[CRIU] [PATCH] btrfs: Don't miss subvol0 on matching

Andrew Vagin avagin at parallels.com
Thu Dec 5 00:09:50 PST 2013


On Thu, Dec 05, 2013 at 11:29:08AM +0400, Cyrill Gorcunov wrote:
> Subvolume 0 has own device number as well, don't miss it
> when looking up for match.
> 
> Reported-by: Andrew Vagin <avagin at parallels.com>

Tested-by: Andrew Vagin <avagin at parallels.com>

> Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
> ---
>  mount-btrfs.c | 21 ++++++++++++++++++---
>  1 file changed, 18 insertions(+), 3 deletions(-)
> 
> diff --git a/mount-btrfs.c b/mount-btrfs.c
> index eab065aa147a..90383dc3bd4a 100644
> --- a/mount-btrfs.c
> +++ b/mount-btrfs.c
> @@ -49,6 +49,7 @@ struct btrfs_subvol_root {
>  	struct mount_info const         *m;
>  
>  	u64				tree_id;
> +	dev_t				st_dev;
>  };
>  
>  struct btrfs_subvol_node {
> @@ -177,7 +178,7 @@ static struct btrfs_subvol_node *btrfs_create_node(void)
>  	return n;
>  }
>  
> -static struct btrfs_subvol_root *btrfs_create_root(int fd, struct mount_info *m)
> +static struct btrfs_subvol_root *btrfs_create_root(int fd, struct mount_info *m, struct stat *st)
>  {
>  	struct btrfs_ioctl_ino_lookup_args args = { };
>  	struct btrfs_subvol_root *r;
> @@ -195,6 +196,7 @@ static struct btrfs_subvol_root *btrfs_create_root(int fd, struct mount_info *m)
>  		return NULL;
>  	}
>  
> +	r->st_dev = st->st_dev;
>  	r->tree_id = args.treeid;
>  	r->m = m;
>  	return r;
> @@ -405,6 +407,7 @@ static void *btrfs_parse_volume(struct mount_info *m)
>  
>  	unsigned long off, i;
>  	int ret = -1, fd = -1;
> +	struct stat st;
>  
>  	memzero(&tree_args, sizeof(tree_args));
>  
> @@ -423,7 +426,12 @@ static void *btrfs_parse_volume(struct mount_info *m)
>  		goto err;
>  	}
>  
> -	r = btrfs_create_root(fd, m);
> +	if (stat(m->mountpoint, &st)) {
> +		pr_perror("Can't get stat on %s", m->mountpoint);
> +		goto err;
> +	}
> +
> +	r = btrfs_create_root(fd, m, &st);
>  	if (!r) {
>  		pr_err("Can't create btrfs root for %s\n", m->mountpoint);
>  		goto err;
> @@ -495,5 +503,12 @@ bool is_btrfs_subvol(dev_t vol_id, dev_t dev_id)
>  	struct btrfs_subvol_root *r;
>  
>  	r = btrfs_vol_lookup_dev(vol_id);
> -	return r ? btrfs_node_lookup_dev(r, dev_id) != NULL : false;
> +	if (r) {
> +		if (r->st_dev == dev_id)
> +			return true;
> +		else
> +			return btrfs_node_lookup_dev(r, dev_id) != NULL;
> +	}
> +
> +	return false;
>  }
> -- 
> 1.8.3.1
> 


More information about the CRIU mailing list