btrfs: zoned: disallow fitrim on zoned filesystems
[linux-block.git] / fs / btrfs / zoned.h
CommitLineData
5b316468
NA
1/* SPDX-License-Identifier: GPL-2.0 */
2
3#ifndef BTRFS_ZONED_H
4#define BTRFS_ZONED_H
5
6#include <linux/types.h>
b70f5097 7#include <linux/blkdev.h>
12659251
NA
8#include "volumes.h"
9#include "disk-io.h"
5b316468
NA
10
11struct btrfs_zoned_device_info {
12 /*
13 * Number of zones, zone size and types of zones if bdev is a
14 * zoned block device.
15 */
16 u64 zone_size;
17 u8 zone_size_shift;
862931c7 18 u64 max_zone_append_size;
5b316468
NA
19 u32 nr_zones;
20 unsigned long *seq_zones;
21 unsigned long *empty_zones;
12659251 22 struct blk_zone sb_zones[2 * BTRFS_SUPER_MIRROR_MAX];
5b316468
NA
23};
24
25#ifdef CONFIG_BLK_DEV_ZONED
26int btrfs_get_dev_zone(struct btrfs_device *device, u64 pos,
27 struct blk_zone *zone);
73651042 28int btrfs_get_dev_zone_info_all_devices(struct btrfs_fs_info *fs_info);
5b316468
NA
29int btrfs_get_dev_zone_info(struct btrfs_device *device);
30void btrfs_destroy_dev_zone_info(struct btrfs_device *device);
b70f5097 31int btrfs_check_zoned_mode(struct btrfs_fs_info *fs_info);
5d1ab66c 32int btrfs_check_mountopts_zoned(struct btrfs_fs_info *info);
12659251
NA
33int btrfs_sb_log_location_bdev(struct block_device *bdev, int mirror, int rw,
34 u64 *bytenr_ret);
35int btrfs_sb_log_location(struct btrfs_device *device, int mirror, int rw,
36 u64 *bytenr_ret);
37void btrfs_advance_sb_log(struct btrfs_device *device, int mirror);
38int btrfs_reset_sb_log_zones(struct block_device *bdev, int mirror);
5b316468
NA
39#else /* CONFIG_BLK_DEV_ZONED */
40static inline int btrfs_get_dev_zone(struct btrfs_device *device, u64 pos,
41 struct blk_zone *zone)
42{
43 return 0;
44}
45
73651042
NA
46static inline int btrfs_get_dev_zone_info_all_devices(struct btrfs_fs_info *fs_info)
47{
48 return 0;
49}
50
5b316468
NA
51static inline int btrfs_get_dev_zone_info(struct btrfs_device *device)
52{
53 return 0;
54}
55
56static inline void btrfs_destroy_dev_zone_info(struct btrfs_device *device) { }
57
b70f5097
NA
58static inline int btrfs_check_zoned_mode(const struct btrfs_fs_info *fs_info)
59{
60 if (!btrfs_is_zoned(fs_info))
61 return 0;
62
63 btrfs_err(fs_info, "zoned block devices support is not enabled");
64 return -EOPNOTSUPP;
65}
66
5d1ab66c
NA
67static inline int btrfs_check_mountopts_zoned(struct btrfs_fs_info *info)
68{
69 return 0;
70}
71
12659251
NA
72static inline int btrfs_sb_log_location_bdev(struct block_device *bdev,
73 int mirror, int rw, u64 *bytenr_ret)
74{
75 *bytenr_ret = btrfs_sb_offset(mirror);
76 return 0;
77}
78
79static inline int btrfs_sb_log_location(struct btrfs_device *device, int mirror,
80 int rw, u64 *bytenr_ret)
81{
82 *bytenr_ret = btrfs_sb_offset(mirror);
83 return 0;
84}
85
86static inline void btrfs_advance_sb_log(struct btrfs_device *device, int mirror)
87{ }
88
89static inline int btrfs_reset_sb_log_zones(struct block_device *bdev, int mirror)
90{
91 return 0;
92}
93
5b316468
NA
94#endif
95
96static inline bool btrfs_dev_is_sequential(struct btrfs_device *device, u64 pos)
97{
98 struct btrfs_zoned_device_info *zone_info = device->zone_info;
99
100 if (!zone_info)
101 return false;
102
103 return test_bit(pos >> zone_info->zone_size_shift, zone_info->seq_zones);
104}
105
106static inline bool btrfs_dev_is_empty_zone(struct btrfs_device *device, u64 pos)
107{
108 struct btrfs_zoned_device_info *zone_info = device->zone_info;
109
110 if (!zone_info)
111 return true;
112
113 return test_bit(pos >> zone_info->zone_size_shift, zone_info->empty_zones);
114}
115
116static inline void btrfs_dev_set_empty_zone_bit(struct btrfs_device *device,
117 u64 pos, bool set)
118{
119 struct btrfs_zoned_device_info *zone_info = device->zone_info;
120 unsigned int zno;
121
122 if (!zone_info)
123 return;
124
125 zno = pos >> zone_info->zone_size_shift;
126 if (set)
127 set_bit(zno, zone_info->empty_zones);
128 else
129 clear_bit(zno, zone_info->empty_zones);
130}
131
132static inline void btrfs_dev_set_zone_empty(struct btrfs_device *device, u64 pos)
133{
134 btrfs_dev_set_empty_zone_bit(device, pos, true);
135}
136
137static inline void btrfs_dev_clear_zone_empty(struct btrfs_device *device, u64 pos)
138{
139 btrfs_dev_set_empty_zone_bit(device, pos, false);
140}
141
b70f5097
NA
142static inline bool btrfs_check_device_zone_type(const struct btrfs_fs_info *fs_info,
143 struct block_device *bdev)
144{
145 u64 zone_size;
146
147 if (btrfs_is_zoned(fs_info)) {
148 zone_size = bdev_zone_sectors(bdev) << SECTOR_SHIFT;
149 /* Do not allow non-zoned device */
150 return bdev_is_zoned(bdev) && fs_info->zone_size == zone_size;
151 }
152
153 /* Do not allow Host Manged zoned device */
154 return bdev_zoned_model(bdev) != BLK_ZONED_HM;
155}
156
12659251
NA
157static inline bool btrfs_check_super_location(struct btrfs_device *device, u64 pos)
158{
159 /*
160 * On a non-zoned device, any address is OK. On a zoned device,
161 * non-SEQUENTIAL WRITE REQUIRED zones are capable.
162 */
163 return device->zone_info == NULL || !btrfs_dev_is_sequential(device, pos);
164}
165
5b316468 166#endif