Patch "Btrfs: don't invalidate root dentry when subvolume deletion fails" has been added to the 4.1-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
Btrfs: don't invalidate root dentry when subvolume deletion fails
to the 4.1-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
btrfs-don-t-invalidate-root-dentry-when-subvolume-deletion-fails.patch
and it can be found in the queue-4.1 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
64ad6c488975d7516230cf7849190a991fd615aeMon Sep 17 00:00:00 2001
From: Omar Sandoval <[email protected]>
Date: Tue, 2 Jun 2015 17:31:00 -0700
Subject: Btrfs: don't invalidate root dentry when subvolume deletion fails
From: Omar Sandoval <[email protected]>
commit 64ad6c488975d7516230cf7849190a991fd615ae upstream.
Since commit bafc9b754f75 ("vfs: More precise tests in d_invalidate"), mounted subvolumes can be deleted because d_invalidate() won't fail. However, we run into problems when we attempt to delete the default subvolume while it is mounted as the root filesystem:
# btrfs subvol list / ID 257 gen 306 top level 5 path rootvol ID 267 gen 334 top level 5 path snap1 # btrfs subvol get-default / ID 267 gen 334 top level 5 path snap1 # btrfs inspect-internal rootid / 267 # mount -o subvol=/ /dev/vda1 /mnt # btrfs subvol del /mnt/snap1 Delete subvolume (no-commit): '/mnt/snap1' ERROR: cannot delete '/mnt/snap1' - Operation not permitted # findmnt / findmnt: can't read /proc/mounts: No such file or directory # ls /proc #
Markus reported that this same scenario simply led to a kernel oops.
This happens because in btrfs_ioctl_snap_destroy(), we call d_invalidate() before we check may_destroy_subvol(), which means that we detach the submounts and drop the dentry before erroring out. Instead, we should only invalidate the dentry once the deletion has succeeded. Additionally, the shrink_dcache_sb() isn't necessary; d_invalidate() will prune the dcache for the deleted subvolume.
--- fs/btrfs/ioctl.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
fs/btrfs/ioctl.c +1 -3
@@ -2413,8 +2413,6 @@ static noinline int btrfs_ioctl_snap_des goto out_unlock_inode; } -d_invalidate (dentry); -down_write (&root->fs_info->subvol_sem); err =may_destroy_subvol (dest);
@@ -2508,7 +2506,7 @@ out_up_write: out_unlock_inode:mutex_unlock (&inode->i_mutex);if (!err) { -shrink_dcache_sb (root->fs_info->sb); +d_invalidate (dentry);btrfs_invalidate_inodes (dest);d_delete (dentry);ASSERT (dest->send_in_progress ==0 );
Patches currently in stable-queue which might be from [email protected] are
queue-4.1/btrfs-don-t-invalidate-root-dentry-when-subvolume-deletion-fails.patch