[CRIU] [PATCH] btrfs: Don't fail if we meet non-subvolume mountpoint

Cyrill Gorcunov gorcunov at openvz.org
Thu Dec 5 02:10:19 PST 2013


If mount point is not a subvolume we need more complex logic
to figure out which subvolumes it might have. It'll be addressed
later, at moment simply don't fail in such case: for worst
scenarion we will fail later in CRIU code when devs are not
matching, in best case if application is not using notify,
sockets or deleted files -- we should continue without errors.

Reported-by: Andrew Vagin <avagin at parallels.com>
Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
---
 mount-btrfs.c | 27 +++++++++++++++++++--------
 1 file changed, 19 insertions(+), 8 deletions(-)

diff --git a/mount-btrfs.c b/mount-btrfs.c
index 90383dc3bd4a..a693e3c55f3a 100644
--- a/mount-btrfs.c
+++ b/mount-btrfs.c
@@ -397,7 +397,7 @@ static void btrfs_show_subvolumes(struct btrfs_subvol_root *r)
 	}
 }
 
-static void *btrfs_parse_volume(struct mount_info *m)
+static struct btrfs_subvol_root *btrfs_parse_volume(struct mount_info *m)
 {
 	struct btrfs_ioctl_search_args tree_args;
 	struct btrfs_ioctl_search_header sh;
@@ -420,14 +420,17 @@ static void *btrfs_parse_volume(struct mount_info *m)
 	sk->max_transid		= (u64)-1;
 	sk->nr_items		= 4096;
 
-	fd = open(m->mountpoint, O_RDONLY);
-	if (fd < 0) {
-		pr_perror("Can't open %s", m->mountpoint);
+	if (stat(m->mountpoint, &st)) {
+		pr_perror("Can't get stat on %s", m->mountpoint);
 		goto err;
 	}
 
-	if (stat(m->mountpoint, &st)) {
-		pr_perror("Can't get stat on %s", m->mountpoint);
+	if (st.st_ino != BTRFS_FIRST_FREE_OBJECTID)
+		return ERR_PTR(-ENOENT);
+
+	fd = open(m->mountpoint, O_RDONLY);
+	if (fd < 0) {
+		pr_perror("Can't open %s", m->mountpoint);
 		goto err;
 	}
 
@@ -490,12 +493,20 @@ static void *btrfs_parse_volume(struct mount_info *m)
 	result = r;
 err:
 	close_safe(&fd);
-	return (void *)result;
+	return result;
 }
 
 int btrfs_parse_mountinfo(struct mount_info *m)
 {
-	return btrfs_parse_volume(m) ? 0 : -1;
+	struct btrfs_subvol_root *r;
+
+	r = btrfs_parse_volume(m);
+	if (IS_ERR(r)) {
+		if (PTR_ERR(r) == -ENOENT)
+			return 0;
+		return -1;
+	}
+	return r ? 0 : -1;
 }
 
 bool is_btrfs_subvol(dev_t vol_id, dev_t dev_id)
-- 
1.8.3.1



More information about the CRIU mailing list