1 /* SPDX-License-Identifier: GPL-2.0 */
6 #include <linux/types.h>
7 #include <linux/blkdev.h>
9 struct btrfs_zoned_device_info {
11 * Number of zones, zone size and types of zones if bdev is a
16 u64 max_zone_append_size;
18 unsigned long *seq_zones;
19 unsigned long *empty_zones;
22 #ifdef CONFIG_BLK_DEV_ZONED
23 int btrfs_get_dev_zone(struct btrfs_device *device, u64 pos,
24 struct blk_zone *zone);
25 int btrfs_get_dev_zone_info(struct btrfs_device *device);
26 void btrfs_destroy_dev_zone_info(struct btrfs_device *device);
27 int btrfs_check_zoned_mode(struct btrfs_fs_info *fs_info);
28 #else /* CONFIG_BLK_DEV_ZONED */
29 static inline int btrfs_get_dev_zone(struct btrfs_device *device, u64 pos,
30 struct blk_zone *zone)
35 static inline int btrfs_get_dev_zone_info(struct btrfs_device *device)
40 static inline void btrfs_destroy_dev_zone_info(struct btrfs_device *device) { }
42 static inline int btrfs_check_zoned_mode(const struct btrfs_fs_info *fs_info)
44 if (!btrfs_is_zoned(fs_info))
47 btrfs_err(fs_info, "zoned block devices support is not enabled");
53 static inline bool btrfs_dev_is_sequential(struct btrfs_device *device, u64 pos)
55 struct btrfs_zoned_device_info *zone_info = device->zone_info;
60 return test_bit(pos >> zone_info->zone_size_shift, zone_info->seq_zones);
63 static inline bool btrfs_dev_is_empty_zone(struct btrfs_device *device, u64 pos)
65 struct btrfs_zoned_device_info *zone_info = device->zone_info;
70 return test_bit(pos >> zone_info->zone_size_shift, zone_info->empty_zones);
73 static inline void btrfs_dev_set_empty_zone_bit(struct btrfs_device *device,
76 struct btrfs_zoned_device_info *zone_info = device->zone_info;
82 zno = pos >> zone_info->zone_size_shift;
84 set_bit(zno, zone_info->empty_zones);
86 clear_bit(zno, zone_info->empty_zones);
89 static inline void btrfs_dev_set_zone_empty(struct btrfs_device *device, u64 pos)
91 btrfs_dev_set_empty_zone_bit(device, pos, true);
94 static inline void btrfs_dev_clear_zone_empty(struct btrfs_device *device, u64 pos)
96 btrfs_dev_set_empty_zone_bit(device, pos, false);
99 static inline bool btrfs_check_device_zone_type(const struct btrfs_fs_info *fs_info,
100 struct block_device *bdev)
104 if (btrfs_is_zoned(fs_info)) {
105 zone_size = bdev_zone_sectors(bdev) << SECTOR_SHIFT;
106 /* Do not allow non-zoned device */
107 return bdev_is_zoned(bdev) && fs_info->zone_size == zone_size;
110 /* Do not allow Host Manged zoned device */
111 return bdev_zoned_model(bdev) != BLK_ZONED_HM;