volumes.h (20012B)
1/* SPDX-License-Identifier: GPL-2.0 */ 2/* 3 * Copyright (C) 2007 Oracle. All rights reserved. 4 */ 5 6#ifndef BTRFS_VOLUMES_H 7#define BTRFS_VOLUMES_H 8 9#include <linux/bio.h> 10#include <linux/sort.h> 11#include <linux/btrfs.h> 12#include "async-thread.h" 13 14#define BTRFS_MAX_DATA_CHUNK_SIZE (10ULL * SZ_1G) 15 16extern struct mutex uuid_mutex; 17 18#define BTRFS_STRIPE_LEN SZ_64K 19 20/* Used by sanity check for btrfs_raid_types. */ 21#define const_ffs(n) (__builtin_ctzll(n) + 1) 22 23/* 24 * The conversion from BTRFS_BLOCK_GROUP_* bits to btrfs_raid_type requires 25 * RAID0 always to be the lowest profile bit. 26 * Although it's part of on-disk format and should never change, do extra 27 * compile-time sanity checks. 28 */ 29static_assert(const_ffs(BTRFS_BLOCK_GROUP_RAID0) < 30 const_ffs(BTRFS_BLOCK_GROUP_PROFILE_MASK & ~BTRFS_BLOCK_GROUP_RAID0)); 31static_assert(const_ilog2(BTRFS_BLOCK_GROUP_RAID0) > 32 ilog2(BTRFS_BLOCK_GROUP_TYPE_MASK)); 33 34/* ilog2() can handle both constants and variables */ 35#define BTRFS_BG_FLAG_TO_INDEX(profile) \ 36 ilog2((profile) >> (ilog2(BTRFS_BLOCK_GROUP_RAID0) - 1)) 37 38enum btrfs_raid_types { 39 /* SINGLE is the special one as it doesn't have on-disk bit. */ 40 BTRFS_RAID_SINGLE = 0, 41 42 BTRFS_RAID_RAID0 = BTRFS_BG_FLAG_TO_INDEX(BTRFS_BLOCK_GROUP_RAID0), 43 BTRFS_RAID_RAID1 = BTRFS_BG_FLAG_TO_INDEX(BTRFS_BLOCK_GROUP_RAID1), 44 BTRFS_RAID_DUP = BTRFS_BG_FLAG_TO_INDEX(BTRFS_BLOCK_GROUP_DUP), 45 BTRFS_RAID_RAID10 = BTRFS_BG_FLAG_TO_INDEX(BTRFS_BLOCK_GROUP_RAID10), 46 BTRFS_RAID_RAID5 = BTRFS_BG_FLAG_TO_INDEX(BTRFS_BLOCK_GROUP_RAID5), 47 BTRFS_RAID_RAID6 = BTRFS_BG_FLAG_TO_INDEX(BTRFS_BLOCK_GROUP_RAID6), 48 BTRFS_RAID_RAID1C3 = BTRFS_BG_FLAG_TO_INDEX(BTRFS_BLOCK_GROUP_RAID1C3), 49 BTRFS_RAID_RAID1C4 = BTRFS_BG_FLAG_TO_INDEX(BTRFS_BLOCK_GROUP_RAID1C4), 50 51 BTRFS_NR_RAID_TYPES 52}; 53 54struct btrfs_io_geometry { 55 /* remaining bytes before crossing a stripe */ 56 u64 len; 57 /* offset of logical address in chunk */ 58 u64 offset; 59 /* length of single IO stripe */ 60 u32 stripe_len; 61 /* offset of address in stripe */ 62 u32 stripe_offset; 63 /* number of stripe where address falls */ 64 u64 stripe_nr; 65 /* offset of raid56 stripe into the chunk */ 66 u64 raid56_stripe_offset; 67}; 68 69/* 70 * Use sequence counter to get consistent device stat data on 71 * 32-bit processors. 72 */ 73#if BITS_PER_LONG==32 && defined(CONFIG_SMP) 74#include <linux/seqlock.h> 75#define __BTRFS_NEED_DEVICE_DATA_ORDERED 76#define btrfs_device_data_ordered_init(device) \ 77 seqcount_init(&device->data_seqcount) 78#else 79#define btrfs_device_data_ordered_init(device) do { } while (0) 80#endif 81 82#define BTRFS_DEV_STATE_WRITEABLE (0) 83#define BTRFS_DEV_STATE_IN_FS_METADATA (1) 84#define BTRFS_DEV_STATE_MISSING (2) 85#define BTRFS_DEV_STATE_REPLACE_TGT (3) 86#define BTRFS_DEV_STATE_FLUSH_SENT (4) 87#define BTRFS_DEV_STATE_NO_READA (5) 88 89struct btrfs_zoned_device_info; 90 91struct btrfs_device { 92 struct list_head dev_list; /* device_list_mutex */ 93 struct list_head dev_alloc_list; /* chunk mutex */ 94 struct list_head post_commit_list; /* chunk mutex */ 95 struct btrfs_fs_devices *fs_devices; 96 struct btrfs_fs_info *fs_info; 97 98 struct rcu_string __rcu *name; 99 100 u64 generation; 101 102 struct block_device *bdev; 103 104 struct btrfs_zoned_device_info *zone_info; 105 106 /* the mode sent to blkdev_get */ 107 fmode_t mode; 108 109 /* 110 * Device's major-minor number. Must be set even if the device is not 111 * opened (bdev == NULL), unless the device is missing. 112 */ 113 dev_t devt; 114 unsigned long dev_state; 115 blk_status_t last_flush_error; 116 117#ifdef __BTRFS_NEED_DEVICE_DATA_ORDERED 118 seqcount_t data_seqcount; 119#endif 120 121 /* the internal btrfs device id */ 122 u64 devid; 123 124 /* size of the device in memory */ 125 u64 total_bytes; 126 127 /* size of the device on disk */ 128 u64 disk_total_bytes; 129 130 /* bytes used */ 131 u64 bytes_used; 132 133 /* optimal io alignment for this device */ 134 u32 io_align; 135 136 /* optimal io width for this device */ 137 u32 io_width; 138 /* type and info about this device */ 139 u64 type; 140 141 /* minimal io size for this device */ 142 u32 sector_size; 143 144 /* physical drive uuid (or lvm uuid) */ 145 u8 uuid[BTRFS_UUID_SIZE]; 146 147 /* 148 * size of the device on the current transaction 149 * 150 * This variant is update when committing the transaction, 151 * and protected by chunk mutex 152 */ 153 u64 commit_total_bytes; 154 155 /* bytes used on the current transaction */ 156 u64 commit_bytes_used; 157 158 /* Bio used for flushing device barriers */ 159 struct bio flush_bio; 160 struct completion flush_wait; 161 162 /* per-device scrub information */ 163 struct scrub_ctx *scrub_ctx; 164 165 /* disk I/O failure stats. For detailed description refer to 166 * enum btrfs_dev_stat_values in ioctl.h */ 167 int dev_stats_valid; 168 169 /* Counter to record the change of device stats */ 170 atomic_t dev_stats_ccnt; 171 atomic_t dev_stat_values[BTRFS_DEV_STAT_VALUES_MAX]; 172 173 struct extent_io_tree alloc_state; 174 175 struct completion kobj_unregister; 176 /* For sysfs/FSID/devinfo/devid/ */ 177 struct kobject devid_kobj; 178 179 /* Bandwidth limit for scrub, in bytes */ 180 u64 scrub_speed_max; 181}; 182 183/* 184 * If we read those variants at the context of their own lock, we needn't 185 * use the following helpers, reading them directly is safe. 186 */ 187#if BITS_PER_LONG==32 && defined(CONFIG_SMP) 188#define BTRFS_DEVICE_GETSET_FUNCS(name) \ 189static inline u64 \ 190btrfs_device_get_##name(const struct btrfs_device *dev) \ 191{ \ 192 u64 size; \ 193 unsigned int seq; \ 194 \ 195 do { \ 196 seq = read_seqcount_begin(&dev->data_seqcount); \ 197 size = dev->name; \ 198 } while (read_seqcount_retry(&dev->data_seqcount, seq)); \ 199 return size; \ 200} \ 201 \ 202static inline void \ 203btrfs_device_set_##name(struct btrfs_device *dev, u64 size) \ 204{ \ 205 preempt_disable(); \ 206 write_seqcount_begin(&dev->data_seqcount); \ 207 dev->name = size; \ 208 write_seqcount_end(&dev->data_seqcount); \ 209 preempt_enable(); \ 210} 211#elif BITS_PER_LONG==32 && defined(CONFIG_PREEMPTION) 212#define BTRFS_DEVICE_GETSET_FUNCS(name) \ 213static inline u64 \ 214btrfs_device_get_##name(const struct btrfs_device *dev) \ 215{ \ 216 u64 size; \ 217 \ 218 preempt_disable(); \ 219 size = dev->name; \ 220 preempt_enable(); \ 221 return size; \ 222} \ 223 \ 224static inline void \ 225btrfs_device_set_##name(struct btrfs_device *dev, u64 size) \ 226{ \ 227 preempt_disable(); \ 228 dev->name = size; \ 229 preempt_enable(); \ 230} 231#else 232#define BTRFS_DEVICE_GETSET_FUNCS(name) \ 233static inline u64 \ 234btrfs_device_get_##name(const struct btrfs_device *dev) \ 235{ \ 236 return dev->name; \ 237} \ 238 \ 239static inline void \ 240btrfs_device_set_##name(struct btrfs_device *dev, u64 size) \ 241{ \ 242 dev->name = size; \ 243} 244#endif 245 246BTRFS_DEVICE_GETSET_FUNCS(total_bytes); 247BTRFS_DEVICE_GETSET_FUNCS(disk_total_bytes); 248BTRFS_DEVICE_GETSET_FUNCS(bytes_used); 249 250enum btrfs_chunk_allocation_policy { 251 BTRFS_CHUNK_ALLOC_REGULAR, 252 BTRFS_CHUNK_ALLOC_ZONED, 253}; 254 255/* 256 * Read policies for mirrored block group profiles, read picks the stripe based 257 * on these policies. 258 */ 259enum btrfs_read_policy { 260 /* Use process PID to choose the stripe */ 261 BTRFS_READ_POLICY_PID, 262 BTRFS_NR_READ_POLICY, 263}; 264 265struct btrfs_fs_devices { 266 u8 fsid[BTRFS_FSID_SIZE]; /* FS specific uuid */ 267 u8 metadata_uuid[BTRFS_FSID_SIZE]; 268 bool fsid_change; 269 struct list_head fs_list; 270 271 /* 272 * Number of devices under this fsid including missing and 273 * replace-target device and excludes seed devices. 274 */ 275 u64 num_devices; 276 277 /* 278 * The number of devices that successfully opened, including 279 * replace-target, excludes seed devices. 280 */ 281 u64 open_devices; 282 283 /* The number of devices that are under the chunk allocation list. */ 284 u64 rw_devices; 285 286 /* Count of missing devices under this fsid excluding seed device. */ 287 u64 missing_devices; 288 u64 total_rw_bytes; 289 290 /* 291 * Count of devices from btrfs_super_block::num_devices for this fsid, 292 * which includes the seed device, excludes the transient replace-target 293 * device. 294 */ 295 u64 total_devices; 296 297 /* Highest generation number of seen devices */ 298 u64 latest_generation; 299 300 /* 301 * The mount device or a device with highest generation after removal 302 * or replace. 303 */ 304 struct btrfs_device *latest_dev; 305 306 /* all of the devices in the FS, protected by a mutex 307 * so we can safely walk it to write out the supers without 308 * worrying about add/remove by the multi-device code. 309 * Scrubbing super can kick off supers writing by holding 310 * this mutex lock. 311 */ 312 struct mutex device_list_mutex; 313 314 /* List of all devices, protected by device_list_mutex */ 315 struct list_head devices; 316 317 /* 318 * Devices which can satisfy space allocation. Protected by 319 * chunk_mutex 320 */ 321 struct list_head alloc_list; 322 323 struct list_head seed_list; 324 bool seeding; 325 326 int opened; 327 328 /* set when we find or add a device that doesn't have the 329 * nonrot flag set 330 */ 331 bool rotating; 332 333 struct btrfs_fs_info *fs_info; 334 /* sysfs kobjects */ 335 struct kobject fsid_kobj; 336 struct kobject *devices_kobj; 337 struct kobject *devinfo_kobj; 338 struct completion kobj_unregister; 339 340 enum btrfs_chunk_allocation_policy chunk_alloc_policy; 341 342 /* Policy used to read the mirrored stripes */ 343 enum btrfs_read_policy read_policy; 344}; 345 346#define BTRFS_BIO_INLINE_CSUM_SIZE 64 347 348#define BTRFS_MAX_DEVS(info) ((BTRFS_MAX_ITEM_SIZE(info) \ 349 - sizeof(struct btrfs_chunk)) \ 350 / sizeof(struct btrfs_stripe) + 1) 351 352#define BTRFS_MAX_DEVS_SYS_CHUNK ((BTRFS_SYSTEM_CHUNK_ARRAY_SIZE \ 353 - 2 * sizeof(struct btrfs_disk_key) \ 354 - 2 * sizeof(struct btrfs_chunk)) \ 355 / sizeof(struct btrfs_stripe) + 1) 356 357/* 358 * Additional info to pass along bio. 359 * 360 * Mostly for btrfs specific features like csum and mirror_num. 361 */ 362struct btrfs_bio { 363 unsigned int mirror_num; 364 365 /* for direct I/O */ 366 u64 file_offset; 367 368 /* @device is for stripe IO submission. */ 369 struct btrfs_device *device; 370 u8 *csum; 371 u8 csum_inline[BTRFS_BIO_INLINE_CSUM_SIZE]; 372 struct bvec_iter iter; 373 374 /* 375 * This member must come last, bio_alloc_bioset will allocate enough 376 * bytes for entire btrfs_bio but relies on bio being last. 377 */ 378 struct bio bio; 379}; 380 381static inline struct btrfs_bio *btrfs_bio(struct bio *bio) 382{ 383 return container_of(bio, struct btrfs_bio, bio); 384} 385 386static inline void btrfs_bio_free_csum(struct btrfs_bio *bbio) 387{ 388 if (bbio->csum != bbio->csum_inline) { 389 kfree(bbio->csum); 390 bbio->csum = NULL; 391 } 392} 393 394struct btrfs_io_stripe { 395 struct btrfs_device *dev; 396 u64 physical; 397 u64 length; /* only used for discard mappings */ 398}; 399 400/* 401 * Context for IO subsmission for device stripe. 402 * 403 * - Track the unfinished mirrors for mirror based profiles 404 * Mirror based profiles are SINGLE/DUP/RAID1/RAID10. 405 * 406 * - Contain the logical -> physical mapping info 407 * Used by submit_stripe_bio() for mapping logical bio 408 * into physical device address. 409 * 410 * - Contain device replace info 411 * Used by handle_ops_on_dev_replace() to copy logical bios 412 * into the new device. 413 * 414 * - Contain RAID56 full stripe logical bytenrs 415 */ 416struct btrfs_io_context { 417 refcount_t refs; 418 atomic_t stripes_pending; 419 struct btrfs_fs_info *fs_info; 420 u64 map_type; /* get from map_lookup->type */ 421 bio_end_io_t *end_io; 422 struct bio *orig_bio; 423 void *private; 424 atomic_t error; 425 int max_errors; 426 int num_stripes; 427 int mirror_num; 428 int num_tgtdevs; 429 int *tgtdev_map; 430 /* 431 * logical block numbers for the start of each stripe 432 * The last one or two are p/q. These are sorted, 433 * so raid_map[0] is the start of our full stripe 434 */ 435 u64 *raid_map; 436 struct btrfs_io_stripe stripes[]; 437}; 438 439struct btrfs_device_info { 440 struct btrfs_device *dev; 441 u64 dev_offset; 442 u64 max_avail; 443 u64 total_avail; 444}; 445 446struct btrfs_raid_attr { 447 u8 sub_stripes; /* sub_stripes info for map */ 448 u8 dev_stripes; /* stripes per dev */ 449 u8 devs_max; /* max devs to use */ 450 u8 devs_min; /* min devs needed */ 451 u8 tolerated_failures; /* max tolerated fail devs */ 452 u8 devs_increment; /* ndevs has to be a multiple of this */ 453 u8 ncopies; /* how many copies to data has */ 454 u8 nparity; /* number of stripes worth of bytes to store 455 * parity information */ 456 u8 mindev_error; /* error code if min devs requisite is unmet */ 457 const char raid_name[8]; /* name of the raid */ 458 u64 bg_flag; /* block group flag of the raid */ 459}; 460 461extern const struct btrfs_raid_attr btrfs_raid_array[BTRFS_NR_RAID_TYPES]; 462 463struct map_lookup { 464 u64 type; 465 int io_align; 466 int io_width; 467 u32 stripe_len; 468 int num_stripes; 469 int sub_stripes; 470 int verified_stripes; /* For mount time dev extent verification */ 471 struct btrfs_io_stripe stripes[]; 472}; 473 474#define map_lookup_size(n) (sizeof(struct map_lookup) + \ 475 (sizeof(struct btrfs_io_stripe) * (n))) 476 477struct btrfs_balance_args; 478struct btrfs_balance_progress; 479struct btrfs_balance_control { 480 struct btrfs_balance_args data; 481 struct btrfs_balance_args meta; 482 struct btrfs_balance_args sys; 483 484 u64 flags; 485 486 struct btrfs_balance_progress stat; 487}; 488 489/* 490 * Search for a given device by the set parameters 491 */ 492struct btrfs_dev_lookup_args { 493 u64 devid; 494 u8 *uuid; 495 u8 *fsid; 496 bool missing; 497}; 498 499/* We have to initialize to -1 because BTRFS_DEV_REPLACE_DEVID is 0 */ 500#define BTRFS_DEV_LOOKUP_ARGS_INIT { .devid = (u64)-1 } 501 502#define BTRFS_DEV_LOOKUP_ARGS(name) \ 503 struct btrfs_dev_lookup_args name = BTRFS_DEV_LOOKUP_ARGS_INIT 504 505enum btrfs_map_op { 506 BTRFS_MAP_READ, 507 BTRFS_MAP_WRITE, 508 BTRFS_MAP_DISCARD, 509 BTRFS_MAP_GET_READ_MIRRORS, 510}; 511 512static inline enum btrfs_map_op btrfs_op(struct bio *bio) 513{ 514 switch (bio_op(bio)) { 515 case REQ_OP_DISCARD: 516 return BTRFS_MAP_DISCARD; 517 case REQ_OP_WRITE: 518 case REQ_OP_ZONE_APPEND: 519 return BTRFS_MAP_WRITE; 520 default: 521 WARN_ON_ONCE(1); 522 fallthrough; 523 case REQ_OP_READ: 524 return BTRFS_MAP_READ; 525 } 526} 527 528void btrfs_get_bioc(struct btrfs_io_context *bioc); 529void btrfs_put_bioc(struct btrfs_io_context *bioc); 530int btrfs_map_block(struct btrfs_fs_info *fs_info, enum btrfs_map_op op, 531 u64 logical, u64 *length, 532 struct btrfs_io_context **bioc_ret, int mirror_num); 533int btrfs_map_sblock(struct btrfs_fs_info *fs_info, enum btrfs_map_op op, 534 u64 logical, u64 *length, 535 struct btrfs_io_context **bioc_ret); 536int btrfs_get_io_geometry(struct btrfs_fs_info *fs_info, struct extent_map *map, 537 enum btrfs_map_op op, u64 logical, 538 struct btrfs_io_geometry *io_geom); 539int btrfs_read_sys_array(struct btrfs_fs_info *fs_info); 540int btrfs_read_chunk_tree(struct btrfs_fs_info *fs_info); 541struct btrfs_block_group *btrfs_create_chunk(struct btrfs_trans_handle *trans, 542 u64 type); 543void btrfs_mapping_tree_free(struct extent_map_tree *tree); 544blk_status_t btrfs_map_bio(struct btrfs_fs_info *fs_info, struct bio *bio, 545 int mirror_num); 546int btrfs_open_devices(struct btrfs_fs_devices *fs_devices, 547 fmode_t flags, void *holder); 548struct btrfs_device *btrfs_scan_one_device(const char *path, 549 fmode_t flags, void *holder); 550int btrfs_forget_devices(dev_t devt); 551void btrfs_close_devices(struct btrfs_fs_devices *fs_devices); 552void btrfs_free_extra_devids(struct btrfs_fs_devices *fs_devices); 553void btrfs_assign_next_active_device(struct btrfs_device *device, 554 struct btrfs_device *this_dev); 555struct btrfs_device *btrfs_find_device_by_devspec(struct btrfs_fs_info *fs_info, 556 u64 devid, 557 const char *devpath); 558int btrfs_get_dev_args_from_path(struct btrfs_fs_info *fs_info, 559 struct btrfs_dev_lookup_args *args, 560 const char *path); 561struct btrfs_device *btrfs_alloc_device(struct btrfs_fs_info *fs_info, 562 const u64 *devid, 563 const u8 *uuid); 564void btrfs_put_dev_args_from_path(struct btrfs_dev_lookup_args *args); 565void btrfs_free_device(struct btrfs_device *device); 566int btrfs_rm_device(struct btrfs_fs_info *fs_info, 567 struct btrfs_dev_lookup_args *args, 568 struct block_device **bdev, fmode_t *mode); 569void __exit btrfs_cleanup_fs_uuids(void); 570int btrfs_num_copies(struct btrfs_fs_info *fs_info, u64 logical, u64 len); 571int btrfs_grow_device(struct btrfs_trans_handle *trans, 572 struct btrfs_device *device, u64 new_size); 573struct btrfs_device *btrfs_find_device(const struct btrfs_fs_devices *fs_devices, 574 const struct btrfs_dev_lookup_args *args); 575int btrfs_shrink_device(struct btrfs_device *device, u64 new_size); 576int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *path); 577int btrfs_balance(struct btrfs_fs_info *fs_info, 578 struct btrfs_balance_control *bctl, 579 struct btrfs_ioctl_balance_args *bargs); 580void btrfs_describe_block_groups(u64 flags, char *buf, u32 size_buf); 581int btrfs_resume_balance_async(struct btrfs_fs_info *fs_info); 582int btrfs_recover_balance(struct btrfs_fs_info *fs_info); 583int btrfs_pause_balance(struct btrfs_fs_info *fs_info); 584int btrfs_relocate_chunk(struct btrfs_fs_info *fs_info, u64 chunk_offset); 585int btrfs_cancel_balance(struct btrfs_fs_info *fs_info); 586int btrfs_create_uuid_tree(struct btrfs_fs_info *fs_info); 587int btrfs_uuid_scan_kthread(void *data); 588bool btrfs_chunk_writeable(struct btrfs_fs_info *fs_info, u64 chunk_offset); 589int find_free_dev_extent(struct btrfs_device *device, u64 num_bytes, 590 u64 *start, u64 *max_avail); 591void btrfs_dev_stat_inc_and_print(struct btrfs_device *dev, int index); 592int btrfs_get_dev_stats(struct btrfs_fs_info *fs_info, 593 struct btrfs_ioctl_get_dev_stats *stats); 594void btrfs_init_devices_late(struct btrfs_fs_info *fs_info); 595int btrfs_init_dev_stats(struct btrfs_fs_info *fs_info); 596int btrfs_run_dev_stats(struct btrfs_trans_handle *trans); 597void btrfs_rm_dev_replace_remove_srcdev(struct btrfs_device *srcdev); 598void btrfs_rm_dev_replace_free_srcdev(struct btrfs_device *srcdev); 599void btrfs_destroy_dev_replace_tgtdev(struct btrfs_device *tgtdev); 600int btrfs_is_parity_mirror(struct btrfs_fs_info *fs_info, 601 u64 logical, u64 len); 602unsigned long btrfs_full_stripe_len(struct btrfs_fs_info *fs_info, 603 u64 logical); 604int btrfs_chunk_alloc_add_chunk_item(struct btrfs_trans_handle *trans, 605 struct btrfs_block_group *bg); 606int btrfs_remove_chunk(struct btrfs_trans_handle *trans, u64 chunk_offset); 607struct extent_map *btrfs_get_chunk_map(struct btrfs_fs_info *fs_info, 608 u64 logical, u64 length); 609void btrfs_release_disk_super(struct btrfs_super_block *super); 610 611static inline void btrfs_dev_stat_inc(struct btrfs_device *dev, 612 int index) 613{ 614 atomic_inc(dev->dev_stat_values + index); 615 /* 616 * This memory barrier orders stores updating statistics before stores 617 * updating dev_stats_ccnt. 618 * 619 * It pairs with smp_rmb() in btrfs_run_dev_stats(). 620 */ 621 smp_mb__before_atomic(); 622 atomic_inc(&dev->dev_stats_ccnt); 623} 624 625static inline int btrfs_dev_stat_read(struct btrfs_device *dev, 626 int index) 627{ 628 return atomic_read(dev->dev_stat_values + index); 629} 630 631static inline int btrfs_dev_stat_read_and_reset(struct btrfs_device *dev, 632 int index) 633{ 634 int ret; 635 636 ret = atomic_xchg(dev->dev_stat_values + index, 0); 637 /* 638 * atomic_xchg implies a full memory barriers as per atomic_t.txt: 639 * - RMW operations that have a return value are fully ordered; 640 * 641 * This implicit memory barriers is paired with the smp_rmb in 642 * btrfs_run_dev_stats 643 */ 644 atomic_inc(&dev->dev_stats_ccnt); 645 return ret; 646} 647 648static inline void btrfs_dev_stat_set(struct btrfs_device *dev, 649 int index, unsigned long val) 650{ 651 atomic_set(dev->dev_stat_values + index, val); 652 /* 653 * This memory barrier orders stores updating statistics before stores 654 * updating dev_stats_ccnt. 655 * 656 * It pairs with smp_rmb() in btrfs_run_dev_stats(). 657 */ 658 smp_mb__before_atomic(); 659 atomic_inc(&dev->dev_stats_ccnt); 660} 661 662void btrfs_commit_device_sizes(struct btrfs_transaction *trans); 663 664struct list_head * __attribute_const__ btrfs_get_fs_uuids(void); 665bool btrfs_check_rw_degradable(struct btrfs_fs_info *fs_info, 666 struct btrfs_device *failing_dev); 667void btrfs_scratch_superblocks(struct btrfs_fs_info *fs_info, 668 struct block_device *bdev, 669 const char *device_path); 670 671enum btrfs_raid_types __attribute_const__ btrfs_bg_flags_to_raid_index(u64 flags); 672int btrfs_bg_type_to_factor(u64 flags); 673const char *btrfs_bg_type_to_raid_name(u64 flags); 674int btrfs_verify_dev_extents(struct btrfs_fs_info *fs_info); 675bool btrfs_repair_one_zone(struct btrfs_fs_info *fs_info, u64 logical); 676 677#endif