All of lore.kernel.org
 help / color / mirror / Atom feed
From: kernel test robot <lkp@intel.com>
To: kbuild@lists.01.org
Subject: Re: [PATCH v2] btrfs: zoned: free zone_cache when freeing zone_info
Date: Thu, 09 Dec 2021 06:11:28 +0800	[thread overview]
Message-ID: <202112090657.BflsS2SD-lkp@intel.com> (raw)

[-- 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

WARNING: multiple messages have this Message-ID (diff)
From: Dan Carpenter <dan.carpenter@oracle.com>
To: kbuild-all@lists.01.org
Subject: Re: [PATCH v2] btrfs: zoned: free zone_cache when freeing zone_info
Date: Fri, 10 Dec 2021 14:09:07 +0300	[thread overview]
Message-ID: <202112090657.BflsS2SD-lkp@intel.com> (raw)
In-Reply-To: <f3ea96654bb7f39afb15555dece992f2a8479608.1638879879.git.johannes.thumshirn@wdc.com>

[-- 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

             reply	other threads:[~2021-12-08 22:11 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-12-08 22:11 kernel test robot [this message]
2021-12-10 11:09 ` [PATCH v2] btrfs: zoned: free zone_cache when freeing zone_info Dan Carpenter
2021-12-10 11:40 ` Johannes Thumshirn
  -- strict thread matches above, loose matches on Subject: below --
2021-12-07 13:58 Johannes Thumshirn
2021-12-07 16:51 ` David Sterba

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=202112090657.BflsS2SD-lkp@intel.com \
    --to=lkp@intel.com \
    --cc=kbuild@lists.01.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.