]> git.baikalelectronics.ru Git - kernel.git/commit
btrfs: prevent subvol with swapfile from being deleted
authorKaiwen Hu <kevinhu@synology.com>
Wed, 23 Mar 2022 07:10:32 +0000 (15:10 +0800)
committerDavid Sterba <dsterba@suse.com>
Thu, 24 Mar 2022 16:50:57 +0000 (17:50 +0100)
commitdc470d73f34eedeb40267fe7dfbb490add676618
treeb3f7df29132a39858d8cab9ef6a8340c92b9067f
parent2173e2227e6aec4fc4dfe67f4ba69dc668de9863
btrfs: prevent subvol with swapfile from being deleted

A subvolume with an active swapfile must not be deleted otherwise it
would not be possible to deactivate it.

After the subvolume is deleted, we cannot swapoff the swapfile in this
deleted subvolume because the path is unreachable.  The swapfile is
still active and holding references, the filesystem cannot be unmounted.

The test looks like this:

  mkfs.btrfs -f $dev > /dev/null
  mount $dev $mnt

  btrfs sub create $mnt/subvol
  touch $mnt/subvol/swapfile
  chmod 600 $mnt/subvol/swapfile
  chattr +C $mnt/subvol/swapfile
  dd if=/dev/zero of=$mnt/subvol/swapfile bs=1K count=4096
  mkswap $mnt/subvol/swapfile
  swapon $mnt/subvol/swapfile

  btrfs sub delete $mnt/subvol
  swapoff $mnt/subvol/swapfile  # failed: No such file or directory
  swapoff --all

  unmount $mnt                  # target is busy.

To prevent above issue, we simply check that whether the subvolume
contains any active swapfile, and stop the deleting process.  This
behavior is like snapshot ioctl dealing with a swapfile.

CC: stable@vger.kernel.org # 5.4+
Reviewed-by: Robbie Ko <robbieko@synology.com>
Reviewed-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: Kaiwen Hu <kevinhu@synology.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/inode.c