* [PATCH v2] btrfs: zoned: free zone_cache when freeing zone_info
@ 2021-12-07 13:58 Johannes Thumshirn
2021-12-07 16:51 ` David Sterba
0 siblings, 1 reply; 5+ messages in thread
From: Johannes Thumshirn @ 2021-12-07 13:58 UTC (permalink / raw)
To: David Sterba; +Cc: Johannes Thumshirn, linux-btrfs, Naohiro Aota
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>
---
Changes to v1:
- call btrfs_destroy_dev_zone_info in btrfs_get_dev_zone_info's cleanup
path
---
fs/btrfs/zoned.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
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;
}
--
2.31.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2] btrfs: zoned: free zone_cache when freeing zone_info
2021-12-07 13:58 [PATCH v2] btrfs: zoned: free zone_cache when freeing zone_info Johannes Thumshirn
@ 2021-12-07 16:51 ` David Sterba
0 siblings, 0 replies; 5+ messages in thread
From: David Sterba @ 2021-12-07 16:51 UTC (permalink / raw)
To: Johannes Thumshirn; +Cc: David Sterba, linux-btrfs, Naohiro Aota
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.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] btrfs: zoned: free zone_cache when freeing zone_info
2021-12-07 13:58 [PATCH v2] btrfs: zoned: free zone_cache when freeing zone_info Johannes Thumshirn
@ 2021-12-10 11:09 ` Dan Carpenter
0 siblings, 0 replies; 5+ messages in thread
From: kernel test robot @ 2021-12-08 22:11 UTC (permalink / raw)
To: kbuild
[-- Attachment #1: Type: text/plain, Size: 21733 bytes --]
CC: kbuild-all(a)lists.01.org
In-Reply-To: <f3ea96654bb7f39afb15555dece992f2a8479608.1638879879.git.johannes.thumshirn@wdc.com>
References: <f3ea96654bb7f39afb15555dece992f2a8479608.1638879879.git.johannes.thumshirn@wdc.com>
TO: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Hi Johannes,
I love your patch! Perhaps something to improve:
[auto build test WARNING on kdave/for-next]
[also build test WARNING on next-20211208]
[cannot apply to v5.16-rc4]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Johannes-Thumshirn/btrfs-zoned-free-zone_cache-when-freeing-zone_info/20211207-215928
base: https://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git for-next
:::::: branch date: 32 hours ago
:::::: commit date: 32 hours ago
config: i386-randconfig-m021-20211207 (https://download.01.org/0day-ci/archive/20211209/202112090657.BflsS2SD-lkp(a)intel.com/config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
New smatch warnings:
fs/btrfs/zoned.c:597 btrfs_get_dev_zone_info() warn: possible memory leak of 'zone_info'
Old smatch warnings:
fs/btrfs/zoned.c:169 sb_zone_number() error: uninitialized symbol 'zone'.
fs/btrfs/zoned.c:1452 btrfs_load_block_group_zone_info() error: uninitialized symbol 'ret'.
vim +/zone_info +597 fs/btrfs/zoned.c
7365104236ade0b Naohiro Aota 2021-02-04 347
1c0066baa869433 Naohiro Aota 2021-11-11 348 int btrfs_get_dev_zone_info(struct btrfs_device *device, bool populate_cache)
5b316468983dfa9 Naohiro Aota 2020-11-10 349 {
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 350 struct btrfs_fs_info *fs_info = device->fs_info;
5b316468983dfa9 Naohiro Aota 2020-11-10 351 struct btrfs_zoned_device_info *zone_info = NULL;
5b316468983dfa9 Naohiro Aota 2020-11-10 352 struct block_device *bdev = device->bdev;
ea6f8ddcde63812 Naohiro Aota 2021-08-19 353 struct request_queue *queue = bdev_get_queue(bdev);
ea6f8ddcde63812 Naohiro Aota 2021-08-19 354 unsigned int max_active_zones;
ea6f8ddcde63812 Naohiro Aota 2021-08-19 355 unsigned int nactive;
5b316468983dfa9 Naohiro Aota 2020-11-10 356 sector_t nr_sectors;
5b316468983dfa9 Naohiro Aota 2020-11-10 357 sector_t sector = 0;
5b316468983dfa9 Naohiro Aota 2020-11-10 358 struct blk_zone *zones = NULL;
5b316468983dfa9 Naohiro Aota 2020-11-10 359 unsigned int i, nreported = 0, nr_zones;
d734492a14a2da6 Naohiro Aota 2021-03-03 360 sector_t zone_sectors;
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 361 char *model, *emulated;
5b316468983dfa9 Naohiro Aota 2020-11-10 362 int ret;
5b316468983dfa9 Naohiro Aota 2020-11-10 363
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 364 /*
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 365 * Cannot use btrfs_is_zoned here, since fs_info::zone_size might not
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 366 * yet be set.
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 367 */
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 368 if (!btrfs_fs_incompat(fs_info, ZONED))
5b316468983dfa9 Naohiro Aota 2020-11-10 369 return 0;
5b316468983dfa9 Naohiro Aota 2020-11-10 370
5b316468983dfa9 Naohiro Aota 2020-11-10 371 if (device->zone_info)
5b316468983dfa9 Naohiro Aota 2020-11-10 372 return 0;
5b316468983dfa9 Naohiro Aota 2020-11-10 373
5b316468983dfa9 Naohiro Aota 2020-11-10 374 zone_info = kzalloc(sizeof(*zone_info), GFP_KERNEL);
5b316468983dfa9 Naohiro Aota 2020-11-10 375 if (!zone_info)
5b316468983dfa9 Naohiro Aota 2020-11-10 376 return -ENOMEM;
5b316468983dfa9 Naohiro Aota 2020-11-10 377
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 378 if (!bdev_is_zoned(bdev)) {
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 379 if (!fs_info->zone_size) {
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 380 ret = calculate_emulated_zone_size(fs_info);
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 381 if (ret)
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 382 goto out;
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 383 }
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 384
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 385 ASSERT(fs_info->zone_size);
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 386 zone_sectors = fs_info->zone_size >> SECTOR_SHIFT;
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 387 } else {
5b316468983dfa9 Naohiro Aota 2020-11-10 388 zone_sectors = bdev_zone_sectors(bdev);
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 389 }
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 390
5b316468983dfa9 Naohiro Aota 2020-11-10 391 /* Check if it's power of 2 (see is_power_of_2) */
5b316468983dfa9 Naohiro Aota 2020-11-10 392 ASSERT(zone_sectors != 0 && (zone_sectors & (zone_sectors - 1)) == 0);
5b316468983dfa9 Naohiro Aota 2020-11-10 393 zone_info->zone_size = zone_sectors << SECTOR_SHIFT;
53b74fa990bf76f Naohiro Aota 2021-04-08 394
53b74fa990bf76f Naohiro Aota 2021-04-08 395 /* We reject devices with a zone size larger than 8GB */
53b74fa990bf76f Naohiro Aota 2021-04-08 396 if (zone_info->zone_size > BTRFS_MAX_ZONE_SIZE) {
53b74fa990bf76f Naohiro Aota 2021-04-08 397 btrfs_err_in_rcu(fs_info,
53b74fa990bf76f Naohiro Aota 2021-04-08 398 "zoned: %s: zone size %llu larger than supported maximum %llu",
53b74fa990bf76f Naohiro Aota 2021-04-08 399 rcu_str_deref(device->name),
53b74fa990bf76f Naohiro Aota 2021-04-08 400 zone_info->zone_size, BTRFS_MAX_ZONE_SIZE);
53b74fa990bf76f Naohiro Aota 2021-04-08 401 ret = -EINVAL;
53b74fa990bf76f Naohiro Aota 2021-04-08 402 goto out;
53b74fa990bf76f Naohiro Aota 2021-04-08 403 }
53b74fa990bf76f Naohiro Aota 2021-04-08 404
53b74fa990bf76f Naohiro Aota 2021-04-08 405 nr_sectors = bdev_nr_sectors(bdev);
5b316468983dfa9 Naohiro Aota 2020-11-10 406 zone_info->zone_size_shift = ilog2(zone_info->zone_size);
5b316468983dfa9 Naohiro Aota 2020-11-10 407 zone_info->nr_zones = nr_sectors >> ilog2(zone_sectors);
5b316468983dfa9 Naohiro Aota 2020-11-10 408 if (!IS_ALIGNED(nr_sectors, zone_sectors))
5b316468983dfa9 Naohiro Aota 2020-11-10 409 zone_info->nr_zones++;
5b316468983dfa9 Naohiro Aota 2020-11-10 410
ea6f8ddcde63812 Naohiro Aota 2021-08-19 411 max_active_zones = queue_max_active_zones(queue);
ea6f8ddcde63812 Naohiro Aota 2021-08-19 412 if (max_active_zones && max_active_zones < BTRFS_MIN_ACTIVE_ZONES) {
ea6f8ddcde63812 Naohiro Aota 2021-08-19 413 btrfs_err_in_rcu(fs_info,
ea6f8ddcde63812 Naohiro Aota 2021-08-19 414 "zoned: %s: max active zones %u is too small, need@least %u active zones",
ea6f8ddcde63812 Naohiro Aota 2021-08-19 415 rcu_str_deref(device->name), max_active_zones,
ea6f8ddcde63812 Naohiro Aota 2021-08-19 416 BTRFS_MIN_ACTIVE_ZONES);
ea6f8ddcde63812 Naohiro Aota 2021-08-19 417 ret = -EINVAL;
ea6f8ddcde63812 Naohiro Aota 2021-08-19 418 goto out;
ea6f8ddcde63812 Naohiro Aota 2021-08-19 419 }
ea6f8ddcde63812 Naohiro Aota 2021-08-19 420 zone_info->max_active_zones = max_active_zones;
ea6f8ddcde63812 Naohiro Aota 2021-08-19 421
5b316468983dfa9 Naohiro Aota 2020-11-10 422 zone_info->seq_zones = bitmap_zalloc(zone_info->nr_zones, GFP_KERNEL);
5b316468983dfa9 Naohiro Aota 2020-11-10 423 if (!zone_info->seq_zones) {
5b316468983dfa9 Naohiro Aota 2020-11-10 424 ret = -ENOMEM;
5b316468983dfa9 Naohiro Aota 2020-11-10 425 goto out;
5b316468983dfa9 Naohiro Aota 2020-11-10 426 }
5b316468983dfa9 Naohiro Aota 2020-11-10 427
5b316468983dfa9 Naohiro Aota 2020-11-10 428 zone_info->empty_zones = bitmap_zalloc(zone_info->nr_zones, GFP_KERNEL);
5b316468983dfa9 Naohiro Aota 2020-11-10 429 if (!zone_info->empty_zones) {
5b316468983dfa9 Naohiro Aota 2020-11-10 430 ret = -ENOMEM;
5b316468983dfa9 Naohiro Aota 2020-11-10 431 goto out;
5b316468983dfa9 Naohiro Aota 2020-11-10 432 }
5b316468983dfa9 Naohiro Aota 2020-11-10 433
ea6f8ddcde63812 Naohiro Aota 2021-08-19 434 zone_info->active_zones = bitmap_zalloc(zone_info->nr_zones, GFP_KERNEL);
ea6f8ddcde63812 Naohiro Aota 2021-08-19 435 if (!zone_info->active_zones) {
ea6f8ddcde63812 Naohiro Aota 2021-08-19 436 ret = -ENOMEM;
ea6f8ddcde63812 Naohiro Aota 2021-08-19 437 goto out;
ea6f8ddcde63812 Naohiro Aota 2021-08-19 438 }
ea6f8ddcde63812 Naohiro Aota 2021-08-19 439
5b316468983dfa9 Naohiro Aota 2020-11-10 440 zones = kcalloc(BTRFS_REPORT_NR_ZONES, sizeof(struct blk_zone), GFP_KERNEL);
5b316468983dfa9 Naohiro Aota 2020-11-10 441 if (!zones) {
5b316468983dfa9 Naohiro Aota 2020-11-10 442 ret = -ENOMEM;
5b316468983dfa9 Naohiro Aota 2020-11-10 443 goto out;
5b316468983dfa9 Naohiro Aota 2020-11-10 444 }
5b316468983dfa9 Naohiro Aota 2020-11-10 445
1c0066baa869433 Naohiro Aota 2021-11-11 446 /*
1c0066baa869433 Naohiro Aota 2021-11-11 447 * Enable zone cache only for a zoned device. On a non-zoned device, we
1c0066baa869433 Naohiro Aota 2021-11-11 448 * fill the zone info with emulated CONVENTIONAL zones, so no need to
1c0066baa869433 Naohiro Aota 2021-11-11 449 * use the cache.
1c0066baa869433 Naohiro Aota 2021-11-11 450 */
1c0066baa869433 Naohiro Aota 2021-11-11 451 if (populate_cache && bdev_is_zoned(device->bdev)) {
1c0066baa869433 Naohiro Aota 2021-11-11 452 zone_info->zone_cache = vzalloc(sizeof(struct blk_zone) *
1c0066baa869433 Naohiro Aota 2021-11-11 453 zone_info->nr_zones);
1c0066baa869433 Naohiro Aota 2021-11-11 454 if (!zone_info->zone_cache) {
1c0066baa869433 Naohiro Aota 2021-11-11 455 btrfs_err_in_rcu(device->fs_info,
1c0066baa869433 Naohiro Aota 2021-11-11 456 "zoned: failed to allocate zone cache for %s",
1c0066baa869433 Naohiro Aota 2021-11-11 457 rcu_str_deref(device->name));
1c0066baa869433 Naohiro Aota 2021-11-11 458 ret = -ENOMEM;
1c0066baa869433 Naohiro Aota 2021-11-11 459 goto out;
1c0066baa869433 Naohiro Aota 2021-11-11 460 }
1c0066baa869433 Naohiro Aota 2021-11-11 461 }
1c0066baa869433 Naohiro Aota 2021-11-11 462
1c0066baa869433 Naohiro Aota 2021-11-11 463 device->zone_info = zone_info;
1c0066baa869433 Naohiro Aota 2021-11-11 464
5b316468983dfa9 Naohiro Aota 2020-11-10 465 /* Get zones type */
ea6f8ddcde63812 Naohiro Aota 2021-08-19 466 nactive = 0;
5b316468983dfa9 Naohiro Aota 2020-11-10 467 while (sector < nr_sectors) {
5b316468983dfa9 Naohiro Aota 2020-11-10 468 nr_zones = BTRFS_REPORT_NR_ZONES;
5b316468983dfa9 Naohiro Aota 2020-11-10 469 ret = btrfs_get_dev_zones(device, sector << SECTOR_SHIFT, zones,
5b316468983dfa9 Naohiro Aota 2020-11-10 470 &nr_zones);
5b316468983dfa9 Naohiro Aota 2020-11-10 471 if (ret)
5b316468983dfa9 Naohiro Aota 2020-11-10 472 goto out;
5b316468983dfa9 Naohiro Aota 2020-11-10 473
5b316468983dfa9 Naohiro Aota 2020-11-10 474 for (i = 0; i < nr_zones; i++) {
5b316468983dfa9 Naohiro Aota 2020-11-10 475 if (zones[i].type == BLK_ZONE_TYPE_SEQWRITE_REQ)
5b316468983dfa9 Naohiro Aota 2020-11-10 476 __set_bit(nreported, zone_info->seq_zones);
ea6f8ddcde63812 Naohiro Aota 2021-08-19 477 switch (zones[i].cond) {
ea6f8ddcde63812 Naohiro Aota 2021-08-19 478 case BLK_ZONE_COND_EMPTY:
5b316468983dfa9 Naohiro Aota 2020-11-10 479 __set_bit(nreported, zone_info->empty_zones);
ea6f8ddcde63812 Naohiro Aota 2021-08-19 480 break;
ea6f8ddcde63812 Naohiro Aota 2021-08-19 481 case BLK_ZONE_COND_IMP_OPEN:
ea6f8ddcde63812 Naohiro Aota 2021-08-19 482 case BLK_ZONE_COND_EXP_OPEN:
ea6f8ddcde63812 Naohiro Aota 2021-08-19 483 case BLK_ZONE_COND_CLOSED:
ea6f8ddcde63812 Naohiro Aota 2021-08-19 484 __set_bit(nreported, zone_info->active_zones);
ea6f8ddcde63812 Naohiro Aota 2021-08-19 485 nactive++;
ea6f8ddcde63812 Naohiro Aota 2021-08-19 486 break;
ea6f8ddcde63812 Naohiro Aota 2021-08-19 487 }
5b316468983dfa9 Naohiro Aota 2020-11-10 488 nreported++;
5b316468983dfa9 Naohiro Aota 2020-11-10 489 }
5b316468983dfa9 Naohiro Aota 2020-11-10 490 sector = zones[nr_zones - 1].start + zones[nr_zones - 1].len;
5b316468983dfa9 Naohiro Aota 2020-11-10 491 }
5b316468983dfa9 Naohiro Aota 2020-11-10 492
5b316468983dfa9 Naohiro Aota 2020-11-10 493 if (nreported != zone_info->nr_zones) {
5b316468983dfa9 Naohiro Aota 2020-11-10 494 btrfs_err_in_rcu(device->fs_info,
5b316468983dfa9 Naohiro Aota 2020-11-10 495 "inconsistent number of zones on %s (%u/%u)",
5b316468983dfa9 Naohiro Aota 2020-11-10 496 rcu_str_deref(device->name), nreported,
5b316468983dfa9 Naohiro Aota 2020-11-10 497 zone_info->nr_zones);
5b316468983dfa9 Naohiro Aota 2020-11-10 498 ret = -EIO;
5b316468983dfa9 Naohiro Aota 2020-11-10 499 goto out;
5b316468983dfa9 Naohiro Aota 2020-11-10 500 }
5b316468983dfa9 Naohiro Aota 2020-11-10 501
ea6f8ddcde63812 Naohiro Aota 2021-08-19 502 if (max_active_zones) {
ea6f8ddcde63812 Naohiro Aota 2021-08-19 503 if (nactive > max_active_zones) {
ea6f8ddcde63812 Naohiro Aota 2021-08-19 504 btrfs_err_in_rcu(device->fs_info,
ea6f8ddcde63812 Naohiro Aota 2021-08-19 505 "zoned: %u active zones on %s exceeds max_active_zones %u",
ea6f8ddcde63812 Naohiro Aota 2021-08-19 506 nactive, rcu_str_deref(device->name),
ea6f8ddcde63812 Naohiro Aota 2021-08-19 507 max_active_zones);
ea6f8ddcde63812 Naohiro Aota 2021-08-19 508 ret = -EIO;
ea6f8ddcde63812 Naohiro Aota 2021-08-19 509 goto out;
ea6f8ddcde63812 Naohiro Aota 2021-08-19 510 }
ea6f8ddcde63812 Naohiro Aota 2021-08-19 511 atomic_set(&zone_info->active_zones_left,
ea6f8ddcde63812 Naohiro Aota 2021-08-19 512 max_active_zones - nactive);
ea6f8ddcde63812 Naohiro Aota 2021-08-19 513 }
ea6f8ddcde63812 Naohiro Aota 2021-08-19 514
12659251ca5df05 Naohiro Aota 2020-11-10 515 /* Validate superblock log */
12659251ca5df05 Naohiro Aota 2020-11-10 516 nr_zones = BTRFS_NR_SB_LOG_ZONES;
12659251ca5df05 Naohiro Aota 2020-11-10 517 for (i = 0; i < BTRFS_SUPER_MIRROR_MAX; i++) {
12659251ca5df05 Naohiro Aota 2020-11-10 518 u32 sb_zone;
12659251ca5df05 Naohiro Aota 2020-11-10 519 u64 sb_wp;
12659251ca5df05 Naohiro Aota 2020-11-10 520 int sb_pos = BTRFS_NR_SB_LOG_ZONES * i;
12659251ca5df05 Naohiro Aota 2020-11-10 521
12659251ca5df05 Naohiro Aota 2020-11-10 522 sb_zone = sb_zone_number(zone_info->zone_size_shift, i);
12659251ca5df05 Naohiro Aota 2020-11-10 523 if (sb_zone + 1 >= zone_info->nr_zones)
12659251ca5df05 Naohiro Aota 2020-11-10 524 continue;
12659251ca5df05 Naohiro Aota 2020-11-10 525
5b434df8778771d Naohiro Aota 2021-05-27 526 ret = btrfs_get_dev_zones(device,
5b434df8778771d Naohiro Aota 2021-05-27 527 zone_start_physical(sb_zone, zone_info),
12659251ca5df05 Naohiro Aota 2020-11-10 528 &zone_info->sb_zones[sb_pos],
12659251ca5df05 Naohiro Aota 2020-11-10 529 &nr_zones);
12659251ca5df05 Naohiro Aota 2020-11-10 530 if (ret)
12659251ca5df05 Naohiro Aota 2020-11-10 531 goto out;
12659251ca5df05 Naohiro Aota 2020-11-10 532
12659251ca5df05 Naohiro Aota 2020-11-10 533 if (nr_zones != BTRFS_NR_SB_LOG_ZONES) {
12659251ca5df05 Naohiro Aota 2020-11-10 534 btrfs_err_in_rcu(device->fs_info,
12659251ca5df05 Naohiro Aota 2020-11-10 535 "zoned: failed to read super block log zone info at devid %llu zone %u",
12659251ca5df05 Naohiro Aota 2020-11-10 536 device->devid, sb_zone);
12659251ca5df05 Naohiro Aota 2020-11-10 537 ret = -EUCLEAN;
12659251ca5df05 Naohiro Aota 2020-11-10 538 goto out;
12659251ca5df05 Naohiro Aota 2020-11-10 539 }
12659251ca5df05 Naohiro Aota 2020-11-10 540
12659251ca5df05 Naohiro Aota 2020-11-10 541 /*
1a9fd4172d5c8ba David Sterba 2021-05-21 542 * If zones[0] is conventional, always use the beginning of the
12659251ca5df05 Naohiro Aota 2020-11-10 543 * zone to record superblock. No need to validate in that case.
12659251ca5df05 Naohiro Aota 2020-11-10 544 */
12659251ca5df05 Naohiro Aota 2020-11-10 545 if (zone_info->sb_zones[BTRFS_NR_SB_LOG_ZONES * i].type ==
12659251ca5df05 Naohiro Aota 2020-11-10 546 BLK_ZONE_TYPE_CONVENTIONAL)
12659251ca5df05 Naohiro Aota 2020-11-10 547 continue;
12659251ca5df05 Naohiro Aota 2020-11-10 548
12659251ca5df05 Naohiro Aota 2020-11-10 549 ret = sb_write_pointer(device->bdev,
12659251ca5df05 Naohiro Aota 2020-11-10 550 &zone_info->sb_zones[sb_pos], &sb_wp);
12659251ca5df05 Naohiro Aota 2020-11-10 551 if (ret != -ENOENT && ret) {
12659251ca5df05 Naohiro Aota 2020-11-10 552 btrfs_err_in_rcu(device->fs_info,
12659251ca5df05 Naohiro Aota 2020-11-10 553 "zoned: super block log zone corrupted devid %llu zone %u",
12659251ca5df05 Naohiro Aota 2020-11-10 554 device->devid, sb_zone);
12659251ca5df05 Naohiro Aota 2020-11-10 555 ret = -EUCLEAN;
12659251ca5df05 Naohiro Aota 2020-11-10 556 goto out;
12659251ca5df05 Naohiro Aota 2020-11-10 557 }
12659251ca5df05 Naohiro Aota 2020-11-10 558 }
12659251ca5df05 Naohiro Aota 2020-11-10 559
12659251ca5df05 Naohiro Aota 2020-11-10 560
5b316468983dfa9 Naohiro Aota 2020-11-10 561 kfree(zones);
5b316468983dfa9 Naohiro Aota 2020-11-10 562
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 563 switch (bdev_zoned_model(bdev)) {
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 564 case BLK_ZONED_HM:
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 565 model = "host-managed zoned";
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 566 emulated = "";
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 567 break;
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 568 case BLK_ZONED_HA:
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 569 model = "host-aware zoned";
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 570 emulated = "";
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 571 break;
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 572 case BLK_ZONED_NONE:
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 573 model = "regular";
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 574 emulated = "emulated ";
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 575 break;
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 576 default:
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 577 /* Just in case */
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 578 btrfs_err_in_rcu(fs_info, "zoned: unsupported model %d on %s",
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 579 bdev_zoned_model(bdev),
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 580 rcu_str_deref(device->name));
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 581 ret = -EOPNOTSUPP;
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 582 goto out_free_zone_info;
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 583 }
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 584
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 585 btrfs_info_in_rcu(fs_info,
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 586 "%s block device %s, %u %szones of %llu bytes",
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 587 model, rcu_str_deref(device->name), zone_info->nr_zones,
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 588 emulated, zone_info->zone_size);
5b316468983dfa9 Naohiro Aota 2020-11-10 589
5b316468983dfa9 Naohiro Aota 2020-11-10 590 return 0;
5b316468983dfa9 Naohiro Aota 2020-11-10 591
5b316468983dfa9 Naohiro Aota 2020-11-10 592 out:
5b316468983dfa9 Naohiro Aota 2020-11-10 593 kfree(zones);
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 594 out_free_zone_info:
0a2a39576fa1dd6 Johannes Thumshirn 2021-12-07 595 btrfs_destroy_dev_zone_info(device);
5b316468983dfa9 Naohiro Aota 2020-11-10 596
5b316468983dfa9 Naohiro Aota 2020-11-10 @597 return ret;
5b316468983dfa9 Naohiro Aota 2020-11-10 598 }
5b316468983dfa9 Naohiro Aota 2020-11-10 599
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] btrfs: zoned: free zone_cache when freeing zone_info
@ 2021-12-10 11:09 ` Dan Carpenter
0 siblings, 0 replies; 5+ messages in thread
From: Dan Carpenter @ 2021-12-10 11:09 UTC (permalink / raw)
To: kbuild-all
[-- Attachment #1: Type: text/plain, Size: 21351 bytes --]
Hi Johannes,
url: https://github.com/0day-ci/linux/commits/Johannes-Thumshirn/btrfs-zoned-free-zone_cache-when-freeing-zone_info/20211207-215928
base: https://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git for-next
config: i386-randconfig-m021-20211207 (https://download.01.org/0day-ci/archive/20211209/202112090657.BflsS2SD-lkp(a)intel.com/config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
New smatch warnings:
fs/btrfs/zoned.c:597 btrfs_get_dev_zone_info() warn: possible memory leak of 'zone_info'
Old smatch warnings:
fs/btrfs/zoned.c:169 sb_zone_number() error: uninitialized symbol 'zone'.
fs/btrfs/zoned.c:1452 btrfs_load_block_group_zone_info() error: uninitialized symbol 'ret'.
vim +/zone_info +597 fs/btrfs/zoned.c
1c0066baa869433 Naohiro Aota 2021-11-11 348 int btrfs_get_dev_zone_info(struct btrfs_device *device, bool populate_cache)
5b316468983dfa9 Naohiro Aota 2020-11-10 349 {
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 350 struct btrfs_fs_info *fs_info = device->fs_info;
5b316468983dfa9 Naohiro Aota 2020-11-10 351 struct btrfs_zoned_device_info *zone_info = NULL;
5b316468983dfa9 Naohiro Aota 2020-11-10 352 struct block_device *bdev = device->bdev;
ea6f8ddcde63812 Naohiro Aota 2021-08-19 353 struct request_queue *queue = bdev_get_queue(bdev);
ea6f8ddcde63812 Naohiro Aota 2021-08-19 354 unsigned int max_active_zones;
ea6f8ddcde63812 Naohiro Aota 2021-08-19 355 unsigned int nactive;
5b316468983dfa9 Naohiro Aota 2020-11-10 356 sector_t nr_sectors;
5b316468983dfa9 Naohiro Aota 2020-11-10 357 sector_t sector = 0;
5b316468983dfa9 Naohiro Aota 2020-11-10 358 struct blk_zone *zones = NULL;
5b316468983dfa9 Naohiro Aota 2020-11-10 359 unsigned int i, nreported = 0, nr_zones;
d734492a14a2da6 Naohiro Aota 2021-03-03 360 sector_t zone_sectors;
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 361 char *model, *emulated;
5b316468983dfa9 Naohiro Aota 2020-11-10 362 int ret;
5b316468983dfa9 Naohiro Aota 2020-11-10 363
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 364 /*
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 365 * Cannot use btrfs_is_zoned here, since fs_info::zone_size might not
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 366 * yet be set.
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 367 */
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 368 if (!btrfs_fs_incompat(fs_info, ZONED))
5b316468983dfa9 Naohiro Aota 2020-11-10 369 return 0;
5b316468983dfa9 Naohiro Aota 2020-11-10 370
5b316468983dfa9 Naohiro Aota 2020-11-10 371 if (device->zone_info)
5b316468983dfa9 Naohiro Aota 2020-11-10 372 return 0;
5b316468983dfa9 Naohiro Aota 2020-11-10 373
5b316468983dfa9 Naohiro Aota 2020-11-10 374 zone_info = kzalloc(sizeof(*zone_info), GFP_KERNEL);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
5b316468983dfa9 Naohiro Aota 2020-11-10 375 if (!zone_info)
5b316468983dfa9 Naohiro Aota 2020-11-10 376 return -ENOMEM;
5b316468983dfa9 Naohiro Aota 2020-11-10 377
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 378 if (!bdev_is_zoned(bdev)) {
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 379 if (!fs_info->zone_size) {
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 380 ret = calculate_emulated_zone_size(fs_info);
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 381 if (ret)
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 382 goto out;
^^^^^^^^^
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 383 }
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 384
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 385 ASSERT(fs_info->zone_size);
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 386 zone_sectors = fs_info->zone_size >> SECTOR_SHIFT;
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 387 } else {
5b316468983dfa9 Naohiro Aota 2020-11-10 388 zone_sectors = bdev_zone_sectors(bdev);
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 389 }
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 390
5b316468983dfa9 Naohiro Aota 2020-11-10 391 /* Check if it's power of 2 (see is_power_of_2) */
5b316468983dfa9 Naohiro Aota 2020-11-10 392 ASSERT(zone_sectors != 0 && (zone_sectors & (zone_sectors - 1)) == 0);
5b316468983dfa9 Naohiro Aota 2020-11-10 393 zone_info->zone_size = zone_sectors << SECTOR_SHIFT;
53b74fa990bf76f Naohiro Aota 2021-04-08 394
53b74fa990bf76f Naohiro Aota 2021-04-08 395 /* We reject devices with a zone size larger than 8GB */
53b74fa990bf76f Naohiro Aota 2021-04-08 396 if (zone_info->zone_size > BTRFS_MAX_ZONE_SIZE) {
53b74fa990bf76f Naohiro Aota 2021-04-08 397 btrfs_err_in_rcu(fs_info,
53b74fa990bf76f Naohiro Aota 2021-04-08 398 "zoned: %s: zone size %llu larger than supported maximum %llu",
53b74fa990bf76f Naohiro Aota 2021-04-08 399 rcu_str_deref(device->name),
53b74fa990bf76f Naohiro Aota 2021-04-08 400 zone_info->zone_size, BTRFS_MAX_ZONE_SIZE);
53b74fa990bf76f Naohiro Aota 2021-04-08 401 ret = -EINVAL;
53b74fa990bf76f Naohiro Aota 2021-04-08 402 goto out;
53b74fa990bf76f Naohiro Aota 2021-04-08 403 }
53b74fa990bf76f Naohiro Aota 2021-04-08 404
53b74fa990bf76f Naohiro Aota 2021-04-08 405 nr_sectors = bdev_nr_sectors(bdev);
5b316468983dfa9 Naohiro Aota 2020-11-10 406 zone_info->zone_size_shift = ilog2(zone_info->zone_size);
5b316468983dfa9 Naohiro Aota 2020-11-10 407 zone_info->nr_zones = nr_sectors >> ilog2(zone_sectors);
5b316468983dfa9 Naohiro Aota 2020-11-10 408 if (!IS_ALIGNED(nr_sectors, zone_sectors))
5b316468983dfa9 Naohiro Aota 2020-11-10 409 zone_info->nr_zones++;
5b316468983dfa9 Naohiro Aota 2020-11-10 410
ea6f8ddcde63812 Naohiro Aota 2021-08-19 411 max_active_zones = queue_max_active_zones(queue);
ea6f8ddcde63812 Naohiro Aota 2021-08-19 412 if (max_active_zones && max_active_zones < BTRFS_MIN_ACTIVE_ZONES) {
ea6f8ddcde63812 Naohiro Aota 2021-08-19 413 btrfs_err_in_rcu(fs_info,
ea6f8ddcde63812 Naohiro Aota 2021-08-19 414 "zoned: %s: max active zones %u is too small, need@least %u active zones",
ea6f8ddcde63812 Naohiro Aota 2021-08-19 415 rcu_str_deref(device->name), max_active_zones,
ea6f8ddcde63812 Naohiro Aota 2021-08-19 416 BTRFS_MIN_ACTIVE_ZONES);
ea6f8ddcde63812 Naohiro Aota 2021-08-19 417 ret = -EINVAL;
ea6f8ddcde63812 Naohiro Aota 2021-08-19 418 goto out;
ea6f8ddcde63812 Naohiro Aota 2021-08-19 419 }
ea6f8ddcde63812 Naohiro Aota 2021-08-19 420 zone_info->max_active_zones = max_active_zones;
ea6f8ddcde63812 Naohiro Aota 2021-08-19 421
5b316468983dfa9 Naohiro Aota 2020-11-10 422 zone_info->seq_zones = bitmap_zalloc(zone_info->nr_zones, GFP_KERNEL);
5b316468983dfa9 Naohiro Aota 2020-11-10 423 if (!zone_info->seq_zones) {
5b316468983dfa9 Naohiro Aota 2020-11-10 424 ret = -ENOMEM;
5b316468983dfa9 Naohiro Aota 2020-11-10 425 goto out;
5b316468983dfa9 Naohiro Aota 2020-11-10 426 }
5b316468983dfa9 Naohiro Aota 2020-11-10 427
5b316468983dfa9 Naohiro Aota 2020-11-10 428 zone_info->empty_zones = bitmap_zalloc(zone_info->nr_zones, GFP_KERNEL);
5b316468983dfa9 Naohiro Aota 2020-11-10 429 if (!zone_info->empty_zones) {
5b316468983dfa9 Naohiro Aota 2020-11-10 430 ret = -ENOMEM;
5b316468983dfa9 Naohiro Aota 2020-11-10 431 goto out;
5b316468983dfa9 Naohiro Aota 2020-11-10 432 }
5b316468983dfa9 Naohiro Aota 2020-11-10 433
ea6f8ddcde63812 Naohiro Aota 2021-08-19 434 zone_info->active_zones = bitmap_zalloc(zone_info->nr_zones, GFP_KERNEL);
ea6f8ddcde63812 Naohiro Aota 2021-08-19 435 if (!zone_info->active_zones) {
ea6f8ddcde63812 Naohiro Aota 2021-08-19 436 ret = -ENOMEM;
ea6f8ddcde63812 Naohiro Aota 2021-08-19 437 goto out;
ea6f8ddcde63812 Naohiro Aota 2021-08-19 438 }
ea6f8ddcde63812 Naohiro Aota 2021-08-19 439
5b316468983dfa9 Naohiro Aota 2020-11-10 440 zones = kcalloc(BTRFS_REPORT_NR_ZONES, sizeof(struct blk_zone), GFP_KERNEL);
5b316468983dfa9 Naohiro Aota 2020-11-10 441 if (!zones) {
5b316468983dfa9 Naohiro Aota 2020-11-10 442 ret = -ENOMEM;
5b316468983dfa9 Naohiro Aota 2020-11-10 443 goto out;
5b316468983dfa9 Naohiro Aota 2020-11-10 444 }
5b316468983dfa9 Naohiro Aota 2020-11-10 445
1c0066baa869433 Naohiro Aota 2021-11-11 446 /*
1c0066baa869433 Naohiro Aota 2021-11-11 447 * Enable zone cache only for a zoned device. On a non-zoned device, we
1c0066baa869433 Naohiro Aota 2021-11-11 448 * fill the zone info with emulated CONVENTIONAL zones, so no need to
1c0066baa869433 Naohiro Aota 2021-11-11 449 * use the cache.
1c0066baa869433 Naohiro Aota 2021-11-11 450 */
1c0066baa869433 Naohiro Aota 2021-11-11 451 if (populate_cache && bdev_is_zoned(device->bdev)) {
1c0066baa869433 Naohiro Aota 2021-11-11 452 zone_info->zone_cache = vzalloc(sizeof(struct blk_zone) *
1c0066baa869433 Naohiro Aota 2021-11-11 453 zone_info->nr_zones);
1c0066baa869433 Naohiro Aota 2021-11-11 454 if (!zone_info->zone_cache) {
1c0066baa869433 Naohiro Aota 2021-11-11 455 btrfs_err_in_rcu(device->fs_info,
1c0066baa869433 Naohiro Aota 2021-11-11 456 "zoned: failed to allocate zone cache for %s",
1c0066baa869433 Naohiro Aota 2021-11-11 457 rcu_str_deref(device->name));
1c0066baa869433 Naohiro Aota 2021-11-11 458 ret = -ENOMEM;
1c0066baa869433 Naohiro Aota 2021-11-11 459 goto out;
1c0066baa869433 Naohiro Aota 2021-11-11 460 }
1c0066baa869433 Naohiro Aota 2021-11-11 461 }
1c0066baa869433 Naohiro Aota 2021-11-11 462
1c0066baa869433 Naohiro Aota 2021-11-11 463 device->zone_info = zone_info;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error paths after this point will free zone_info and the bitmaps.
1c0066baa869433 Naohiro Aota 2021-11-11 464
5b316468983dfa9 Naohiro Aota 2020-11-10 465 /* Get zones type */
ea6f8ddcde63812 Naohiro Aota 2021-08-19 466 nactive = 0;
5b316468983dfa9 Naohiro Aota 2020-11-10 467 while (sector < nr_sectors) {
5b316468983dfa9 Naohiro Aota 2020-11-10 468 nr_zones = BTRFS_REPORT_NR_ZONES;
5b316468983dfa9 Naohiro Aota 2020-11-10 469 ret = btrfs_get_dev_zones(device, sector << SECTOR_SHIFT, zones,
5b316468983dfa9 Naohiro Aota 2020-11-10 470 &nr_zones);
5b316468983dfa9 Naohiro Aota 2020-11-10 471 if (ret)
5b316468983dfa9 Naohiro Aota 2020-11-10 472 goto out;
5b316468983dfa9 Naohiro Aota 2020-11-10 473
5b316468983dfa9 Naohiro Aota 2020-11-10 474 for (i = 0; i < nr_zones; i++) {
5b316468983dfa9 Naohiro Aota 2020-11-10 475 if (zones[i].type == BLK_ZONE_TYPE_SEQWRITE_REQ)
5b316468983dfa9 Naohiro Aota 2020-11-10 476 __set_bit(nreported, zone_info->seq_zones);
ea6f8ddcde63812 Naohiro Aota 2021-08-19 477 switch (zones[i].cond) {
ea6f8ddcde63812 Naohiro Aota 2021-08-19 478 case BLK_ZONE_COND_EMPTY:
5b316468983dfa9 Naohiro Aota 2020-11-10 479 __set_bit(nreported, zone_info->empty_zones);
ea6f8ddcde63812 Naohiro Aota 2021-08-19 480 break;
ea6f8ddcde63812 Naohiro Aota 2021-08-19 481 case BLK_ZONE_COND_IMP_OPEN:
ea6f8ddcde63812 Naohiro Aota 2021-08-19 482 case BLK_ZONE_COND_EXP_OPEN:
ea6f8ddcde63812 Naohiro Aota 2021-08-19 483 case BLK_ZONE_COND_CLOSED:
ea6f8ddcde63812 Naohiro Aota 2021-08-19 484 __set_bit(nreported, zone_info->active_zones);
ea6f8ddcde63812 Naohiro Aota 2021-08-19 485 nactive++;
ea6f8ddcde63812 Naohiro Aota 2021-08-19 486 break;
ea6f8ddcde63812 Naohiro Aota 2021-08-19 487 }
5b316468983dfa9 Naohiro Aota 2020-11-10 488 nreported++;
5b316468983dfa9 Naohiro Aota 2020-11-10 489 }
5b316468983dfa9 Naohiro Aota 2020-11-10 490 sector = zones[nr_zones - 1].start + zones[nr_zones - 1].len;
5b316468983dfa9 Naohiro Aota 2020-11-10 491 }
5b316468983dfa9 Naohiro Aota 2020-11-10 492
5b316468983dfa9 Naohiro Aota 2020-11-10 493 if (nreported != zone_info->nr_zones) {
5b316468983dfa9 Naohiro Aota 2020-11-10 494 btrfs_err_in_rcu(device->fs_info,
5b316468983dfa9 Naohiro Aota 2020-11-10 495 "inconsistent number of zones on %s (%u/%u)",
5b316468983dfa9 Naohiro Aota 2020-11-10 496 rcu_str_deref(device->name), nreported,
5b316468983dfa9 Naohiro Aota 2020-11-10 497 zone_info->nr_zones);
5b316468983dfa9 Naohiro Aota 2020-11-10 498 ret = -EIO;
5b316468983dfa9 Naohiro Aota 2020-11-10 499 goto out;
5b316468983dfa9 Naohiro Aota 2020-11-10 500 }
5b316468983dfa9 Naohiro Aota 2020-11-10 501
ea6f8ddcde63812 Naohiro Aota 2021-08-19 502 if (max_active_zones) {
ea6f8ddcde63812 Naohiro Aota 2021-08-19 503 if (nactive > max_active_zones) {
ea6f8ddcde63812 Naohiro Aota 2021-08-19 504 btrfs_err_in_rcu(device->fs_info,
ea6f8ddcde63812 Naohiro Aota 2021-08-19 505 "zoned: %u active zones on %s exceeds max_active_zones %u",
ea6f8ddcde63812 Naohiro Aota 2021-08-19 506 nactive, rcu_str_deref(device->name),
ea6f8ddcde63812 Naohiro Aota 2021-08-19 507 max_active_zones);
ea6f8ddcde63812 Naohiro Aota 2021-08-19 508 ret = -EIO;
ea6f8ddcde63812 Naohiro Aota 2021-08-19 509 goto out;
ea6f8ddcde63812 Naohiro Aota 2021-08-19 510 }
ea6f8ddcde63812 Naohiro Aota 2021-08-19 511 atomic_set(&zone_info->active_zones_left,
ea6f8ddcde63812 Naohiro Aota 2021-08-19 512 max_active_zones - nactive);
ea6f8ddcde63812 Naohiro Aota 2021-08-19 513 }
ea6f8ddcde63812 Naohiro Aota 2021-08-19 514
12659251ca5df05 Naohiro Aota 2020-11-10 515 /* Validate superblock log */
12659251ca5df05 Naohiro Aota 2020-11-10 516 nr_zones = BTRFS_NR_SB_LOG_ZONES;
12659251ca5df05 Naohiro Aota 2020-11-10 517 for (i = 0; i < BTRFS_SUPER_MIRROR_MAX; i++) {
12659251ca5df05 Naohiro Aota 2020-11-10 518 u32 sb_zone;
12659251ca5df05 Naohiro Aota 2020-11-10 519 u64 sb_wp;
12659251ca5df05 Naohiro Aota 2020-11-10 520 int sb_pos = BTRFS_NR_SB_LOG_ZONES * i;
12659251ca5df05 Naohiro Aota 2020-11-10 521
12659251ca5df05 Naohiro Aota 2020-11-10 522 sb_zone = sb_zone_number(zone_info->zone_size_shift, i);
12659251ca5df05 Naohiro Aota 2020-11-10 523 if (sb_zone + 1 >= zone_info->nr_zones)
12659251ca5df05 Naohiro Aota 2020-11-10 524 continue;
12659251ca5df05 Naohiro Aota 2020-11-10 525
5b434df8778771d Naohiro Aota 2021-05-27 526 ret = btrfs_get_dev_zones(device,
5b434df8778771d Naohiro Aota 2021-05-27 527 zone_start_physical(sb_zone, zone_info),
12659251ca5df05 Naohiro Aota 2020-11-10 528 &zone_info->sb_zones[sb_pos],
12659251ca5df05 Naohiro Aota 2020-11-10 529 &nr_zones);
12659251ca5df05 Naohiro Aota 2020-11-10 530 if (ret)
12659251ca5df05 Naohiro Aota 2020-11-10 531 goto out;
12659251ca5df05 Naohiro Aota 2020-11-10 532
12659251ca5df05 Naohiro Aota 2020-11-10 533 if (nr_zones != BTRFS_NR_SB_LOG_ZONES) {
12659251ca5df05 Naohiro Aota 2020-11-10 534 btrfs_err_in_rcu(device->fs_info,
12659251ca5df05 Naohiro Aota 2020-11-10 535 "zoned: failed to read super block log zone info at devid %llu zone %u",
12659251ca5df05 Naohiro Aota 2020-11-10 536 device->devid, sb_zone);
12659251ca5df05 Naohiro Aota 2020-11-10 537 ret = -EUCLEAN;
12659251ca5df05 Naohiro Aota 2020-11-10 538 goto out;
12659251ca5df05 Naohiro Aota 2020-11-10 539 }
12659251ca5df05 Naohiro Aota 2020-11-10 540
12659251ca5df05 Naohiro Aota 2020-11-10 541 /*
1a9fd4172d5c8ba David Sterba 2021-05-21 542 * If zones[0] is conventional, always use the beginning of the
12659251ca5df05 Naohiro Aota 2020-11-10 543 * zone to record superblock. No need to validate in that case.
12659251ca5df05 Naohiro Aota 2020-11-10 544 */
12659251ca5df05 Naohiro Aota 2020-11-10 545 if (zone_info->sb_zones[BTRFS_NR_SB_LOG_ZONES * i].type ==
12659251ca5df05 Naohiro Aota 2020-11-10 546 BLK_ZONE_TYPE_CONVENTIONAL)
12659251ca5df05 Naohiro Aota 2020-11-10 547 continue;
12659251ca5df05 Naohiro Aota 2020-11-10 548
12659251ca5df05 Naohiro Aota 2020-11-10 549 ret = sb_write_pointer(device->bdev,
12659251ca5df05 Naohiro Aota 2020-11-10 550 &zone_info->sb_zones[sb_pos], &sb_wp);
12659251ca5df05 Naohiro Aota 2020-11-10 551 if (ret != -ENOENT && ret) {
12659251ca5df05 Naohiro Aota 2020-11-10 552 btrfs_err_in_rcu(device->fs_info,
12659251ca5df05 Naohiro Aota 2020-11-10 553 "zoned: super block log zone corrupted devid %llu zone %u",
12659251ca5df05 Naohiro Aota 2020-11-10 554 device->devid, sb_zone);
12659251ca5df05 Naohiro Aota 2020-11-10 555 ret = -EUCLEAN;
12659251ca5df05 Naohiro Aota 2020-11-10 556 goto out;
12659251ca5df05 Naohiro Aota 2020-11-10 557 }
12659251ca5df05 Naohiro Aota 2020-11-10 558 }
12659251ca5df05 Naohiro Aota 2020-11-10 559
12659251ca5df05 Naohiro Aota 2020-11-10 560
5b316468983dfa9 Naohiro Aota 2020-11-10 561 kfree(zones);
5b316468983dfa9 Naohiro Aota 2020-11-10 562
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 563 switch (bdev_zoned_model(bdev)) {
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 564 case BLK_ZONED_HM:
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 565 model = "host-managed zoned";
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 566 emulated = "";
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 567 break;
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 568 case BLK_ZONED_HA:
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 569 model = "host-aware zoned";
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 570 emulated = "";
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 571 break;
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 572 case BLK_ZONED_NONE:
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 573 model = "regular";
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 574 emulated = "emulated ";
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 575 break;
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 576 default:
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 577 /* Just in case */
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 578 btrfs_err_in_rcu(fs_info, "zoned: unsupported model %d on %s",
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 579 bdev_zoned_model(bdev),
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 580 rcu_str_deref(device->name));
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 581 ret = -EOPNOTSUPP;
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 582 goto out_free_zone_info;
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 583 }
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 584
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 585 btrfs_info_in_rcu(fs_info,
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 586 "%s block device %s, %u %szones of %llu bytes",
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 587 model, rcu_str_deref(device->name), zone_info->nr_zones,
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 588 emulated, zone_info->zone_size);
5b316468983dfa9 Naohiro Aota 2020-11-10 589
5b316468983dfa9 Naohiro Aota 2020-11-10 590 return 0;
5b316468983dfa9 Naohiro Aota 2020-11-10 591
5b316468983dfa9 Naohiro Aota 2020-11-10 592 out:
5b316468983dfa9 Naohiro Aota 2020-11-10 593 kfree(zones);
3c9daa09ccd43f6 Johannes Thumshirn 2021-02-04 594 out_free_zone_info:
0a2a39576fa1dd6 Johannes Thumshirn 2021-12-07 595 btrfs_destroy_dev_zone_info(device);
5b316468983dfa9 Naohiro Aota 2020-11-10 596
5b316468983dfa9 Naohiro Aota 2020-11-10 @597 return ret;
^^^^^^^^^^
leaks
5b316468983dfa9 Naohiro Aota 2020-11-10 598 }
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] btrfs: zoned: free zone_cache when freeing zone_info
2021-12-10 11:09 ` Dan Carpenter
(?)
@ 2021-12-10 11:40 ` Johannes Thumshirn
-1 siblings, 0 replies; 5+ messages in thread
From: Johannes Thumshirn @ 2021-12-10 11:40 UTC (permalink / raw)
To: kbuild-all
[-- Attachment #1: Type: text/plain, Size: 1058 bytes --]
On 10/12/2021 12:09, Dan Carpenter wrote:
> Hi Johannes,
>
> url: https://github.com/0day-ci/linux/commits/Johannes-Thumshirn/btrfs-zoned-free-zone_cache-when-freeing-zone_info/20211207-215928
> base: https://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git for-next
> config: i386-randconfig-m021-20211207 (https://download.01.org/0day-ci/archive/20211209/202112090657.BflsS2SD-lkp(a)intel.com/config)
> compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
>
> If you fix the issue, kindly add following tag as appropriate
> Reported-by: kernel test robot <lkp@intel.com>
> Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
>
Hi Dan,
I've send a fix.
> New smatch warnings:
> fs/btrfs/zoned.c:597 btrfs_get_dev_zone_info() warn: possible memory leak of 'zone_info'
>
> Old smatch warnings:
> fs/btrfs/zoned.c:169 sb_zone_number() error: uninitialized symbol 'zone'.
> fs/btrfs/zoned.c:1452 btrfs_load_block_group_zone_info() error: uninitialized symbol 'ret'.
>
These two are false positive afaics.
Byte,
Johannes
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2021-12-10 11:40 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-07 13:58 [PATCH v2] btrfs: zoned: free zone_cache when freeing zone_info Johannes Thumshirn
2021-12-07 16:51 ` David Sterba
2021-12-08 22:11 kernel test robot
2021-12-10 11:09 ` Dan Carpenter
2021-12-10 11:40 ` Johannes Thumshirn
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.