]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
btrfs: fix missing snapshot drew unlock when root is dead during swap activation
authorFilipe Manana <fdmanana@suse.com>
Fri, 29 Nov 2024 13:33:03 +0000 (13:33 +0000)
committerDavid Sterba <dsterba@suse.com>
Tue, 3 Dec 2024 19:27:02 +0000 (20:27 +0100)
When activating a swap file we acquire the root's snapshot drew lock and
then check if the root is dead, failing and returning with -EPERM if it's
dead but without unlocking the root's snapshot lock. Fix this by adding
the missing unlock.

Fixes: 60021bd754c6 ("btrfs: prevent subvol with swapfile from being deleted")
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Reviewed-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/inode.c

index 659a5940a5b2ba91870652056e34a905230213d2..94c8809e817057eed7b6a9362c8cd481ca9cea17 100644 (file)
@@ -9876,6 +9876,7 @@ static int btrfs_swap_activate(struct swap_info_struct *sis, struct file *file,
        if (btrfs_root_dead(root)) {
                spin_unlock(&root->root_item_lock);
 
+               btrfs_drew_write_unlock(&root->snapshot_lock);
                btrfs_exclop_finish(fs_info);
                btrfs_warn(fs_info,
                "cannot activate swapfile because subvolume %llu is being deleted",