Lines Matching +full:data +full:- +full:mirror

1 // SPDX-License-Identifier: GPL-2.0
10 #include "rcu-string.h"
11 #include "disk-io.h"
12 #include "block-group.h"
14 #include "dev-replace.h"
15 #include "space-info.h"
20 #define WP_MISSING_DEV ((u64)-1)
22 #define WP_CONVENTIONAL ((u64)-2)
27 * - primary superblock: 0B (zone 0)
28 * - first copy: 512G (zone starting at that offset)
29 * - second copy: 4T (zone starting at that offset)
43 * 256MiB, and we are expecting ZNS drives to be in the 1-4GiB range. We do not
48 static int copy_zone_info_cb(struct blk_zone *zone, unsigned int idx, void *data) in copy_zone_info_cb() argument
50 struct blk_zone *zones = data; in copy_zone_info_cb()
92 return -ENOENT; in sb_write_pointer()
95 struct address_space *mapping = bdev->bd_inode->i_mapping; in sb_write_pointer()
104 << SECTOR_SHIFT) - BTRFS_SUPER_INFO_SIZE; in sb_write_pointer()
116 if (super[0]->generation > super[1]->generation) in sb_write_pointer()
128 return -EUCLEAN; in sb_write_pointer()
135 * Get the first zone number of the superblock mirror
137 static inline u32 sb_zone_number(int shift, int mirror) in sb_zone_number() argument
141 ASSERT(mirror < BTRFS_SUPER_MIRROR_MAX); in sb_zone_number()
142 switch (mirror) { in sb_zone_number()
144 case 1: zone = 1ULL << (BTRFS_SB_LOG_FIRST_SHIFT - shift); break; in sb_zone_number()
145 case 2: zone = 1ULL << (BTRFS_SB_LOG_SECOND_SHIFT - shift); break; in sb_zone_number()
162 return (u64)zone_number << zone_info->zone_size_shift; in zone_start_physical()
166 * Emulate blkdev_report_zones() for a non-zoned device. It slices up the block
173 const sector_t zone_sectors = device->fs_info->zone_size >> SECTOR_SHIFT; in emulate_report_zones()
174 sector_t bdev_size = bdev_nr_sectors(device->bdev); in emulate_report_zones()
203 if (!bdev_is_zoned(device->bdev)) { in btrfs_get_dev_zones()
209 ret = blkdev_report_zones(device->bdev, pos >> SECTOR_SHIFT, *nr_zones, in btrfs_get_dev_zones()
212 btrfs_err_in_rcu(device->fs_info, in btrfs_get_dev_zones()
214 pos, rcu_str_deref(device->name), in btrfs_get_dev_zones()
215 device->devid); in btrfs_get_dev_zones()
220 return -EIO; in btrfs_get_dev_zones()
229 struct btrfs_root *root = fs_info->dev_root; in calculate_emulated_zone_size()
241 return -ENOMEM; in calculate_emulated_zone_size()
247 if (path->slots[0] >= btrfs_header_nritems(path->nodes[0])) { in calculate_emulated_zone_size()
253 ret = -EUCLEAN; in calculate_emulated_zone_size()
258 leaf = path->nodes[0]; in calculate_emulated_zone_size()
259 dext = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_dev_extent); in calculate_emulated_zone_size()
260 fs_info->zone_size = btrfs_dev_extent_length(leaf, dext); in calculate_emulated_zone_size()
271 struct btrfs_fs_devices *fs_devices = fs_info->fs_devices; in btrfs_get_dev_zone_info_all_devices()
275 /* fs_info->zone_size might not set yet. Use the incomapt flag here. */ in btrfs_get_dev_zone_info_all_devices()
279 mutex_lock(&fs_devices->device_list_mutex); in btrfs_get_dev_zone_info_all_devices()
280 list_for_each_entry(device, &fs_devices->devices, dev_list) { in btrfs_get_dev_zone_info_all_devices()
282 if (!device->bdev) in btrfs_get_dev_zone_info_all_devices()
289 mutex_unlock(&fs_devices->device_list_mutex); in btrfs_get_dev_zone_info_all_devices()
296 struct btrfs_fs_info *fs_info = device->fs_info; in btrfs_get_dev_zone_info()
298 struct block_device *bdev = device->bdev; in btrfs_get_dev_zone_info()
314 if (device->zone_info) in btrfs_get_dev_zone_info()
319 return -ENOMEM; in btrfs_get_dev_zone_info()
322 if (!fs_info->zone_size) { in btrfs_get_dev_zone_info()
328 ASSERT(fs_info->zone_size); in btrfs_get_dev_zone_info()
329 zone_sectors = fs_info->zone_size >> SECTOR_SHIFT; in btrfs_get_dev_zone_info()
335 ASSERT(zone_sectors != 0 && (zone_sectors & (zone_sectors - 1)) == 0); in btrfs_get_dev_zone_info()
336 zone_info->zone_size = zone_sectors << SECTOR_SHIFT; in btrfs_get_dev_zone_info()
339 if (zone_info->zone_size > BTRFS_MAX_ZONE_SIZE) { in btrfs_get_dev_zone_info()
342 rcu_str_deref(device->name), in btrfs_get_dev_zone_info()
343 zone_info->zone_size, BTRFS_MAX_ZONE_SIZE); in btrfs_get_dev_zone_info()
344 ret = -EINVAL; in btrfs_get_dev_zone_info()
349 zone_info->zone_size_shift = ilog2(zone_info->zone_size); in btrfs_get_dev_zone_info()
350 zone_info->nr_zones = nr_sectors >> ilog2(zone_sectors); in btrfs_get_dev_zone_info()
352 zone_info->nr_zones++; in btrfs_get_dev_zone_info()
354 zone_info->seq_zones = bitmap_zalloc(zone_info->nr_zones, GFP_KERNEL); in btrfs_get_dev_zone_info()
355 if (!zone_info->seq_zones) { in btrfs_get_dev_zone_info()
356 ret = -ENOMEM; in btrfs_get_dev_zone_info()
360 zone_info->empty_zones = bitmap_zalloc(zone_info->nr_zones, GFP_KERNEL); in btrfs_get_dev_zone_info()
361 if (!zone_info->empty_zones) { in btrfs_get_dev_zone_info()
362 ret = -ENOMEM; in btrfs_get_dev_zone_info()
368 ret = -ENOMEM; in btrfs_get_dev_zone_info()
382 __set_bit(nreported, zone_info->seq_zones); in btrfs_get_dev_zone_info()
384 __set_bit(nreported, zone_info->empty_zones); in btrfs_get_dev_zone_info()
387 sector = zones[nr_zones - 1].start + zones[nr_zones - 1].len; in btrfs_get_dev_zone_info()
390 if (nreported != zone_info->nr_zones) { in btrfs_get_dev_zone_info()
391 btrfs_err_in_rcu(device->fs_info, in btrfs_get_dev_zone_info()
393 rcu_str_deref(device->name), nreported, in btrfs_get_dev_zone_info()
394 zone_info->nr_zones); in btrfs_get_dev_zone_info()
395 ret = -EIO; in btrfs_get_dev_zone_info()
406 sb_zone = sb_zone_number(zone_info->zone_size_shift, i); in btrfs_get_dev_zone_info()
407 if (sb_zone + 1 >= zone_info->nr_zones) in btrfs_get_dev_zone_info()
412 &zone_info->sb_zones[sb_pos], in btrfs_get_dev_zone_info()
418 btrfs_err_in_rcu(device->fs_info, in btrfs_get_dev_zone_info()
420 device->devid, sb_zone); in btrfs_get_dev_zone_info()
421 ret = -EUCLEAN; in btrfs_get_dev_zone_info()
429 if (zone_info->sb_zones[BTRFS_NR_SB_LOG_ZONES * i].type == in btrfs_get_dev_zone_info()
433 ret = sb_write_pointer(device->bdev, in btrfs_get_dev_zone_info()
434 &zone_info->sb_zones[sb_pos], &sb_wp); in btrfs_get_dev_zone_info()
435 if (ret != -ENOENT && ret) { in btrfs_get_dev_zone_info()
436 btrfs_err_in_rcu(device->fs_info, in btrfs_get_dev_zone_info()
438 device->devid, sb_zone); in btrfs_get_dev_zone_info()
439 ret = -EUCLEAN; in btrfs_get_dev_zone_info()
447 device->zone_info = zone_info; in btrfs_get_dev_zone_info()
451 model = "host-managed zoned"; in btrfs_get_dev_zone_info()
455 model = "host-aware zoned"; in btrfs_get_dev_zone_info()
466 rcu_str_deref(device->name)); in btrfs_get_dev_zone_info()
467 ret = -EOPNOTSUPP; in btrfs_get_dev_zone_info()
473 model, rcu_str_deref(device->name), zone_info->nr_zones, in btrfs_get_dev_zone_info()
474 emulated, zone_info->zone_size); in btrfs_get_dev_zone_info()
481 bitmap_free(zone_info->empty_zones); in btrfs_get_dev_zone_info()
482 bitmap_free(zone_info->seq_zones); in btrfs_get_dev_zone_info()
484 device->zone_info = NULL; in btrfs_get_dev_zone_info()
491 struct btrfs_zoned_device_info *zone_info = device->zone_info; in btrfs_destroy_dev_zone_info()
496 bitmap_free(zone_info->seq_zones); in btrfs_destroy_dev_zone_info()
497 bitmap_free(zone_info->empty_zones); in btrfs_destroy_dev_zone_info()
499 device->zone_info = NULL; in btrfs_destroy_dev_zone_info()
510 return ret ? ret : -EIO; in btrfs_get_dev_zone()
517 struct btrfs_fs_devices *fs_devices = fs_info->fs_devices; in btrfs_check_zoned_mode()
526 list_for_each_entry(device, &fs_devices->devices, dev_list) { in btrfs_check_zoned_mode()
529 if (!device->bdev) in btrfs_check_zoned_mode()
532 model = bdev_zoned_model(device->bdev); in btrfs_check_zoned_mode()
534 * A Host-Managed zoned device must be used as a zoned device. in btrfs_check_zoned_mode()
535 * A Host-Aware zoned device and a non-zoned devices can be in btrfs_check_zoned_mode()
543 device->zone_info; in btrfs_check_zoned_mode()
545 zone_info = device->zone_info; in btrfs_check_zoned_mode()
548 zone_size = zone_info->zone_size; in btrfs_check_zoned_mode()
549 } else if (zone_info->zone_size != zone_size) { in btrfs_check_zoned_mode()
552 device->zone_info->zone_size, in btrfs_check_zoned_mode()
554 ret = -EINVAL; in btrfs_check_zoned_mode()
568 ret = -EINVAL; in btrfs_check_zoned_mode()
575 ret = -EINVAL; in btrfs_check_zoned_mode()
582 ret = -EINVAL; in btrfs_check_zoned_mode()
595 ret = -EINVAL; in btrfs_check_zoned_mode()
601 ret = -EINVAL; in btrfs_check_zoned_mode()
605 fs_info->zone_size = zone_size; in btrfs_check_zoned_mode()
606 fs_info->fs_devices->chunk_alloc_policy = BTRFS_CHUNK_ALLOC_ZONED; in btrfs_check_zoned_mode()
609 * Check mount options here, because we might change fs_info->zoned in btrfs_check_zoned_mode()
610 * from fs_info->zone_size. in btrfs_check_zoned_mode()
632 return -EINVAL; in btrfs_check_mountopts_zoned()
637 return -EINVAL; in btrfs_check_mountopts_zoned()
655 if (ret != -ENOENT && ret < 0) in sb_log_location()
666 if (reset && reset->cond != BLK_ZONE_COND_EMPTY) { in sb_log_location()
667 ASSERT(reset->cond == BLK_ZONE_COND_FULL); in sb_log_location()
670 reset->start, reset->len, in sb_log_location()
675 reset->cond = BLK_ZONE_COND_EMPTY; in sb_log_location()
676 reset->wp = reset->start; in sb_log_location()
678 } else if (ret != -ENOENT) { in sb_log_location()
682 wp -= BTRFS_SUPER_INFO_SIZE; in sb_log_location()
690 int btrfs_sb_log_location_bdev(struct block_device *bdev, int mirror, int rw, in btrfs_sb_log_location_bdev() argument
702 *bytenr_ret = btrfs_sb_offset(mirror); in btrfs_sb_log_location_bdev()
710 return -EINVAL; in btrfs_sb_log_location_bdev()
715 sb_zone = sb_zone_number(zone_sectors_shift + SECTOR_SHIFT, mirror); in btrfs_sb_log_location_bdev()
717 return -ENOENT; in btrfs_sb_log_location_bdev()
725 return -EIO; in btrfs_sb_log_location_bdev()
730 int btrfs_sb_log_location(struct btrfs_device *device, int mirror, int rw, in btrfs_sb_log_location() argument
733 struct btrfs_zoned_device_info *zinfo = device->zone_info; in btrfs_sb_log_location()
737 * For a zoned filesystem on a non-zoned block device, use the same in btrfs_sb_log_location()
742 if (!bdev_is_zoned(device->bdev)) { in btrfs_sb_log_location()
743 *bytenr_ret = btrfs_sb_offset(mirror); in btrfs_sb_log_location()
747 zone_num = sb_zone_number(zinfo->zone_size_shift, mirror); in btrfs_sb_log_location()
748 if (zone_num + 1 >= zinfo->nr_zones) in btrfs_sb_log_location()
749 return -ENOENT; in btrfs_sb_log_location()
751 return sb_log_location(device->bdev, in btrfs_sb_log_location()
752 &zinfo->sb_zones[BTRFS_NR_SB_LOG_ZONES * mirror], in btrfs_sb_log_location()
757 int mirror) in is_sb_log_zone() argument
764 zone_num = sb_zone_number(zinfo->zone_size_shift, mirror); in is_sb_log_zone()
765 if (zone_num + 1 >= zinfo->nr_zones) in is_sb_log_zone()
768 if (!test_bit(zone_num, zinfo->seq_zones)) in is_sb_log_zone()
774 void btrfs_advance_sb_log(struct btrfs_device *device, int mirror) in btrfs_advance_sb_log() argument
776 struct btrfs_zoned_device_info *zinfo = device->zone_info; in btrfs_advance_sb_log()
779 if (!is_sb_log_zone(zinfo, mirror)) in btrfs_advance_sb_log()
782 zone = &zinfo->sb_zones[BTRFS_NR_SB_LOG_ZONES * mirror]; in btrfs_advance_sb_log()
783 if (zone->cond != BLK_ZONE_COND_FULL) { in btrfs_advance_sb_log()
784 if (zone->cond == BLK_ZONE_COND_EMPTY) in btrfs_advance_sb_log()
785 zone->cond = BLK_ZONE_COND_IMP_OPEN; in btrfs_advance_sb_log()
787 zone->wp += (BTRFS_SUPER_INFO_SIZE >> SECTOR_SHIFT); in btrfs_advance_sb_log()
789 if (zone->wp == zone->start + zone->len) in btrfs_advance_sb_log()
790 zone->cond = BLK_ZONE_COND_FULL; in btrfs_advance_sb_log()
796 ASSERT(zone->cond != BLK_ZONE_COND_FULL); in btrfs_advance_sb_log()
797 if (zone->cond == BLK_ZONE_COND_EMPTY) in btrfs_advance_sb_log()
798 zone->cond = BLK_ZONE_COND_IMP_OPEN; in btrfs_advance_sb_log()
800 zone->wp += (BTRFS_SUPER_INFO_SIZE >> SECTOR_SHIFT); in btrfs_advance_sb_log()
802 if (zone->wp == zone->start + zone->len) in btrfs_advance_sb_log()
803 zone->cond = BLK_ZONE_COND_FULL; in btrfs_advance_sb_log()
806 int btrfs_reset_sb_log_zones(struct block_device *bdev, int mirror) in btrfs_reset_sb_log_zones() argument
819 sb_zone = sb_zone_number(zone_sectors_shift + SECTOR_SHIFT, mirror); in btrfs_reset_sb_log_zones()
821 return -ENOENT; in btrfs_reset_sb_log_zones()
829 * btrfs_find_allocatable_zones - find allocatable zones within a given region
842 struct btrfs_zoned_device_info *zinfo = device->zone_info; in btrfs_find_allocatable_zones()
843 const u8 shift = zinfo->zone_size_shift; in btrfs_find_allocatable_zones()
850 ASSERT(IS_ALIGNED(hole_start, zinfo->zone_size)); in btrfs_find_allocatable_zones()
851 ASSERT(IS_ALIGNED(num_bytes, zinfo->zone_size)); in btrfs_find_allocatable_zones()
857 if (end > zinfo->nr_zones) in btrfs_find_allocatable_zones()
862 find_next_zero_bit(zinfo->empty_zones, end, begin) != end) { in btrfs_find_allocatable_zones()
863 pos += zinfo->zone_size; in btrfs_find_allocatable_zones()
887 zinfo->zone_size); in btrfs_find_allocatable_zones()
904 ret = blkdev_zone_mgmt(device->bdev, REQ_OP_ZONE_RESET, in btrfs_reset_device_zone()
913 physical += device->zone_info->zone_size; in btrfs_reset_device_zone()
914 length -= device->zone_info->zone_size; in btrfs_reset_device_zone()
922 struct btrfs_zoned_device_info *zinfo = device->zone_info; in btrfs_ensure_empty_zones()
923 const u8 shift = zinfo->zone_size_shift; in btrfs_ensure_empty_zones()
929 ASSERT(IS_ALIGNED(start, zinfo->zone_size)); in btrfs_ensure_empty_zones()
930 ASSERT(IS_ALIGNED(size, zinfo->zone_size)); in btrfs_ensure_empty_zones()
932 if (end > zinfo->nr_zones) in btrfs_ensure_empty_zones()
933 return -ERANGE; in btrfs_ensure_empty_zones()
936 if (find_next_bit(zinfo->seq_zones, begin, end) == end) in btrfs_ensure_empty_zones()
940 if (find_next_zero_bit(zinfo->seq_zones, begin, end) == end && in btrfs_ensure_empty_zones()
941 find_next_zero_bit(zinfo->empty_zones, begin, end) == end) in btrfs_ensure_empty_zones()
944 for (pos = start; pos < start + size; pos += zinfo->zone_size) { in btrfs_ensure_empty_zones()
953 device->fs_info, in btrfs_ensure_empty_zones()
955 rcu_str_deref(device->name), device->devid, pos >> shift); in btrfs_ensure_empty_zones()
958 ret = btrfs_reset_device_zone(device, pos, zinfo->zone_size, in btrfs_ensure_empty_zones()
976 struct btrfs_fs_info *fs_info = cache->fs_info; in calculate_alloc_pointer()
977 struct btrfs_root *root = fs_info->extent_root; in calculate_alloc_pointer()
986 return -ENOMEM; in calculate_alloc_pointer()
988 key.objectid = cache->start + cache->length; in calculate_alloc_pointer()
995 ret = -EUCLEAN; in calculate_alloc_pointer()
999 ret = btrfs_previous_extent_item(root, path, cache->start); in calculate_alloc_pointer()
1008 btrfs_item_key_to_cpu(path->nodes[0], &found_key, path->slots[0]); in calculate_alloc_pointer()
1013 length = fs_info->nodesize; in calculate_alloc_pointer()
1015 if (!(found_key.objectid >= cache->start && in calculate_alloc_pointer()
1016 found_key.objectid + length <= cache->start + cache->length)) { in calculate_alloc_pointer()
1017 ret = -EUCLEAN; in calculate_alloc_pointer()
1020 *offset_ret = found_key.objectid + length - cache->start; in calculate_alloc_pointer()
1030 struct btrfs_fs_info *fs_info = cache->fs_info; in btrfs_load_block_group_zone_info()
1031 struct extent_map_tree *em_tree = &fs_info->mapping_tree; in btrfs_load_block_group_zone_info()
1035 u64 logical = cache->start; in btrfs_load_block_group_zone_info()
1036 u64 length = cache->length; in btrfs_load_block_group_zone_info()
1049 if (!IS_ALIGNED(length, fs_info->zone_size)) { in btrfs_load_block_group_zone_info()
1052 logical, length, fs_info->zone_size); in btrfs_load_block_group_zone_info()
1053 return -EIO; in btrfs_load_block_group_zone_info()
1057 read_lock(&em_tree->lock); in btrfs_load_block_group_zone_info()
1059 read_unlock(&em_tree->lock); in btrfs_load_block_group_zone_info()
1062 return -EINVAL; in btrfs_load_block_group_zone_info()
1064 map = em->map_lookup; in btrfs_load_block_group_zone_info()
1066 alloc_offsets = kcalloc(map->num_stripes, sizeof(*alloc_offsets), GFP_NOFS); in btrfs_load_block_group_zone_info()
1069 return -ENOMEM; in btrfs_load_block_group_zone_info()
1072 for (i = 0; i < map->num_stripes; i++) { in btrfs_load_block_group_zone_info()
1075 struct btrfs_dev_replace *dev_replace = &fs_info->dev_replace; in btrfs_load_block_group_zone_info()
1078 device = map->stripes[i].dev; in btrfs_load_block_group_zone_info()
1079 physical = map->stripes[i].physical; in btrfs_load_block_group_zone_info()
1081 if (device->bdev == NULL) { in btrfs_load_block_group_zone_info()
1099 * non-empty. in btrfs_load_block_group_zone_info()
1103 down_read(&dev_replace->rwsem); in btrfs_load_block_group_zone_info()
1105 if (dev_replace_is_ongoing && dev_replace->tgtdev != NULL) in btrfs_load_block_group_zone_info()
1106 btrfs_dev_clear_zone_empty(dev_replace->tgtdev, physical); in btrfs_load_block_group_zone_info()
1107 up_read(&dev_replace->rwsem); in btrfs_load_block_group_zone_info()
1113 WARN_ON(!IS_ALIGNED(physical, fs_info->zone_size)); in btrfs_load_block_group_zone_info()
1117 if (ret == -EIO || ret == -EOPNOTSUPP) { in btrfs_load_block_group_zone_info()
1129 rcu_str_deref(device->name), device->devid); in btrfs_load_block_group_zone_info()
1130 ret = -EIO; in btrfs_load_block_group_zone_info()
1139 physical >> device->zone_info->zone_size_shift, in btrfs_load_block_group_zone_info()
1140 rcu_str_deref(device->name), device->devid); in btrfs_load_block_group_zone_info()
1147 alloc_offsets[i] = fs_info->zone_size; in btrfs_load_block_group_zone_info()
1152 ((zone.wp - zone.start) << SECTOR_SHIFT); in btrfs_load_block_group_zone_info()
1158 cache->seq_zone = true; in btrfs_load_block_group_zone_info()
1165 * Also, we have a lock chain of extent buffer lock -> in btrfs_load_block_group_zone_info()
1173 cache->alloc_offset = 0; in btrfs_load_block_group_zone_info()
1177 if (ret || map->num_stripes == num_conventional) { in btrfs_load_block_group_zone_info()
1179 cache->alloc_offset = last_alloc; in btrfs_load_block_group_zone_info()
1183 cache->start); in btrfs_load_block_group_zone_info()
1188 switch (map->type & BTRFS_BLOCK_GROUP_PROFILE_MASK) { in btrfs_load_block_group_zone_info()
1194 ret = -EIO; in btrfs_load_block_group_zone_info()
1197 cache->alloc_offset = alloc_offsets[0]; in btrfs_load_block_group_zone_info()
1205 /* non-single profiles are not supported yet */ in btrfs_load_block_group_zone_info()
1208 btrfs_bg_type_to_raid_name(map->type)); in btrfs_load_block_group_zone_info()
1209 ret = -EINVAL; in btrfs_load_block_group_zone_info()
1214 if (cache->alloc_offset > fs_info->zone_size) { in btrfs_load_block_group_zone_info()
1217 cache->alloc_offset, cache->start); in btrfs_load_block_group_zone_info()
1218 ret = -EIO; in btrfs_load_block_group_zone_info()
1222 if (!ret && num_conventional && last_alloc > cache->alloc_offset) { in btrfs_load_block_group_zone_info()
1225 logical, last_alloc, cache->alloc_offset); in btrfs_load_block_group_zone_info()
1226 ret = -EIO; in btrfs_load_block_group_zone_info()
1230 cache->meta_write_pointer = cache->alloc_offset + cache->start; in btrfs_load_block_group_zone_info()
1242 if (!btrfs_is_zoned(cache->fs_info)) in btrfs_calc_zone_unusable()
1245 WARN_ON(cache->bytes_super != 0); in btrfs_calc_zone_unusable()
1246 unusable = cache->alloc_offset - cache->used; in btrfs_calc_zone_unusable()
1247 free = cache->length - cache->alloc_offset; in btrfs_calc_zone_unusable()
1249 /* We only need ->free_space in ALLOC_SEQ block groups */ in btrfs_calc_zone_unusable()
1250 cache->last_byte_to_unpin = (u64)-1; in btrfs_calc_zone_unusable()
1251 cache->cached = BTRFS_CACHE_FINISHED; in btrfs_calc_zone_unusable()
1252 cache->free_space_ctl->free_space = free; in btrfs_calc_zone_unusable()
1253 cache->zone_unusable = unusable; in btrfs_calc_zone_unusable()
1262 struct btrfs_fs_info *fs_info = eb->fs_info; in btrfs_redirty_list_add()
1266 !list_empty(&eb->release_list)) in btrfs_redirty_list_add()
1270 set_extent_bits_nowait(&trans->dirty_pages, eb->start, in btrfs_redirty_list_add()
1271 eb->start + eb->len - 1, EXTENT_DIRTY); in btrfs_redirty_list_add()
1272 memzero_extent_buffer(eb, 0, eb->len); in btrfs_redirty_list_add()
1273 set_bit(EXTENT_BUFFER_NO_CHECK, &eb->bflags); in btrfs_redirty_list_add()
1275 spin_lock(&trans->releasing_ebs_lock); in btrfs_redirty_list_add()
1276 list_add_tail(&eb->release_list, &trans->releasing_ebs); in btrfs_redirty_list_add()
1277 spin_unlock(&trans->releasing_ebs_lock); in btrfs_redirty_list_add()
1278 atomic_inc(&eb->refs); in btrfs_redirty_list_add()
1283 spin_lock(&trans->releasing_ebs_lock); in btrfs_free_redirty_list()
1284 while (!list_empty(&trans->releasing_ebs)) { in btrfs_free_redirty_list()
1287 eb = list_first_entry(&trans->releasing_ebs, in btrfs_free_redirty_list()
1289 list_del_init(&eb->release_list); in btrfs_free_redirty_list()
1292 spin_unlock(&trans->releasing_ebs_lock); in btrfs_free_redirty_list()
1297 struct btrfs_fs_info *fs_info = inode->root->fs_info; in btrfs_use_zone_append()
1304 if (!is_data_inode(&inode->vfs_inode)) in btrfs_use_zone_append()
1312 ret = cache->seq_zone; in btrfs_use_zone_append()
1322 const u64 physical = bio->bi_iter.bi_sector << SECTOR_SHIFT; in btrfs_record_physical_zoned()
1331 ordered->physical = physical; in btrfs_record_physical_zoned()
1332 ordered->bdev = bio->bi_bdev; in btrfs_record_physical_zoned()
1339 struct btrfs_inode *inode = BTRFS_I(ordered->inode); in btrfs_rewrite_logical_zoned()
1340 struct btrfs_fs_info *fs_info = inode->root->fs_info; in btrfs_rewrite_logical_zoned()
1344 u64 orig_logical = ordered->disk_bytenr; in btrfs_rewrite_logical_zoned()
1349 ASSERT(!bdev_is_partition(ordered->bdev)); in btrfs_rewrite_logical_zoned()
1350 if (WARN_ON(!ordered->bdev)) in btrfs_rewrite_logical_zoned()
1353 if (WARN_ON(btrfs_rmap_block(fs_info, orig_logical, ordered->bdev, in btrfs_rewrite_logical_zoned()
1354 ordered->physical, &logical, &nr, in btrfs_rewrite_logical_zoned()
1363 ordered->disk_bytenr = *logical; in btrfs_rewrite_logical_zoned()
1365 em_tree = &inode->extent_tree; in btrfs_rewrite_logical_zoned()
1366 write_lock(&em_tree->lock); in btrfs_rewrite_logical_zoned()
1367 em = search_extent_mapping(em_tree, ordered->file_offset, in btrfs_rewrite_logical_zoned()
1368 ordered->num_bytes); in btrfs_rewrite_logical_zoned()
1369 em->block_start = *logical; in btrfs_rewrite_logical_zoned()
1371 write_unlock(&em_tree->lock); in btrfs_rewrite_logical_zoned()
1373 list_for_each_entry(sum, &ordered->list, list) { in btrfs_rewrite_logical_zoned()
1375 sum->bytenr -= orig_logical - *logical; in btrfs_rewrite_logical_zoned()
1377 sum->bytenr += *logical - orig_logical; in btrfs_rewrite_logical_zoned()
1396 if (cache && (eb->start < cache->start || in btrfs_check_meta_write_pointer()
1397 cache->start + cache->length <= eb->start)) { in btrfs_check_meta_write_pointer()
1404 cache = btrfs_lookup_block_group(fs_info, eb->start); in btrfs_check_meta_write_pointer()
1407 if (cache->meta_write_pointer != eb->start) { in btrfs_check_meta_write_pointer()
1412 cache->meta_write_pointer = eb->start + eb->len; in btrfs_check_meta_write_pointer()
1424 if (!btrfs_is_zoned(eb->fs_info) || !cache) in btrfs_revert_meta_write_pointer()
1427 ASSERT(cache->meta_write_pointer == eb->start + eb->len); in btrfs_revert_meta_write_pointer()
1428 cache->meta_write_pointer = eb->start; in btrfs_revert_meta_write_pointer()
1434 return -EOPNOTSUPP; in btrfs_zoned_issue_zeroout()
1436 return blkdev_issue_zeroout(device->bdev, physical >> SECTOR_SHIFT, in btrfs_zoned_issue_zeroout()
1453 return -EIO; in read_zone_info()
1456 if (bbio->map_type & BTRFS_BLOCK_GROUP_RAID56_MASK) in read_zone_info()
1457 return -EINVAL; in read_zone_info()
1460 nmirrors = (int)bbio->num_stripes; in read_zone_info()
1462 u64 physical = bbio->stripes[i].physical; in read_zone_info()
1463 struct btrfs_device *dev = bbio->stripes[i].dev; in read_zone_info()
1466 if (!dev->bdev) in read_zone_info()
1471 if (ret == -EIO || ret == -EOPNOTSUPP) in read_zone_info()
1482 * filling zeros between @physical_pos to a write pointer of dev-replace
1488 struct btrfs_fs_info *fs_info = tgt_dev->fs_info; in btrfs_sync_zone_write_pointer()
1501 wp = physical_start + ((zone.wp - zone.start) << SECTOR_SHIFT); in btrfs_sync_zone_write_pointer()
1507 return -EUCLEAN; in btrfs_sync_zone_write_pointer()
1509 length = wp - physical_pos; in btrfs_sync_zone_write_pointer()
1524 map = em->map_lookup; in btrfs_zoned_get_device()
1526 ASSERT(map->num_stripes == 1); in btrfs_zoned_get_device()
1527 device = map->stripes[0].dev; in btrfs_zoned_get_device()