• Kaiwen Hu's avatar
    btrfs: prevent subvol with swapfile from being deleted · 60021bd7
    Kaiwen Hu authored
    
    
    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: default avatarRobbie Ko <robbieko@synology.com>
    Reviewed-by: default avatarQu Wenruo <wqu@suse.com>
    Reviewed-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarKaiwen Hu <kevinhu@synology.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    60021bd7
inode.c 321 KB