[CRIU] [PATCH] [RFC] locks: fix up a device returned by stat() for btrfs

Andrew Vagin avagin at openvz.org
Wed Sep 3 04:54:41 PDT 2014


BTRFS returns subvolume dev-id instead of superblock dev-id,
in such case return device obtained from mountinfo (ie subvolume0).

Reported-by: Mr Jenkins
Signed-off-by: Andrew Vagin <avagin at openvz.org>
---
 file-lock.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/file-lock.c b/file-lock.c
index b6a511f..f380010 100644
--- a/file-lock.c
+++ b/file-lock.c
@@ -10,6 +10,8 @@
 #include "fdset.h"
 #include "files.h"
 #include "image.h"
+#include "mount.h"
+#include "proc_parse.h"
 #include "servicefd.h"
 #include "file-lock.h"
 #include "parasite.h"
@@ -123,8 +125,20 @@ err:
 
 static inline bool lock_file_match(struct file_lock *fl, struct fd_parms *p)
 {
+	struct mount_info *m;
+	dev_t dev = p->stat.st_dev;
+
+	/* Get the right devices for BTRFS. Look at phys_stat_resolve_dev()
+	 * for more details.
+	 */
+	if (p->mnt_id != -1) {
+		m = lookup_mnt_id(p->mnt_id);
+		BUG_ON(m == NULL);
+		dev = kdev_to_odev(m->s_dev);
+	}
+
 	return fl->i_no == p->stat.st_ino &&
-		makedev(fl->maj, fl->min) == p->stat.st_dev;
+		makedev(fl->maj, fl->min) == dev;
 }
 
 static int lock_check_fd(int lfd, struct file_lock *fl)
-- 
1.9.3



More information about the CRIU mailing list