162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci#ifndef BTRFS_ZONED_H 462306a36Sopenharmony_ci#define BTRFS_ZONED_H 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/types.h> 762306a36Sopenharmony_ci#include <linux/blkdev.h> 862306a36Sopenharmony_ci#include "messages.h" 962306a36Sopenharmony_ci#include "volumes.h" 1062306a36Sopenharmony_ci#include "disk-io.h" 1162306a36Sopenharmony_ci#include "block-group.h" 1262306a36Sopenharmony_ci#include "btrfs_inode.h" 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#define BTRFS_DEFAULT_RECLAIM_THRESH (75) 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_cistruct btrfs_zoned_device_info { 1762306a36Sopenharmony_ci /* 1862306a36Sopenharmony_ci * Number of zones, zone size and types of zones if bdev is a 1962306a36Sopenharmony_ci * zoned block device. 2062306a36Sopenharmony_ci */ 2162306a36Sopenharmony_ci u64 zone_size; 2262306a36Sopenharmony_ci u8 zone_size_shift; 2362306a36Sopenharmony_ci u32 nr_zones; 2462306a36Sopenharmony_ci unsigned int max_active_zones; 2562306a36Sopenharmony_ci /* 2662306a36Sopenharmony_ci * Reserved active zones for one metadata and one system block group. 2762306a36Sopenharmony_ci * It can vary per-device depending on the allocation status. 2862306a36Sopenharmony_ci */ 2962306a36Sopenharmony_ci int reserved_active_zones; 3062306a36Sopenharmony_ci atomic_t active_zones_left; 3162306a36Sopenharmony_ci unsigned long *seq_zones; 3262306a36Sopenharmony_ci unsigned long *empty_zones; 3362306a36Sopenharmony_ci unsigned long *active_zones; 3462306a36Sopenharmony_ci struct blk_zone *zone_cache; 3562306a36Sopenharmony_ci struct blk_zone sb_zones[2 * BTRFS_SUPER_MIRROR_MAX]; 3662306a36Sopenharmony_ci}; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_civoid btrfs_finish_ordered_zoned(struct btrfs_ordered_extent *ordered); 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci#ifdef CONFIG_BLK_DEV_ZONED 4162306a36Sopenharmony_ciint btrfs_get_dev_zone(struct btrfs_device *device, u64 pos, 4262306a36Sopenharmony_ci struct blk_zone *zone); 4362306a36Sopenharmony_ciint btrfs_get_dev_zone_info_all_devices(struct btrfs_fs_info *fs_info); 4462306a36Sopenharmony_ciint btrfs_get_dev_zone_info(struct btrfs_device *device, bool populate_cache); 4562306a36Sopenharmony_civoid btrfs_destroy_dev_zone_info(struct btrfs_device *device); 4662306a36Sopenharmony_cistruct btrfs_zoned_device_info *btrfs_clone_dev_zone_info(struct btrfs_device *orig_dev); 4762306a36Sopenharmony_ciint btrfs_check_zoned_mode(struct btrfs_fs_info *fs_info); 4862306a36Sopenharmony_ciint btrfs_check_mountopts_zoned(struct btrfs_fs_info *info); 4962306a36Sopenharmony_ciint btrfs_sb_log_location_bdev(struct block_device *bdev, int mirror, int rw, 5062306a36Sopenharmony_ci u64 *bytenr_ret); 5162306a36Sopenharmony_ciint btrfs_sb_log_location(struct btrfs_device *device, int mirror, int rw, 5262306a36Sopenharmony_ci u64 *bytenr_ret); 5362306a36Sopenharmony_ciint btrfs_advance_sb_log(struct btrfs_device *device, int mirror); 5462306a36Sopenharmony_ciint btrfs_reset_sb_log_zones(struct block_device *bdev, int mirror); 5562306a36Sopenharmony_ciu64 btrfs_find_allocatable_zones(struct btrfs_device *device, u64 hole_start, 5662306a36Sopenharmony_ci u64 hole_end, u64 num_bytes); 5762306a36Sopenharmony_ciint btrfs_reset_device_zone(struct btrfs_device *device, u64 physical, 5862306a36Sopenharmony_ci u64 length, u64 *bytes); 5962306a36Sopenharmony_ciint btrfs_ensure_empty_zones(struct btrfs_device *device, u64 start, u64 size); 6062306a36Sopenharmony_ciint btrfs_load_block_group_zone_info(struct btrfs_block_group *cache, bool new); 6162306a36Sopenharmony_civoid btrfs_calc_zone_unusable(struct btrfs_block_group *cache); 6262306a36Sopenharmony_civoid btrfs_redirty_list_add(struct btrfs_transaction *trans, 6362306a36Sopenharmony_ci struct extent_buffer *eb); 6462306a36Sopenharmony_cibool btrfs_use_zone_append(struct btrfs_bio *bbio); 6562306a36Sopenharmony_civoid btrfs_record_physical_zoned(struct btrfs_bio *bbio); 6662306a36Sopenharmony_ciint btrfs_check_meta_write_pointer(struct btrfs_fs_info *fs_info, 6762306a36Sopenharmony_ci struct btrfs_eb_write_context *ctx); 6862306a36Sopenharmony_ciint btrfs_zoned_issue_zeroout(struct btrfs_device *device, u64 physical, u64 length); 6962306a36Sopenharmony_ciint btrfs_sync_zone_write_pointer(struct btrfs_device *tgt_dev, u64 logical, 7062306a36Sopenharmony_ci u64 physical_start, u64 physical_pos); 7162306a36Sopenharmony_cibool btrfs_zone_activate(struct btrfs_block_group *block_group); 7262306a36Sopenharmony_ciint btrfs_zone_finish(struct btrfs_block_group *block_group); 7362306a36Sopenharmony_cibool btrfs_can_activate_zone(struct btrfs_fs_devices *fs_devices, u64 flags); 7462306a36Sopenharmony_civoid btrfs_zone_finish_endio(struct btrfs_fs_info *fs_info, u64 logical, 7562306a36Sopenharmony_ci u64 length); 7662306a36Sopenharmony_civoid btrfs_schedule_zone_finish_bg(struct btrfs_block_group *bg, 7762306a36Sopenharmony_ci struct extent_buffer *eb); 7862306a36Sopenharmony_civoid btrfs_clear_data_reloc_bg(struct btrfs_block_group *bg); 7962306a36Sopenharmony_civoid btrfs_free_zone_cache(struct btrfs_fs_info *fs_info); 8062306a36Sopenharmony_cibool btrfs_zoned_should_reclaim(struct btrfs_fs_info *fs_info); 8162306a36Sopenharmony_civoid btrfs_zoned_release_data_reloc_bg(struct btrfs_fs_info *fs_info, u64 logical, 8262306a36Sopenharmony_ci u64 length); 8362306a36Sopenharmony_ciint btrfs_zone_finish_one_bg(struct btrfs_fs_info *fs_info); 8462306a36Sopenharmony_ciint btrfs_zoned_activate_one_bg(struct btrfs_fs_info *fs_info, 8562306a36Sopenharmony_ci struct btrfs_space_info *space_info, bool do_finish); 8662306a36Sopenharmony_civoid btrfs_check_active_zone_reservation(struct btrfs_fs_info *fs_info); 8762306a36Sopenharmony_ci#else /* CONFIG_BLK_DEV_ZONED */ 8862306a36Sopenharmony_cistatic inline int btrfs_get_dev_zone(struct btrfs_device *device, u64 pos, 8962306a36Sopenharmony_ci struct blk_zone *zone) 9062306a36Sopenharmony_ci{ 9162306a36Sopenharmony_ci return 0; 9262306a36Sopenharmony_ci} 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_cistatic inline int btrfs_get_dev_zone_info_all_devices(struct btrfs_fs_info *fs_info) 9562306a36Sopenharmony_ci{ 9662306a36Sopenharmony_ci return 0; 9762306a36Sopenharmony_ci} 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_cistatic inline int btrfs_get_dev_zone_info(struct btrfs_device *device, 10062306a36Sopenharmony_ci bool populate_cache) 10162306a36Sopenharmony_ci{ 10262306a36Sopenharmony_ci return 0; 10362306a36Sopenharmony_ci} 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_cistatic inline void btrfs_destroy_dev_zone_info(struct btrfs_device *device) { } 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci/* 10862306a36Sopenharmony_ci * In case the kernel is compiled without CONFIG_BLK_DEV_ZONED we'll never call 10962306a36Sopenharmony_ci * into btrfs_clone_dev_zone_info() so it's safe to return NULL here. 11062306a36Sopenharmony_ci */ 11162306a36Sopenharmony_cistatic inline struct btrfs_zoned_device_info *btrfs_clone_dev_zone_info( 11262306a36Sopenharmony_ci struct btrfs_device *orig_dev) 11362306a36Sopenharmony_ci{ 11462306a36Sopenharmony_ci return NULL; 11562306a36Sopenharmony_ci} 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_cistatic inline int btrfs_check_zoned_mode(const struct btrfs_fs_info *fs_info) 11862306a36Sopenharmony_ci{ 11962306a36Sopenharmony_ci if (!btrfs_is_zoned(fs_info)) 12062306a36Sopenharmony_ci return 0; 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci btrfs_err(fs_info, "zoned block devices support is not enabled"); 12362306a36Sopenharmony_ci return -EOPNOTSUPP; 12462306a36Sopenharmony_ci} 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_cistatic inline int btrfs_check_mountopts_zoned(struct btrfs_fs_info *info) 12762306a36Sopenharmony_ci{ 12862306a36Sopenharmony_ci return 0; 12962306a36Sopenharmony_ci} 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_cistatic inline int btrfs_sb_log_location_bdev(struct block_device *bdev, 13262306a36Sopenharmony_ci int mirror, int rw, u64 *bytenr_ret) 13362306a36Sopenharmony_ci{ 13462306a36Sopenharmony_ci *bytenr_ret = btrfs_sb_offset(mirror); 13562306a36Sopenharmony_ci return 0; 13662306a36Sopenharmony_ci} 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_cistatic inline int btrfs_sb_log_location(struct btrfs_device *device, int mirror, 13962306a36Sopenharmony_ci int rw, u64 *bytenr_ret) 14062306a36Sopenharmony_ci{ 14162306a36Sopenharmony_ci *bytenr_ret = btrfs_sb_offset(mirror); 14262306a36Sopenharmony_ci return 0; 14362306a36Sopenharmony_ci} 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_cistatic inline int btrfs_advance_sb_log(struct btrfs_device *device, int mirror) 14662306a36Sopenharmony_ci{ 14762306a36Sopenharmony_ci return 0; 14862306a36Sopenharmony_ci} 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_cistatic inline int btrfs_reset_sb_log_zones(struct block_device *bdev, int mirror) 15162306a36Sopenharmony_ci{ 15262306a36Sopenharmony_ci return 0; 15362306a36Sopenharmony_ci} 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_cistatic inline u64 btrfs_find_allocatable_zones(struct btrfs_device *device, 15662306a36Sopenharmony_ci u64 hole_start, u64 hole_end, 15762306a36Sopenharmony_ci u64 num_bytes) 15862306a36Sopenharmony_ci{ 15962306a36Sopenharmony_ci return hole_start; 16062306a36Sopenharmony_ci} 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_cistatic inline int btrfs_reset_device_zone(struct btrfs_device *device, 16362306a36Sopenharmony_ci u64 physical, u64 length, u64 *bytes) 16462306a36Sopenharmony_ci{ 16562306a36Sopenharmony_ci *bytes = 0; 16662306a36Sopenharmony_ci return 0; 16762306a36Sopenharmony_ci} 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_cistatic inline int btrfs_ensure_empty_zones(struct btrfs_device *device, 17062306a36Sopenharmony_ci u64 start, u64 size) 17162306a36Sopenharmony_ci{ 17262306a36Sopenharmony_ci return 0; 17362306a36Sopenharmony_ci} 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_cistatic inline int btrfs_load_block_group_zone_info( 17662306a36Sopenharmony_ci struct btrfs_block_group *cache, bool new) 17762306a36Sopenharmony_ci{ 17862306a36Sopenharmony_ci return 0; 17962306a36Sopenharmony_ci} 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_cistatic inline void btrfs_calc_zone_unusable(struct btrfs_block_group *cache) { } 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_cistatic inline void btrfs_redirty_list_add(struct btrfs_transaction *trans, 18462306a36Sopenharmony_ci struct extent_buffer *eb) { } 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_cistatic inline bool btrfs_use_zone_append(struct btrfs_bio *bbio) 18762306a36Sopenharmony_ci{ 18862306a36Sopenharmony_ci return false; 18962306a36Sopenharmony_ci} 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_cistatic inline void btrfs_record_physical_zoned(struct btrfs_bio *bbio) 19262306a36Sopenharmony_ci{ 19362306a36Sopenharmony_ci} 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_cistatic inline int btrfs_check_meta_write_pointer(struct btrfs_fs_info *fs_info, 19662306a36Sopenharmony_ci struct btrfs_eb_write_context *ctx) 19762306a36Sopenharmony_ci{ 19862306a36Sopenharmony_ci return 0; 19962306a36Sopenharmony_ci} 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_cistatic inline int btrfs_zoned_issue_zeroout(struct btrfs_device *device, 20262306a36Sopenharmony_ci u64 physical, u64 length) 20362306a36Sopenharmony_ci{ 20462306a36Sopenharmony_ci return -EOPNOTSUPP; 20562306a36Sopenharmony_ci} 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_cistatic inline int btrfs_sync_zone_write_pointer(struct btrfs_device *tgt_dev, 20862306a36Sopenharmony_ci u64 logical, u64 physical_start, 20962306a36Sopenharmony_ci u64 physical_pos) 21062306a36Sopenharmony_ci{ 21162306a36Sopenharmony_ci return -EOPNOTSUPP; 21262306a36Sopenharmony_ci} 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_cistatic inline bool btrfs_zone_activate(struct btrfs_block_group *block_group) 21562306a36Sopenharmony_ci{ 21662306a36Sopenharmony_ci return true; 21762306a36Sopenharmony_ci} 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_cistatic inline int btrfs_zone_finish(struct btrfs_block_group *block_group) 22062306a36Sopenharmony_ci{ 22162306a36Sopenharmony_ci return 0; 22262306a36Sopenharmony_ci} 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_cistatic inline bool btrfs_can_activate_zone(struct btrfs_fs_devices *fs_devices, 22562306a36Sopenharmony_ci u64 flags) 22662306a36Sopenharmony_ci{ 22762306a36Sopenharmony_ci return true; 22862306a36Sopenharmony_ci} 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_cistatic inline void btrfs_zone_finish_endio(struct btrfs_fs_info *fs_info, 23162306a36Sopenharmony_ci u64 logical, u64 length) { } 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_cistatic inline void btrfs_schedule_zone_finish_bg(struct btrfs_block_group *bg, 23462306a36Sopenharmony_ci struct extent_buffer *eb) { } 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_cistatic inline void btrfs_clear_data_reloc_bg(struct btrfs_block_group *bg) { } 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_cistatic inline void btrfs_free_zone_cache(struct btrfs_fs_info *fs_info) { } 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_cistatic inline bool btrfs_zoned_should_reclaim(struct btrfs_fs_info *fs_info) 24162306a36Sopenharmony_ci{ 24262306a36Sopenharmony_ci return false; 24362306a36Sopenharmony_ci} 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_cistatic inline void btrfs_zoned_release_data_reloc_bg(struct btrfs_fs_info *fs_info, 24662306a36Sopenharmony_ci u64 logical, u64 length) { } 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_cistatic inline int btrfs_zone_finish_one_bg(struct btrfs_fs_info *fs_info) 24962306a36Sopenharmony_ci{ 25062306a36Sopenharmony_ci return 1; 25162306a36Sopenharmony_ci} 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_cistatic inline int btrfs_zoned_activate_one_bg(struct btrfs_fs_info *fs_info, 25462306a36Sopenharmony_ci struct btrfs_space_info *space_info, 25562306a36Sopenharmony_ci bool do_finish) 25662306a36Sopenharmony_ci{ 25762306a36Sopenharmony_ci /* Consider all the block groups are active */ 25862306a36Sopenharmony_ci return 0; 25962306a36Sopenharmony_ci} 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_cistatic inline void btrfs_check_active_zone_reservation(struct btrfs_fs_info *fs_info) { } 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_ci#endif 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_cistatic inline bool btrfs_dev_is_sequential(struct btrfs_device *device, u64 pos) 26662306a36Sopenharmony_ci{ 26762306a36Sopenharmony_ci struct btrfs_zoned_device_info *zone_info = device->zone_info; 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_ci if (!zone_info) 27062306a36Sopenharmony_ci return false; 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci return test_bit(pos >> zone_info->zone_size_shift, zone_info->seq_zones); 27362306a36Sopenharmony_ci} 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_cistatic inline bool btrfs_dev_is_empty_zone(struct btrfs_device *device, u64 pos) 27662306a36Sopenharmony_ci{ 27762306a36Sopenharmony_ci struct btrfs_zoned_device_info *zone_info = device->zone_info; 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci if (!zone_info) 28062306a36Sopenharmony_ci return true; 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_ci return test_bit(pos >> zone_info->zone_size_shift, zone_info->empty_zones); 28362306a36Sopenharmony_ci} 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_cistatic inline void btrfs_dev_set_empty_zone_bit(struct btrfs_device *device, 28662306a36Sopenharmony_ci u64 pos, bool set) 28762306a36Sopenharmony_ci{ 28862306a36Sopenharmony_ci struct btrfs_zoned_device_info *zone_info = device->zone_info; 28962306a36Sopenharmony_ci unsigned int zno; 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_ci if (!zone_info) 29262306a36Sopenharmony_ci return; 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci zno = pos >> zone_info->zone_size_shift; 29562306a36Sopenharmony_ci if (set) 29662306a36Sopenharmony_ci set_bit(zno, zone_info->empty_zones); 29762306a36Sopenharmony_ci else 29862306a36Sopenharmony_ci clear_bit(zno, zone_info->empty_zones); 29962306a36Sopenharmony_ci} 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_cistatic inline void btrfs_dev_set_zone_empty(struct btrfs_device *device, u64 pos) 30262306a36Sopenharmony_ci{ 30362306a36Sopenharmony_ci btrfs_dev_set_empty_zone_bit(device, pos, true); 30462306a36Sopenharmony_ci} 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_cistatic inline void btrfs_dev_clear_zone_empty(struct btrfs_device *device, u64 pos) 30762306a36Sopenharmony_ci{ 30862306a36Sopenharmony_ci btrfs_dev_set_empty_zone_bit(device, pos, false); 30962306a36Sopenharmony_ci} 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_cistatic inline bool btrfs_check_device_zone_type(const struct btrfs_fs_info *fs_info, 31262306a36Sopenharmony_ci struct block_device *bdev) 31362306a36Sopenharmony_ci{ 31462306a36Sopenharmony_ci if (btrfs_is_zoned(fs_info)) { 31562306a36Sopenharmony_ci /* 31662306a36Sopenharmony_ci * We can allow a regular device on a zoned filesystem, because 31762306a36Sopenharmony_ci * we will emulate the zoned capabilities. 31862306a36Sopenharmony_ci */ 31962306a36Sopenharmony_ci if (!bdev_is_zoned(bdev)) 32062306a36Sopenharmony_ci return true; 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_ci return fs_info->zone_size == 32362306a36Sopenharmony_ci (bdev_zone_sectors(bdev) << SECTOR_SHIFT); 32462306a36Sopenharmony_ci } 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ci /* Do not allow Host Manged zoned device */ 32762306a36Sopenharmony_ci return bdev_zoned_model(bdev) != BLK_ZONED_HM; 32862306a36Sopenharmony_ci} 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_cistatic inline bool btrfs_check_super_location(struct btrfs_device *device, u64 pos) 33162306a36Sopenharmony_ci{ 33262306a36Sopenharmony_ci /* 33362306a36Sopenharmony_ci * On a non-zoned device, any address is OK. On a zoned device, 33462306a36Sopenharmony_ci * non-SEQUENTIAL WRITE REQUIRED zones are capable. 33562306a36Sopenharmony_ci */ 33662306a36Sopenharmony_ci return device->zone_info == NULL || !btrfs_dev_is_sequential(device, pos); 33762306a36Sopenharmony_ci} 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_cistatic inline bool btrfs_can_zone_reset(struct btrfs_device *device, 34062306a36Sopenharmony_ci u64 physical, u64 length) 34162306a36Sopenharmony_ci{ 34262306a36Sopenharmony_ci u64 zone_size; 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci if (!btrfs_dev_is_sequential(device, physical)) 34562306a36Sopenharmony_ci return false; 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_ci zone_size = device->zone_info->zone_size; 34862306a36Sopenharmony_ci if (!IS_ALIGNED(physical, zone_size) || !IS_ALIGNED(length, zone_size)) 34962306a36Sopenharmony_ci return false; 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_ci return true; 35262306a36Sopenharmony_ci} 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_cistatic inline void btrfs_zoned_meta_io_lock(struct btrfs_fs_info *fs_info) 35562306a36Sopenharmony_ci{ 35662306a36Sopenharmony_ci if (!btrfs_is_zoned(fs_info)) 35762306a36Sopenharmony_ci return; 35862306a36Sopenharmony_ci mutex_lock(&fs_info->zoned_meta_io_lock); 35962306a36Sopenharmony_ci} 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_cistatic inline void btrfs_zoned_meta_io_unlock(struct btrfs_fs_info *fs_info) 36262306a36Sopenharmony_ci{ 36362306a36Sopenharmony_ci if (!btrfs_is_zoned(fs_info)) 36462306a36Sopenharmony_ci return; 36562306a36Sopenharmony_ci mutex_unlock(&fs_info->zoned_meta_io_lock); 36662306a36Sopenharmony_ci} 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_cistatic inline void btrfs_clear_treelog_bg(struct btrfs_block_group *bg) 36962306a36Sopenharmony_ci{ 37062306a36Sopenharmony_ci struct btrfs_fs_info *fs_info = bg->fs_info; 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_ci if (!btrfs_is_zoned(fs_info)) 37362306a36Sopenharmony_ci return; 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_ci spin_lock(&fs_info->treelog_bg_lock); 37662306a36Sopenharmony_ci if (fs_info->treelog_bg == bg->start) 37762306a36Sopenharmony_ci fs_info->treelog_bg = 0; 37862306a36Sopenharmony_ci spin_unlock(&fs_info->treelog_bg_lock); 37962306a36Sopenharmony_ci} 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_cistatic inline void btrfs_zoned_data_reloc_lock(struct btrfs_inode *inode) 38262306a36Sopenharmony_ci{ 38362306a36Sopenharmony_ci struct btrfs_root *root = inode->root; 38462306a36Sopenharmony_ci 38562306a36Sopenharmony_ci if (btrfs_is_data_reloc_root(root) && btrfs_is_zoned(root->fs_info)) 38662306a36Sopenharmony_ci mutex_lock(&root->fs_info->zoned_data_reloc_io_lock); 38762306a36Sopenharmony_ci} 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_cistatic inline void btrfs_zoned_data_reloc_unlock(struct btrfs_inode *inode) 39062306a36Sopenharmony_ci{ 39162306a36Sopenharmony_ci struct btrfs_root *root = inode->root; 39262306a36Sopenharmony_ci 39362306a36Sopenharmony_ci if (btrfs_is_data_reloc_root(root) && btrfs_is_zoned(root->fs_info)) 39462306a36Sopenharmony_ci mutex_unlock(&root->fs_info->zoned_data_reloc_io_lock); 39562306a36Sopenharmony_ci} 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_cistatic inline bool btrfs_zoned_bg_is_full(const struct btrfs_block_group *bg) 39862306a36Sopenharmony_ci{ 39962306a36Sopenharmony_ci ASSERT(btrfs_is_zoned(bg->fs_info)); 40062306a36Sopenharmony_ci return (bg->alloc_offset == bg->zone_capacity); 40162306a36Sopenharmony_ci} 40262306a36Sopenharmony_ci 40362306a36Sopenharmony_ci#endif 404