Lines Matching refs:device
250 static void btrfs_dev_stat_print_on_load(struct btrfs_device *device);
399 void btrfs_free_device(struct btrfs_device *device) in btrfs_free_device() argument
401 WARN_ON(!list_empty(&device->post_commit_list)); in btrfs_free_device()
402 rcu_string_free(device->name); in btrfs_free_device()
403 extent_io_tree_release(&device->alloc_state); in btrfs_free_device()
404 btrfs_destroy_dev_zone_info(device); in btrfs_free_device()
405 kfree(device); in btrfs_free_device()
410 struct btrfs_device *device; in free_fs_devices() local
414 device = list_entry(fs_devices->devices.next, in free_fs_devices()
416 list_del(&device->dev_list); in free_fs_devices()
417 btrfs_free_device(device); in free_fs_devices()
549 struct btrfs_device *device, *tmp_device; in btrfs_free_stale_devices() local
560 list_for_each_entry_safe(device, tmp_device, in btrfs_free_stale_devices()
562 if (skip_device && skip_device == device) in btrfs_free_stale_devices()
564 if (devt && devt != device->devt) in btrfs_free_stale_devices()
575 list_del(&device->dev_list); in btrfs_free_stale_devices()
576 btrfs_free_device(device); in btrfs_free_stale_devices()
598 struct btrfs_device *device, fmode_t flags, in btrfs_open_one_device() argument
606 if (device->bdev) in btrfs_open_one_device()
608 if (!device->name) in btrfs_open_one_device()
611 ret = btrfs_get_bdev_and_sb(device->name->str, flags, holder, 1, in btrfs_open_one_device()
617 if (devid != device->devid) in btrfs_open_one_device()
620 if (memcmp(device->uuid, disk_super->dev_item.uuid, BTRFS_UUID_SIZE)) in btrfs_open_one_device()
623 device->generation = btrfs_super_generation(disk_super); in btrfs_open_one_device()
633 clear_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state); in btrfs_open_one_device()
637 clear_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state); in btrfs_open_one_device()
639 set_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state); in btrfs_open_one_device()
645 device->bdev = bdev; in btrfs_open_one_device()
646 clear_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state); in btrfs_open_one_device()
647 device->mode = flags; in btrfs_open_one_device()
650 if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state) && in btrfs_open_one_device()
651 device->devid != BTRFS_DEV_REPLACE_DEVID) { in btrfs_open_one_device()
653 list_add_tail(&device->dev_alloc_list, &fs_devices->alloc_list); in btrfs_open_one_device()
769 struct btrfs_device *device; in device_list_add() local
817 device = NULL; in device_list_add()
825 device = btrfs_find_device(fs_devices, &args); in device_list_add()
849 if (!device) { in device_list_add()
858 device = btrfs_alloc_device(NULL, &devid, in device_list_add()
860 if (IS_ERR(device)) { in device_list_add()
863 return device; in device_list_add()
868 btrfs_free_device(device); in device_list_add()
872 rcu_assign_pointer(device->name, name); in device_list_add()
873 device->devt = path_devt; in device_list_add()
875 list_add_rcu(&device->dev_list, &fs_devices->devices); in device_list_add()
878 device->fs_devices = fs_devices; in device_list_add()
892 } else if (!device->name || strcmp(device->name->str, path)) { in device_list_add()
919 if (!fs_devices->opened && found_transid < device->generation) { in device_list_add()
930 path, found_transid, device->generation); in device_list_add()
943 if (device->bdev) { in device_list_add()
944 if (device->devt != path_devt) { in device_list_add()
955 devid, rcu_str_deref(device->name), in device_list_add()
965 rcu_string_free(device->name); in device_list_add()
966 rcu_assign_pointer(device->name, name); in device_list_add()
967 if (test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state)) { in device_list_add()
969 clear_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state); in device_list_add()
971 device->devt = path_devt; in device_list_add()
981 device->generation = found_transid; in device_list_add()
989 return device; in device_list_add()
995 struct btrfs_device *device; in clone_fs_devices() local
1010 device = btrfs_alloc_device(NULL, &orig_dev->devid, in clone_fs_devices()
1012 if (IS_ERR(device)) { in clone_fs_devices()
1013 ret = PTR_ERR(device); in clone_fs_devices()
1025 btrfs_free_device(device); in clone_fs_devices()
1029 rcu_assign_pointer(device->name, name); in clone_fs_devices()
1037 btrfs_free_device(device); in clone_fs_devices()
1041 device->zone_info = zone_info; in clone_fs_devices()
1044 list_add(&device->dev_list, &fs_devices->devices); in clone_fs_devices()
1045 device->fs_devices = fs_devices; in clone_fs_devices()
1057 struct btrfs_device *device, *next; in __btrfs_free_extra_devids() local
1060 list_for_each_entry_safe(device, next, &fs_devices->devices, dev_list) { in __btrfs_free_extra_devids()
1061 if (test_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state)) { in __btrfs_free_extra_devids()
1063 &device->dev_state) && in __btrfs_free_extra_devids()
1065 &device->dev_state) && in __btrfs_free_extra_devids()
1067 device->generation > (*latest_dev)->generation)) { in __btrfs_free_extra_devids()
1068 *latest_dev = device; in __btrfs_free_extra_devids()
1077 if (device->devid == BTRFS_DEV_REPLACE_DEVID) in __btrfs_free_extra_devids()
1080 if (device->bdev) { in __btrfs_free_extra_devids()
1081 blkdev_put(device->bdev, device->mode); in __btrfs_free_extra_devids()
1082 device->bdev = NULL; in __btrfs_free_extra_devids()
1085 if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)) { in __btrfs_free_extra_devids()
1086 list_del_init(&device->dev_alloc_list); in __btrfs_free_extra_devids()
1087 clear_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state); in __btrfs_free_extra_devids()
1090 list_del_init(&device->dev_list); in __btrfs_free_extra_devids()
1092 btrfs_free_device(device); in __btrfs_free_extra_devids()
1117 static void btrfs_close_bdev(struct btrfs_device *device) in btrfs_close_bdev() argument
1119 if (!device->bdev) in btrfs_close_bdev()
1122 if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)) { in btrfs_close_bdev()
1123 sync_blockdev(device->bdev); in btrfs_close_bdev()
1124 invalidate_bdev(device->bdev); in btrfs_close_bdev()
1127 blkdev_put(device->bdev, device->mode); in btrfs_close_bdev()
1130 static void btrfs_close_one_device(struct btrfs_device *device) in btrfs_close_one_device() argument
1132 struct btrfs_fs_devices *fs_devices = device->fs_devices; in btrfs_close_one_device()
1134 if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state) && in btrfs_close_one_device()
1135 device->devid != BTRFS_DEV_REPLACE_DEVID) { in btrfs_close_one_device()
1136 list_del_init(&device->dev_alloc_list); in btrfs_close_one_device()
1140 if (device->devid == BTRFS_DEV_REPLACE_DEVID) in btrfs_close_one_device()
1141 clear_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state); in btrfs_close_one_device()
1143 if (test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state)) { in btrfs_close_one_device()
1144 clear_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state); in btrfs_close_one_device()
1148 btrfs_close_bdev(device); in btrfs_close_one_device()
1149 if (device->bdev) { in btrfs_close_one_device()
1151 device->bdev = NULL; in btrfs_close_one_device()
1153 clear_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state); in btrfs_close_one_device()
1154 btrfs_destroy_dev_zone_info(device); in btrfs_close_one_device()
1156 device->fs_info = NULL; in btrfs_close_one_device()
1157 atomic_set(&device->dev_stats_ccnt, 0); in btrfs_close_one_device()
1158 extent_io_tree_release(&device->alloc_state); in btrfs_close_one_device()
1171 device->last_flush_error = 0; in btrfs_close_one_device()
1174 ASSERT(!test_bit(BTRFS_DEV_STATE_FLUSH_SENT, &device->dev_state)); in btrfs_close_one_device()
1175 ASSERT(!test_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state)); in btrfs_close_one_device()
1176 ASSERT(list_empty(&device->dev_alloc_list)); in btrfs_close_one_device()
1177 ASSERT(list_empty(&device->post_commit_list)); in btrfs_close_one_device()
1182 struct btrfs_device *device, *tmp; in close_fs_devices() local
1189 list_for_each_entry_safe(device, tmp, &fs_devices->devices, dev_list) in close_fs_devices()
1190 btrfs_close_one_device(device); in close_fs_devices()
1233 struct btrfs_device *device; in open_fs_devices() local
1239 list_for_each_entry_safe(device, tmp_device, &fs_devices->devices, in open_fs_devices()
1243 ret = btrfs_open_one_device(fs_devices, device, flags, holder); in open_fs_devices()
1245 (!latest_dev || device->generation > latest_dev->generation)) { in open_fs_devices()
1246 latest_dev = device; in open_fs_devices()
1249 list_del(&device->dev_list); in open_fs_devices()
1250 btrfs_free_device(device); in open_fs_devices()
1377 struct btrfs_device *device = NULL; in btrfs_scan_one_device() local
1408 device = ERR_PTR(ret); in btrfs_scan_one_device()
1414 device = ERR_CAST(disk_super); in btrfs_scan_one_device()
1418 device = device_list_add(path, disk_super, &new_device_added); in btrfs_scan_one_device()
1419 if (!IS_ERR(device) && new_device_added) in btrfs_scan_one_device()
1420 btrfs_free_stale_devices(device->devt, device); in btrfs_scan_one_device()
1427 return device; in btrfs_scan_one_device()
1434 static bool contains_pending_extent(struct btrfs_device *device, u64 *start, in contains_pending_extent() argument
1439 lockdep_assert_held(&device->fs_info->chunk_mutex); in contains_pending_extent()
1441 if (!find_first_extent_bit(&device->alloc_state, *start, in contains_pending_extent()
1455 static u64 dev_extent_search_start(struct btrfs_device *device, u64 start) in dev_extent_search_start() argument
1457 switch (device->fs_devices->chunk_alloc_policy) { in dev_extent_search_start()
1466 return ALIGN(start, device->zone_info->zone_size); in dev_extent_search_start()
1472 static bool dev_extent_hole_check_zoned(struct btrfs_device *device, in dev_extent_hole_check_zoned() argument
1476 u64 zone_size = device->zone_info->zone_size; in dev_extent_hole_check_zoned()
1484 pos = btrfs_find_allocatable_zones(device, *hole_start, in dev_extent_hole_check_zoned()
1495 ret = btrfs_ensure_empty_zones(device, pos, num_bytes); in dev_extent_hole_check_zoned()
1526 static bool dev_extent_hole_check(struct btrfs_device *device, u64 *hole_start, in dev_extent_hole_check() argument
1537 if (contains_pending_extent(device, hole_start, *hole_size)) { in dev_extent_hole_check()
1545 switch (device->fs_devices->chunk_alloc_policy) { in dev_extent_hole_check()
1550 if (dev_extent_hole_check_zoned(device, hole_start, in dev_extent_hole_check()
1597 static int find_free_dev_extent_start(struct btrfs_device *device, in find_free_dev_extent_start() argument
1601 struct btrfs_fs_info *fs_info = device->fs_info; in find_free_dev_extent_start()
1610 u64 search_end = device->total_bytes; in find_free_dev_extent_start()
1615 search_start = dev_extent_search_start(device, search_start); in find_free_dev_extent_start()
1617 WARN_ON(device->zone_info && in find_free_dev_extent_start()
1618 !IS_ALIGNED(num_bytes, device->zone_info->zone_size)); in find_free_dev_extent_start()
1629 test_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state)) { in find_free_dev_extent_start()
1638 key.objectid = device->devid; in find_free_dev_extent_start()
1660 if (key.objectid < device->devid) in find_free_dev_extent_start()
1663 if (key.objectid > device->devid) in find_free_dev_extent_start()
1674 dev_extent_hole_check(device, &search_start, &hole_size, in find_free_dev_extent_start()
1714 if (dev_extent_hole_check(device, &search_start, &hole_size, in find_free_dev_extent_start()
1741 int find_free_dev_extent(struct btrfs_device *device, u64 num_bytes, in find_free_dev_extent() argument
1745 return find_free_dev_extent_start(device, num_bytes, 0, start, len); in find_free_dev_extent()
1749 struct btrfs_device *device, in btrfs_free_dev_extent() argument
1752 struct btrfs_fs_info *fs_info = device->fs_info; in btrfs_free_dev_extent()
1765 key.objectid = device->devid; in btrfs_free_dev_extent()
1869 struct btrfs_device *device) in btrfs_add_dev_item() argument
1884 key.offset = device->devid; in btrfs_add_dev_item()
1896 btrfs_set_device_id(leaf, dev_item, device->devid); in btrfs_add_dev_item()
1898 btrfs_set_device_type(leaf, dev_item, device->type); in btrfs_add_dev_item()
1899 btrfs_set_device_io_align(leaf, dev_item, device->io_align); in btrfs_add_dev_item()
1900 btrfs_set_device_io_width(leaf, dev_item, device->io_width); in btrfs_add_dev_item()
1901 btrfs_set_device_sector_size(leaf, dev_item, device->sector_size); in btrfs_add_dev_item()
1903 btrfs_device_get_disk_total_bytes(device)); in btrfs_add_dev_item()
1905 btrfs_device_get_bytes_used(device)); in btrfs_add_dev_item()
1912 write_extent_buffer(leaf, device->uuid, ptr, BTRFS_UUID_SIZE); in btrfs_add_dev_item()
1946 struct btrfs_device *device) in btrfs_rm_dev_item() argument
1948 struct btrfs_root *root = device->fs_info->chunk_root; in btrfs_rm_dev_item()
1959 key.offset = device->devid; in btrfs_rm_dev_item()
2008 struct btrfs_fs_devices *fs_devs, struct btrfs_device *device) in btrfs_find_next_active_device() argument
2013 if (next_device != device && in btrfs_find_next_active_device()
2028 void __cold btrfs_assign_next_active_device(struct btrfs_device *device, in btrfs_assign_next_active_device() argument
2031 struct btrfs_fs_info *fs_info = device->fs_info; in btrfs_assign_next_active_device()
2035 device); in btrfs_assign_next_active_device()
2039 (fs_info->sb->s_bdev == device->bdev)) in btrfs_assign_next_active_device()
2042 if (fs_info->fs_devices->latest_dev->bdev == device->bdev) in btrfs_assign_next_active_device()
2114 struct btrfs_device *device; in btrfs_rm_device() local
2136 device = btrfs_find_device(fs_info->fs_devices, args); in btrfs_rm_device()
2137 if (!device) { in btrfs_rm_device()
2145 if (btrfs_pinned_by_swapfile(fs_info, device)) { in btrfs_rm_device()
2148 rcu_str_deref(device->name), device->devid); in btrfs_rm_device()
2152 if (test_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state)) in btrfs_rm_device()
2155 if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state) && in btrfs_rm_device()
2159 if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)) { in btrfs_rm_device()
2161 list_del_init(&device->dev_alloc_list); in btrfs_rm_device()
2162 device->fs_devices->rw_devices--; in btrfs_rm_device()
2166 ret = btrfs_shrink_device(device, 0); in btrfs_rm_device()
2176 ret = btrfs_rm_dev_item(trans, device); in btrfs_rm_device()
2181 device->devid, ret); in btrfs_rm_device()
2187 clear_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state); in btrfs_rm_device()
2188 btrfs_scrub_cancel_dev(device); in btrfs_rm_device()
2205 cur_devices = device->fs_devices; in btrfs_rm_device()
2207 list_del_rcu(&device->dev_list); in btrfs_rm_device()
2215 if (test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state)) in btrfs_rm_device()
2218 btrfs_assign_next_active_device(device, NULL); in btrfs_rm_device()
2220 if (device->bdev) { in btrfs_rm_device()
2223 btrfs_sysfs_remove_device(device); in btrfs_rm_device()
2240 if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)) { in btrfs_rm_device()
2241 btrfs_scratch_superblocks(fs_info, device->bdev, in btrfs_rm_device()
2242 device->name->str); in btrfs_rm_device()
2243 if (device->bdev) { in btrfs_rm_device()
2244 sync_blockdev(device->bdev); in btrfs_rm_device()
2245 invalidate_bdev(device->bdev); in btrfs_rm_device()
2249 *bdev = device->bdev; in btrfs_rm_device()
2250 *mode = device->mode; in btrfs_rm_device()
2252 btrfs_free_device(device); in btrfs_rm_device()
2273 if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)) { in btrfs_rm_device()
2275 list_add(&device->dev_alloc_list, in btrfs_rm_device()
2277 device->fs_devices->rw_devices++; in btrfs_rm_device()
2440 struct btrfs_device *device; in btrfs_find_device_by_devspec() local
2445 device = btrfs_find_device(fs_info->fs_devices, &args); in btrfs_find_device_by_devspec()
2446 if (!device) in btrfs_find_device_by_devspec()
2448 return device; in btrfs_find_device_by_devspec()
2454 device = btrfs_find_device(fs_info->fs_devices, &args); in btrfs_find_device_by_devspec()
2456 if (!device) in btrfs_find_device_by_devspec()
2458 return device; in btrfs_find_device_by_devspec()
2511 struct btrfs_device *device; in btrfs_setup_sprout() local
2536 list_for_each_entry(device, &seed_devices->devices, dev_list) in btrfs_setup_sprout()
2537 device->fs_devices = seed_devices; in btrfs_setup_sprout()
2566 struct btrfs_device *device; in btrfs_finish_sprout() local
2615 device = btrfs_find_device(fs_info->fs_devices, &args); in btrfs_finish_sprout()
2616 BUG_ON(!device); /* Logic error */ in btrfs_finish_sprout()
2618 if (device->fs_devices->seeding) { in btrfs_finish_sprout()
2620 device->generation); in btrfs_finish_sprout()
2637 struct btrfs_device *device; in btrfs_init_new_device() local
2672 list_for_each_entry_rcu(device, &fs_devices->devices, dev_list) { in btrfs_init_new_device()
2673 if (device->bdev == bdev) { in btrfs_init_new_device()
2681 device = btrfs_alloc_device(fs_info, NULL, NULL); in btrfs_init_new_device()
2682 if (IS_ERR(device)) { in btrfs_init_new_device()
2684 ret = PTR_ERR(device); in btrfs_init_new_device()
2693 rcu_assign_pointer(device->name, name); in btrfs_init_new_device()
2695 device->fs_info = fs_info; in btrfs_init_new_device()
2696 device->bdev = bdev; in btrfs_init_new_device()
2697 ret = lookup_bdev(device_path, &device->devt); in btrfs_init_new_device()
2701 ret = btrfs_get_dev_zone_info(device, false); in btrfs_init_new_device()
2711 set_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state); in btrfs_init_new_device()
2712 device->generation = trans->transid; in btrfs_init_new_device()
2713 device->io_width = fs_info->sectorsize; in btrfs_init_new_device()
2714 device->io_align = fs_info->sectorsize; in btrfs_init_new_device()
2715 device->sector_size = fs_info->sectorsize; in btrfs_init_new_device()
2716 device->total_bytes = in btrfs_init_new_device()
2718 device->disk_total_bytes = device->total_bytes; in btrfs_init_new_device()
2719 device->commit_total_bytes = device->total_bytes; in btrfs_init_new_device()
2720 set_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state); in btrfs_init_new_device()
2721 clear_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state); in btrfs_init_new_device()
2722 device->mode = FMODE_EXCL; in btrfs_init_new_device()
2723 device->dev_stats_valid = 1; in btrfs_init_new_device()
2724 set_blocksize(device->bdev, BTRFS_BDEV_BLOCKSIZE); in btrfs_init_new_device()
2742 device); in btrfs_init_new_device()
2745 device->fs_devices = fs_devices; in btrfs_init_new_device()
2748 list_add_rcu(&device->dev_list, &fs_devices->devices); in btrfs_init_new_device()
2749 list_add(&device->dev_alloc_list, &fs_devices->alloc_list); in btrfs_init_new_device()
2754 fs_devices->total_rw_bytes += device->total_bytes; in btrfs_init_new_device()
2756 atomic64_add(device->total_bytes, &fs_info->free_chunk_space); in btrfs_init_new_device()
2763 round_down(orig_super_total_bytes + device->total_bytes, in btrfs_init_new_device()
2779 btrfs_sysfs_add_device(device); in btrfs_init_new_device()
2793 ret = btrfs_add_dev_item(trans, device); in btrfs_init_new_device()
2845 btrfs_forget_devices(device->devt); in btrfs_init_new_device()
2853 btrfs_sysfs_remove_device(device); in btrfs_init_new_device()
2856 list_del_rcu(&device->dev_list); in btrfs_init_new_device()
2857 list_del(&device->dev_alloc_list); in btrfs_init_new_device()
2862 fs_info->fs_devices->total_rw_bytes -= device->total_bytes; in btrfs_init_new_device()
2863 atomic64_sub(device->total_bytes, &fs_info->free_chunk_space); in btrfs_init_new_device()
2876 btrfs_destroy_dev_zone_info(device); in btrfs_init_new_device()
2878 btrfs_free_device(device); in btrfs_init_new_device()
2889 struct btrfs_device *device) in btrfs_update_device() argument
2893 struct btrfs_root *root = device->fs_info->chunk_root; in btrfs_update_device()
2904 key.offset = device->devid; in btrfs_update_device()
2918 btrfs_set_device_id(leaf, dev_item, device->devid); in btrfs_update_device()
2919 btrfs_set_device_type(leaf, dev_item, device->type); in btrfs_update_device()
2920 btrfs_set_device_io_align(leaf, dev_item, device->io_align); in btrfs_update_device()
2921 btrfs_set_device_io_width(leaf, dev_item, device->io_width); in btrfs_update_device()
2922 btrfs_set_device_sector_size(leaf, dev_item, device->sector_size); in btrfs_update_device()
2924 btrfs_device_get_disk_total_bytes(device)); in btrfs_update_device()
2926 btrfs_device_get_bytes_used(device)); in btrfs_update_device()
2935 struct btrfs_device *device, u64 new_size) in btrfs_grow_device() argument
2937 struct btrfs_fs_info *fs_info = device->fs_info; in btrfs_grow_device()
2943 if (!test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)) in btrfs_grow_device()
2950 diff = round_down(new_size - device->total_bytes, fs_info->sectorsize); in btrfs_grow_device()
2952 if (new_size <= device->total_bytes || in btrfs_grow_device()
2953 test_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state)) { in btrfs_grow_device()
2960 device->fs_devices->total_rw_bytes += diff; in btrfs_grow_device()
2962 btrfs_device_set_total_bytes(device, new_size); in btrfs_grow_device()
2963 btrfs_device_set_disk_total_bytes(device, new_size); in btrfs_grow_device()
2964 btrfs_clear_space_info_full(device->fs_info); in btrfs_grow_device()
2965 if (list_empty(&device->post_commit_list)) in btrfs_grow_device()
2966 list_add_tail(&device->post_commit_list, in btrfs_grow_device()
2971 ret = btrfs_update_device(trans, device); in btrfs_grow_device()
3151 struct btrfs_device *device = map->stripes[i].dev; in btrfs_remove_chunk() local
3152 ret = btrfs_free_dev_extent(trans, device, in btrfs_remove_chunk()
3161 if (device->bytes_used > 0) { in btrfs_remove_chunk()
3163 btrfs_device_set_bytes_used(device, in btrfs_remove_chunk()
3164 device->bytes_used - dev_extent_len); in btrfs_remove_chunk()
4852 int btrfs_shrink_device(struct btrfs_device *device, u64 new_size) in btrfs_shrink_device() argument
4854 struct btrfs_fs_info *fs_info = device->fs_info; in btrfs_shrink_device()
4869 u64 old_size = btrfs_device_get_total_bytes(device); in btrfs_shrink_device()
4877 if (test_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state)) in btrfs_shrink_device()
4894 btrfs_device_set_total_bytes(device, new_size); in btrfs_shrink_device()
4895 if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)) { in btrfs_shrink_device()
4896 device->fs_devices->total_rw_bytes -= diff; in btrfs_shrink_device()
4905 if (contains_pending_extent(device, &start, diff)) { in btrfs_shrink_device()
4916 key.objectid = device->devid; in btrfs_shrink_device()
4942 if (key.objectid != device->devid) { in btrfs_shrink_device()
5004 clear_extent_bits(&device->alloc_state, new_size, (u64)-1, in btrfs_shrink_device()
5007 btrfs_device_set_disk_total_bytes(device, new_size); in btrfs_shrink_device()
5008 if (list_empty(&device->post_commit_list)) in btrfs_shrink_device()
5009 list_add_tail(&device->post_commit_list, in btrfs_shrink_device()
5019 ret = btrfs_update_device(trans, device); in btrfs_shrink_device()
5031 btrfs_device_set_total_bytes(device, old_size); in btrfs_shrink_device()
5032 if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)) in btrfs_shrink_device()
5033 device->fs_devices->total_rw_bytes += diff; in btrfs_shrink_device()
5220 struct btrfs_device *device; in gather_device_info() local
5232 list_for_each_entry(device, &fs_devices->alloc_list, dev_alloc_list) { in gather_device_info()
5233 if (!test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)) { in gather_device_info()
5240 &device->dev_state) || in gather_device_info()
5241 test_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state)) in gather_device_info()
5244 if (device->total_bytes > device->bytes_used) in gather_device_info()
5245 total_avail = device->total_bytes - device->bytes_used; in gather_device_info()
5253 ret = find_free_dev_extent(device, dev_extent_want, &dev_offset, in gather_device_info()
5265 __func__, device->devid, max_avail, in gather_device_info()
5278 devices_info[ndevs].dev = device; in gather_device_info()
5621 struct btrfs_device *device = map->stripes[i].dev; in btrfs_chunk_alloc_add_chunk_item() local
5623 ret = btrfs_update_device(trans, device); in btrfs_chunk_alloc_add_chunk_item()
5630 struct btrfs_device *device = map->stripes[i].dev; in btrfs_chunk_alloc_add_chunk_item() local
5633 btrfs_set_stack_stripe_devid(stripe, device->devid); in btrfs_chunk_alloc_add_chunk_item()
5635 memcpy(stripe->dev_uuid, device->uuid, BTRFS_UUID_SIZE); in btrfs_chunk_alloc_add_chunk_item()
6792 btrfs_log_dev_io_error(bio, bbio->device); in btrfs_simple_end_io()
6943 btrfs_bio(bio)->device = smap.dev; in btrfs_submit_bio()
6978 const struct btrfs_device *device) in dev_args_match_device() argument
6981 if (test_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state) && in dev_args_match_device()
6982 !device->bdev) in dev_args_match_device()
6987 if (device->devid != args->devid) in dev_args_match_device()
6989 if (args->uuid && memcmp(device->uuid, args->uuid, BTRFS_UUID_SIZE) != 0) in dev_args_match_device()
7004 struct btrfs_device *device; in btrfs_find_device() local
7008 list_for_each_entry(device, &fs_devices->devices, dev_list) { in btrfs_find_device()
7009 if (dev_args_match_device(args, device)) in btrfs_find_device()
7010 return device; in btrfs_find_device()
7017 list_for_each_entry(device, &seed_devs->devices, dev_list) { in btrfs_find_device()
7018 if (dev_args_match_device(args, device)) in btrfs_find_device()
7019 return device; in btrfs_find_device()
7029 struct btrfs_device *device; in add_missing_dev() local
7039 device = btrfs_alloc_device(NULL, &devid, dev_uuid); in add_missing_dev()
7041 if (IS_ERR(device)) in add_missing_dev()
7042 return device; in add_missing_dev()
7044 list_add(&device->dev_list, &fs_devices->devices); in add_missing_dev()
7045 device->fs_devices = fs_devices; in add_missing_dev()
7048 set_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state); in add_missing_dev()
7051 return device; in add_missing_dev()
7316 struct btrfs_device *device) in fill_device_from_item() argument
7320 device->devid = btrfs_device_id(leaf, dev_item); in fill_device_from_item()
7321 device->disk_total_bytes = btrfs_device_total_bytes(leaf, dev_item); in fill_device_from_item()
7322 device->total_bytes = device->disk_total_bytes; in fill_device_from_item()
7323 device->commit_total_bytes = device->disk_total_bytes; in fill_device_from_item()
7324 device->bytes_used = btrfs_device_bytes_used(leaf, dev_item); in fill_device_from_item()
7325 device->commit_bytes_used = device->bytes_used; in fill_device_from_item()
7326 device->type = btrfs_device_type(leaf, dev_item); in fill_device_from_item()
7327 device->io_align = btrfs_device_io_align(leaf, dev_item); in fill_device_from_item()
7328 device->io_width = btrfs_device_io_width(leaf, dev_item); in fill_device_from_item()
7329 device->sector_size = btrfs_device_sector_size(leaf, dev_item); in fill_device_from_item()
7330 WARN_ON(device->devid == BTRFS_DEV_REPLACE_DEVID); in fill_device_from_item()
7331 clear_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state); in fill_device_from_item()
7334 read_extent_buffer(leaf, device->uuid, ptr, BTRFS_UUID_SIZE); in fill_device_from_item()
7397 struct btrfs_device *device; in read_one_dev() local
7418 device = btrfs_find_device(fs_info->fs_devices, &args); in read_one_dev()
7419 if (!device) { in read_one_dev()
7426 device = add_missing_dev(fs_devices, devid, dev_uuid); in read_one_dev()
7427 if (IS_ERR(device)) { in read_one_dev()
7430 devid, PTR_ERR(device)); in read_one_dev()
7431 return PTR_ERR(device); in read_one_dev()
7435 if (!device->bdev) { in read_one_dev()
7445 if (!device->bdev && in read_one_dev()
7446 !test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state)) { in read_one_dev()
7453 device->fs_devices->missing_devices++; in read_one_dev()
7454 set_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state); in read_one_dev()
7458 if (device->fs_devices != fs_devices) { in read_one_dev()
7460 &device->dev_state)); in read_one_dev()
7462 list_move(&device->dev_list, &fs_devices->devices); in read_one_dev()
7463 device->fs_devices->num_devices--; in read_one_dev()
7466 device->fs_devices->missing_devices--; in read_one_dev()
7469 device->fs_devices = fs_devices; in read_one_dev()
7473 if (device->fs_devices != fs_info->fs_devices) { in read_one_dev()
7474 BUG_ON(test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)); in read_one_dev()
7475 if (device->generation != in read_one_dev()
7480 fill_device_from_item(leaf, dev_item, device); in read_one_dev()
7481 if (device->bdev) { in read_one_dev()
7482 u64 max_total_bytes = bdev_nr_bytes(device->bdev); in read_one_dev()
7484 if (device->total_bytes > max_total_bytes) { in read_one_dev()
7487 max_total_bytes, device->total_bytes); in read_one_dev()
7491 set_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state); in read_one_dev()
7492 if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state) && in read_one_dev()
7493 !test_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state)) { in read_one_dev()
7494 device->fs_devices->total_rw_bytes += device->total_bytes; in read_one_dev()
7495 atomic64_add(device->total_bytes - device->bytes_used, in read_one_dev()
7810 struct btrfs_device *device; in btrfs_init_devices_late() local
7816 list_for_each_entry(device, &fs_devices->devices, dev_list) in btrfs_init_devices_late()
7817 device->fs_info = fs_info; in btrfs_init_devices_late()
7820 list_for_each_entry(device, &seed_devs->devices, dev_list) { in btrfs_init_devices_late()
7821 device->fs_info = fs_info; in btrfs_init_devices_late()
7822 ret = btrfs_get_dev_zone_info(device, false); in btrfs_init_devices_late()
7857 static int btrfs_device_init_dev_stats(struct btrfs_device *device, in btrfs_device_init_dev_stats() argument
7866 if (!device->fs_info->dev_root) in btrfs_device_init_dev_stats()
7871 key.offset = device->devid; in btrfs_device_init_dev_stats()
7872 ret = btrfs_search_slot(NULL, device->fs_info->dev_root, &key, path, 0, 0); in btrfs_device_init_dev_stats()
7875 btrfs_dev_stat_set(device, i, 0); in btrfs_device_init_dev_stats()
7876 device->dev_stats_valid = 1; in btrfs_device_init_dev_stats()
7888 btrfs_dev_stat_set(device, i, in btrfs_device_init_dev_stats()
7891 btrfs_dev_stat_set(device, i, 0); in btrfs_device_init_dev_stats()
7894 device->dev_stats_valid = 1; in btrfs_device_init_dev_stats()
7895 btrfs_dev_stat_print_on_load(device); in btrfs_device_init_dev_stats()
7904 struct btrfs_device *device; in btrfs_init_dev_stats() local
7913 list_for_each_entry(device, &fs_devices->devices, dev_list) { in btrfs_init_dev_stats()
7914 ret = btrfs_device_init_dev_stats(device, path); in btrfs_init_dev_stats()
7919 list_for_each_entry(device, &seed_devs->devices, dev_list) { in btrfs_init_dev_stats()
7920 ret = btrfs_device_init_dev_stats(device, path); in btrfs_init_dev_stats()
7933 struct btrfs_device *device) in update_dev_stat_item() argument
7946 key.offset = device->devid; in update_dev_stat_item()
7955 ret, rcu_str_deref(device->name)); in update_dev_stat_item()
7966 rcu_str_deref(device->name), ret); in update_dev_stat_item()
7980 rcu_str_deref(device->name), ret); in update_dev_stat_item()
7989 btrfs_dev_stat_read(device, i)); in update_dev_stat_item()
8004 struct btrfs_device *device; in btrfs_run_dev_stats() local
8009 list_for_each_entry(device, &fs_devices->devices, dev_list) { in btrfs_run_dev_stats()
8010 stats_cnt = atomic_read(&device->dev_stats_ccnt); in btrfs_run_dev_stats()
8011 if (!device->dev_stats_valid || stats_cnt == 0) in btrfs_run_dev_stats()
8028 ret = update_dev_stat_item(trans, device); in btrfs_run_dev_stats()
8030 atomic_sub(stats_cnt, &device->dev_stats_ccnt); in btrfs_run_dev_stats()