Commit 53de7ee4 authored by Johannes Thumshirn's avatar Johannes Thumshirn Committed by David Sterba
Browse files

btrfs: zoned: don't fail mount needlessly due to too many active zones



Previously BTRFS did not look at a device's reported max_open_zones limit,
but starting with commit 04147d83 ("btrfs: zoned: limit active zones
to max_open_zones"), zoned BTRFS limited the number of concurrently used
block-groups to the number of max_open_zones a device reported, if it
hadn't already reported a number of max_active_zones.

Starting with commit 04147d83 the number of open zones is treated the
same way as active zones. But this leads to mount failures on filesystems
which have been used before 04147d83 because too many zones are in an
open state.

Ignore the new limitations on these filesystems, so zones can be finished
or evacuated.

Reported-by: default avatarYuwei Han <hrx@bupt.moe>
Link: https://lore.kernel.org/all/2F48A90AF7DDF380+1790bcfd-cb6f-456b-870d-7982f21b5eae@bupt.moe/


Fixes: 04147d83 ("btrfs: zoned: limit active zones to max_open_zones")
Reviewed-by: default avatarNaohiro Aota <naohiro.aota@wdc.com>
Signed-off-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent b98b2083
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -514,6 +514,11 @@ int btrfs_get_dev_zone_info(struct btrfs_device *device, bool populate_cache)

	if (max_active_zones) {
		if (nactive > max_active_zones) {
			if (bdev_max_active_zones(bdev) == 0) {
				max_active_zones = 0;
				zone_info->max_active_zones = 0;
				goto validate;
			}
			btrfs_err(device->fs_info,
			"zoned: %u active zones on %s exceeds max_active_zones %u",
					 nactive, rcu_dereference(device->name),
@@ -526,6 +531,7 @@ int btrfs_get_dev_zone_info(struct btrfs_device *device, bool populate_cache)
		set_bit(BTRFS_FS_ACTIVE_ZONE_TRACKING, &fs_info->flags);
	}

validate:
	/* Validate superblock log */
	nr_zones = BTRFS_NR_SB_LOG_ZONES;
	for (i = 0; i < BTRFS_SUPER_MIRROR_MAX; i++) {