brintos

brintos / linux-shallow public Read only

0
0
Text · 70.1 KiB · 69d03fe Raw
2651 lines · c
1// SPDX-License-Identifier: GPL-2.02 3#include <linux/bitops.h>4#include <linux/slab.h>5#include <linux/blkdev.h>6#include <linux/sched/mm.h>7#include <linux/atomic.h>8#include <linux/vmalloc.h>9#include "ctree.h"10#include "volumes.h"11#include "zoned.h"12#include "rcu-string.h"13#include "disk-io.h"14#include "block-group.h"15#include "dev-replace.h"16#include "space-info.h"17#include "fs.h"18#include "accessors.h"19#include "bio.h"20 21/* Maximum number of zones to report per blkdev_report_zones() call */22#define BTRFS_REPORT_NR_ZONES   409623/* Invalid allocation pointer value for missing devices */24#define WP_MISSING_DEV ((u64)-1)25/* Pseudo write pointer value for conventional zone */26#define WP_CONVENTIONAL ((u64)-2)27 28/*29 * Location of the first zone of superblock logging zone pairs.30 *31 * - primary superblock:    0B (zone 0)32 * - first copy:          512G (zone starting at that offset)33 * - second copy:           4T (zone starting at that offset)34 */35#define BTRFS_SB_LOG_PRIMARY_OFFSET	(0ULL)36#define BTRFS_SB_LOG_FIRST_OFFSET	(512ULL * SZ_1G)37#define BTRFS_SB_LOG_SECOND_OFFSET	(4096ULL * SZ_1G)38 39#define BTRFS_SB_LOG_FIRST_SHIFT	const_ilog2(BTRFS_SB_LOG_FIRST_OFFSET)40#define BTRFS_SB_LOG_SECOND_SHIFT	const_ilog2(BTRFS_SB_LOG_SECOND_OFFSET)41 42/* Number of superblock log zones */43#define BTRFS_NR_SB_LOG_ZONES 244 45/*46 * Minimum of active zones we need:47 *48 * - BTRFS_SUPER_MIRROR_MAX zones for superblock mirrors49 * - 3 zones to ensure at least one zone per SYSTEM, META and DATA block group50 * - 1 zone for tree-log dedicated block group51 * - 1 zone for relocation52 */53#define BTRFS_MIN_ACTIVE_ZONES		(BTRFS_SUPER_MIRROR_MAX + 5)54 55/*56 * Minimum / maximum supported zone size. Currently, SMR disks have a zone57 * size of 256MiB, and we are expecting ZNS drives to be in the 1-4GiB range.58 * We do not expect the zone size to become larger than 8GiB or smaller than59 * 4MiB in the near future.60 */61#define BTRFS_MAX_ZONE_SIZE		SZ_8G62#define BTRFS_MIN_ZONE_SIZE		SZ_4M63 64#define SUPER_INFO_SECTORS	((u64)BTRFS_SUPER_INFO_SIZE >> SECTOR_SHIFT)65 66static void wait_eb_writebacks(struct btrfs_block_group *block_group);67static int do_zone_finish(struct btrfs_block_group *block_group, bool fully_written);68 69static inline bool sb_zone_is_full(const struct blk_zone *zone)70{71	return (zone->cond == BLK_ZONE_COND_FULL) ||72		(zone->wp + SUPER_INFO_SECTORS > zone->start + zone->capacity);73}74 75static int copy_zone_info_cb(struct blk_zone *zone, unsigned int idx, void *data)76{77	struct blk_zone *zones = data;78 79	memcpy(&zones[idx], zone, sizeof(*zone));80 81	return 0;82}83 84static int sb_write_pointer(struct block_device *bdev, struct blk_zone *zones,85			    u64 *wp_ret)86{87	bool empty[BTRFS_NR_SB_LOG_ZONES];88	bool full[BTRFS_NR_SB_LOG_ZONES];89	sector_t sector;90 91	for (int i = 0; i < BTRFS_NR_SB_LOG_ZONES; i++) {92		ASSERT(zones[i].type != BLK_ZONE_TYPE_CONVENTIONAL);93		empty[i] = (zones[i].cond == BLK_ZONE_COND_EMPTY);94		full[i] = sb_zone_is_full(&zones[i]);95	}96 97	/*98	 * Possible states of log buffer zones99	 *100	 *           Empty[0]  In use[0]  Full[0]101	 * Empty[1]         *          0        1102	 * In use[1]        x          x        1103	 * Full[1]          0          0        C104	 *105	 * Log position:106	 *   *: Special case, no superblock is written107	 *   0: Use write pointer of zones[0]108	 *   1: Use write pointer of zones[1]109	 *   C: Compare super blocks from zones[0] and zones[1], use the latest110	 *      one determined by generation111	 *   x: Invalid state112	 */113 114	if (empty[0] && empty[1]) {115		/* Special case to distinguish no superblock to read */116		*wp_ret = zones[0].start << SECTOR_SHIFT;117		return -ENOENT;118	} else if (full[0] && full[1]) {119		/* Compare two super blocks */120		struct address_space *mapping = bdev->bd_mapping;121		struct page *page[BTRFS_NR_SB_LOG_ZONES];122		struct btrfs_super_block *super[BTRFS_NR_SB_LOG_ZONES];123 124		for (int i = 0; i < BTRFS_NR_SB_LOG_ZONES; i++) {125			u64 zone_end = (zones[i].start + zones[i].capacity) << SECTOR_SHIFT;126			u64 bytenr = ALIGN_DOWN(zone_end, BTRFS_SUPER_INFO_SIZE) -127						BTRFS_SUPER_INFO_SIZE;128 129			page[i] = read_cache_page_gfp(mapping,130					bytenr >> PAGE_SHIFT, GFP_NOFS);131			if (IS_ERR(page[i])) {132				if (i == 1)133					btrfs_release_disk_super(super[0]);134				return PTR_ERR(page[i]);135			}136			super[i] = page_address(page[i]);137		}138 139		if (btrfs_super_generation(super[0]) >140		    btrfs_super_generation(super[1]))141			sector = zones[1].start;142		else143			sector = zones[0].start;144 145		for (int i = 0; i < BTRFS_NR_SB_LOG_ZONES; i++)146			btrfs_release_disk_super(super[i]);147	} else if (!full[0] && (empty[1] || full[1])) {148		sector = zones[0].wp;149	} else if (full[0]) {150		sector = zones[1].wp;151	} else {152		return -EUCLEAN;153	}154	*wp_ret = sector << SECTOR_SHIFT;155	return 0;156}157 158/*159 * Get the first zone number of the superblock mirror160 */161static inline u32 sb_zone_number(int shift, int mirror)162{163	u64 zone = U64_MAX;164 165	ASSERT(mirror < BTRFS_SUPER_MIRROR_MAX);166	switch (mirror) {167	case 0: zone = 0; break;168	case 1: zone = 1ULL << (BTRFS_SB_LOG_FIRST_SHIFT - shift); break;169	case 2: zone = 1ULL << (BTRFS_SB_LOG_SECOND_SHIFT - shift); break;170	}171 172	ASSERT(zone <= U32_MAX);173 174	return (u32)zone;175}176 177static inline sector_t zone_start_sector(u32 zone_number,178					 struct block_device *bdev)179{180	return (sector_t)zone_number << ilog2(bdev_zone_sectors(bdev));181}182 183static inline u64 zone_start_physical(u32 zone_number,184				      struct btrfs_zoned_device_info *zone_info)185{186	return (u64)zone_number << zone_info->zone_size_shift;187}188 189/*190 * Emulate blkdev_report_zones() for a non-zoned device. It slices up the block191 * device into static sized chunks and fake a conventional zone on each of192 * them.193 */194static int emulate_report_zones(struct btrfs_device *device, u64 pos,195				struct blk_zone *zones, unsigned int nr_zones)196{197	const sector_t zone_sectors = device->fs_info->zone_size >> SECTOR_SHIFT;198	sector_t bdev_size = bdev_nr_sectors(device->bdev);199	unsigned int i;200 201	pos >>= SECTOR_SHIFT;202	for (i = 0; i < nr_zones; i++) {203		zones[i].start = i * zone_sectors + pos;204		zones[i].len = zone_sectors;205		zones[i].capacity = zone_sectors;206		zones[i].wp = zones[i].start + zone_sectors;207		zones[i].type = BLK_ZONE_TYPE_CONVENTIONAL;208		zones[i].cond = BLK_ZONE_COND_NOT_WP;209 210		if (zones[i].wp >= bdev_size) {211			i++;212			break;213		}214	}215 216	return i;217}218 219static int btrfs_get_dev_zones(struct btrfs_device *device, u64 pos,220			       struct blk_zone *zones, unsigned int *nr_zones)221{222	struct btrfs_zoned_device_info *zinfo = device->zone_info;223	int ret;224 225	if (!*nr_zones)226		return 0;227 228	if (!bdev_is_zoned(device->bdev)) {229		ret = emulate_report_zones(device, pos, zones, *nr_zones);230		*nr_zones = ret;231		return 0;232	}233 234	/* Check cache */235	if (zinfo->zone_cache) {236		unsigned int i;237		u32 zno;238 239		ASSERT(IS_ALIGNED(pos, zinfo->zone_size));240		zno = pos >> zinfo->zone_size_shift;241		/*242		 * We cannot report zones beyond the zone end. So, it is OK to243		 * cap *nr_zones to at the end.244		 */245		*nr_zones = min_t(u32, *nr_zones, zinfo->nr_zones - zno);246 247		for (i = 0; i < *nr_zones; i++) {248			struct blk_zone *zone_info;249 250			zone_info = &zinfo->zone_cache[zno + i];251			if (!zone_info->len)252				break;253		}254 255		if (i == *nr_zones) {256			/* Cache hit on all the zones */257			memcpy(zones, zinfo->zone_cache + zno,258			       sizeof(*zinfo->zone_cache) * *nr_zones);259			return 0;260		}261	}262 263	ret = blkdev_report_zones(device->bdev, pos >> SECTOR_SHIFT, *nr_zones,264				  copy_zone_info_cb, zones);265	if (ret < 0) {266		btrfs_err_in_rcu(device->fs_info,267				 "zoned: failed to read zone %llu on %s (devid %llu)",268				 pos, rcu_str_deref(device->name),269				 device->devid);270		return ret;271	}272	*nr_zones = ret;273	if (!ret)274		return -EIO;275 276	/* Populate cache */277	if (zinfo->zone_cache) {278		u32 zno = pos >> zinfo->zone_size_shift;279 280		memcpy(zinfo->zone_cache + zno, zones,281		       sizeof(*zinfo->zone_cache) * *nr_zones);282	}283 284	return 0;285}286 287/* The emulated zone size is determined from the size of device extent */288static int calculate_emulated_zone_size(struct btrfs_fs_info *fs_info)289{290	BTRFS_PATH_AUTO_FREE(path);291	struct btrfs_root *root = fs_info->dev_root;292	struct btrfs_key key;293	struct extent_buffer *leaf;294	struct btrfs_dev_extent *dext;295	int ret = 0;296 297	key.objectid = 1;298	key.type = BTRFS_DEV_EXTENT_KEY;299	key.offset = 0;300 301	path = btrfs_alloc_path();302	if (!path)303		return -ENOMEM;304 305	ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);306	if (ret < 0)307		return ret;308 309	if (path->slots[0] >= btrfs_header_nritems(path->nodes[0])) {310		ret = btrfs_next_leaf(root, path);311		if (ret < 0)312			return ret;313		/* No dev extents at all? Not good */314		if (ret > 0)315			return -EUCLEAN;316	}317 318	leaf = path->nodes[0];319	dext = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_dev_extent);320	fs_info->zone_size = btrfs_dev_extent_length(leaf, dext);321	return 0;322}323 324int btrfs_get_dev_zone_info_all_devices(struct btrfs_fs_info *fs_info)325{326	struct btrfs_fs_devices *fs_devices = fs_info->fs_devices;327	struct btrfs_device *device;328	int ret = 0;329 330	/* fs_info->zone_size might not set yet. Use the incomapt flag here. */331	if (!btrfs_fs_incompat(fs_info, ZONED))332		return 0;333 334	mutex_lock(&fs_devices->device_list_mutex);335	list_for_each_entry(device, &fs_devices->devices, dev_list) {336		/* We can skip reading of zone info for missing devices */337		if (!device->bdev)338			continue;339 340		ret = btrfs_get_dev_zone_info(device, true);341		if (ret)342			break;343	}344	mutex_unlock(&fs_devices->device_list_mutex);345 346	return ret;347}348 349int btrfs_get_dev_zone_info(struct btrfs_device *device, bool populate_cache)350{351	struct btrfs_fs_info *fs_info = device->fs_info;352	struct btrfs_zoned_device_info *zone_info = NULL;353	struct block_device *bdev = device->bdev;354	unsigned int max_active_zones;355	unsigned int nactive;356	sector_t nr_sectors;357	sector_t sector = 0;358	struct blk_zone *zones = NULL;359	unsigned int i, nreported = 0, nr_zones;360	sector_t zone_sectors;361	char *model, *emulated;362	int ret;363 364	/*365	 * Cannot use btrfs_is_zoned here, since fs_info::zone_size might not366	 * yet be set.367	 */368	if (!btrfs_fs_incompat(fs_info, ZONED))369		return 0;370 371	if (device->zone_info)372		return 0;373 374	zone_info = kzalloc(sizeof(*zone_info), GFP_KERNEL);375	if (!zone_info)376		return -ENOMEM;377 378	device->zone_info = zone_info;379 380	if (!bdev_is_zoned(bdev)) {381		if (!fs_info->zone_size) {382			ret = calculate_emulated_zone_size(fs_info);383			if (ret)384				goto out;385		}386 387		ASSERT(fs_info->zone_size);388		zone_sectors = fs_info->zone_size >> SECTOR_SHIFT;389	} else {390		zone_sectors = bdev_zone_sectors(bdev);391	}392 393	ASSERT(is_power_of_two_u64(zone_sectors));394	zone_info->zone_size = zone_sectors << SECTOR_SHIFT;395 396	/* We reject devices with a zone size larger than 8GB */397	if (zone_info->zone_size > BTRFS_MAX_ZONE_SIZE) {398		btrfs_err_in_rcu(fs_info,399		"zoned: %s: zone size %llu larger than supported maximum %llu",400				 rcu_str_deref(device->name),401				 zone_info->zone_size, BTRFS_MAX_ZONE_SIZE);402		ret = -EINVAL;403		goto out;404	} else if (zone_info->zone_size < BTRFS_MIN_ZONE_SIZE) {405		btrfs_err_in_rcu(fs_info,406		"zoned: %s: zone size %llu smaller than supported minimum %u",407				 rcu_str_deref(device->name),408				 zone_info->zone_size, BTRFS_MIN_ZONE_SIZE);409		ret = -EINVAL;410		goto out;411	}412 413	nr_sectors = bdev_nr_sectors(bdev);414	zone_info->zone_size_shift = ilog2(zone_info->zone_size);415	zone_info->nr_zones = nr_sectors >> ilog2(zone_sectors);416	if (!IS_ALIGNED(nr_sectors, zone_sectors))417		zone_info->nr_zones++;418 419	max_active_zones = bdev_max_active_zones(bdev);420	if (max_active_zones && max_active_zones < BTRFS_MIN_ACTIVE_ZONES) {421		btrfs_err_in_rcu(fs_info,422"zoned: %s: max active zones %u is too small, need at least %u active zones",423				 rcu_str_deref(device->name), max_active_zones,424				 BTRFS_MIN_ACTIVE_ZONES);425		ret = -EINVAL;426		goto out;427	}428	zone_info->max_active_zones = max_active_zones;429 430	zone_info->seq_zones = bitmap_zalloc(zone_info->nr_zones, GFP_KERNEL);431	if (!zone_info->seq_zones) {432		ret = -ENOMEM;433		goto out;434	}435 436	zone_info->empty_zones = bitmap_zalloc(zone_info->nr_zones, GFP_KERNEL);437	if (!zone_info->empty_zones) {438		ret = -ENOMEM;439		goto out;440	}441 442	zone_info->active_zones = bitmap_zalloc(zone_info->nr_zones, GFP_KERNEL);443	if (!zone_info->active_zones) {444		ret = -ENOMEM;445		goto out;446	}447 448	zones = kvcalloc(BTRFS_REPORT_NR_ZONES, sizeof(struct blk_zone), GFP_KERNEL);449	if (!zones) {450		ret = -ENOMEM;451		goto out;452	}453 454	/*455	 * Enable zone cache only for a zoned device. On a non-zoned device, we456	 * fill the zone info with emulated CONVENTIONAL zones, so no need to457	 * use the cache.458	 */459	if (populate_cache && bdev_is_zoned(device->bdev)) {460		zone_info->zone_cache = vcalloc(zone_info->nr_zones,461						sizeof(struct blk_zone));462		if (!zone_info->zone_cache) {463			btrfs_err_in_rcu(device->fs_info,464				"zoned: failed to allocate zone cache for %s",465				rcu_str_deref(device->name));466			ret = -ENOMEM;467			goto out;468		}469	}470 471	/* Get zones type */472	nactive = 0;473	while (sector < nr_sectors) {474		nr_zones = BTRFS_REPORT_NR_ZONES;475		ret = btrfs_get_dev_zones(device, sector << SECTOR_SHIFT, zones,476					  &nr_zones);477		if (ret)478			goto out;479 480		for (i = 0; i < nr_zones; i++) {481			if (zones[i].type == BLK_ZONE_TYPE_SEQWRITE_REQ)482				__set_bit(nreported, zone_info->seq_zones);483			switch (zones[i].cond) {484			case BLK_ZONE_COND_EMPTY:485				__set_bit(nreported, zone_info->empty_zones);486				break;487			case BLK_ZONE_COND_IMP_OPEN:488			case BLK_ZONE_COND_EXP_OPEN:489			case BLK_ZONE_COND_CLOSED:490				__set_bit(nreported, zone_info->active_zones);491				nactive++;492				break;493			}494			nreported++;495		}496		sector = zones[nr_zones - 1].start + zones[nr_zones - 1].len;497	}498 499	if (nreported != zone_info->nr_zones) {500		btrfs_err_in_rcu(device->fs_info,501				 "inconsistent number of zones on %s (%u/%u)",502				 rcu_str_deref(device->name), nreported,503				 zone_info->nr_zones);504		ret = -EIO;505		goto out;506	}507 508	if (max_active_zones) {509		if (nactive > max_active_zones) {510			btrfs_err_in_rcu(device->fs_info,511			"zoned: %u active zones on %s exceeds max_active_zones %u",512					 nactive, rcu_str_deref(device->name),513					 max_active_zones);514			ret = -EIO;515			goto out;516		}517		atomic_set(&zone_info->active_zones_left,518			   max_active_zones - nactive);519		set_bit(BTRFS_FS_ACTIVE_ZONE_TRACKING, &fs_info->flags);520	}521 522	/* Validate superblock log */523	nr_zones = BTRFS_NR_SB_LOG_ZONES;524	for (i = 0; i < BTRFS_SUPER_MIRROR_MAX; i++) {525		u32 sb_zone;526		u64 sb_wp;527		int sb_pos = BTRFS_NR_SB_LOG_ZONES * i;528 529		sb_zone = sb_zone_number(zone_info->zone_size_shift, i);530		if (sb_zone + 1 >= zone_info->nr_zones)531			continue;532 533		ret = btrfs_get_dev_zones(device,534					  zone_start_physical(sb_zone, zone_info),535					  &zone_info->sb_zones[sb_pos],536					  &nr_zones);537		if (ret)538			goto out;539 540		if (nr_zones != BTRFS_NR_SB_LOG_ZONES) {541			btrfs_err_in_rcu(device->fs_info,542	"zoned: failed to read super block log zone info at devid %llu zone %u",543					 device->devid, sb_zone);544			ret = -EUCLEAN;545			goto out;546		}547 548		/*549		 * If zones[0] is conventional, always use the beginning of the550		 * zone to record superblock. No need to validate in that case.551		 */552		if (zone_info->sb_zones[BTRFS_NR_SB_LOG_ZONES * i].type ==553		    BLK_ZONE_TYPE_CONVENTIONAL)554			continue;555 556		ret = sb_write_pointer(device->bdev,557				       &zone_info->sb_zones[sb_pos], &sb_wp);558		if (ret != -ENOENT && ret) {559			btrfs_err_in_rcu(device->fs_info,560			"zoned: super block log zone corrupted devid %llu zone %u",561					 device->devid, sb_zone);562			ret = -EUCLEAN;563			goto out;564		}565	}566 567 568	kvfree(zones);569 570	if (bdev_is_zoned(bdev)) {571		model = "host-managed zoned";572		emulated = "";573	} else {574		model = "regular";575		emulated = "emulated ";576	}577 578	btrfs_info_in_rcu(fs_info,579		"%s block device %s, %u %szones of %llu bytes",580		model, rcu_str_deref(device->name), zone_info->nr_zones,581		emulated, zone_info->zone_size);582 583	return 0;584 585out:586	kvfree(zones);587	btrfs_destroy_dev_zone_info(device);588	return ret;589}590 591void btrfs_destroy_dev_zone_info(struct btrfs_device *device)592{593	struct btrfs_zoned_device_info *zone_info = device->zone_info;594 595	if (!zone_info)596		return;597 598	bitmap_free(zone_info->active_zones);599	bitmap_free(zone_info->seq_zones);600	bitmap_free(zone_info->empty_zones);601	vfree(zone_info->zone_cache);602	kfree(zone_info);603	device->zone_info = NULL;604}605 606struct btrfs_zoned_device_info *btrfs_clone_dev_zone_info(struct btrfs_device *orig_dev)607{608	struct btrfs_zoned_device_info *zone_info;609 610	zone_info = kmemdup(orig_dev->zone_info, sizeof(*zone_info), GFP_KERNEL);611	if (!zone_info)612		return NULL;613 614	zone_info->seq_zones = bitmap_zalloc(zone_info->nr_zones, GFP_KERNEL);615	if (!zone_info->seq_zones)616		goto out;617 618	bitmap_copy(zone_info->seq_zones, orig_dev->zone_info->seq_zones,619		    zone_info->nr_zones);620 621	zone_info->empty_zones = bitmap_zalloc(zone_info->nr_zones, GFP_KERNEL);622	if (!zone_info->empty_zones)623		goto out;624 625	bitmap_copy(zone_info->empty_zones, orig_dev->zone_info->empty_zones,626		    zone_info->nr_zones);627 628	zone_info->active_zones = bitmap_zalloc(zone_info->nr_zones, GFP_KERNEL);629	if (!zone_info->active_zones)630		goto out;631 632	bitmap_copy(zone_info->active_zones, orig_dev->zone_info->active_zones,633		    zone_info->nr_zones);634	zone_info->zone_cache = NULL;635 636	return zone_info;637 638out:639	bitmap_free(zone_info->seq_zones);640	bitmap_free(zone_info->empty_zones);641	bitmap_free(zone_info->active_zones);642	kfree(zone_info);643	return NULL;644}645 646static int btrfs_get_dev_zone(struct btrfs_device *device, u64 pos, struct blk_zone *zone)647{648	unsigned int nr_zones = 1;649	int ret;650 651	ret = btrfs_get_dev_zones(device, pos, zone, &nr_zones);652	if (ret != 0 || !nr_zones)653		return ret ? ret : -EIO;654 655	return 0;656}657 658static int btrfs_check_for_zoned_device(struct btrfs_fs_info *fs_info)659{660	struct btrfs_device *device;661 662	list_for_each_entry(device, &fs_info->fs_devices->devices, dev_list) {663		if (device->bdev && bdev_is_zoned(device->bdev)) {664			btrfs_err(fs_info,665				"zoned: mode not enabled but zoned device found: %pg",666				device->bdev);667			return -EINVAL;668		}669	}670 671	return 0;672}673 674int btrfs_check_zoned_mode(struct btrfs_fs_info *fs_info)675{676	struct queue_limits *lim = &fs_info->limits;677	struct btrfs_device *device;678	u64 zone_size = 0;679	int ret;680 681	/*682	 * Host-Managed devices can't be used without the ZONED flag.  With the683	 * ZONED all devices can be used, using zone emulation if required.684	 */685	if (!btrfs_fs_incompat(fs_info, ZONED))686		return btrfs_check_for_zoned_device(fs_info);687 688	blk_set_stacking_limits(lim);689 690	list_for_each_entry(device, &fs_info->fs_devices->devices, dev_list) {691		struct btrfs_zoned_device_info *zone_info = device->zone_info;692 693		if (!device->bdev)694			continue;695 696		if (!zone_size) {697			zone_size = zone_info->zone_size;698		} else if (zone_info->zone_size != zone_size) {699			btrfs_err(fs_info,700		"zoned: unequal block device zone sizes: have %llu found %llu",701				  zone_info->zone_size, zone_size);702			return -EINVAL;703		}704 705		/*706		 * With the zoned emulation, we can have non-zoned device on the707		 * zoned mode. In this case, we don't have a valid max zone708		 * append size.709		 */710		if (bdev_is_zoned(device->bdev)) {711			blk_stack_limits(lim,712					 &bdev_get_queue(device->bdev)->limits,713					 0);714		}715	}716 717	/*718	 * stripe_size is always aligned to BTRFS_STRIPE_LEN in719	 * btrfs_create_chunk(). Since we want stripe_len == zone_size,720	 * check the alignment here.721	 */722	if (!IS_ALIGNED(zone_size, BTRFS_STRIPE_LEN)) {723		btrfs_err(fs_info,724			  "zoned: zone size %llu not aligned to stripe %u",725			  zone_size, BTRFS_STRIPE_LEN);726		return -EINVAL;727	}728 729	if (btrfs_fs_incompat(fs_info, MIXED_GROUPS)) {730		btrfs_err(fs_info, "zoned: mixed block groups not supported");731		return -EINVAL;732	}733 734	fs_info->zone_size = zone_size;735	/*736	 * Also limit max_zone_append_size by max_segments * PAGE_SIZE.737	 * Technically, we can have multiple pages per segment. But, since738	 * we add the pages one by one to a bio, and cannot increase the739	 * metadata reservation even if it increases the number of extents, it740	 * is safe to stick with the limit.741	 */742	fs_info->max_zone_append_size = ALIGN_DOWN(743		min3((u64)lim->max_zone_append_sectors << SECTOR_SHIFT,744		     (u64)lim->max_sectors << SECTOR_SHIFT,745		     (u64)lim->max_segments << PAGE_SHIFT),746		fs_info->sectorsize);747	fs_info->fs_devices->chunk_alloc_policy = BTRFS_CHUNK_ALLOC_ZONED;748	if (fs_info->max_zone_append_size < fs_info->max_extent_size)749		fs_info->max_extent_size = fs_info->max_zone_append_size;750 751	/*752	 * Check mount options here, because we might change fs_info->zoned753	 * from fs_info->zone_size.754	 */755	ret = btrfs_check_mountopts_zoned(fs_info, &fs_info->mount_opt);756	if (ret)757		return ret;758 759	btrfs_info(fs_info, "zoned mode enabled with zone size %llu", zone_size);760	return 0;761}762 763int btrfs_check_mountopts_zoned(const struct btrfs_fs_info *info,764				unsigned long long *mount_opt)765{766	if (!btrfs_is_zoned(info))767		return 0;768 769	/*770	 * Space cache writing is not COWed. Disable that to avoid write errors771	 * in sequential zones.772	 */773	if (btrfs_raw_test_opt(*mount_opt, SPACE_CACHE)) {774		btrfs_err(info, "zoned: space cache v1 is not supported");775		return -EINVAL;776	}777 778	if (btrfs_raw_test_opt(*mount_opt, NODATACOW)) {779		btrfs_err(info, "zoned: NODATACOW not supported");780		return -EINVAL;781	}782 783	if (btrfs_raw_test_opt(*mount_opt, DISCARD_ASYNC)) {784		btrfs_info(info,785			   "zoned: async discard ignored and disabled for zoned mode");786		btrfs_clear_opt(*mount_opt, DISCARD_ASYNC);787	}788 789	return 0;790}791 792static int sb_log_location(struct block_device *bdev, struct blk_zone *zones,793			   int rw, u64 *bytenr_ret)794{795	u64 wp;796	int ret;797 798	if (zones[0].type == BLK_ZONE_TYPE_CONVENTIONAL) {799		*bytenr_ret = zones[0].start << SECTOR_SHIFT;800		return 0;801	}802 803	ret = sb_write_pointer(bdev, zones, &wp);804	if (ret != -ENOENT && ret < 0)805		return ret;806 807	if (rw == WRITE) {808		struct blk_zone *reset = NULL;809 810		if (wp == zones[0].start << SECTOR_SHIFT)811			reset = &zones[0];812		else if (wp == zones[1].start << SECTOR_SHIFT)813			reset = &zones[1];814 815		if (reset && reset->cond != BLK_ZONE_COND_EMPTY) {816			unsigned int nofs_flags;817 818			ASSERT(sb_zone_is_full(reset));819 820			nofs_flags = memalloc_nofs_save();821			ret = blkdev_zone_mgmt(bdev, REQ_OP_ZONE_RESET,822					       reset->start, reset->len);823			memalloc_nofs_restore(nofs_flags);824			if (ret)825				return ret;826 827			reset->cond = BLK_ZONE_COND_EMPTY;828			reset->wp = reset->start;829		}830	} else if (ret != -ENOENT) {831		/*832		 * For READ, we want the previous one. Move write pointer to833		 * the end of a zone, if it is at the head of a zone.834		 */835		u64 zone_end = 0;836 837		if (wp == zones[0].start << SECTOR_SHIFT)838			zone_end = zones[1].start + zones[1].capacity;839		else if (wp == zones[1].start << SECTOR_SHIFT)840			zone_end = zones[0].start + zones[0].capacity;841		if (zone_end)842			wp = ALIGN_DOWN(zone_end << SECTOR_SHIFT,843					BTRFS_SUPER_INFO_SIZE);844 845		wp -= BTRFS_SUPER_INFO_SIZE;846	}847 848	*bytenr_ret = wp;849	return 0;850 851}852 853int btrfs_sb_log_location_bdev(struct block_device *bdev, int mirror, int rw,854			       u64 *bytenr_ret)855{856	struct blk_zone zones[BTRFS_NR_SB_LOG_ZONES];857	sector_t zone_sectors;858	u32 sb_zone;859	int ret;860	u8 zone_sectors_shift;861	sector_t nr_sectors;862	u32 nr_zones;863 864	if (!bdev_is_zoned(bdev)) {865		*bytenr_ret = btrfs_sb_offset(mirror);866		return 0;867	}868 869	ASSERT(rw == READ || rw == WRITE);870 871	zone_sectors = bdev_zone_sectors(bdev);872	if (!is_power_of_2(zone_sectors))873		return -EINVAL;874	zone_sectors_shift = ilog2(zone_sectors);875	nr_sectors = bdev_nr_sectors(bdev);876	nr_zones = nr_sectors >> zone_sectors_shift;877 878	sb_zone = sb_zone_number(zone_sectors_shift + SECTOR_SHIFT, mirror);879	if (sb_zone + 1 >= nr_zones)880		return -ENOENT;881 882	ret = blkdev_report_zones(bdev, zone_start_sector(sb_zone, bdev),883				  BTRFS_NR_SB_LOG_ZONES, copy_zone_info_cb,884				  zones);885	if (ret < 0)886		return ret;887	if (ret != BTRFS_NR_SB_LOG_ZONES)888		return -EIO;889 890	return sb_log_location(bdev, zones, rw, bytenr_ret);891}892 893int btrfs_sb_log_location(struct btrfs_device *device, int mirror, int rw,894			  u64 *bytenr_ret)895{896	struct btrfs_zoned_device_info *zinfo = device->zone_info;897	u32 zone_num;898 899	/*900	 * For a zoned filesystem on a non-zoned block device, use the same901	 * super block locations as regular filesystem. Doing so, the super902	 * block can always be retrieved and the zoned flag of the volume903	 * detected from the super block information.904	 */905	if (!bdev_is_zoned(device->bdev)) {906		*bytenr_ret = btrfs_sb_offset(mirror);907		return 0;908	}909 910	zone_num = sb_zone_number(zinfo->zone_size_shift, mirror);911	if (zone_num + 1 >= zinfo->nr_zones)912		return -ENOENT;913 914	return sb_log_location(device->bdev,915			       &zinfo->sb_zones[BTRFS_NR_SB_LOG_ZONES * mirror],916			       rw, bytenr_ret);917}918 919static inline bool is_sb_log_zone(struct btrfs_zoned_device_info *zinfo,920				  int mirror)921{922	u32 zone_num;923 924	if (!zinfo)925		return false;926 927	zone_num = sb_zone_number(zinfo->zone_size_shift, mirror);928	if (zone_num + 1 >= zinfo->nr_zones)929		return false;930 931	if (!test_bit(zone_num, zinfo->seq_zones))932		return false;933 934	return true;935}936 937int btrfs_advance_sb_log(struct btrfs_device *device, int mirror)938{939	struct btrfs_zoned_device_info *zinfo = device->zone_info;940	struct blk_zone *zone;941	int i;942 943	if (!is_sb_log_zone(zinfo, mirror))944		return 0;945 946	zone = &zinfo->sb_zones[BTRFS_NR_SB_LOG_ZONES * mirror];947	for (i = 0; i < BTRFS_NR_SB_LOG_ZONES; i++) {948		/* Advance the next zone */949		if (zone->cond == BLK_ZONE_COND_FULL) {950			zone++;951			continue;952		}953 954		if (zone->cond == BLK_ZONE_COND_EMPTY)955			zone->cond = BLK_ZONE_COND_IMP_OPEN;956 957		zone->wp += SUPER_INFO_SECTORS;958 959		if (sb_zone_is_full(zone)) {960			/*961			 * No room left to write new superblock. Since962			 * superblock is written with REQ_SYNC, it is safe to963			 * finish the zone now.964			 *965			 * If the write pointer is exactly at the capacity,966			 * explicit ZONE_FINISH is not necessary.967			 */968			if (zone->wp != zone->start + zone->capacity) {969				unsigned int nofs_flags;970				int ret;971 972				nofs_flags = memalloc_nofs_save();973				ret = blkdev_zone_mgmt(device->bdev,974						REQ_OP_ZONE_FINISH, zone->start,975						zone->len);976				memalloc_nofs_restore(nofs_flags);977				if (ret)978					return ret;979			}980 981			zone->wp = zone->start + zone->len;982			zone->cond = BLK_ZONE_COND_FULL;983		}984		return 0;985	}986 987	/* All the zones are FULL. Should not reach here. */988	ASSERT(0);989	return -EIO;990}991 992int btrfs_reset_sb_log_zones(struct block_device *bdev, int mirror)993{994	unsigned int nofs_flags;995	sector_t zone_sectors;996	sector_t nr_sectors;997	u8 zone_sectors_shift;998	u32 sb_zone;999	u32 nr_zones;1000	int ret;1001 1002	zone_sectors = bdev_zone_sectors(bdev);1003	zone_sectors_shift = ilog2(zone_sectors);1004	nr_sectors = bdev_nr_sectors(bdev);1005	nr_zones = nr_sectors >> zone_sectors_shift;1006 1007	sb_zone = sb_zone_number(zone_sectors_shift + SECTOR_SHIFT, mirror);1008	if (sb_zone + 1 >= nr_zones)1009		return -ENOENT;1010 1011	nofs_flags = memalloc_nofs_save();1012	ret = blkdev_zone_mgmt(bdev, REQ_OP_ZONE_RESET,1013			       zone_start_sector(sb_zone, bdev),1014			       zone_sectors * BTRFS_NR_SB_LOG_ZONES);1015	memalloc_nofs_restore(nofs_flags);1016	return ret;1017}1018 1019/*1020 * Find allocatable zones within a given region.1021 *1022 * @device:	the device to allocate a region on1023 * @hole_start: the position of the hole to allocate the region1024 * @num_bytes:	size of wanted region1025 * @hole_end:	the end of the hole1026 * @return:	position of allocatable zones1027 *1028 * Allocatable region should not contain any superblock locations.1029 */1030u64 btrfs_find_allocatable_zones(struct btrfs_device *device, u64 hole_start,1031				 u64 hole_end, u64 num_bytes)1032{1033	struct btrfs_zoned_device_info *zinfo = device->zone_info;1034	const u8 shift = zinfo->zone_size_shift;1035	u64 nzones = num_bytes >> shift;1036	u64 pos = hole_start;1037	u64 begin, end;1038	bool have_sb;1039	int i;1040 1041	ASSERT(IS_ALIGNED(hole_start, zinfo->zone_size));1042	ASSERT(IS_ALIGNED(num_bytes, zinfo->zone_size));1043 1044	while (pos < hole_end) {1045		begin = pos >> shift;1046		end = begin + nzones;1047 1048		if (end > zinfo->nr_zones)1049			return hole_end;1050 1051		/* Check if zones in the region are all empty */1052		if (btrfs_dev_is_sequential(device, pos) &&1053		    !bitmap_test_range_all_set(zinfo->empty_zones, begin, nzones)) {1054			pos += zinfo->zone_size;1055			continue;1056		}1057 1058		have_sb = false;1059		for (i = 0; i < BTRFS_SUPER_MIRROR_MAX; i++) {1060			u32 sb_zone;1061			u64 sb_pos;1062 1063			sb_zone = sb_zone_number(shift, i);1064			if (!(end <= sb_zone ||1065			      sb_zone + BTRFS_NR_SB_LOG_ZONES <= begin)) {1066				have_sb = true;1067				pos = zone_start_physical(1068					sb_zone + BTRFS_NR_SB_LOG_ZONES, zinfo);1069				break;1070			}1071 1072			/* We also need to exclude regular superblock positions */1073			sb_pos = btrfs_sb_offset(i);1074			if (!(pos + num_bytes <= sb_pos ||1075			      sb_pos + BTRFS_SUPER_INFO_SIZE <= pos)) {1076				have_sb = true;1077				pos = ALIGN(sb_pos + BTRFS_SUPER_INFO_SIZE,1078					    zinfo->zone_size);1079				break;1080			}1081		}1082		if (!have_sb)1083			break;1084	}1085 1086	return pos;1087}1088 1089static bool btrfs_dev_set_active_zone(struct btrfs_device *device, u64 pos)1090{1091	struct btrfs_zoned_device_info *zone_info = device->zone_info;1092	unsigned int zno = (pos >> zone_info->zone_size_shift);1093 1094	/* We can use any number of zones */1095	if (zone_info->max_active_zones == 0)1096		return true;1097 1098	if (!test_bit(zno, zone_info->active_zones)) {1099		/* Active zone left? */1100		if (atomic_dec_if_positive(&zone_info->active_zones_left) < 0)1101			return false;1102		if (test_and_set_bit(zno, zone_info->active_zones)) {1103			/* Someone already set the bit */1104			atomic_inc(&zone_info->active_zones_left);1105		}1106	}1107 1108	return true;1109}1110 1111static void btrfs_dev_clear_active_zone(struct btrfs_device *device, u64 pos)1112{1113	struct btrfs_zoned_device_info *zone_info = device->zone_info;1114	unsigned int zno = (pos >> zone_info->zone_size_shift);1115 1116	/* We can use any number of zones */1117	if (zone_info->max_active_zones == 0)1118		return;1119 1120	if (test_and_clear_bit(zno, zone_info->active_zones))1121		atomic_inc(&zone_info->active_zones_left);1122}1123 1124int btrfs_reset_device_zone(struct btrfs_device *device, u64 physical,1125			    u64 length, u64 *bytes)1126{1127	unsigned int nofs_flags;1128	int ret;1129 1130	*bytes = 0;1131	nofs_flags = memalloc_nofs_save();1132	ret = blkdev_zone_mgmt(device->bdev, REQ_OP_ZONE_RESET,1133			       physical >> SECTOR_SHIFT, length >> SECTOR_SHIFT);1134	memalloc_nofs_restore(nofs_flags);1135	if (ret)1136		return ret;1137 1138	*bytes = length;1139	while (length) {1140		btrfs_dev_set_zone_empty(device, physical);1141		btrfs_dev_clear_active_zone(device, physical);1142		physical += device->zone_info->zone_size;1143		length -= device->zone_info->zone_size;1144	}1145 1146	return 0;1147}1148 1149int btrfs_ensure_empty_zones(struct btrfs_device *device, u64 start, u64 size)1150{1151	struct btrfs_zoned_device_info *zinfo = device->zone_info;1152	const u8 shift = zinfo->zone_size_shift;1153	unsigned long begin = start >> shift;1154	unsigned long nbits = size >> shift;1155	u64 pos;1156	int ret;1157 1158	ASSERT(IS_ALIGNED(start, zinfo->zone_size));1159	ASSERT(IS_ALIGNED(size, zinfo->zone_size));1160 1161	if (begin + nbits > zinfo->nr_zones)1162		return -ERANGE;1163 1164	/* All the zones are conventional */1165	if (bitmap_test_range_all_zero(zinfo->seq_zones, begin, nbits))1166		return 0;1167 1168	/* All the zones are sequential and empty */1169	if (bitmap_test_range_all_set(zinfo->seq_zones, begin, nbits) &&1170	    bitmap_test_range_all_set(zinfo->empty_zones, begin, nbits))1171		return 0;1172 1173	for (pos = start; pos < start + size; pos += zinfo->zone_size) {1174		u64 reset_bytes;1175 1176		if (!btrfs_dev_is_sequential(device, pos) ||1177		    btrfs_dev_is_empty_zone(device, pos))1178			continue;1179 1180		/* Free regions should be empty */1181		btrfs_warn_in_rcu(1182			device->fs_info,1183		"zoned: resetting device %s (devid %llu) zone %llu for allocation",1184			rcu_str_deref(device->name), device->devid, pos >> shift);1185		WARN_ON_ONCE(1);1186 1187		ret = btrfs_reset_device_zone(device, pos, zinfo->zone_size,1188					      &reset_bytes);1189		if (ret)1190			return ret;1191	}1192 1193	return 0;1194}1195 1196/*1197 * Calculate an allocation pointer from the extent allocation information1198 * for a block group consist of conventional zones. It is pointed to the1199 * end of the highest addressed extent in the block group as an allocation1200 * offset.1201 */1202static int calculate_alloc_pointer(struct btrfs_block_group *cache,1203				   u64 *offset_ret, bool new)1204{1205	struct btrfs_fs_info *fs_info = cache->fs_info;1206	struct btrfs_root *root;1207	BTRFS_PATH_AUTO_FREE(path);1208	struct btrfs_key key;1209	struct btrfs_key found_key;1210	int ret;1211	u64 length;1212 1213	/*1214	 * Avoid  tree lookups for a new block group, there's no use for it.1215	 * It must always be 0.1216	 *1217	 * Also, we have a lock chain of extent buffer lock -> chunk mutex.1218	 * For new a block group, this function is called from1219	 * btrfs_make_block_group() which is already taking the chunk mutex.1220	 * Thus, we cannot call calculate_alloc_pointer() which takes extent1221	 * buffer locks to avoid deadlock.1222	 */1223	if (new) {1224		*offset_ret = 0;1225		return 0;1226	}1227 1228	path = btrfs_alloc_path();1229	if (!path)1230		return -ENOMEM;1231 1232	key.objectid = cache->start + cache->length;1233	key.type = 0;1234	key.offset = 0;1235 1236	root = btrfs_extent_root(fs_info, key.objectid);1237	ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);1238	/* We should not find the exact match */1239	if (!ret)1240		ret = -EUCLEAN;1241	if (ret < 0)1242		return ret;1243 1244	ret = btrfs_previous_extent_item(root, path, cache->start);1245	if (ret) {1246		if (ret == 1) {1247			ret = 0;1248			*offset_ret = 0;1249		}1250		return ret;1251	}1252 1253	btrfs_item_key_to_cpu(path->nodes[0], &found_key, path->slots[0]);1254 1255	if (found_key.type == BTRFS_EXTENT_ITEM_KEY)1256		length = found_key.offset;1257	else1258		length = fs_info->nodesize;1259 1260	if (!(found_key.objectid >= cache->start &&1261	       found_key.objectid + length <= cache->start + cache->length)) {1262		return -EUCLEAN;1263	}1264	*offset_ret = found_key.objectid + length - cache->start;1265	return 0;1266}1267 1268struct zone_info {1269	u64 physical;1270	u64 capacity;1271	u64 alloc_offset;1272};1273 1274static int btrfs_load_zone_info(struct btrfs_fs_info *fs_info, int zone_idx,1275				struct zone_info *info, unsigned long *active,1276				struct btrfs_chunk_map *map)1277{1278	struct btrfs_dev_replace *dev_replace = &fs_info->dev_replace;1279	struct btrfs_device *device;1280	int dev_replace_is_ongoing = 0;1281	unsigned int nofs_flag;1282	struct blk_zone zone;1283	int ret;1284 1285	info->physical = map->stripes[zone_idx].physical;1286 1287	down_read(&dev_replace->rwsem);1288	device = map->stripes[zone_idx].dev;1289 1290	if (!device->bdev) {1291		up_read(&dev_replace->rwsem);1292		info->alloc_offset = WP_MISSING_DEV;1293		return 0;1294	}1295 1296	/* Consider a zone as active if we can allow any number of active zones. */1297	if (!device->zone_info->max_active_zones)1298		__set_bit(zone_idx, active);1299 1300	if (!btrfs_dev_is_sequential(device, info->physical)) {1301		up_read(&dev_replace->rwsem);1302		info->alloc_offset = WP_CONVENTIONAL;1303		return 0;1304	}1305 1306	/* This zone will be used for allocation, so mark this zone non-empty. */1307	btrfs_dev_clear_zone_empty(device, info->physical);1308 1309	dev_replace_is_ongoing = btrfs_dev_replace_is_ongoing(dev_replace);1310	if (dev_replace_is_ongoing && dev_replace->tgtdev != NULL)1311		btrfs_dev_clear_zone_empty(dev_replace->tgtdev, info->physical);1312 1313	/*1314	 * The group is mapped to a sequential zone. Get the zone write pointer1315	 * to determine the allocation offset within the zone.1316	 */1317	WARN_ON(!IS_ALIGNED(info->physical, fs_info->zone_size));1318	nofs_flag = memalloc_nofs_save();1319	ret = btrfs_get_dev_zone(device, info->physical, &zone);1320	memalloc_nofs_restore(nofs_flag);1321	if (ret) {1322		up_read(&dev_replace->rwsem);1323		if (ret != -EIO && ret != -EOPNOTSUPP)1324			return ret;1325		info->alloc_offset = WP_MISSING_DEV;1326		return 0;1327	}1328 1329	if (zone.type == BLK_ZONE_TYPE_CONVENTIONAL) {1330		btrfs_err_in_rcu(fs_info,1331		"zoned: unexpected conventional zone %llu on device %s (devid %llu)",1332			zone.start << SECTOR_SHIFT, rcu_str_deref(device->name),1333			device->devid);1334		up_read(&dev_replace->rwsem);1335		return -EIO;1336	}1337 1338	info->capacity = (zone.capacity << SECTOR_SHIFT);1339 1340	switch (zone.cond) {1341	case BLK_ZONE_COND_OFFLINE:1342	case BLK_ZONE_COND_READONLY:1343		btrfs_err_in_rcu(fs_info,1344		"zoned: offline/readonly zone %llu on device %s (devid %llu)",1345			  (info->physical >> device->zone_info->zone_size_shift),1346			  rcu_str_deref(device->name), device->devid);1347		info->alloc_offset = WP_MISSING_DEV;1348		break;1349	case BLK_ZONE_COND_EMPTY:1350		info->alloc_offset = 0;1351		break;1352	case BLK_ZONE_COND_FULL:1353		info->alloc_offset = info->capacity;1354		break;1355	default:1356		/* Partially used zone. */1357		info->alloc_offset = ((zone.wp - zone.start) << SECTOR_SHIFT);1358		__set_bit(zone_idx, active);1359		break;1360	}1361 1362	up_read(&dev_replace->rwsem);1363 1364	return 0;1365}1366 1367static int btrfs_load_block_group_single(struct btrfs_block_group *bg,1368					 struct zone_info *info,1369					 unsigned long *active)1370{1371	if (info->alloc_offset == WP_MISSING_DEV) {1372		btrfs_err(bg->fs_info,1373			"zoned: cannot recover write pointer for zone %llu",1374			info->physical);1375		return -EIO;1376	}1377 1378	bg->alloc_offset = info->alloc_offset;1379	bg->zone_capacity = info->capacity;1380	if (test_bit(0, active))1381		set_bit(BLOCK_GROUP_FLAG_ZONE_IS_ACTIVE, &bg->runtime_flags);1382	return 0;1383}1384 1385static int btrfs_load_block_group_dup(struct btrfs_block_group *bg,1386				      struct btrfs_chunk_map *map,1387				      struct zone_info *zone_info,1388				      unsigned long *active)1389{1390	struct btrfs_fs_info *fs_info = bg->fs_info;1391 1392	if ((map->type & BTRFS_BLOCK_GROUP_DATA) && !fs_info->stripe_root) {1393		btrfs_err(fs_info, "zoned: data DUP profile needs raid-stripe-tree");1394		return -EINVAL;1395	}1396 1397	bg->zone_capacity = min_not_zero(zone_info[0].capacity, zone_info[1].capacity);1398 1399	if (zone_info[0].alloc_offset == WP_MISSING_DEV) {1400		btrfs_err(bg->fs_info,1401			  "zoned: cannot recover write pointer for zone %llu",1402			  zone_info[0].physical);1403		return -EIO;1404	}1405	if (zone_info[1].alloc_offset == WP_MISSING_DEV) {1406		btrfs_err(bg->fs_info,1407			  "zoned: cannot recover write pointer for zone %llu",1408			  zone_info[1].physical);1409		return -EIO;1410	}1411	if (zone_info[0].alloc_offset != zone_info[1].alloc_offset) {1412		btrfs_err(bg->fs_info,1413			  "zoned: write pointer offset mismatch of zones in DUP profile");1414		return -EIO;1415	}1416 1417	if (test_bit(0, active) != test_bit(1, active)) {1418		if (!btrfs_zone_activate(bg))1419			return -EIO;1420	} else if (test_bit(0, active)) {1421		set_bit(BLOCK_GROUP_FLAG_ZONE_IS_ACTIVE, &bg->runtime_flags);1422	}1423 1424	bg->alloc_offset = zone_info[0].alloc_offset;1425	return 0;1426}1427 1428static int btrfs_load_block_group_raid1(struct btrfs_block_group *bg,1429					struct btrfs_chunk_map *map,1430					struct zone_info *zone_info,1431					unsigned long *active)1432{1433	struct btrfs_fs_info *fs_info = bg->fs_info;1434	int i;1435 1436	if ((map->type & BTRFS_BLOCK_GROUP_DATA) && !fs_info->stripe_root) {1437		btrfs_err(fs_info, "zoned: data %s needs raid-stripe-tree",1438			  btrfs_bg_type_to_raid_name(map->type));1439		return -EINVAL;1440	}1441 1442	/* In case a device is missing we have a cap of 0, so don't use it. */1443	bg->zone_capacity = min_not_zero(zone_info[0].capacity, zone_info[1].capacity);1444 1445	for (i = 0; i < map->num_stripes; i++) {1446		if (zone_info[i].alloc_offset == WP_MISSING_DEV ||1447		    zone_info[i].alloc_offset == WP_CONVENTIONAL)1448			continue;1449 1450		if ((zone_info[0].alloc_offset != zone_info[i].alloc_offset) &&1451		    !btrfs_test_opt(fs_info, DEGRADED)) {1452			btrfs_err(fs_info,1453			"zoned: write pointer offset mismatch of zones in %s profile",1454				  btrfs_bg_type_to_raid_name(map->type));1455			return -EIO;1456		}1457		if (test_bit(0, active) != test_bit(i, active)) {1458			if (!btrfs_test_opt(fs_info, DEGRADED) &&1459			    !btrfs_zone_activate(bg)) {1460				return -EIO;1461			}1462		} else {1463			if (test_bit(0, active))1464				set_bit(BLOCK_GROUP_FLAG_ZONE_IS_ACTIVE, &bg->runtime_flags);1465		}1466	}1467 1468	if (zone_info[0].alloc_offset != WP_MISSING_DEV)1469		bg->alloc_offset = zone_info[0].alloc_offset;1470	else1471		bg->alloc_offset = zone_info[i - 1].alloc_offset;1472 1473	return 0;1474}1475 1476static int btrfs_load_block_group_raid0(struct btrfs_block_group *bg,1477					struct btrfs_chunk_map *map,1478					struct zone_info *zone_info,1479					unsigned long *active)1480{1481	struct btrfs_fs_info *fs_info = bg->fs_info;1482 1483	if ((map->type & BTRFS_BLOCK_GROUP_DATA) && !fs_info->stripe_root) {1484		btrfs_err(fs_info, "zoned: data %s needs raid-stripe-tree",1485			  btrfs_bg_type_to_raid_name(map->type));1486		return -EINVAL;1487	}1488 1489	for (int i = 0; i < map->num_stripes; i++) {1490		if (zone_info[i].alloc_offset == WP_MISSING_DEV ||1491		    zone_info[i].alloc_offset == WP_CONVENTIONAL)1492			continue;1493 1494		if (test_bit(0, active) != test_bit(i, active)) {1495			if (!btrfs_zone_activate(bg))1496				return -EIO;1497		} else {1498			if (test_bit(0, active))1499				set_bit(BLOCK_GROUP_FLAG_ZONE_IS_ACTIVE, &bg->runtime_flags);1500		}1501		bg->zone_capacity += zone_info[i].capacity;1502		bg->alloc_offset += zone_info[i].alloc_offset;1503	}1504 1505	return 0;1506}1507 1508static int btrfs_load_block_group_raid10(struct btrfs_block_group *bg,1509					 struct btrfs_chunk_map *map,1510					 struct zone_info *zone_info,1511					 unsigned long *active)1512{1513	struct btrfs_fs_info *fs_info = bg->fs_info;1514 1515	if ((map->type & BTRFS_BLOCK_GROUP_DATA) && !fs_info->stripe_root) {1516		btrfs_err(fs_info, "zoned: data %s needs raid-stripe-tree",1517			  btrfs_bg_type_to_raid_name(map->type));1518		return -EINVAL;1519	}1520 1521	for (int i = 0; i < map->num_stripes; i++) {1522		if (zone_info[i].alloc_offset == WP_MISSING_DEV ||1523		    zone_info[i].alloc_offset == WP_CONVENTIONAL)1524			continue;1525 1526		if (test_bit(0, active) != test_bit(i, active)) {1527			if (!btrfs_zone_activate(bg))1528				return -EIO;1529		} else {1530			if (test_bit(0, active))1531				set_bit(BLOCK_GROUP_FLAG_ZONE_IS_ACTIVE, &bg->runtime_flags);1532		}1533 1534		if ((i % map->sub_stripes) == 0) {1535			bg->zone_capacity += zone_info[i].capacity;1536			bg->alloc_offset += zone_info[i].alloc_offset;1537		}1538	}1539 1540	return 0;1541}1542 1543int btrfs_load_block_group_zone_info(struct btrfs_block_group *cache, bool new)1544{1545	struct btrfs_fs_info *fs_info = cache->fs_info;1546	struct btrfs_chunk_map *map;1547	u64 logical = cache->start;1548	u64 length = cache->length;1549	struct zone_info *zone_info = NULL;1550	int ret;1551	int i;1552	unsigned long *active = NULL;1553	u64 last_alloc = 0;1554	u32 num_sequential = 0, num_conventional = 0;1555	u64 profile;1556 1557	if (!btrfs_is_zoned(fs_info))1558		return 0;1559 1560	/* Sanity check */1561	if (!IS_ALIGNED(length, fs_info->zone_size)) {1562		btrfs_err(fs_info,1563		"zoned: block group %llu len %llu unaligned to zone size %llu",1564			  logical, length, fs_info->zone_size);1565		return -EIO;1566	}1567 1568	map = btrfs_find_chunk_map(fs_info, logical, length);1569	if (!map)1570		return -EINVAL;1571 1572	cache->physical_map = map;1573 1574	zone_info = kcalloc(map->num_stripes, sizeof(*zone_info), GFP_NOFS);1575	if (!zone_info) {1576		ret = -ENOMEM;1577		goto out;1578	}1579 1580	active = bitmap_zalloc(map->num_stripes, GFP_NOFS);1581	if (!active) {1582		ret = -ENOMEM;1583		goto out;1584	}1585 1586	for (i = 0; i < map->num_stripes; i++) {1587		ret = btrfs_load_zone_info(fs_info, i, &zone_info[i], active, map);1588		if (ret)1589			goto out;1590 1591		if (zone_info[i].alloc_offset == WP_CONVENTIONAL)1592			num_conventional++;1593		else1594			num_sequential++;1595	}1596 1597	if (num_sequential > 0)1598		set_bit(BLOCK_GROUP_FLAG_SEQUENTIAL_ZONE, &cache->runtime_flags);1599 1600	if (num_conventional > 0) {1601		/* Zone capacity is always zone size in emulation */1602		cache->zone_capacity = cache->length;1603		ret = calculate_alloc_pointer(cache, &last_alloc, new);1604		if (ret) {1605			btrfs_err(fs_info,1606			"zoned: failed to determine allocation offset of bg %llu",1607				  cache->start);1608			goto out;1609		} else if (map->num_stripes == num_conventional) {1610			cache->alloc_offset = last_alloc;1611			set_bit(BLOCK_GROUP_FLAG_ZONE_IS_ACTIVE, &cache->runtime_flags);1612			goto out;1613		}1614	}1615 1616	profile = map->type & BTRFS_BLOCK_GROUP_PROFILE_MASK;1617	switch (profile) {1618	case 0: /* single */1619		ret = btrfs_load_block_group_single(cache, &zone_info[0], active);1620		break;1621	case BTRFS_BLOCK_GROUP_DUP:1622		ret = btrfs_load_block_group_dup(cache, map, zone_info, active);1623		break;1624	case BTRFS_BLOCK_GROUP_RAID1:1625	case BTRFS_BLOCK_GROUP_RAID1C3:1626	case BTRFS_BLOCK_GROUP_RAID1C4:1627		ret = btrfs_load_block_group_raid1(cache, map, zone_info, active);1628		break;1629	case BTRFS_BLOCK_GROUP_RAID0:1630		ret = btrfs_load_block_group_raid0(cache, map, zone_info, active);1631		break;1632	case BTRFS_BLOCK_GROUP_RAID10:1633		ret = btrfs_load_block_group_raid10(cache, map, zone_info, active);1634		break;1635	case BTRFS_BLOCK_GROUP_RAID5:1636	case BTRFS_BLOCK_GROUP_RAID6:1637	default:1638		btrfs_err(fs_info, "zoned: profile %s not yet supported",1639			  btrfs_bg_type_to_raid_name(map->type));1640		ret = -EINVAL;1641		goto out;1642	}1643 1644	if (ret == -EIO && profile != 0 && profile != BTRFS_BLOCK_GROUP_RAID0 &&1645	    profile != BTRFS_BLOCK_GROUP_RAID10) {1646		/*1647		 * Detected broken write pointer.  Make this block group1648		 * unallocatable by setting the allocation pointer at the end of1649		 * allocatable region. Relocating this block group will fix the1650		 * mismatch.1651		 *1652		 * Currently, we cannot handle RAID0 or RAID10 case like this1653		 * because we don't have a proper zone_capacity value. But,1654		 * reading from this block group won't work anyway by a missing1655		 * stripe.1656		 */1657		cache->alloc_offset = cache->zone_capacity;1658		ret = 0;1659	}1660 1661out:1662	/* Reject non SINGLE data profiles without RST */1663	if ((map->type & BTRFS_BLOCK_GROUP_DATA) &&1664	    (map->type & BTRFS_BLOCK_GROUP_PROFILE_MASK) &&1665	    !fs_info->stripe_root) {1666		btrfs_err(fs_info, "zoned: data %s needs raid-stripe-tree",1667			  btrfs_bg_type_to_raid_name(map->type));1668		return -EINVAL;1669	}1670 1671	if (cache->alloc_offset > cache->zone_capacity) {1672		btrfs_err(fs_info,1673"zoned: invalid write pointer %llu (larger than zone capacity %llu) in block group %llu",1674			  cache->alloc_offset, cache->zone_capacity,1675			  cache->start);1676		ret = -EIO;1677	}1678 1679	/* An extent is allocated after the write pointer */1680	if (!ret && num_conventional && last_alloc > cache->alloc_offset) {1681		btrfs_err(fs_info,1682			  "zoned: got wrong write pointer in BG %llu: %llu > %llu",1683			  logical, last_alloc, cache->alloc_offset);1684		ret = -EIO;1685	}1686 1687	if (!ret) {1688		cache->meta_write_pointer = cache->alloc_offset + cache->start;1689		if (test_bit(BLOCK_GROUP_FLAG_ZONE_IS_ACTIVE, &cache->runtime_flags)) {1690			btrfs_get_block_group(cache);1691			spin_lock(&fs_info->zone_active_bgs_lock);1692			list_add_tail(&cache->active_bg_list,1693				      &fs_info->zone_active_bgs);1694			spin_unlock(&fs_info->zone_active_bgs_lock);1695		}1696	} else {1697		btrfs_free_chunk_map(cache->physical_map);1698		cache->physical_map = NULL;1699	}1700	bitmap_free(active);1701	kfree(zone_info);1702 1703	return ret;1704}1705 1706void btrfs_calc_zone_unusable(struct btrfs_block_group *cache)1707{1708	u64 unusable, free;1709 1710	if (!btrfs_is_zoned(cache->fs_info))1711		return;1712 1713	WARN_ON(cache->bytes_super != 0);1714	unusable = (cache->alloc_offset - cache->used) +1715		   (cache->length - cache->zone_capacity);1716	free = cache->zone_capacity - cache->alloc_offset;1717 1718	/* We only need ->free_space in ALLOC_SEQ block groups */1719	cache->cached = BTRFS_CACHE_FINISHED;1720	cache->free_space_ctl->free_space = free;1721	cache->zone_unusable = unusable;1722}1723 1724bool btrfs_use_zone_append(struct btrfs_bio *bbio)1725{1726	u64 start = (bbio->bio.bi_iter.bi_sector << SECTOR_SHIFT);1727	struct btrfs_inode *inode = bbio->inode;1728	struct btrfs_fs_info *fs_info = bbio->fs_info;1729	struct btrfs_block_group *cache;1730	bool ret = false;1731 1732	if (!btrfs_is_zoned(fs_info))1733		return false;1734 1735	if (!inode || !is_data_inode(inode))1736		return false;1737 1738	if (btrfs_op(&bbio->bio) != BTRFS_MAP_WRITE)1739		return false;1740 1741	/*1742	 * Using REQ_OP_ZONE_APPNED for relocation can break assumptions on the1743	 * extent layout the relocation code has.1744	 * Furthermore we have set aside own block-group from which only the1745	 * relocation "process" can allocate and make sure only one process at a1746	 * time can add pages to an extent that gets relocated, so it's safe to1747	 * use regular REQ_OP_WRITE for this special case.1748	 */1749	if (btrfs_is_data_reloc_root(inode->root))1750		return false;1751 1752	cache = btrfs_lookup_block_group(fs_info, start);1753	ASSERT(cache);1754	if (!cache)1755		return false;1756 1757	ret = !!test_bit(BLOCK_GROUP_FLAG_SEQUENTIAL_ZONE, &cache->runtime_flags);1758	btrfs_put_block_group(cache);1759 1760	return ret;1761}1762 1763void btrfs_record_physical_zoned(struct btrfs_bio *bbio)1764{1765	const u64 physical = bbio->bio.bi_iter.bi_sector << SECTOR_SHIFT;1766	struct btrfs_ordered_sum *sum = bbio->sums;1767 1768	if (physical < bbio->orig_physical)1769		sum->logical -= bbio->orig_physical - physical;1770	else1771		sum->logical += physical - bbio->orig_physical;1772}1773 1774static void btrfs_rewrite_logical_zoned(struct btrfs_ordered_extent *ordered,1775					u64 logical)1776{1777	struct extent_map_tree *em_tree = &ordered->inode->extent_tree;1778	struct extent_map *em;1779 1780	ordered->disk_bytenr = logical;1781 1782	write_lock(&em_tree->lock);1783	em = search_extent_mapping(em_tree, ordered->file_offset,1784				   ordered->num_bytes);1785	/* The em should be a new COW extent, thus it should not have an offset. */1786	ASSERT(em->offset == 0);1787	em->disk_bytenr = logical;1788	free_extent_map(em);1789	write_unlock(&em_tree->lock);1790}1791 1792static bool btrfs_zoned_split_ordered(struct btrfs_ordered_extent *ordered,1793				      u64 logical, u64 len)1794{1795	struct btrfs_ordered_extent *new;1796 1797	if (!test_bit(BTRFS_ORDERED_NOCOW, &ordered->flags) &&1798	    split_extent_map(ordered->inode, ordered->file_offset,1799			     ordered->num_bytes, len, logical))1800		return false;1801 1802	new = btrfs_split_ordered_extent(ordered, len);1803	if (IS_ERR(new))1804		return false;1805	new->disk_bytenr = logical;1806	btrfs_finish_one_ordered(new);1807	return true;1808}1809 1810void btrfs_finish_ordered_zoned(struct btrfs_ordered_extent *ordered)1811{1812	struct btrfs_inode *inode = ordered->inode;1813	struct btrfs_fs_info *fs_info = inode->root->fs_info;1814	struct btrfs_ordered_sum *sum;1815	u64 logical, len;1816 1817	/*1818	 * Write to pre-allocated region is for the data relocation, and so1819	 * it should use WRITE operation. No split/rewrite are necessary.1820	 */1821	if (test_bit(BTRFS_ORDERED_PREALLOC, &ordered->flags))1822		return;1823 1824	ASSERT(!list_empty(&ordered->list));1825	/* The ordered->list can be empty in the above pre-alloc case. */1826	sum = list_first_entry(&ordered->list, struct btrfs_ordered_sum, list);1827	logical = sum->logical;1828	len = sum->len;1829 1830	while (len < ordered->disk_num_bytes) {1831		sum = list_next_entry(sum, list);1832		if (sum->logical == logical + len) {1833			len += sum->len;1834			continue;1835		}1836		if (!btrfs_zoned_split_ordered(ordered, logical, len)) {1837			set_bit(BTRFS_ORDERED_IOERR, &ordered->flags);1838			btrfs_err(fs_info, "failed to split ordered extent");1839			goto out;1840		}1841		logical = sum->logical;1842		len = sum->len;1843	}1844 1845	if (ordered->disk_bytenr != logical)1846		btrfs_rewrite_logical_zoned(ordered, logical);1847 1848out:1849	/*1850	 * If we end up here for nodatasum I/O, the btrfs_ordered_sum structures1851	 * were allocated by btrfs_alloc_dummy_sum only to record the logical1852	 * addresses and don't contain actual checksums.  We thus must free them1853	 * here so that we don't attempt to log the csums later.1854	 */1855	if ((inode->flags & BTRFS_INODE_NODATASUM) ||1856	    test_bit(BTRFS_FS_STATE_NO_DATA_CSUMS, &fs_info->fs_state)) {1857		while ((sum = list_first_entry_or_null(&ordered->list,1858						       typeof(*sum), list))) {1859			list_del(&sum->list);1860			kfree(sum);1861		}1862	}1863}1864 1865static bool check_bg_is_active(struct btrfs_eb_write_context *ctx,1866			       struct btrfs_block_group **active_bg)1867{1868	const struct writeback_control *wbc = ctx->wbc;1869	struct btrfs_block_group *block_group = ctx->zoned_bg;1870	struct btrfs_fs_info *fs_info = block_group->fs_info;1871 1872	if (test_bit(BLOCK_GROUP_FLAG_ZONE_IS_ACTIVE, &block_group->runtime_flags))1873		return true;1874 1875	if (fs_info->treelog_bg == block_group->start) {1876		if (!btrfs_zone_activate(block_group)) {1877			int ret_fin = btrfs_zone_finish_one_bg(fs_info);1878 1879			if (ret_fin != 1 || !btrfs_zone_activate(block_group))1880				return false;1881		}1882	} else if (*active_bg != block_group) {1883		struct btrfs_block_group *tgt = *active_bg;1884 1885		/* zoned_meta_io_lock protects fs_info->active_{meta,system}_bg. */1886		lockdep_assert_held(&fs_info->zoned_meta_io_lock);1887 1888		if (tgt) {1889			/*1890			 * If there is an unsent IO left in the allocated area,1891			 * we cannot wait for them as it may cause a deadlock.1892			 */1893			if (tgt->meta_write_pointer < tgt->start + tgt->alloc_offset) {1894				if (wbc->sync_mode == WB_SYNC_NONE ||1895				    (wbc->sync_mode == WB_SYNC_ALL && !wbc->for_sync))1896					return false;1897			}1898 1899			/* Pivot active metadata/system block group. */1900			btrfs_zoned_meta_io_unlock(fs_info);1901			wait_eb_writebacks(tgt);1902			do_zone_finish(tgt, true);1903			btrfs_zoned_meta_io_lock(fs_info);1904			if (*active_bg == tgt) {1905				btrfs_put_block_group(tgt);1906				*active_bg = NULL;1907			}1908		}1909		if (!btrfs_zone_activate(block_group))1910			return false;1911		if (*active_bg != block_group) {1912			ASSERT(*active_bg == NULL);1913			*active_bg = block_group;1914			btrfs_get_block_group(block_group);1915		}1916	}1917 1918	return true;1919}1920 1921/*1922 * Check if @ctx->eb is aligned to the write pointer.1923 *1924 * Return:1925 *   0:        @ctx->eb is at the write pointer. You can write it.1926 *   -EAGAIN:  There is a hole. The caller should handle the case.1927 *   -EBUSY:   There is a hole, but the caller can just bail out.1928 */1929int btrfs_check_meta_write_pointer(struct btrfs_fs_info *fs_info,1930				   struct btrfs_eb_write_context *ctx)1931{1932	const struct writeback_control *wbc = ctx->wbc;1933	const struct extent_buffer *eb = ctx->eb;1934	struct btrfs_block_group *block_group = ctx->zoned_bg;1935 1936	if (!btrfs_is_zoned(fs_info))1937		return 0;1938 1939	if (block_group) {1940		if (block_group->start > eb->start ||1941		    block_group->start + block_group->length <= eb->start) {1942			btrfs_put_block_group(block_group);1943			block_group = NULL;1944			ctx->zoned_bg = NULL;1945		}1946	}1947 1948	if (!block_group) {1949		block_group = btrfs_lookup_block_group(fs_info, eb->start);1950		if (!block_group)1951			return 0;1952		ctx->zoned_bg = block_group;1953	}1954 1955	if (block_group->meta_write_pointer == eb->start) {1956		struct btrfs_block_group **tgt;1957 1958		if (!test_bit(BTRFS_FS_ACTIVE_ZONE_TRACKING, &fs_info->flags))1959			return 0;1960 1961		if (block_group->flags & BTRFS_BLOCK_GROUP_SYSTEM)1962			tgt = &fs_info->active_system_bg;1963		else1964			tgt = &fs_info->active_meta_bg;1965		if (check_bg_is_active(ctx, tgt))1966			return 0;1967	}1968 1969	/*1970	 * Since we may release fs_info->zoned_meta_io_lock, someone can already1971	 * start writing this eb. In that case, we can just bail out.1972	 */1973	if (block_group->meta_write_pointer > eb->start)1974		return -EBUSY;1975 1976	/* If for_sync, this hole will be filled with trasnsaction commit. */1977	if (wbc->sync_mode == WB_SYNC_ALL && !wbc->for_sync)1978		return -EAGAIN;1979	return -EBUSY;1980}1981 1982int btrfs_zoned_issue_zeroout(struct btrfs_device *device, u64 physical, u64 length)1983{1984	if (!btrfs_dev_is_sequential(device, physical))1985		return -EOPNOTSUPP;1986 1987	return blkdev_issue_zeroout(device->bdev, physical >> SECTOR_SHIFT,1988				    length >> SECTOR_SHIFT, GFP_NOFS, 0);1989}1990 1991static int read_zone_info(struct btrfs_fs_info *fs_info, u64 logical,1992			  struct blk_zone *zone)1993{1994	struct btrfs_io_context *bioc = NULL;1995	u64 mapped_length = PAGE_SIZE;1996	unsigned int nofs_flag;1997	int nmirrors;1998	int i, ret;1999 2000	ret = btrfs_map_block(fs_info, BTRFS_MAP_GET_READ_MIRRORS, logical,2001			      &mapped_length, &bioc, NULL, NULL);2002	if (ret || !bioc || mapped_length < PAGE_SIZE) {2003		ret = -EIO;2004		goto out_put_bioc;2005	}2006 2007	if (bioc->map_type & BTRFS_BLOCK_GROUP_RAID56_MASK) {2008		ret = -EINVAL;2009		goto out_put_bioc;2010	}2011 2012	nofs_flag = memalloc_nofs_save();2013	nmirrors = (int)bioc->num_stripes;2014	for (i = 0; i < nmirrors; i++) {2015		u64 physical = bioc->stripes[i].physical;2016		struct btrfs_device *dev = bioc->stripes[i].dev;2017 2018		/* Missing device */2019		if (!dev->bdev)2020			continue;2021 2022		ret = btrfs_get_dev_zone(dev, physical, zone);2023		/* Failing device */2024		if (ret == -EIO || ret == -EOPNOTSUPP)2025			continue;2026		break;2027	}2028	memalloc_nofs_restore(nofs_flag);2029out_put_bioc:2030	btrfs_put_bioc(bioc);2031	return ret;2032}2033 2034/*2035 * Synchronize write pointer in a zone at @physical_start on @tgt_dev, by2036 * filling zeros between @physical_pos to a write pointer of dev-replace2037 * source device.2038 */2039int btrfs_sync_zone_write_pointer(struct btrfs_device *tgt_dev, u64 logical,2040				    u64 physical_start, u64 physical_pos)2041{2042	struct btrfs_fs_info *fs_info = tgt_dev->fs_info;2043	struct blk_zone zone;2044	u64 length;2045	u64 wp;2046	int ret;2047 2048	if (!btrfs_dev_is_sequential(tgt_dev, physical_pos))2049		return 0;2050 2051	ret = read_zone_info(fs_info, logical, &zone);2052	if (ret)2053		return ret;2054 2055	wp = physical_start + ((zone.wp - zone.start) << SECTOR_SHIFT);2056 2057	if (physical_pos == wp)2058		return 0;2059 2060	if (physical_pos > wp)2061		return -EUCLEAN;2062 2063	length = wp - physical_pos;2064	return btrfs_zoned_issue_zeroout(tgt_dev, physical_pos, length);2065}2066 2067/*2068 * Activate block group and underlying device zones2069 *2070 * @block_group: the block group to activate2071 *2072 * Return: true on success, false otherwise2073 */2074bool btrfs_zone_activate(struct btrfs_block_group *block_group)2075{2076	struct btrfs_fs_info *fs_info = block_group->fs_info;2077	struct btrfs_chunk_map *map;2078	struct btrfs_device *device;2079	u64 physical;2080	const bool is_data = (block_group->flags & BTRFS_BLOCK_GROUP_DATA);2081	bool ret;2082	int i;2083 2084	if (!btrfs_is_zoned(block_group->fs_info))2085		return true;2086 2087	map = block_group->physical_map;2088 2089	spin_lock(&fs_info->zone_active_bgs_lock);2090	spin_lock(&block_group->lock);2091	if (test_bit(BLOCK_GROUP_FLAG_ZONE_IS_ACTIVE, &block_group->runtime_flags)) {2092		ret = true;2093		goto out_unlock;2094	}2095 2096	/* No space left */2097	if (btrfs_zoned_bg_is_full(block_group)) {2098		ret = false;2099		goto out_unlock;2100	}2101 2102	for (i = 0; i < map->num_stripes; i++) {2103		struct btrfs_zoned_device_info *zinfo;2104		int reserved = 0;2105 2106		device = map->stripes[i].dev;2107		physical = map->stripes[i].physical;2108		zinfo = device->zone_info;2109 2110		if (zinfo->max_active_zones == 0)2111			continue;2112 2113		if (is_data)2114			reserved = zinfo->reserved_active_zones;2115		/*2116		 * For the data block group, leave active zones for one2117		 * metadata block group and one system block group.2118		 */2119		if (atomic_read(&zinfo->active_zones_left) <= reserved) {2120			ret = false;2121			goto out_unlock;2122		}2123 2124		if (!btrfs_dev_set_active_zone(device, physical)) {2125			/* Cannot activate the zone */2126			ret = false;2127			goto out_unlock;2128		}2129		if (!is_data)2130			zinfo->reserved_active_zones--;2131	}2132 2133	/* Successfully activated all the zones */2134	set_bit(BLOCK_GROUP_FLAG_ZONE_IS_ACTIVE, &block_group->runtime_flags);2135	spin_unlock(&block_group->lock);2136 2137	/* For the active block group list */2138	btrfs_get_block_group(block_group);2139	list_add_tail(&block_group->active_bg_list, &fs_info->zone_active_bgs);2140	spin_unlock(&fs_info->zone_active_bgs_lock);2141 2142	return true;2143 2144out_unlock:2145	spin_unlock(&block_group->lock);2146	spin_unlock(&fs_info->zone_active_bgs_lock);2147	return ret;2148}2149 2150static void wait_eb_writebacks(struct btrfs_block_group *block_group)2151{2152	struct btrfs_fs_info *fs_info = block_group->fs_info;2153	const u64 end = block_group->start + block_group->length;2154	struct radix_tree_iter iter;2155	struct extent_buffer *eb;2156	void __rcu **slot;2157 2158	rcu_read_lock();2159	radix_tree_for_each_slot(slot, &fs_info->buffer_radix, &iter,2160				 block_group->start >> fs_info->sectorsize_bits) {2161		eb = radix_tree_deref_slot(slot);2162		if (!eb)2163			continue;2164		if (radix_tree_deref_retry(eb)) {2165			slot = radix_tree_iter_retry(&iter);2166			continue;2167		}2168 2169		if (eb->start < block_group->start)2170			continue;2171		if (eb->start >= end)2172			break;2173 2174		slot = radix_tree_iter_resume(slot, &iter);2175		rcu_read_unlock();2176		wait_on_extent_buffer_writeback(eb);2177		rcu_read_lock();2178	}2179	rcu_read_unlock();2180}2181 2182static int do_zone_finish(struct btrfs_block_group *block_group, bool fully_written)2183{2184	struct btrfs_fs_info *fs_info = block_group->fs_info;2185	struct btrfs_chunk_map *map;2186	const bool is_metadata = (block_group->flags &2187			(BTRFS_BLOCK_GROUP_METADATA | BTRFS_BLOCK_GROUP_SYSTEM));2188	struct btrfs_dev_replace *dev_replace = &fs_info->dev_replace;2189	int ret = 0;2190	int i;2191 2192	spin_lock(&block_group->lock);2193	if (!test_bit(BLOCK_GROUP_FLAG_ZONE_IS_ACTIVE, &block_group->runtime_flags)) {2194		spin_unlock(&block_group->lock);2195		return 0;2196	}2197 2198	/* Check if we have unwritten allocated space */2199	if (is_metadata &&2200	    block_group->start + block_group->alloc_offset > block_group->meta_write_pointer) {2201		spin_unlock(&block_group->lock);2202		return -EAGAIN;2203	}2204 2205	/*2206	 * If we are sure that the block group is full (= no more room left for2207	 * new allocation) and the IO for the last usable block is completed, we2208	 * don't need to wait for the other IOs. This holds because we ensure2209	 * the sequential IO submissions using the ZONE_APPEND command for data2210	 * and block_group->meta_write_pointer for metadata.2211	 */2212	if (!fully_written) {2213		if (test_bit(BLOCK_GROUP_FLAG_ZONED_DATA_RELOC, &block_group->runtime_flags)) {2214			spin_unlock(&block_group->lock);2215			return -EAGAIN;2216		}2217		spin_unlock(&block_group->lock);2218 2219		ret = btrfs_inc_block_group_ro(block_group, false);2220		if (ret)2221			return ret;2222 2223		/* Ensure all writes in this block group finish */2224		btrfs_wait_block_group_reservations(block_group);2225		/* No need to wait for NOCOW writers. Zoned mode does not allow that */2226		btrfs_wait_ordered_roots(fs_info, U64_MAX, block_group);2227		/* Wait for extent buffers to be written. */2228		if (is_metadata)2229			wait_eb_writebacks(block_group);2230 2231		spin_lock(&block_group->lock);2232 2233		/*2234		 * Bail out if someone already deactivated the block group, or2235		 * allocated space is left in the block group.2236		 */2237		if (!test_bit(BLOCK_GROUP_FLAG_ZONE_IS_ACTIVE,2238			      &block_group->runtime_flags)) {2239			spin_unlock(&block_group->lock);2240			btrfs_dec_block_group_ro(block_group);2241			return 0;2242		}2243 2244		if (block_group->reserved ||2245		    test_bit(BLOCK_GROUP_FLAG_ZONED_DATA_RELOC,2246			     &block_group->runtime_flags)) {2247			spin_unlock(&block_group->lock);2248			btrfs_dec_block_group_ro(block_group);2249			return -EAGAIN;2250		}2251	}2252 2253	clear_bit(BLOCK_GROUP_FLAG_ZONE_IS_ACTIVE, &block_group->runtime_flags);2254	block_group->alloc_offset = block_group->zone_capacity;2255	if (block_group->flags & (BTRFS_BLOCK_GROUP_METADATA | BTRFS_BLOCK_GROUP_SYSTEM))2256		block_group->meta_write_pointer = block_group->start +2257						  block_group->zone_capacity;2258	block_group->free_space_ctl->free_space = 0;2259	btrfs_clear_treelog_bg(block_group);2260	btrfs_clear_data_reloc_bg(block_group);2261	spin_unlock(&block_group->lock);2262 2263	down_read(&dev_replace->rwsem);2264	map = block_group->physical_map;2265	for (i = 0; i < map->num_stripes; i++) {2266		struct btrfs_device *device = map->stripes[i].dev;2267		const u64 physical = map->stripes[i].physical;2268		struct btrfs_zoned_device_info *zinfo = device->zone_info;2269		unsigned int nofs_flags;2270 2271		if (zinfo->max_active_zones == 0)2272			continue;2273 2274		nofs_flags = memalloc_nofs_save();2275		ret = blkdev_zone_mgmt(device->bdev, REQ_OP_ZONE_FINISH,2276				       physical >> SECTOR_SHIFT,2277				       zinfo->zone_size >> SECTOR_SHIFT);2278		memalloc_nofs_restore(nofs_flags);2279 2280		if (ret) {2281			up_read(&dev_replace->rwsem);2282			return ret;2283		}2284 2285		if (!(block_group->flags & BTRFS_BLOCK_GROUP_DATA))2286			zinfo->reserved_active_zones++;2287		btrfs_dev_clear_active_zone(device, physical);2288	}2289	up_read(&dev_replace->rwsem);2290 2291	if (!fully_written)2292		btrfs_dec_block_group_ro(block_group);2293 2294	spin_lock(&fs_info->zone_active_bgs_lock);2295	ASSERT(!list_empty(&block_group->active_bg_list));2296	list_del_init(&block_group->active_bg_list);2297	spin_unlock(&fs_info->zone_active_bgs_lock);2298 2299	/* For active_bg_list */2300	btrfs_put_block_group(block_group);2301 2302	clear_and_wake_up_bit(BTRFS_FS_NEED_ZONE_FINISH, &fs_info->flags);2303 2304	return 0;2305}2306 2307int btrfs_zone_finish(struct btrfs_block_group *block_group)2308{2309	if (!btrfs_is_zoned(block_group->fs_info))2310		return 0;2311 2312	return do_zone_finish(block_group, false);2313}2314 2315bool btrfs_can_activate_zone(struct btrfs_fs_devices *fs_devices, u64 flags)2316{2317	struct btrfs_fs_info *fs_info = fs_devices->fs_info;2318	struct btrfs_device *device;2319	bool ret = false;2320 2321	if (!btrfs_is_zoned(fs_info))2322		return true;2323 2324	/* Check if there is a device with active zones left */2325	mutex_lock(&fs_info->chunk_mutex);2326	spin_lock(&fs_info->zone_active_bgs_lock);2327	list_for_each_entry(device, &fs_devices->alloc_list, dev_alloc_list) {2328		struct btrfs_zoned_device_info *zinfo = device->zone_info;2329		int reserved = 0;2330 2331		if (!device->bdev)2332			continue;2333 2334		if (!zinfo->max_active_zones) {2335			ret = true;2336			break;2337		}2338 2339		if (flags & BTRFS_BLOCK_GROUP_DATA)2340			reserved = zinfo->reserved_active_zones;2341 2342		switch (flags & BTRFS_BLOCK_GROUP_PROFILE_MASK) {2343		case 0: /* single */2344			ret = (atomic_read(&zinfo->active_zones_left) >= (1 + reserved));2345			break;2346		case BTRFS_BLOCK_GROUP_DUP:2347			ret = (atomic_read(&zinfo->active_zones_left) >= (2 + reserved));2348			break;2349		}2350		if (ret)2351			break;2352	}2353	spin_unlock(&fs_info->zone_active_bgs_lock);2354	mutex_unlock(&fs_info->chunk_mutex);2355 2356	if (!ret)2357		set_bit(BTRFS_FS_NEED_ZONE_FINISH, &fs_info->flags);2358 2359	return ret;2360}2361 2362void btrfs_zone_finish_endio(struct btrfs_fs_info *fs_info, u64 logical, u64 length)2363{2364	struct btrfs_block_group *block_group;2365	u64 min_alloc_bytes;2366 2367	if (!btrfs_is_zoned(fs_info))2368		return;2369 2370	block_group = btrfs_lookup_block_group(fs_info, logical);2371	ASSERT(block_group);2372 2373	/* No MIXED_BG on zoned btrfs. */2374	if (block_group->flags & BTRFS_BLOCK_GROUP_DATA)2375		min_alloc_bytes = fs_info->sectorsize;2376	else2377		min_alloc_bytes = fs_info->nodesize;2378 2379	/* Bail out if we can allocate more data from this block group. */2380	if (logical + length + min_alloc_bytes <=2381	    block_group->start + block_group->zone_capacity)2382		goto out;2383 2384	do_zone_finish(block_group, true);2385 2386out:2387	btrfs_put_block_group(block_group);2388}2389 2390static void btrfs_zone_finish_endio_workfn(struct work_struct *work)2391{2392	struct btrfs_block_group *bg =2393		container_of(work, struct btrfs_block_group, zone_finish_work);2394 2395	wait_on_extent_buffer_writeback(bg->last_eb);2396	free_extent_buffer(bg->last_eb);2397	btrfs_zone_finish_endio(bg->fs_info, bg->start, bg->length);2398	btrfs_put_block_group(bg);2399}2400 2401void btrfs_schedule_zone_finish_bg(struct btrfs_block_group *bg,2402				   struct extent_buffer *eb)2403{2404	if (!test_bit(BLOCK_GROUP_FLAG_SEQUENTIAL_ZONE, &bg->runtime_flags) ||2405	    eb->start + eb->len * 2 <= bg->start + bg->zone_capacity)2406		return;2407 2408	if (WARN_ON(bg->zone_finish_work.func == btrfs_zone_finish_endio_workfn)) {2409		btrfs_err(bg->fs_info, "double scheduling of bg %llu zone finishing",2410			  bg->start);2411		return;2412	}2413 2414	/* For the work */2415	btrfs_get_block_group(bg);2416	atomic_inc(&eb->refs);2417	bg->last_eb = eb;2418	INIT_WORK(&bg->zone_finish_work, btrfs_zone_finish_endio_workfn);2419	queue_work(system_unbound_wq, &bg->zone_finish_work);2420}2421 2422void btrfs_clear_data_reloc_bg(struct btrfs_block_group *bg)2423{2424	struct btrfs_fs_info *fs_info = bg->fs_info;2425 2426	spin_lock(&fs_info->relocation_bg_lock);2427	if (fs_info->data_reloc_bg == bg->start)2428		fs_info->data_reloc_bg = 0;2429	spin_unlock(&fs_info->relocation_bg_lock);2430}2431 2432void btrfs_free_zone_cache(struct btrfs_fs_info *fs_info)2433{2434	struct btrfs_fs_devices *fs_devices = fs_info->fs_devices;2435	struct btrfs_device *device;2436 2437	if (!btrfs_is_zoned(fs_info))2438		return;2439 2440	mutex_lock(&fs_devices->device_list_mutex);2441	list_for_each_entry(device, &fs_devices->devices, dev_list) {2442		if (device->zone_info) {2443			vfree(device->zone_info->zone_cache);2444			device->zone_info->zone_cache = NULL;2445		}2446	}2447	mutex_unlock(&fs_devices->device_list_mutex);2448}2449 2450bool btrfs_zoned_should_reclaim(const struct btrfs_fs_info *fs_info)2451{2452	struct btrfs_fs_devices *fs_devices = fs_info->fs_devices;2453	struct btrfs_device *device;2454	u64 used = 0;2455	u64 total = 0;2456	u64 factor;2457 2458	ASSERT(btrfs_is_zoned(fs_info));2459 2460	if (fs_info->bg_reclaim_threshold == 0)2461		return false;2462 2463	mutex_lock(&fs_devices->device_list_mutex);2464	list_for_each_entry(device, &fs_devices->devices, dev_list) {2465		if (!device->bdev)2466			continue;2467 2468		total += device->disk_total_bytes;2469		used += device->bytes_used;2470	}2471	mutex_unlock(&fs_devices->device_list_mutex);2472 2473	factor = div64_u64(used * 100, total);2474	return factor >= fs_info->bg_reclaim_threshold;2475}2476 2477void btrfs_zoned_release_data_reloc_bg(struct btrfs_fs_info *fs_info, u64 logical,2478				       u64 length)2479{2480	struct btrfs_block_group *block_group;2481 2482	if (!btrfs_is_zoned(fs_info))2483		return;2484 2485	block_group = btrfs_lookup_block_group(fs_info, logical);2486	/* It should be called on a previous data relocation block group. */2487	ASSERT(block_group && (block_group->flags & BTRFS_BLOCK_GROUP_DATA));2488 2489	spin_lock(&block_group->lock);2490	if (!test_bit(BLOCK_GROUP_FLAG_ZONED_DATA_RELOC, &block_group->runtime_flags))2491		goto out;2492 2493	/* All relocation extents are written. */2494	if (block_group->start + block_group->alloc_offset == logical + length) {2495		/*2496		 * Now, release this block group for further allocations and2497		 * zone finish.2498		 */2499		clear_bit(BLOCK_GROUP_FLAG_ZONED_DATA_RELOC,2500			  &block_group->runtime_flags);2501	}2502 2503out:2504	spin_unlock(&block_group->lock);2505	btrfs_put_block_group(block_group);2506}2507 2508int btrfs_zone_finish_one_bg(struct btrfs_fs_info *fs_info)2509{2510	struct btrfs_block_group *block_group;2511	struct btrfs_block_group *min_bg = NULL;2512	u64 min_avail = U64_MAX;2513	int ret;2514 2515	spin_lock(&fs_info->zone_active_bgs_lock);2516	list_for_each_entry(block_group, &fs_info->zone_active_bgs,2517			    active_bg_list) {2518		u64 avail;2519 2520		spin_lock(&block_group->lock);2521		if (block_group->reserved || block_group->alloc_offset == 0 ||2522		    (block_group->flags & BTRFS_BLOCK_GROUP_SYSTEM) ||2523		    test_bit(BLOCK_GROUP_FLAG_ZONED_DATA_RELOC, &block_group->runtime_flags)) {2524			spin_unlock(&block_group->lock);2525			continue;2526		}2527 2528		avail = block_group->zone_capacity - block_group->alloc_offset;2529		if (min_avail > avail) {2530			if (min_bg)2531				btrfs_put_block_group(min_bg);2532			min_bg = block_group;2533			min_avail = avail;2534			btrfs_get_block_group(min_bg);2535		}2536		spin_unlock(&block_group->lock);2537	}2538	spin_unlock(&fs_info->zone_active_bgs_lock);2539 2540	if (!min_bg)2541		return 0;2542 2543	ret = btrfs_zone_finish(min_bg);2544	btrfs_put_block_group(min_bg);2545 2546	return ret < 0 ? ret : 1;2547}2548 2549int btrfs_zoned_activate_one_bg(struct btrfs_fs_info *fs_info,2550				struct btrfs_space_info *space_info,2551				bool do_finish)2552{2553	struct btrfs_block_group *bg;2554	int index;2555 2556	if (!btrfs_is_zoned(fs_info) || (space_info->flags & BTRFS_BLOCK_GROUP_DATA))2557		return 0;2558 2559	for (;;) {2560		int ret;2561		bool need_finish = false;2562 2563		down_read(&space_info->groups_sem);2564		for (index = 0; index < BTRFS_NR_RAID_TYPES; index++) {2565			list_for_each_entry(bg, &space_info->block_groups[index],2566					    list) {2567				if (!spin_trylock(&bg->lock))2568					continue;2569				if (btrfs_zoned_bg_is_full(bg) ||2570				    test_bit(BLOCK_GROUP_FLAG_ZONE_IS_ACTIVE,2571					     &bg->runtime_flags)) {2572					spin_unlock(&bg->lock);2573					continue;2574				}2575				spin_unlock(&bg->lock);2576 2577				if (btrfs_zone_activate(bg)) {2578					up_read(&space_info->groups_sem);2579					return 1;2580				}2581 2582				need_finish = true;2583			}2584		}2585		up_read(&space_info->groups_sem);2586 2587		if (!do_finish || !need_finish)2588			break;2589 2590		ret = btrfs_zone_finish_one_bg(fs_info);2591		if (ret == 0)2592			break;2593		if (ret < 0)2594			return ret;2595	}2596 2597	return 0;2598}2599 2600/*2601 * Reserve zones for one metadata block group, one tree-log block group, and one2602 * system block group.2603 */2604void btrfs_check_active_zone_reservation(struct btrfs_fs_info *fs_info)2605{2606	struct btrfs_fs_devices *fs_devices = fs_info->fs_devices;2607	struct btrfs_block_group *block_group;2608	struct btrfs_device *device;2609	/* Reserve zones for normal SINGLE metadata and tree-log block group. */2610	unsigned int metadata_reserve = 2;2611	/* Reserve a zone for SINGLE system block group. */2612	unsigned int system_reserve = 1;2613 2614	if (!test_bit(BTRFS_FS_ACTIVE_ZONE_TRACKING, &fs_info->flags))2615		return;2616 2617	/*2618	 * This function is called from the mount context. So, there is no2619	 * parallel process touching the bits. No need for read_seqretry().2620	 */2621	if (fs_info->avail_metadata_alloc_bits & BTRFS_BLOCK_GROUP_DUP)2622		metadata_reserve = 4;2623	if (fs_info->avail_system_alloc_bits & BTRFS_BLOCK_GROUP_DUP)2624		system_reserve = 2;2625 2626	/* Apply the reservation on all the devices. */2627	mutex_lock(&fs_devices->device_list_mutex);2628	list_for_each_entry(device, &fs_devices->devices, dev_list) {2629		if (!device->bdev)2630			continue;2631 2632		device->zone_info->reserved_active_zones =2633			metadata_reserve + system_reserve;2634	}2635	mutex_unlock(&fs_devices->device_list_mutex);2636 2637	/* Release reservation for currently active block groups. */2638	spin_lock(&fs_info->zone_active_bgs_lock);2639	list_for_each_entry(block_group, &fs_info->zone_active_bgs, active_bg_list) {2640		struct btrfs_chunk_map *map = block_group->physical_map;2641 2642		if (!(block_group->flags &2643		      (BTRFS_BLOCK_GROUP_METADATA | BTRFS_BLOCK_GROUP_SYSTEM)))2644			continue;2645 2646		for (int i = 0; i < map->num_stripes; i++)2647			map->stripes[i].dev->zone_info->reserved_active_zones--;2648	}2649	spin_unlock(&fs_info->zone_active_bgs_lock);2650}2651