diff options
Diffstat (limited to 'fs/btrfs/disk-io.c')
| -rw-r--r-- | fs/btrfs/disk-io.c | 13 | 
1 files changed, 11 insertions, 2 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index c6907d533fe8..e71ef97d0a7c 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -1336,8 +1336,17 @@ static struct btrfs_root *btrfs_get_root_ref(struct btrfs_fs_info *fs_info,  again:  	root = btrfs_lookup_fs_root(fs_info, objectid);  	if (root) { -		/* Shouldn't get preallocated anon_dev for cached roots */ -		ASSERT(!anon_dev); +		/* +		 * Some other caller may have read out the newly inserted +		 * subvolume already (for things like backref walk etc).  Not +		 * that common but still possible.  In that case, we just need +		 * to free the anon_dev. +		 */ +		if (unlikely(anon_dev)) { +			free_anon_bdev(anon_dev); +			anon_dev = 0; +		} +  		if (check_ref && btrfs_root_refs(&root->root_item) == 0) {  			btrfs_put_root(root);  			return ERR_PTR(-ENOENT);  | 
