diff options
Diffstat (limited to 'fs/btrfs/ioctl.c')
| -rw-r--r-- | fs/btrfs/ioctl.c | 10 | 
1 files changed, 6 insertions, 4 deletions
| diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 2b84846ed934..edfecfe62b4b 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -617,11 +617,13 @@ static noinline int create_subvol(struct user_namespace *mnt_userns,  		 * Since we don't abort the transaction in this case, free the  		 * tree block so that we don't leak space and leave the  		 * filesystem in an inconsistent state (an extent item in the -		 * extent tree without backreferences). Also no need to have -		 * the tree block locked since it is not in any tree at this -		 * point, so no other task can find it and use it. +		 * extent tree with a backreference for a root that does not +		 * exists).  		 */ -		btrfs_free_tree_block(trans, root, leaf, 0, 1); +		btrfs_tree_lock(leaf); +		btrfs_clean_tree_block(leaf); +		btrfs_tree_unlock(leaf); +		btrfs_free_tree_block(trans, objectid, leaf, 0, 1);  		free_extent_buffer(leaf);  		goto fail;  	} |