btrfs: add assertion for empty list of transactions at late stage of umount
authorFilipe Manana <fdmanana@suse.com>
Mon, 14 Dec 2020 10:10:48 +0000 (10:10 +0000)
committerDavid Sterba <dsterba@suse.com>
Fri, 18 Dec 2020 14:00:06 +0000 (15:00 +0100)
Add an assertion to close_ctree(), after destroying all the work queues,
to verify we do not have any transaction still open or committing at that
at that point. If we have any, it means something is seriously wrong and
that can cause memory leaks and use-after-free problems. This is motivated
by the previous patches that fixed bugs where we ended up leaking an open
transaction after unmounting the filesystem.

Tested-by: Fabian Vogt <fvogt@suse.com>
Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/disk-io.c

index e7bcbd0b93ef8703869d66aa33b526b2208f6312..1dfd4b2d0e1e8f868f654beb25826c050b8fb1a8 100644 (file)
@@ -4181,6 +4181,9 @@ void __cold close_ctree(struct btrfs_fs_info *fs_info)
        invalidate_inode_pages2(fs_info->btree_inode->i_mapping);
        btrfs_stop_all_workers(fs_info);
 
+       /* We shouldn't have any transaction open at this point */
+       ASSERT(list_empty(&fs_info->trans_list));
+
        clear_bit(BTRFS_FS_OPEN, &fs_info->flags);
        free_root_pointers(fs_info, true);
        btrfs_free_fs_roots(fs_info);