btrfs: use free_root_extent_buffer to free root
authorJohannes Thumshirn <johannes.thumshirn@wdc.com>
Tue, 23 Jun 2020 08:40:07 +0000 (17:40 +0900)
committerDavid Sterba <dsterba@suse.com>
Mon, 27 Jul 2020 10:55:27 +0000 (12:55 +0200)
In btrfs_put_root() we're freeing a btrfs_root's 'node' and 'commit_root'
extent buffers manually via kfree(), while we're using
free_root_extent_buffers() in the free_root_pointers() function above.

free_root_extent_buffers() also NULLs the pointers after freeing, which
mitigates potential double frees.

Reviewed-by: Anand Jain <anand.jain@oracle.com>
Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/disk-io.c

index a9cf6152d175ae7d737e1a4eb469e0ffcb251043..b5b7055b795307fc157dd6e4e7ed4055ebde4110 100644 (file)
@@ -2001,8 +2001,7 @@ void btrfs_put_root(struct btrfs_root *root)
                if (root->anon_dev)
                        free_anon_bdev(root->anon_dev);
                btrfs_drew_lock_destroy(&root->snapshot_lock);
-               free_extent_buffer(root->node);
-               free_extent_buffer(root->commit_root);
+               free_root_extent_buffers(root);
                kfree(root->free_ino_ctl);
                kfree(root->free_ino_pinned);
 #ifdef CONFIG_BTRFS_DEBUG