All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.