Message ID | f3ea96654bb7f39afb15555dece992f2a8479608.1638879879.git.johannes.thumshirn@wdc.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] btrfs: zoned: free zone_cache when freeing zone_info | expand |
On Tue, Dec 07, 2021 at 05:58:13AM -0800, Johannes Thumshirn wrote: > Kmemleak was reporting the following memory leak on fstests btrfs/224 on my > zoned test setup: > > unreferenced object 0xffffc900001a9000 (size 4096): > comm "mount", pid 1781, jiffies 4295339102 (age 5.740s) > hex dump (first 32 bytes): > 00 00 00 00 00 00 00 00 00 00 08 00 00 00 00 00 ................ > 00 00 08 00 00 00 00 00 01 00 00 00 00 00 00 00 ................ > backtrace: > [<00000000b0ef6261>] __vmalloc_node_range+0x240/0x3d0 > [<00000000aa06ac88>] vzalloc+0x3c/0x50 > [<000000001824c35c>] btrfs_get_dev_zone_info+0x426/0x7e0 [btrfs] > [<0000000004ba8d9d>] btrfs_get_dev_zone_info_all_devices+0x52/0x80 [btrfs] > [<0000000054bc27eb>] open_ctree+0x1022/0x1709 [btrfs] > [<0000000074fe7dc0>] btrfs_mount_root.cold+0x13/0xe5 [btrfs] > [<00000000a54ca18b>] legacy_get_tree+0x22/0x40 > [<00000000ce480896>] vfs_get_tree+0x1b/0x80 > [<000000006423c6bd>] vfs_kern_mount.part.0+0x6c/0xa0 > [<000000003cf6fc28>] btrfs_mount+0x10d/0x380 [btrfs] > [<00000000a54ca18b>] legacy_get_tree+0x22/0x40 > [<00000000ce480896>] vfs_get_tree+0x1b/0x80 > [<00000000995da674>] path_mount+0x6b6/0xa10 > [<00000000a5b4b6ec>] __x64_sys_mount+0xde/0x110 > [<00000000fe985c23>] do_syscall_64+0x43/0x90 > [<00000000c6071ff4>] entry_SYSCALL_64_after_hwframe+0x44/0xae > > The allocated object in question is the zone_cache. > > Free it when freeing a btrfs_device's zone_info. > > Also as the cleanup code in btrfs_get_dev_zone_info() utilizes the same > pattern btrfs_destroy_dev_zone_info() is using directly call > btrfs_destroy_dev_zone_info() instead of open-coding it. > > Fixes: dea0e0d65459 ("btrfs: cache reported zone during mount") > Cc: Naohiro Aota <naohiro.aota@wdc.com> > Reviewed-by: Naohiro Aota <naohiro.aota@wdc.com> > Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Added to misc-next, thanks.
diff --git a/fs/btrfs/zoned.c b/fs/btrfs/zoned.c index 9cdef5e8f6b7..6a00f49a397c 100644 --- a/fs/btrfs/zoned.c +++ b/fs/btrfs/zoned.c @@ -592,12 +592,7 @@ int btrfs_get_dev_zone_info(struct btrfs_device *device, bool populate_cache) out: kfree(zones); out_free_zone_info: - bitmap_free(zone_info->active_zones); - bitmap_free(zone_info->empty_zones); - bitmap_free(zone_info->seq_zones); - vfree(zone_info->zone_cache); - kfree(zone_info); - device->zone_info = NULL; + btrfs_destroy_dev_zone_info(device); return ret; } @@ -612,6 +607,7 @@ void btrfs_destroy_dev_zone_info(struct btrfs_device *device) bitmap_free(zone_info->active_zones); bitmap_free(zone_info->seq_zones); bitmap_free(zone_info->empty_zones); + vfree(zone_info->zone_cache); kfree(zone_info); device->zone_info = NULL; }