]>
Commit | Line | Data |
---|---|---|
9888c340 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
0b86a832 CM |
2 | /* |
3 | * Copyright (C) 2007 Oracle. All rights reserved. | |
0b86a832 CM |
4 | */ |
5 | ||
9888c340 DS |
6 | #ifndef BTRFS_VOLUMES_H |
7 | #define BTRFS_VOLUMES_H | |
8790d502 | 8 | |
b2117a39 | 9 | #include <linux/sort.h> |
55e301fd | 10 | #include <linux/btrfs.h> |
8b712842 | 11 | #include "async-thread.h" |
b31bed17 | 12 | #include "messages.h" |
27137fac | 13 | #include "tree-checker.h" |
cb3e217b | 14 | #include "rcu-string.h" |
cea9e445 | 15 | |
fce466ea QW |
16 | #define BTRFS_MAX_DATA_CHUNK_SIZE (10ULL * SZ_1G) |
17 | ||
67a2c45e MX |
18 | extern struct mutex uuid_mutex; |
19 | ||
a97699d1 QW |
20 | #define BTRFS_STRIPE_LEN SZ_64K |
21 | #define BTRFS_STRIPE_LEN_SHIFT (16) | |
22 | #define BTRFS_STRIPE_LEN_MASK (BTRFS_STRIPE_LEN - 1) | |
23 | ||
24 | static_assert(const_ilog2(BTRFS_STRIPE_LEN) == BTRFS_STRIPE_LEN_SHIFT); | |
b2117a39 | 25 | |
719fae89 QW |
26 | /* Used by sanity check for btrfs_raid_types. */ |
27 | #define const_ffs(n) (__builtin_ctzll(n) + 1) | |
28 | ||
29 | /* | |
30 | * The conversion from BTRFS_BLOCK_GROUP_* bits to btrfs_raid_type requires | |
31 | * RAID0 always to be the lowest profile bit. | |
32 | * Although it's part of on-disk format and should never change, do extra | |
33 | * compile-time sanity checks. | |
34 | */ | |
35 | static_assert(const_ffs(BTRFS_BLOCK_GROUP_RAID0) < | |
36 | const_ffs(BTRFS_BLOCK_GROUP_PROFILE_MASK & ~BTRFS_BLOCK_GROUP_RAID0)); | |
37 | static_assert(const_ilog2(BTRFS_BLOCK_GROUP_RAID0) > | |
38 | ilog2(BTRFS_BLOCK_GROUP_TYPE_MASK)); | |
39 | ||
40 | /* ilog2() can handle both constants and variables */ | |
41 | #define BTRFS_BG_FLAG_TO_INDEX(profile) \ | |
42 | ilog2((profile) >> (ilog2(BTRFS_BLOCK_GROUP_RAID0) - 1)) | |
43 | ||
f04fbcc6 | 44 | enum btrfs_raid_types { |
719fae89 QW |
45 | /* SINGLE is the special one as it doesn't have on-disk bit. */ |
46 | BTRFS_RAID_SINGLE = 0, | |
47 | ||
48 | BTRFS_RAID_RAID0 = BTRFS_BG_FLAG_TO_INDEX(BTRFS_BLOCK_GROUP_RAID0), | |
49 | BTRFS_RAID_RAID1 = BTRFS_BG_FLAG_TO_INDEX(BTRFS_BLOCK_GROUP_RAID1), | |
50 | BTRFS_RAID_DUP = BTRFS_BG_FLAG_TO_INDEX(BTRFS_BLOCK_GROUP_DUP), | |
51 | BTRFS_RAID_RAID10 = BTRFS_BG_FLAG_TO_INDEX(BTRFS_BLOCK_GROUP_RAID10), | |
52 | BTRFS_RAID_RAID5 = BTRFS_BG_FLAG_TO_INDEX(BTRFS_BLOCK_GROUP_RAID5), | |
53 | BTRFS_RAID_RAID6 = BTRFS_BG_FLAG_TO_INDEX(BTRFS_BLOCK_GROUP_RAID6), | |
54 | BTRFS_RAID_RAID1C3 = BTRFS_BG_FLAG_TO_INDEX(BTRFS_BLOCK_GROUP_RAID1C3), | |
55 | BTRFS_RAID_RAID1C4 = BTRFS_BG_FLAG_TO_INDEX(BTRFS_BLOCK_GROUP_RAID1C4), | |
56 | ||
f04fbcc6 QW |
57 | BTRFS_NR_RAID_TYPES |
58 | }; | |
59 | ||
7cc8e58d MX |
60 | /* |
61 | * Use sequence counter to get consistent device stat data on | |
62 | * 32-bit processors. | |
63 | */ | |
64 | #if BITS_PER_LONG==32 && defined(CONFIG_SMP) | |
65 | #include <linux/seqlock.h> | |
66 | #define __BTRFS_NEED_DEVICE_DATA_ORDERED | |
c41ec452 SY |
67 | #define btrfs_device_data_ordered_init(device) \ |
68 | seqcount_init(&device->data_seqcount) | |
7cc8e58d | 69 | #else |
c41ec452 | 70 | #define btrfs_device_data_ordered_init(device) do { } while (0) |
7cc8e58d MX |
71 | #endif |
72 | ||
ebbede42 | 73 | #define BTRFS_DEV_STATE_WRITEABLE (0) |
e12c9621 | 74 | #define BTRFS_DEV_STATE_IN_FS_METADATA (1) |
e6e674bd | 75 | #define BTRFS_DEV_STATE_MISSING (2) |
401e29c1 | 76 | #define BTRFS_DEV_STATE_REPLACE_TGT (3) |
1c3063b6 | 77 | #define BTRFS_DEV_STATE_FLUSH_SENT (4) |
66d204a1 | 78 | #define BTRFS_DEV_STATE_NO_READA (5) |
ebbede42 | 79 | |
5b316468 NA |
80 | struct btrfs_zoned_device_info; |
81 | ||
0b86a832 | 82 | struct btrfs_device { |
0b6f5d40 NB |
83 | struct list_head dev_list; /* device_list_mutex */ |
84 | struct list_head dev_alloc_list; /* chunk mutex */ | |
bbbf7243 | 85 | struct list_head post_commit_list; /* chunk mutex */ |
2b82032c | 86 | struct btrfs_fs_devices *fs_devices; |
fb456252 | 87 | struct btrfs_fs_info *fs_info; |
ffbd517d | 88 | |
8d1a7aae | 89 | struct rcu_string __rcu *name; |
d5ee37bc MX |
90 | |
91 | u64 generation; | |
92 | ||
86ec15d0 | 93 | struct bdev_handle *bdev_handle; |
d5ee37bc MX |
94 | struct block_device *bdev; |
95 | ||
5b316468 NA |
96 | struct btrfs_zoned_device_info *zone_info; |
97 | ||
4889bc05 AJ |
98 | /* |
99 | * Device's major-minor number. Must be set even if the device is not | |
100 | * opened (bdev == NULL), unless the device is missing. | |
101 | */ | |
102 | dev_t devt; | |
ebbede42 | 103 | unsigned long dev_state; |
58efbc9f | 104 | blk_status_t last_flush_error; |
b3075717 | 105 | |
7cc8e58d | 106 | #ifdef __BTRFS_NEED_DEVICE_DATA_ORDERED |
c41ec452 | 107 | seqcount_t data_seqcount; |
7cc8e58d MX |
108 | #endif |
109 | ||
0b86a832 CM |
110 | /* the internal btrfs device id */ |
111 | u64 devid; | |
112 | ||
6ba40b61 | 113 | /* size of the device in memory */ |
0b86a832 CM |
114 | u64 total_bytes; |
115 | ||
6ba40b61 | 116 | /* size of the device on disk */ |
d6397bae CB |
117 | u64 disk_total_bytes; |
118 | ||
0b86a832 CM |
119 | /* bytes used */ |
120 | u64 bytes_used; | |
121 | ||
122 | /* optimal io alignment for this device */ | |
123 | u32 io_align; | |
124 | ||
125 | /* optimal io width for this device */ | |
126 | u32 io_width; | |
3c45bfc1 DG |
127 | /* type and info about this device */ |
128 | u64 type; | |
0b86a832 CM |
129 | |
130 | /* minimal io size for this device */ | |
131 | u32 sector_size; | |
132 | ||
0b86a832 | 133 | /* physical drive uuid (or lvm uuid) */ |
e17cade2 | 134 | u8 uuid[BTRFS_UUID_SIZE]; |
8b712842 | 135 | |
935e5cc9 MX |
136 | /* |
137 | * size of the device on the current transaction | |
138 | * | |
139 | * This variant is update when committing the transaction, | |
bbbf7243 | 140 | * and protected by chunk mutex |
935e5cc9 MX |
141 | */ |
142 | u64 commit_total_bytes; | |
143 | ||
ce7213c7 MX |
144 | /* bytes used on the current transaction */ |
145 | u64 commit_bytes_used; | |
935e5cc9 | 146 | |
f9e69aa9 CH |
147 | /* Bio used for flushing device barriers */ |
148 | struct bio flush_bio; | |
3c45bfc1 DG |
149 | struct completion flush_wait; |
150 | ||
a2de733c | 151 | /* per-device scrub information */ |
cadbc0a0 | 152 | struct scrub_ctx *scrub_ctx; |
a2de733c | 153 | |
442a4f63 SB |
154 | /* disk I/O failure stats. For detailed description refer to |
155 | * enum btrfs_dev_stat_values in ioctl.h */ | |
733f4fbb | 156 | int dev_stats_valid; |
addc3fa7 MX |
157 | |
158 | /* Counter to record the change of device stats */ | |
159 | atomic_t dev_stats_ccnt; | |
442a4f63 | 160 | atomic_t dev_stat_values[BTRFS_DEV_STAT_VALUES_MAX]; |
1c11b63e JM |
161 | |
162 | struct extent_io_tree alloc_state; | |
668e48af AJ |
163 | |
164 | struct completion kobj_unregister; | |
165 | /* For sysfs/FSID/devinfo/devid/ */ | |
166 | struct kobject devid_kobj; | |
eb3b5053 DS |
167 | |
168 | /* Bandwidth limit for scrub, in bytes */ | |
169 | u64 scrub_speed_max; | |
0b86a832 CM |
170 | }; |
171 | ||
2103da3b JB |
172 | /* |
173 | * Block group or device which contains an active swapfile. Used for preventing | |
174 | * unsafe operations while a swapfile is active. | |
175 | * | |
176 | * These are sorted on (ptr, inode) (note that a block group or device can | |
177 | * contain more than one swapfile). We compare the pointer values because we | |
178 | * don't actually care what the object is, we just need a quick check whether | |
179 | * the object exists in the rbtree. | |
180 | */ | |
181 | struct btrfs_swapfile_pin { | |
182 | struct rb_node node; | |
183 | void *ptr; | |
184 | struct inode *inode; | |
185 | /* | |
186 | * If true, ptr points to a struct btrfs_block_group. Otherwise, ptr | |
187 | * points to a struct btrfs_device. | |
188 | */ | |
189 | bool is_block_group; | |
190 | /* | |
191 | * Only used when 'is_block_group' is true and it is the number of | |
192 | * extents used by a swapfile for this block group ('ptr' field). | |
193 | */ | |
194 | int bg_extent_count; | |
195 | }; | |
196 | ||
7cc8e58d MX |
197 | /* |
198 | * If we read those variants at the context of their own lock, we needn't | |
199 | * use the following helpers, reading them directly is safe. | |
200 | */ | |
201 | #if BITS_PER_LONG==32 && defined(CONFIG_SMP) | |
202 | #define BTRFS_DEVICE_GETSET_FUNCS(name) \ | |
203 | static inline u64 \ | |
204 | btrfs_device_get_##name(const struct btrfs_device *dev) \ | |
205 | { \ | |
206 | u64 size; \ | |
207 | unsigned int seq; \ | |
208 | \ | |
209 | do { \ | |
210 | seq = read_seqcount_begin(&dev->data_seqcount); \ | |
211 | size = dev->name; \ | |
212 | } while (read_seqcount_retry(&dev->data_seqcount, seq)); \ | |
213 | return size; \ | |
214 | } \ | |
215 | \ | |
216 | static inline void \ | |
217 | btrfs_device_set_##name(struct btrfs_device *dev, u64 size) \ | |
218 | { \ | |
c41ec452 | 219 | preempt_disable(); \ |
7cc8e58d MX |
220 | write_seqcount_begin(&dev->data_seqcount); \ |
221 | dev->name = size; \ | |
222 | write_seqcount_end(&dev->data_seqcount); \ | |
c41ec452 | 223 | preempt_enable(); \ |
7cc8e58d | 224 | } |
94545870 | 225 | #elif BITS_PER_LONG==32 && defined(CONFIG_PREEMPTION) |
7cc8e58d MX |
226 | #define BTRFS_DEVICE_GETSET_FUNCS(name) \ |
227 | static inline u64 \ | |
228 | btrfs_device_get_##name(const struct btrfs_device *dev) \ | |
229 | { \ | |
230 | u64 size; \ | |
231 | \ | |
232 | preempt_disable(); \ | |
233 | size = dev->name; \ | |
234 | preempt_enable(); \ | |
235 | return size; \ | |
236 | } \ | |
237 | \ | |
238 | static inline void \ | |
239 | btrfs_device_set_##name(struct btrfs_device *dev, u64 size) \ | |
240 | { \ | |
241 | preempt_disable(); \ | |
242 | dev->name = size; \ | |
243 | preempt_enable(); \ | |
244 | } | |
245 | #else | |
246 | #define BTRFS_DEVICE_GETSET_FUNCS(name) \ | |
247 | static inline u64 \ | |
248 | btrfs_device_get_##name(const struct btrfs_device *dev) \ | |
249 | { \ | |
250 | return dev->name; \ | |
251 | } \ | |
252 | \ | |
253 | static inline void \ | |
254 | btrfs_device_set_##name(struct btrfs_device *dev, u64 size) \ | |
255 | { \ | |
256 | dev->name = size; \ | |
257 | } | |
258 | #endif | |
259 | ||
260 | BTRFS_DEVICE_GETSET_FUNCS(total_bytes); | |
261 | BTRFS_DEVICE_GETSET_FUNCS(disk_total_bytes); | |
262 | BTRFS_DEVICE_GETSET_FUNCS(bytes_used); | |
263 | ||
c4a816c6 NA |
264 | enum btrfs_chunk_allocation_policy { |
265 | BTRFS_CHUNK_ALLOC_REGULAR, | |
1cd6121f | 266 | BTRFS_CHUNK_ALLOC_ZONED, |
c4a816c6 NA |
267 | }; |
268 | ||
33fd2f71 AJ |
269 | /* |
270 | * Read policies for mirrored block group profiles, read picks the stripe based | |
271 | * on these policies. | |
272 | */ | |
273 | enum btrfs_read_policy { | |
274 | /* Use process PID to choose the stripe */ | |
275 | BTRFS_READ_POLICY_PID, | |
276 | BTRFS_NR_READ_POLICY, | |
277 | }; | |
278 | ||
8a4b83cc CM |
279 | struct btrfs_fs_devices { |
280 | u8 fsid[BTRFS_FSID_SIZE]; /* FS specific uuid */ | |
f62c302e AJ |
281 | |
282 | /* | |
283 | * UUID written into the btree blocks: | |
284 | * | |
285 | * - If metadata_uuid != fsid then super block must have | |
286 | * BTRFS_FEATURE_INCOMPAT_METADATA_UUID flag set. | |
287 | * | |
288 | * - Following shall be true at all times: | |
289 | * - metadata_uuid == btrfs_header::fsid | |
290 | * - metadata_uuid == btrfs_dev_item::fsid | |
cb6eb475 AJ |
291 | * |
292 | * - Relations between fsid and metadata_uuid in sb and fs_devices: | |
293 | * - Normal: | |
294 | * fs_devices->fsid == fs_devices->metadata_uuid == sb->fsid | |
295 | * sb->metadata_uuid == 0 | |
296 | * | |
297 | * - When the BTRFS_FEATURE_INCOMPAT_METADATA_UUID flag is set: | |
298 | * fs_devices->fsid == sb->fsid | |
299 | * fs_devices->metadata_uuid == sb->metadata_uuid | |
000331bb AJ |
300 | * |
301 | * - When in-memory fs_devices->temp_fsid is true | |
302 | * fs_devices->fsid = random | |
303 | * fs_devices->metadata_uuid == sb->fsid | |
f62c302e | 304 | */ |
7239ff4b | 305 | u8 metadata_uuid[BTRFS_FSID_SIZE]; |
f62c302e | 306 | |
c4babc5e | 307 | struct list_head fs_list; |
8a4b83cc | 308 | |
add9745a AJ |
309 | /* |
310 | * Number of devices under this fsid including missing and | |
311 | * replace-target device and excludes seed devices. | |
312 | */ | |
8a4b83cc | 313 | u64 num_devices; |
add9745a AJ |
314 | |
315 | /* | |
316 | * The number of devices that successfully opened, including | |
317 | * replace-target, excludes seed devices. | |
318 | */ | |
a0af469b | 319 | u64 open_devices; |
add9745a AJ |
320 | |
321 | /* The number of devices that are under the chunk allocation list. */ | |
2b82032c | 322 | u64 rw_devices; |
add9745a AJ |
323 | |
324 | /* Count of missing devices under this fsid excluding seed device. */ | |
cd02dca5 | 325 | u64 missing_devices; |
2b82032c | 326 | u64 total_rw_bytes; |
add9745a AJ |
327 | |
328 | /* | |
329 | * Count of devices from btrfs_super_block::num_devices for this fsid, | |
330 | * which includes the seed device, excludes the transient replace-target | |
331 | * device. | |
332 | */ | |
02db0844 | 333 | u64 total_devices; |
d1a63002 NB |
334 | |
335 | /* Highest generation number of seen devices */ | |
336 | u64 latest_generation; | |
337 | ||
d24fa5c1 AJ |
338 | /* |
339 | * The mount device or a device with highest generation after removal | |
340 | * or replace. | |
341 | */ | |
342 | struct btrfs_device *latest_dev; | |
e5e9a520 | 343 | |
d85512d5 AJ |
344 | /* |
345 | * All of the devices in the filesystem, protected by a mutex so we can | |
346 | * safely walk it to write out the super blocks without worrying about | |
347 | * adding/removing by the multi-device code. Scrubbing super block can | |
348 | * kick off supers writing by holding this mutex lock. | |
e5e9a520 CM |
349 | */ |
350 | struct mutex device_list_mutex; | |
0b6f5d40 NB |
351 | |
352 | /* List of all devices, protected by device_list_mutex */ | |
8a4b83cc | 353 | struct list_head devices; |
b3075717 | 354 | |
d85512d5 | 355 | /* Devices which can satisfy space allocation. Protected by * chunk_mutex. */ |
b3075717 | 356 | struct list_head alloc_list; |
2b82032c | 357 | |
944d3f9f | 358 | struct list_head seed_list; |
2b82032c | 359 | |
d85512d5 | 360 | /* Count fs-devices opened. */ |
2b82032c | 361 | int opened; |
c289811c | 362 | |
d85512d5 | 363 | /* Set when we find or add a device that doesn't have the nonrot flag set. */ |
7f0432d0 | 364 | bool rotating; |
d85512d5 | 365 | /* Devices support TRIM/discard commands. */ |
63a7cb13 | 366 | bool discardable; |
d85512d5 | 367 | /* The filesystem is a seed filesystem. */ |
4693893b | 368 | bool seeding; |
a5b8a5f9 AJ |
369 | /* The mount needs to use a randomly generated fsid. */ |
370 | bool temp_fsid; | |
2e7910d6 | 371 | |
5a13f430 | 372 | struct btrfs_fs_info *fs_info; |
2e7910d6 | 373 | /* sysfs kobjects */ |
c1b7e474 | 374 | struct kobject fsid_kobj; |
b5501504 | 375 | struct kobject *devices_kobj; |
a013d141 | 376 | struct kobject *devinfo_kobj; |
2e7910d6 | 377 | struct completion kobj_unregister; |
c4a816c6 NA |
378 | |
379 | enum btrfs_chunk_allocation_policy chunk_alloc_policy; | |
33fd2f71 | 380 | |
d85512d5 | 381 | /* Policy used to read the mirrored stripes. */ |
33fd2f71 | 382 | enum btrfs_read_policy read_policy; |
8a4b83cc CM |
383 | }; |
384 | ||
ab4ba2e1 QW |
385 | #define BTRFS_MAX_DEVS(info) ((BTRFS_MAX_ITEM_SIZE(info) \ |
386 | - sizeof(struct btrfs_chunk)) \ | |
387 | / sizeof(struct btrfs_stripe) + 1) | |
388 | ||
389 | #define BTRFS_MAX_DEVS_SYS_CHUNK ((BTRFS_SYSTEM_CHUNK_ARRAY_SIZE \ | |
390 | - 2 * sizeof(struct btrfs_disk_key) \ | |
391 | - 2 * sizeof(struct btrfs_chunk)) \ | |
392 | / sizeof(struct btrfs_stripe) + 1) | |
393 | ||
4c664611 | 394 | struct btrfs_io_stripe { |
cea9e445 | 395 | struct btrfs_device *dev; |
02c372e1 JT |
396 | /* Block mapping. */ |
397 | u64 physical; | |
398 | u64 length; | |
9acaa641 | 399 | bool is_scrub; |
02c372e1 JT |
400 | /* For the endio handler. */ |
401 | struct btrfs_io_context *bioc; | |
a4012f06 CH |
402 | }; |
403 | ||
404 | struct btrfs_discard_stripe { | |
405 | struct btrfs_device *dev; | |
406 | u64 physical; | |
407 | u64 length; | |
cea9e445 CM |
408 | }; |
409 | ||
4c664611 QW |
410 | /* |
411 | * Context for IO subsmission for device stripe. | |
412 | * | |
413 | * - Track the unfinished mirrors for mirror based profiles | |
414 | * Mirror based profiles are SINGLE/DUP/RAID1/RAID10. | |
415 | * | |
416 | * - Contain the logical -> physical mapping info | |
417 | * Used by submit_stripe_bio() for mapping logical bio | |
418 | * into physical device address. | |
419 | * | |
420 | * - Contain device replace info | |
421 | * Used by handle_ops_on_dev_replace() to copy logical bios | |
422 | * into the new device. | |
423 | * | |
424 | * - Contain RAID56 full stripe logical bytenrs | |
425 | */ | |
426 | struct btrfs_io_context { | |
140475ae | 427 | refcount_t refs; |
c404e0dc | 428 | struct btrfs_fs_info *fs_info; |
7dc66abb FM |
429 | /* Taken from struct btrfs_chunk_map::type. */ |
430 | u64 map_type; | |
7d2b4daa | 431 | struct bio *orig_bio; |
a236aed1 | 432 | atomic_t error; |
4ced85f8 QW |
433 | u16 max_errors; |
434 | ||
02c372e1 JT |
435 | u64 logical; |
436 | u64 size; | |
437 | /* Raid stripe tree ordered entry. */ | |
438 | struct list_head rst_ordered_entry; | |
439 | ||
4ced85f8 QW |
440 | /* |
441 | * The total number of stripes, including the extra duplicated | |
442 | * stripe for replace. | |
443 | */ | |
444 | u16 num_stripes; | |
445 | ||
446 | /* | |
447 | * The mirror_num of this bioc. | |
448 | * | |
449 | * This is for reads which use 0 as mirror_num, thus we should return a | |
450 | * valid mirror_num (>0) for the reader. | |
451 | */ | |
452 | u16 mirror_num; | |
453 | ||
454 | /* | |
455 | * The following two members are for dev-replace case only. | |
456 | * | |
1faf3885 | 457 | * @replace_nr_stripes: Number of duplicated stripes which need to be |
4ced85f8 QW |
458 | * written to replace target. |
459 | * Should be <= 2 (2 for DUP, otherwise <= 1). | |
1faf3885 QW |
460 | * @replace_stripe_src: The array indicates where the duplicated stripes |
461 | * are from. | |
4ced85f8 | 462 | * |
1faf3885 | 463 | * The @replace_stripe_src[] array is mostly for RAID56 cases. |
4ced85f8 QW |
464 | * As non-RAID56 stripes share the same contents of the mapped range, |
465 | * thus no need to bother where the duplicated ones are from. | |
466 | * | |
467 | * But for RAID56 case, all stripes contain different contents, thus | |
468 | * we need a way to know the mapping. | |
469 | * | |
470 | * There is an example for the two members, using a RAID5 write: | |
471 | * | |
472 | * num_stripes: 4 (3 + 1 duplicated write) | |
473 | * stripes[0]: dev = devid 1, physical = X | |
474 | * stripes[1]: dev = devid 2, physical = Y | |
475 | * stripes[2]: dev = devid 3, physical = Z | |
476 | * stripes[3]: dev = devid 0, physical = Y | |
477 | * | |
1faf3885 QW |
478 | * replace_nr_stripes = 1 |
479 | * replace_stripe_src = 1 <- Means stripes[1] is involved in replace. | |
480 | * The duplicated stripe index would be | |
481 | * (@num_stripes - 1). | |
482 | * | |
483 | * Note, that we can still have cases replace_nr_stripes = 2 for DUP. | |
484 | * In that case, all stripes share the same content, thus we don't | |
485 | * need to bother @replace_stripe_src value at all. | |
4ced85f8 | 486 | */ |
1faf3885 QW |
487 | u16 replace_nr_stripes; |
488 | s16 replace_stripe_src; | |
8e5cfb55 | 489 | /* |
18d758a2 QW |
490 | * Logical bytenr of the full stripe start, only for RAID56 cases. |
491 | * | |
492 | * When this value is set to other than (u64)-1, the stripes[] should | |
493 | * follow this pattern: | |
494 | * | |
495 | * (real_stripes = num_stripes - replace_nr_stripes) | |
496 | * (data_stripes = (is_raid6) ? (real_stripes - 2) : (real_stripes - 1)) | |
497 | * | |
498 | * stripes[0]: The first data stripe | |
499 | * stripes[1]: The second data stripe | |
500 | * ... | |
501 | * stripes[data_stripes - 1]: The last data stripe | |
502 | * stripes[data_stripes]: The P stripe | |
503 | * stripes[data_stripes + 1]: The Q stripe (only for RAID6). | |
8e5cfb55 | 504 | */ |
18d758a2 | 505 | u64 full_stripe_logical; |
4c664611 | 506 | struct btrfs_io_stripe stripes[]; |
cea9e445 CM |
507 | }; |
508 | ||
b2117a39 MX |
509 | struct btrfs_device_info { |
510 | struct btrfs_device *dev; | |
511 | u64 dev_offset; | |
512 | u64 max_avail; | |
73c5de00 | 513 | u64 total_avail; |
b2117a39 MX |
514 | }; |
515 | ||
31e50229 | 516 | struct btrfs_raid_attr { |
8c3e3582 DS |
517 | u8 sub_stripes; /* sub_stripes info for map */ |
518 | u8 dev_stripes; /* stripes per dev */ | |
519 | u8 devs_max; /* max devs to use */ | |
520 | u8 devs_min; /* min devs needed */ | |
521 | u8 tolerated_failures; /* max tolerated fail devs */ | |
522 | u8 devs_increment; /* ndevs has to be a multiple of this */ | |
523 | u8 ncopies; /* how many copies to data has */ | |
524 | u8 nparity; /* number of stripes worth of bytes to store | |
b50836ed | 525 | * parity information */ |
8c3e3582 | 526 | u8 mindev_error; /* error code if min devs requisite is unmet */ |
ed23467b | 527 | const char raid_name[8]; /* name of the raid */ |
41a6e891 | 528 | u64 bg_flag; /* block group flag of the raid */ |
31e50229 LB |
529 | }; |
530 | ||
af902047 | 531 | extern const struct btrfs_raid_attr btrfs_raid_array[BTRFS_NR_RAID_TYPES]; |
af902047 | 532 | |
7dc66abb FM |
533 | struct btrfs_chunk_map { |
534 | struct rb_node rb_node; | |
535 | /* For mount time dev extent verification. */ | |
536 | int verified_stripes; | |
537 | refcount_t refs; | |
538 | u64 start; | |
539 | u64 chunk_len; | |
540 | u64 stripe_size; | |
1abe9b8a | 541 | u64 type; |
542 | int io_align; | |
543 | int io_width; | |
1abe9b8a | 544 | int num_stripes; |
545 | int sub_stripes; | |
4c664611 | 546 | struct btrfs_io_stripe stripes[]; |
1abe9b8a | 547 | }; |
548 | ||
7dc66abb FM |
549 | #define btrfs_chunk_map_size(n) (sizeof(struct btrfs_chunk_map) + \ |
550 | (sizeof(struct btrfs_io_stripe) * (n))) | |
551 | ||
552 | static inline void btrfs_free_chunk_map(struct btrfs_chunk_map *map) | |
553 | { | |
554 | if (map && refcount_dec_and_test(&map->refs)) { | |
555 | ASSERT(RB_EMPTY_NODE(&map->rb_node)); | |
556 | kfree(map); | |
557 | } | |
558 | } | |
a2de733c | 559 | |
c9e9f97b | 560 | struct btrfs_balance_args; |
19a39dce | 561 | struct btrfs_balance_progress; |
c9e9f97b | 562 | struct btrfs_balance_control { |
c9e9f97b ID |
563 | struct btrfs_balance_args data; |
564 | struct btrfs_balance_args meta; | |
565 | struct btrfs_balance_args sys; | |
566 | ||
567 | u64 flags; | |
19a39dce ID |
568 | |
569 | struct btrfs_balance_progress stat; | |
c9e9f97b ID |
570 | }; |
571 | ||
562d7b15 JB |
572 | /* |
573 | * Search for a given device by the set parameters | |
574 | */ | |
575 | struct btrfs_dev_lookup_args { | |
576 | u64 devid; | |
577 | u8 *uuid; | |
578 | u8 *fsid; | |
579 | bool missing; | |
580 | }; | |
581 | ||
582 | /* We have to initialize to -1 because BTRFS_DEV_REPLACE_DEVID is 0 */ | |
583 | #define BTRFS_DEV_LOOKUP_ARGS_INIT { .devid = (u64)-1 } | |
584 | ||
585 | #define BTRFS_DEV_LOOKUP_ARGS(name) \ | |
586 | struct btrfs_dev_lookup_args name = BTRFS_DEV_LOOKUP_ARGS_INIT | |
587 | ||
cf8cddd3 CH |
588 | enum btrfs_map_op { |
589 | BTRFS_MAP_READ, | |
590 | BTRFS_MAP_WRITE, | |
cf8cddd3 CH |
591 | BTRFS_MAP_GET_READ_MIRRORS, |
592 | }; | |
593 | ||
594 | static inline enum btrfs_map_op btrfs_op(struct bio *bio) | |
595 | { | |
596 | switch (bio_op(bio)) { | |
cf8cddd3 | 597 | case REQ_OP_WRITE: |
cfe94440 | 598 | case REQ_OP_ZONE_APPEND: |
cf8cddd3 CH |
599 | return BTRFS_MAP_WRITE; |
600 | default: | |
601 | WARN_ON_ONCE(1); | |
c730ae0c | 602 | fallthrough; |
cf8cddd3 CH |
603 | case REQ_OP_READ: |
604 | return BTRFS_MAP_READ; | |
605 | } | |
606 | } | |
607 | ||
b31bed17 JB |
608 | static inline unsigned long btrfs_chunk_item_size(int num_stripes) |
609 | { | |
610 | ASSERT(num_stripes); | |
611 | return sizeof(struct btrfs_chunk) + | |
612 | sizeof(struct btrfs_stripe) * (num_stripes - 1); | |
613 | } | |
614 | ||
cb091225 | 615 | /* |
eefaf0a1 | 616 | * Do the type safe conversion from stripe_nr to offset inside the chunk. |
cb091225 QW |
617 | * |
618 | * @stripe_nr is u32, with left shift it can overflow u32 for chunks larger | |
619 | * than 4G. This does the proper type cast to avoid overflow. | |
620 | */ | |
621 | static inline u64 btrfs_stripe_nr_to_offset(u32 stripe_nr) | |
622 | { | |
623 | return (u64)stripe_nr << BTRFS_STRIPE_LEN_SHIFT; | |
624 | } | |
625 | ||
4c664611 QW |
626 | void btrfs_get_bioc(struct btrfs_io_context *bioc); |
627 | void btrfs_put_bioc(struct btrfs_io_context *bioc); | |
cf8cddd3 | 628 | int btrfs_map_block(struct btrfs_fs_info *fs_info, enum btrfs_map_op op, |
cea9e445 | 629 | u64 logical, u64 *length, |
cd4efd21 | 630 | struct btrfs_io_context **bioc_ret, |
9fb2acc2 | 631 | struct btrfs_io_stripe *smap, int *mirror_num_ret); |
4886ff7b QW |
632 | int btrfs_map_repair_block(struct btrfs_fs_info *fs_info, |
633 | struct btrfs_io_stripe *smap, u64 logical, | |
634 | u32 length, int mirror_num); | |
a4012f06 CH |
635 | struct btrfs_discard_stripe *btrfs_map_discard(struct btrfs_fs_info *fs_info, |
636 | u64 logical, u64 *length_ret, | |
637 | u32 *num_stripes); | |
6bccf3ab | 638 | int btrfs_read_sys_array(struct btrfs_fs_info *fs_info); |
5b4aacef | 639 | int btrfs_read_chunk_tree(struct btrfs_fs_info *fs_info); |
f6f39f7a | 640 | struct btrfs_block_group *btrfs_create_chunk(struct btrfs_trans_handle *trans, |
79bd3712 | 641 | u64 type); |
7dc66abb | 642 | void btrfs_mapping_tree_free(struct btrfs_fs_info *fs_info); |
8a4b83cc | 643 | int btrfs_open_devices(struct btrfs_fs_devices *fs_devices, |
05bdb996 | 644 | blk_mode_t flags, void *holder); |
bc27d6f0 AJ |
645 | struct btrfs_device *btrfs_scan_one_device(const char *path, blk_mode_t flags, |
646 | bool mount_arg_dev); | |
16cab91a | 647 | int btrfs_forget_devices(dev_t devt); |
54eed6ae | 648 | void btrfs_close_devices(struct btrfs_fs_devices *fs_devices); |
bacce86a | 649 | void btrfs_free_extra_devids(struct btrfs_fs_devices *fs_devices); |
d6507cf1 NB |
650 | void btrfs_assign_next_active_device(struct btrfs_device *device, |
651 | struct btrfs_device *this_dev); | |
a27a94c2 NB |
652 | struct btrfs_device *btrfs_find_device_by_devspec(struct btrfs_fs_info *fs_info, |
653 | u64 devid, | |
654 | const char *devpath); | |
faa775c4 JB |
655 | int btrfs_get_dev_args_from_path(struct btrfs_fs_info *fs_info, |
656 | struct btrfs_dev_lookup_args *args, | |
657 | const char *path); | |
12bd2fc0 | 658 | struct btrfs_device *btrfs_alloc_device(struct btrfs_fs_info *fs_info, |
bb21e302 AJ |
659 | const u64 *devid, const u8 *uuid, |
660 | const char *path); | |
faa775c4 | 661 | void btrfs_put_dev_args_from_path(struct btrfs_dev_lookup_args *args); |
2ff7e61e | 662 | int btrfs_rm_device(struct btrfs_fs_info *fs_info, |
1a15eb72 | 663 | struct btrfs_dev_lookup_args *args, |
86ec15d0 | 664 | struct bdev_handle **bdev_handle); |
ffc5a379 | 665 | void __exit btrfs_cleanup_fs_uuids(void); |
5d964051 | 666 | int btrfs_num_copies(struct btrfs_fs_info *fs_info, u64 logical, u64 len); |
8f18cf13 CM |
667 | int btrfs_grow_device(struct btrfs_trans_handle *trans, |
668 | struct btrfs_device *device, u64 new_size); | |
562d7b15 JB |
669 | struct btrfs_device *btrfs_find_device(const struct btrfs_fs_devices *fs_devices, |
670 | const struct btrfs_dev_lookup_args *args); | |
8f18cf13 | 671 | int btrfs_shrink_device(struct btrfs_device *device, u64 new_size); |
da353f6b | 672 | int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *path); |
6fcf6e2b DS |
673 | int btrfs_balance(struct btrfs_fs_info *fs_info, |
674 | struct btrfs_balance_control *bctl, | |
c9e9f97b | 675 | struct btrfs_ioctl_balance_args *bargs); |
f89e09cf | 676 | void btrfs_describe_block_groups(u64 flags, char *buf, u32 size_buf); |
2b6ba629 | 677 | int btrfs_resume_balance_async(struct btrfs_fs_info *fs_info); |
68310a5e | 678 | int btrfs_recover_balance(struct btrfs_fs_info *fs_info); |
837d5b6e | 679 | int btrfs_pause_balance(struct btrfs_fs_info *fs_info); |
18bb8bbf | 680 | int btrfs_relocate_chunk(struct btrfs_fs_info *fs_info, u64 chunk_offset); |
a7e99c69 | 681 | int btrfs_cancel_balance(struct btrfs_fs_info *fs_info); |
f7a81ea4 | 682 | int btrfs_create_uuid_tree(struct btrfs_fs_info *fs_info); |
97f4dd09 | 683 | int btrfs_uuid_scan_kthread(void *data); |
a09f23c3 | 684 | bool btrfs_chunk_writeable(struct btrfs_fs_info *fs_info, u64 chunk_offset); |
442a4f63 | 685 | void btrfs_dev_stat_inc_and_print(struct btrfs_device *dev, int index); |
2ff7e61e | 686 | int btrfs_get_dev_stats(struct btrfs_fs_info *fs_info, |
b27f7c0c | 687 | struct btrfs_ioctl_get_dev_stats *stats); |
a8d1b164 | 688 | int btrfs_init_devices_late(struct btrfs_fs_info *fs_info); |
733f4fbb | 689 | int btrfs_init_dev_stats(struct btrfs_fs_info *fs_info); |
196c9d8d | 690 | int btrfs_run_dev_stats(struct btrfs_trans_handle *trans); |
68a9db5f | 691 | void btrfs_rm_dev_replace_remove_srcdev(struct btrfs_device *srcdev); |
65237ee3 | 692 | void btrfs_rm_dev_replace_free_srcdev(struct btrfs_device *srcdev); |
4f5ad7bd | 693 | void btrfs_destroy_dev_replace_tgtdev(struct btrfs_device *tgtdev); |
592d92ee | 694 | int btrfs_is_parity_mirror(struct btrfs_fs_info *fs_info, |
e4ff5fb5 | 695 | u64 logical, u64 len); |
2ff7e61e | 696 | unsigned long btrfs_full_stripe_len(struct btrfs_fs_info *fs_info, |
53b381b3 | 697 | u64 logical); |
7dc66abb | 698 | u64 btrfs_calc_stripe_length(const struct btrfs_chunk_map *map); |
0b30f719 | 699 | int btrfs_nr_parity_stripes(u64 type); |
79bd3712 FM |
700 | int btrfs_chunk_alloc_add_chunk_item(struct btrfs_trans_handle *trans, |
701 | struct btrfs_block_group *bg); | |
97aff912 | 702 | int btrfs_remove_chunk(struct btrfs_trans_handle *trans, u64 chunk_offset); |
7dc66abb FM |
703 | |
704 | #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS | |
705 | struct btrfs_chunk_map *btrfs_alloc_chunk_map(int num_stripes, gfp_t gfp); | |
706 | int btrfs_add_chunk_map(struct btrfs_fs_info *fs_info, struct btrfs_chunk_map *map); | |
707 | #endif | |
708 | ||
709 | struct btrfs_chunk_map *btrfs_clone_chunk_map(struct btrfs_chunk_map *map, gfp_t gfp); | |
710 | struct btrfs_chunk_map *btrfs_find_chunk_map(struct btrfs_fs_info *fs_info, | |
711 | u64 logical, u64 length); | |
712 | struct btrfs_chunk_map *btrfs_find_chunk_map_nolock(struct btrfs_fs_info *fs_info, | |
713 | u64 logical, u64 length); | |
714 | struct btrfs_chunk_map *btrfs_get_chunk_map(struct btrfs_fs_info *fs_info, | |
715 | u64 logical, u64 length); | |
716 | void btrfs_remove_chunk_map(struct btrfs_fs_info *fs_info, struct btrfs_chunk_map *map); | |
8f32380d | 717 | void btrfs_release_disk_super(struct btrfs_super_block *super); |
addc3fa7 | 718 | |
442a4f63 SB |
719 | static inline void btrfs_dev_stat_inc(struct btrfs_device *dev, |
720 | int index) | |
721 | { | |
722 | atomic_inc(dev->dev_stat_values + index); | |
9deae968 NB |
723 | /* |
724 | * This memory barrier orders stores updating statistics before stores | |
725 | * updating dev_stats_ccnt. | |
726 | * | |
727 | * It pairs with smp_rmb() in btrfs_run_dev_stats(). | |
728 | */ | |
addc3fa7 MX |
729 | smp_mb__before_atomic(); |
730 | atomic_inc(&dev->dev_stats_ccnt); | |
442a4f63 SB |
731 | } |
732 | ||
733 | static inline int btrfs_dev_stat_read(struct btrfs_device *dev, | |
734 | int index) | |
735 | { | |
736 | return atomic_read(dev->dev_stat_values + index); | |
737 | } | |
738 | ||
739 | static inline int btrfs_dev_stat_read_and_reset(struct btrfs_device *dev, | |
740 | int index) | |
741 | { | |
742 | int ret; | |
743 | ||
744 | ret = atomic_xchg(dev->dev_stat_values + index, 0); | |
4660c49f NB |
745 | /* |
746 | * atomic_xchg implies a full memory barriers as per atomic_t.txt: | |
747 | * - RMW operations that have a return value are fully ordered; | |
748 | * | |
749 | * This implicit memory barriers is paired with the smp_rmb in | |
750 | * btrfs_run_dev_stats | |
751 | */ | |
addc3fa7 | 752 | atomic_inc(&dev->dev_stats_ccnt); |
442a4f63 SB |
753 | return ret; |
754 | } | |
755 | ||
756 | static inline void btrfs_dev_stat_set(struct btrfs_device *dev, | |
757 | int index, unsigned long val) | |
758 | { | |
759 | atomic_set(dev->dev_stat_values + index, val); | |
9deae968 NB |
760 | /* |
761 | * This memory barrier orders stores updating statistics before stores | |
762 | * updating dev_stats_ccnt. | |
763 | * | |
764 | * It pairs with smp_rmb() in btrfs_run_dev_stats(). | |
765 | */ | |
addc3fa7 MX |
766 | smp_mb__before_atomic(); |
767 | atomic_inc(&dev->dev_stats_ccnt); | |
442a4f63 SB |
768 | } |
769 | ||
cb3e217b QW |
770 | static inline const char *btrfs_dev_name(const struct btrfs_device *device) |
771 | { | |
772 | if (!device || test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state)) | |
773 | return "<missing disk>"; | |
774 | else | |
775 | return rcu_str_deref(device->name); | |
776 | } | |
777 | ||
bbbf7243 | 778 | void btrfs_commit_device_sizes(struct btrfs_transaction *trans); |
04216820 | 779 | |
4143cb8b | 780 | struct list_head * __attribute_const__ btrfs_get_fs_uuids(void); |
6528b99d AJ |
781 | bool btrfs_check_rw_degradable(struct btrfs_fs_info *fs_info, |
782 | struct btrfs_device *failing_dev); | |
313b0858 JB |
783 | void btrfs_scratch_superblocks(struct btrfs_fs_info *fs_info, |
784 | struct block_device *bdev, | |
785 | const char *device_path); | |
21634a19 | 786 | |
500a44c9 | 787 | enum btrfs_raid_types __attribute_const__ btrfs_bg_flags_to_raid_index(u64 flags); |
46df06b8 | 788 | int btrfs_bg_type_to_factor(u64 flags); |
158da513 | 789 | const char *btrfs_bg_type_to_raid_name(u64 flags); |
cf90d884 | 790 | int btrfs_verify_dev_extents(struct btrfs_fs_info *fs_info); |
554aed7d | 791 | bool btrfs_repair_one_zone(struct btrfs_fs_info *fs_info, u64 logical); |
46df06b8 | 792 | |
c2e79e86 | 793 | bool btrfs_pinned_by_swapfile(struct btrfs_fs_info *fs_info, void *ptr); |
4844c366 | 794 | u8 *btrfs_sb_fsid_ptr(struct btrfs_super_block *sb); |
c2e79e86 | 795 | |
0b86a832 | 796 | #endif |