Lines Matching refs:fs_devices
380 static void free_fs_devices(struct btrfs_fs_devices *fs_devices) in free_fs_devices() argument
383 WARN_ON(fs_devices->opened); in free_fs_devices()
384 while (!list_empty(&fs_devices->devices)) { in free_fs_devices()
385 device = list_entry(fs_devices->devices.next, in free_fs_devices()
390 kfree(fs_devices); in free_fs_devices()
395 struct btrfs_fs_devices *fs_devices; in btrfs_cleanup_fs_uuids() local
398 fs_devices = list_entry(fs_uuids.next, in btrfs_cleanup_fs_uuids()
400 list_del(&fs_devices->fs_list); in btrfs_cleanup_fs_uuids()
401 free_fs_devices(fs_devices); in btrfs_cleanup_fs_uuids()
446 struct btrfs_fs_devices *fs_devices; in find_fsid() local
451 list_for_each_entry(fs_devices, &fs_uuids, fs_list) { in find_fsid()
453 if (memcmp(fsid, fs_devices->fsid, BTRFS_FSID_SIZE) == 0 in find_fsid()
454 && memcmp(metadata_fsid, fs_devices->metadata_uuid, in find_fsid()
456 return fs_devices; in find_fsid()
458 if (memcmp(fsid, fs_devices->fsid, BTRFS_FSID_SIZE) == 0) in find_fsid()
459 return fs_devices; in find_fsid()
469 struct btrfs_fs_devices *fs_devices; in find_fsid_with_metadata_uuid() local
477 list_for_each_entry(fs_devices, &fs_uuids, fs_list) { in find_fsid_with_metadata_uuid()
478 if (fs_devices->fsid_change && in find_fsid_with_metadata_uuid()
479 memcmp(disk_super->metadata_uuid, fs_devices->fsid, in find_fsid_with_metadata_uuid()
481 memcmp(fs_devices->fsid, fs_devices->metadata_uuid, in find_fsid_with_metadata_uuid()
483 return fs_devices; in find_fsid_with_metadata_uuid()
492 list_for_each_entry(fs_devices, &fs_uuids, fs_list) { in find_fsid_with_metadata_uuid()
493 if (fs_devices->fsid_change && in find_fsid_with_metadata_uuid()
494 memcmp(fs_devices->metadata_uuid, in find_fsid_with_metadata_uuid()
495 fs_devices->fsid, BTRFS_FSID_SIZE) != 0 && in find_fsid_with_metadata_uuid()
496 memcmp(disk_super->metadata_uuid, fs_devices->metadata_uuid, in find_fsid_with_metadata_uuid()
498 return fs_devices; in find_fsid_with_metadata_uuid()
567 struct btrfs_fs_devices *fs_devices, *tmp_fs_devices; in btrfs_free_stale_devices() local
574 list_for_each_entry_safe(fs_devices, tmp_fs_devices, &fs_uuids, fs_list) { in btrfs_free_stale_devices()
576 mutex_lock(&fs_devices->device_list_mutex); in btrfs_free_stale_devices()
578 &fs_devices->devices, dev_list) { in btrfs_free_stale_devices()
585 if (fs_devices->opened) { in btrfs_free_stale_devices()
593 fs_devices->num_devices--; in btrfs_free_stale_devices()
599 mutex_unlock(&fs_devices->device_list_mutex); in btrfs_free_stale_devices()
601 if (fs_devices->num_devices == 0) { in btrfs_free_stale_devices()
602 btrfs_sysfs_remove_fsid(fs_devices); in btrfs_free_stale_devices()
603 list_del(&fs_devices->fs_list); in btrfs_free_stale_devices()
604 free_fs_devices(fs_devices); in btrfs_free_stale_devices()
616 static int btrfs_open_one_device(struct btrfs_fs_devices *fs_devices, in btrfs_open_one_device() argument
654 fs_devices->seeding = true; in btrfs_open_one_device()
664 fs_devices->rotating = true; in btrfs_open_one_device()
670 fs_devices->open_devices++; in btrfs_open_one_device()
673 fs_devices->rw_devices++; in btrfs_open_one_device()
674 list_add_tail(&device->dev_alloc_list, &fs_devices->alloc_list); in btrfs_open_one_device()
696 struct btrfs_fs_devices *fs_devices; in find_fsid_inprogress() local
698 list_for_each_entry(fs_devices, &fs_uuids, fs_list) { in find_fsid_inprogress()
699 if (memcmp(fs_devices->metadata_uuid, fs_devices->fsid, in find_fsid_inprogress()
701 memcmp(fs_devices->metadata_uuid, disk_super->fsid, in find_fsid_inprogress()
702 BTRFS_FSID_SIZE) == 0 && !fs_devices->fsid_change) { in find_fsid_inprogress()
703 return fs_devices; in find_fsid_inprogress()
714 struct btrfs_fs_devices *fs_devices; in find_fsid_changed() local
725 list_for_each_entry(fs_devices, &fs_uuids, fs_list) { in find_fsid_changed()
727 if (memcmp(fs_devices->metadata_uuid, fs_devices->fsid, in find_fsid_changed()
729 memcmp(fs_devices->metadata_uuid, disk_super->metadata_uuid, in find_fsid_changed()
731 memcmp(fs_devices->fsid, disk_super->fsid, in find_fsid_changed()
733 return fs_devices; in find_fsid_changed()
736 if (memcmp(fs_devices->metadata_uuid, fs_devices->fsid, in find_fsid_changed()
738 memcmp(fs_devices->fsid, disk_super->metadata_uuid, in find_fsid_changed()
740 return fs_devices; in find_fsid_changed()
749 struct btrfs_fs_devices *fs_devices; in find_fsid_reverted_metadata() local
760 list_for_each_entry(fs_devices, &fs_uuids, fs_list) { in find_fsid_reverted_metadata()
761 if (memcmp(fs_devices->fsid, fs_devices->metadata_uuid, in find_fsid_reverted_metadata()
763 memcmp(fs_devices->metadata_uuid, disk_super->fsid, in find_fsid_reverted_metadata()
765 fs_devices->fsid_change) in find_fsid_reverted_metadata()
766 return fs_devices; in find_fsid_reverted_metadata()
783 struct btrfs_fs_devices *fs_devices = NULL; in device_list_add() local
794 fs_devices = find_fsid_inprogress(disk_super); in device_list_add()
796 fs_devices = find_fsid_changed(disk_super); in device_list_add()
798 fs_devices = find_fsid_with_metadata_uuid(disk_super); in device_list_add()
800 fs_devices = find_fsid_reverted_metadata(disk_super); in device_list_add()
801 if (!fs_devices) in device_list_add()
802 fs_devices = find_fsid(disk_super->fsid, NULL); in device_list_add()
806 if (!fs_devices) { in device_list_add()
808 fs_devices = alloc_fs_devices(disk_super->fsid, in device_list_add()
811 fs_devices = alloc_fs_devices(disk_super->fsid, NULL); in device_list_add()
813 if (IS_ERR(fs_devices)) in device_list_add()
814 return ERR_CAST(fs_devices); in device_list_add()
816 fs_devices->fsid_change = fsid_change_in_progress; in device_list_add()
818 mutex_lock(&fs_devices->device_list_mutex); in device_list_add()
819 list_add(&fs_devices->fs_list, &fs_uuids); in device_list_add()
823 mutex_lock(&fs_devices->device_list_mutex); in device_list_add()
824 device = btrfs_find_device(fs_devices, devid, in device_list_add()
832 if (fs_devices->fsid_change && in device_list_add()
833 found_transid > fs_devices->latest_generation) { in device_list_add()
834 memcpy(fs_devices->fsid, disk_super->fsid, in device_list_add()
838 memcpy(fs_devices->metadata_uuid, in device_list_add()
842 memcpy(fs_devices->metadata_uuid, in device_list_add()
845 fs_devices->fsid_change = false; in device_list_add()
850 if (fs_devices->opened) { in device_list_add()
851 mutex_unlock(&fs_devices->device_list_mutex); in device_list_add()
858 mutex_unlock(&fs_devices->device_list_mutex); in device_list_add()
866 mutex_unlock(&fs_devices->device_list_mutex); in device_list_add()
871 list_add_rcu(&device->dev_list, &fs_devices->devices); in device_list_add()
872 fs_devices->num_devices++; in device_list_add()
874 device->fs_devices = fs_devices; in device_list_add()
915 if (!fs_devices->opened && found_transid < device->generation) { in device_list_add()
923 mutex_unlock(&fs_devices->device_list_mutex); in device_list_add()
936 mutex_unlock(&fs_devices->device_list_mutex); in device_list_add()
942 mutex_unlock(&fs_devices->device_list_mutex); in device_list_add()
966 mutex_unlock(&fs_devices->device_list_mutex); in device_list_add()
972 fs_devices->missing_devices--; in device_list_add()
983 if (!fs_devices->opened) { in device_list_add()
985 fs_devices->latest_generation = max_t(u64, found_transid, in device_list_add()
986 fs_devices->latest_generation); in device_list_add()
989 fs_devices->total_devices = btrfs_super_num_devices(disk_super); in device_list_add()
991 mutex_unlock(&fs_devices->device_list_mutex); in device_list_add()
997 struct btrfs_fs_devices *fs_devices; in clone_fs_devices() local
1002 fs_devices = alloc_fs_devices(orig->fsid, NULL); in clone_fs_devices()
1003 if (IS_ERR(fs_devices)) in clone_fs_devices()
1004 return fs_devices; in clone_fs_devices()
1007 fs_devices->total_devices = orig->total_devices; in clone_fs_devices()
1034 list_add(&device->dev_list, &fs_devices->devices); in clone_fs_devices()
1035 device->fs_devices = fs_devices; in clone_fs_devices()
1036 fs_devices->num_devices++; in clone_fs_devices()
1039 return fs_devices; in clone_fs_devices()
1042 free_fs_devices(fs_devices); in clone_fs_devices()
1046 static void __btrfs_free_extra_devids(struct btrfs_fs_devices *fs_devices, in __btrfs_free_extra_devids() argument
1052 list_for_each_entry_safe(device, next, &fs_devices->devices, dev_list) { in __btrfs_free_extra_devids()
1075 fs_devices->open_devices--; in __btrfs_free_extra_devids()
1082 fs_devices->num_devices--; in __btrfs_free_extra_devids()
1092 void btrfs_free_extra_devids(struct btrfs_fs_devices *fs_devices, int step) in btrfs_free_extra_devids() argument
1098 __btrfs_free_extra_devids(fs_devices, step, &latest_dev); in btrfs_free_extra_devids()
1100 list_for_each_entry(seed_dev, &fs_devices->seed_list, seed_list) in btrfs_free_extra_devids()
1103 fs_devices->latest_bdev = latest_dev->bdev; in btrfs_free_extra_devids()
1123 struct btrfs_fs_devices *fs_devices = device->fs_devices; in btrfs_close_one_device() local
1128 fs_devices->rw_devices--; in btrfs_close_one_device()
1132 fs_devices->missing_devices--; in btrfs_close_one_device()
1136 fs_devices->open_devices--; in btrfs_close_one_device()
1153 static void close_fs_devices(struct btrfs_fs_devices *fs_devices) in close_fs_devices() argument
1159 if (--fs_devices->opened > 0) in close_fs_devices()
1162 list_for_each_entry_safe(device, tmp, &fs_devices->devices, dev_list) in close_fs_devices()
1165 WARN_ON(fs_devices->open_devices); in close_fs_devices()
1166 WARN_ON(fs_devices->rw_devices); in close_fs_devices()
1167 fs_devices->opened = 0; in close_fs_devices()
1168 fs_devices->seeding = false; in close_fs_devices()
1169 fs_devices->fs_info = NULL; in close_fs_devices()
1172 void btrfs_close_devices(struct btrfs_fs_devices *fs_devices) in btrfs_close_devices() argument
1178 close_fs_devices(fs_devices); in btrfs_close_devices()
1179 if (!fs_devices->opened) in btrfs_close_devices()
1180 list_splice_init(&fs_devices->seed_list, &list); in btrfs_close_devices()
1182 list_for_each_entry_safe(fs_devices, tmp, &list, seed_list) { in btrfs_close_devices()
1183 close_fs_devices(fs_devices); in btrfs_close_devices()
1184 list_del(&fs_devices->seed_list); in btrfs_close_devices()
1185 free_fs_devices(fs_devices); in btrfs_close_devices()
1190 static int open_fs_devices(struct btrfs_fs_devices *fs_devices, in open_fs_devices() argument
1199 list_for_each_entry_safe(device, tmp_device, &fs_devices->devices, in open_fs_devices()
1203 ret = btrfs_open_one_device(fs_devices, device, flags, holder); in open_fs_devices()
1208 fs_devices->num_devices--; in open_fs_devices()
1213 if (fs_devices->open_devices == 0) in open_fs_devices()
1216 fs_devices->opened = 1; in open_fs_devices()
1217 fs_devices->latest_bdev = latest_dev->bdev; in open_fs_devices()
1218 fs_devices->total_rw_bytes = 0; in open_fs_devices()
1219 fs_devices->chunk_alloc_policy = BTRFS_CHUNK_ALLOC_REGULAR; in open_fs_devices()
1238 int btrfs_open_devices(struct btrfs_fs_devices *fs_devices, in btrfs_open_devices() argument
1252 if (fs_devices->opened) { in btrfs_open_devices()
1253 fs_devices->opened++; in btrfs_open_devices()
1256 list_sort(NULL, &fs_devices->devices, devid_cmp); in btrfs_open_devices()
1257 ret = open_fs_devices(fs_devices, flags, holder); in btrfs_open_devices()
1401 switch (device->fs_devices->chunk_alloc_policy) { in dev_extent_search_start()
1442 switch (device->fs_devices->chunk_alloc_policy) { in dev_extent_hole_check()
1840 write_extent_buffer(leaf, trans->fs_info->fs_devices->metadata_uuid, in btrfs_add_dev_item()
1970 next_device = btrfs_find_next_active_device(fs_info->fs_devices, in btrfs_assign_next_active_device()
1978 if (fs_info->fs_devices->latest_bdev == device->bdev) in btrfs_assign_next_active_device()
1979 fs_info->fs_devices->latest_bdev = next_device->bdev; in btrfs_assign_next_active_device()
1988 u64 num_devices = fs_info->fs_devices->num_devices; in btrfs_num_devices()
2045 struct btrfs_fs_devices *fs_devices = fs_info->fs_devices; in btrfs_rm_device() local
2082 fs_info->fs_devices->rw_devices == 1) { in btrfs_rm_device()
2090 device->fs_devices->rw_devices--; in btrfs_rm_device()
2129 cur_devices = device->fs_devices; in btrfs_rm_device()
2130 mutex_lock(&fs_devices->device_list_mutex); in btrfs_rm_device()
2136 if (cur_devices != fs_devices) in btrfs_rm_device()
2137 fs_devices->total_devices--; in btrfs_rm_device()
2152 mutex_unlock(&fs_devices->device_list_mutex); in btrfs_rm_device()
2182 &fs_devices->alloc_list); in btrfs_rm_device()
2183 device->fs_devices->rw_devices++; in btrfs_rm_device()
2191 struct btrfs_fs_devices *fs_devices; in btrfs_rm_dev_replace_remove_srcdev() local
2193 lockdep_assert_held(&srcdev->fs_info->fs_devices->device_list_mutex); in btrfs_rm_dev_replace_remove_srcdev()
2201 fs_devices = srcdev->fs_devices; in btrfs_rm_dev_replace_remove_srcdev()
2205 fs_devices->num_devices--; in btrfs_rm_dev_replace_remove_srcdev()
2207 fs_devices->missing_devices--; in btrfs_rm_dev_replace_remove_srcdev()
2210 fs_devices->rw_devices--; in btrfs_rm_dev_replace_remove_srcdev()
2213 fs_devices->open_devices--; in btrfs_rm_dev_replace_remove_srcdev()
2218 struct btrfs_fs_devices *fs_devices = srcdev->fs_devices; in btrfs_rm_dev_replace_free_srcdev() local
2227 if (!fs_devices->num_devices) { in btrfs_rm_dev_replace_free_srcdev()
2234 ASSERT(fs_devices->seeding); in btrfs_rm_dev_replace_free_srcdev()
2236 list_del_init(&fs_devices->seed_list); in btrfs_rm_dev_replace_free_srcdev()
2237 close_fs_devices(fs_devices); in btrfs_rm_dev_replace_free_srcdev()
2238 free_fs_devices(fs_devices); in btrfs_rm_dev_replace_free_srcdev()
2245 struct btrfs_fs_devices *fs_devices = tgtdev->fs_info->fs_devices; in btrfs_destroy_dev_replace_tgtdev() local
2247 mutex_lock(&fs_devices->device_list_mutex); in btrfs_destroy_dev_replace_tgtdev()
2252 fs_devices->open_devices--; in btrfs_destroy_dev_replace_tgtdev()
2254 fs_devices->num_devices--; in btrfs_destroy_dev_replace_tgtdev()
2260 mutex_unlock(&fs_devices->device_list_mutex); in btrfs_destroy_dev_replace_tgtdev()
2295 device = btrfs_find_device(fs_info->fs_devices, devid, dev_uuid, in btrfs_find_device_by_path()
2298 device = btrfs_find_device(fs_info->fs_devices, devid, dev_uuid, in btrfs_find_device_by_path()
2318 device = btrfs_find_device(fs_info->fs_devices, devid, NULL, in btrfs_find_device_by_devspec()
2330 list_for_each_entry(device, &fs_info->fs_devices->devices, in btrfs_find_device_by_devspec()
2347 struct btrfs_fs_devices *fs_devices = fs_info->fs_devices; in btrfs_prepare_sprout() local
2355 if (!fs_devices->seeding) in btrfs_prepare_sprout()
2372 old_devices = clone_fs_devices(fs_devices); in btrfs_prepare_sprout()
2380 memcpy(seed_devices, fs_devices, sizeof(*seed_devices)); in btrfs_prepare_sprout()
2386 mutex_lock(&fs_devices->device_list_mutex); in btrfs_prepare_sprout()
2387 list_splice_init_rcu(&fs_devices->devices, &seed_devices->devices, in btrfs_prepare_sprout()
2390 device->fs_devices = seed_devices; in btrfs_prepare_sprout()
2392 fs_devices->seeding = false; in btrfs_prepare_sprout()
2393 fs_devices->num_devices = 0; in btrfs_prepare_sprout()
2394 fs_devices->open_devices = 0; in btrfs_prepare_sprout()
2395 fs_devices->missing_devices = 0; in btrfs_prepare_sprout()
2396 fs_devices->rotating = false; in btrfs_prepare_sprout()
2397 list_add(&seed_devices->seed_list, &fs_devices->seed_list); in btrfs_prepare_sprout()
2399 generate_random_uuid(fs_devices->fsid); in btrfs_prepare_sprout()
2400 memcpy(fs_devices->metadata_uuid, fs_devices->fsid, BTRFS_FSID_SIZE); in btrfs_prepare_sprout()
2401 memcpy(disk_super->fsid, fs_devices->fsid, BTRFS_FSID_SIZE); in btrfs_prepare_sprout()
2402 mutex_unlock(&fs_devices->device_list_mutex); in btrfs_prepare_sprout()
2467 device = btrfs_find_device(fs_info->fs_devices, devid, dev_uuid, in btrfs_finish_sprout()
2471 if (device->fs_devices->seeding) { in btrfs_finish_sprout()
2495 struct btrfs_fs_devices *fs_devices = fs_info->fs_devices; in btrfs_init_new_device() local
2502 if (sb_rdonly(sb) && !fs_devices->seeding) in btrfs_init_new_device()
2510 if (fs_devices->seeding) { in btrfs_init_new_device()
2520 list_for_each_entry_rcu(device, &fs_devices->devices, dev_list) { in btrfs_init_new_device()
2576 device->fs_devices = fs_devices; in btrfs_init_new_device()
2578 mutex_lock(&fs_devices->device_list_mutex); in btrfs_init_new_device()
2580 list_add_rcu(&device->dev_list, &fs_devices->devices); in btrfs_init_new_device()
2581 list_add(&device->dev_alloc_list, &fs_devices->alloc_list); in btrfs_init_new_device()
2582 fs_devices->num_devices++; in btrfs_init_new_device()
2583 fs_devices->open_devices++; in btrfs_init_new_device()
2584 fs_devices->rw_devices++; in btrfs_init_new_device()
2585 fs_devices->total_devices++; in btrfs_init_new_device()
2586 fs_devices->total_rw_bytes += device->total_bytes; in btrfs_init_new_device()
2591 fs_devices->rotating = true; in btrfs_init_new_device()
2613 mutex_unlock(&fs_devices->device_list_mutex); in btrfs_init_new_device()
2642 btrfs_sysfs_update_sprout_fsid(fs_devices); in btrfs_init_new_device()
2686 mutex_lock(&fs_info->fs_devices->device_list_mutex); in btrfs_init_new_device()
2690 fs_info->fs_devices->num_devices--; in btrfs_init_new_device()
2691 fs_info->fs_devices->open_devices--; in btrfs_init_new_device()
2692 fs_info->fs_devices->rw_devices--; in btrfs_init_new_device()
2693 fs_info->fs_devices->total_devices--; in btrfs_init_new_device()
2694 fs_info->fs_devices->total_rw_bytes -= device->total_bytes; in btrfs_init_new_device()
2701 mutex_unlock(&fs_info->fs_devices->device_list_mutex); in btrfs_init_new_device()
2789 device->fs_devices->total_rw_bytes += diff; in btrfs_grow_device()
2927 struct btrfs_fs_devices *fs_devices = fs_info->fs_devices; in btrfs_remove_chunk() local
2949 mutex_lock(&fs_devices->device_list_mutex); in btrfs_remove_chunk()
2956 mutex_unlock(&fs_devices->device_list_mutex); in btrfs_remove_chunk()
2972 mutex_unlock(&fs_devices->device_list_mutex); in btrfs_remove_chunk()
2977 mutex_unlock(&fs_devices->device_list_mutex); in btrfs_remove_chunk()
4040 num_devices = fs_info->fs_devices->rw_devices; in btrfs_balance()
4607 device->fs_devices->total_rw_bytes -= diff; in btrfs_shrink_device()
4743 device->fs_devices->total_rw_bytes += diff; in btrfs_shrink_device()
4846 struct btrfs_fs_devices *fs_devices, in init_alloc_chunk_ctl_policy_regular() argument
4856 if (fs_devices->total_rw_bytes > 50ULL * SZ_1G) in init_alloc_chunk_ctl_policy_regular()
4871 ctl->max_chunk_size = min(div_factor(fs_devices->total_rw_bytes, 1), in init_alloc_chunk_ctl_policy_regular()
4876 static void init_alloc_chunk_ctl(struct btrfs_fs_devices *fs_devices, in init_alloc_chunk_ctl() argument
4885 ctl->devs_max = BTRFS_MAX_DEVS(fs_devices->fs_info); in init_alloc_chunk_ctl()
4892 switch (fs_devices->chunk_alloc_policy) { in init_alloc_chunk_ctl()
4894 init_alloc_chunk_ctl_policy_regular(fs_devices, ctl); in init_alloc_chunk_ctl()
4901 static int gather_device_info(struct btrfs_fs_devices *fs_devices, in gather_device_info() argument
4905 struct btrfs_fs_info *info = fs_devices->fs_info; in gather_device_info()
4918 list_for_each_entry(device, &fs_devices->alloc_list, dev_alloc_list) { in gather_device_info()
4956 if (ndevs == fs_devices->rw_devices) { in gather_device_info()
4958 __func__, fs_devices->rw_devices); in gather_device_info()
5022 static int decide_stripe_size(struct btrfs_fs_devices *fs_devices, in decide_stripe_size() argument
5026 struct btrfs_fs_info *info = fs_devices->fs_info; in decide_stripe_size()
5046 switch (fs_devices->chunk_alloc_policy) { in decide_stripe_size()
5151 struct btrfs_fs_devices *fs_devices = info->fs_devices; in btrfs_alloc_chunk() local
5163 if (list_empty(&fs_devices->alloc_list)) { in btrfs_alloc_chunk()
5177 init_alloc_chunk_ctl(fs_devices, &ctl); in btrfs_alloc_chunk()
5179 devices_info = kcalloc(fs_devices->rw_devices, sizeof(*devices_info), in btrfs_alloc_chunk()
5184 ret = gather_device_info(fs_devices, &ctl, devices_info); in btrfs_alloc_chunk()
5188 ret = decide_stripe_size(fs_devices, &ctl, devices_info); in btrfs_alloc_chunk()
5245 mutex_lock(&fs_info->fs_devices->device_list_mutex); in btrfs_finish_chunk_alloc()
5259 mutex_unlock(&fs_info->fs_devices->device_list_mutex); in btrfs_finish_chunk_alloc()
5273 mutex_unlock(&fs_info->fs_devices->device_list_mutex); in btrfs_finish_chunk_alloc()
6449 struct btrfs_device *btrfs_find_device(struct btrfs_fs_devices *fs_devices, in btrfs_find_device() argument
6456 if (!fsid || !memcmp(fs_devices->metadata_uuid, fsid, BTRFS_FSID_SIZE)) { in btrfs_find_device()
6457 list_for_each_entry(device, &fs_devices->devices, dev_list) { in btrfs_find_device()
6465 list_for_each_entry(seed_devs, &fs_devices->seed_list, seed_list) { in btrfs_find_device()
6481 static struct btrfs_device *add_missing_dev(struct btrfs_fs_devices *fs_devices, in add_missing_dev() argument
6499 list_add(&device->dev_list, &fs_devices->devices); in add_missing_dev()
6500 device->fs_devices = fs_devices; in add_missing_dev()
6501 fs_devices->num_devices++; in add_missing_dev()
6504 fs_devices->missing_devices++; in add_missing_dev()
6657 map->stripes[i].dev = btrfs_find_device(fs_info->fs_devices, in read_one_chunk()
6667 add_missing_dev(fs_info->fs_devices, devid, in read_one_chunk()
6722 struct btrfs_fs_devices *fs_devices; in open_seed_devices() local
6729 list_for_each_entry(fs_devices, &fs_info->fs_devices->seed_list, seed_list) in open_seed_devices()
6730 if (!memcmp(fs_devices->fsid, fsid, BTRFS_FSID_SIZE)) in open_seed_devices()
6731 return fs_devices; in open_seed_devices()
6734 fs_devices = find_fsid(fsid, NULL); in open_seed_devices()
6735 if (!fs_devices) { in open_seed_devices()
6739 fs_devices = alloc_fs_devices(fsid, NULL); in open_seed_devices()
6740 if (IS_ERR(fs_devices)) in open_seed_devices()
6741 return fs_devices; in open_seed_devices()
6743 fs_devices->seeding = true; in open_seed_devices()
6744 fs_devices->opened = 1; in open_seed_devices()
6745 return fs_devices; in open_seed_devices()
6752 fs_devices = clone_fs_devices(fs_devices); in open_seed_devices()
6753 if (IS_ERR(fs_devices)) in open_seed_devices()
6754 return fs_devices; in open_seed_devices()
6756 ret = open_fs_devices(fs_devices, FMODE_READ, fs_info->bdev_holder); in open_seed_devices()
6758 free_fs_devices(fs_devices); in open_seed_devices()
6762 if (!fs_devices->seeding) { in open_seed_devices()
6763 close_fs_devices(fs_devices); in open_seed_devices()
6764 free_fs_devices(fs_devices); in open_seed_devices()
6768 list_add(&fs_devices->seed_list, &fs_info->fs_devices->seed_list); in open_seed_devices()
6770 return fs_devices; in open_seed_devices()
6777 struct btrfs_fs_devices *fs_devices = fs_info->fs_devices; in read_one_dev() local
6790 if (memcmp(fs_uuid, fs_devices->metadata_uuid, BTRFS_FSID_SIZE)) { in read_one_dev()
6791 fs_devices = open_seed_devices(fs_info, fs_uuid); in read_one_dev()
6792 if (IS_ERR(fs_devices)) in read_one_dev()
6793 return PTR_ERR(fs_devices); in read_one_dev()
6796 device = btrfs_find_device(fs_info->fs_devices, devid, dev_uuid, in read_one_dev()
6805 device = add_missing_dev(fs_devices, devid, dev_uuid); in read_one_dev()
6832 device->fs_devices->missing_devices++; in read_one_dev()
6837 if (device->fs_devices != fs_devices) { in read_one_dev()
6841 list_move(&device->dev_list, &fs_devices->devices); in read_one_dev()
6842 device->fs_devices->num_devices--; in read_one_dev()
6843 fs_devices->num_devices++; in read_one_dev()
6845 device->fs_devices->missing_devices--; in read_one_dev()
6846 fs_devices->missing_devices++; in read_one_dev()
6848 device->fs_devices = fs_devices; in read_one_dev()
6852 if (device->fs_devices != fs_info->fs_devices) { in read_one_dev()
6863 device->fs_devices->total_rw_bytes += device->total_bytes; in read_one_dev()
7098 fs_info->fs_devices->total_rw_bytes = 0; in btrfs_read_chunk_tree()
7161 if (total_dev != fs_info->fs_devices->total_devices) { in btrfs_read_chunk_tree()
7170 fs_info->fs_devices->total_rw_bytes) { in btrfs_read_chunk_tree()
7174 fs_info->fs_devices->total_rw_bytes); in btrfs_read_chunk_tree()
7188 struct btrfs_fs_devices *fs_devices = fs_info->fs_devices, *seed_devs; in btrfs_init_devices_late() local
7191 fs_devices->fs_info = fs_info; in btrfs_init_devices_late()
7193 mutex_lock(&fs_devices->device_list_mutex); in btrfs_init_devices_late()
7194 list_for_each_entry(device, &fs_devices->devices, dev_list) in btrfs_init_devices_late()
7197 list_for_each_entry(seed_devs, &fs_devices->seed_list, seed_list) { in btrfs_init_devices_late()
7203 mutex_unlock(&fs_devices->device_list_mutex); in btrfs_init_devices_late()
7272 struct btrfs_fs_devices *fs_devices = fs_info->fs_devices, *seed_devs; in btrfs_init_dev_stats() local
7281 mutex_lock(&fs_devices->device_list_mutex); in btrfs_init_dev_stats()
7282 list_for_each_entry(device, &fs_devices->devices, dev_list) { in btrfs_init_dev_stats()
7287 list_for_each_entry(seed_devs, &fs_devices->seed_list, seed_list) { in btrfs_init_dev_stats()
7295 mutex_unlock(&fs_devices->device_list_mutex); in btrfs_init_dev_stats()
7372 struct btrfs_fs_devices *fs_devices = fs_info->fs_devices; in btrfs_run_dev_stats() local
7377 mutex_lock(&fs_devices->device_list_mutex); in btrfs_run_dev_stats()
7378 list_for_each_entry(device, &fs_devices->devices, dev_list) { in btrfs_run_dev_stats()
7401 mutex_unlock(&fs_devices->device_list_mutex); in btrfs_run_dev_stats()
7450 struct btrfs_fs_devices *fs_devices = fs_info->fs_devices; in btrfs_get_dev_stats() local
7453 mutex_lock(&fs_devices->device_list_mutex); in btrfs_get_dev_stats()
7454 dev = btrfs_find_device(fs_info->fs_devices, stats->devid, NULL, NULL, in btrfs_get_dev_stats()
7456 mutex_unlock(&fs_devices->device_list_mutex); in btrfs_get_dev_stats()
7586 dev = btrfs_find_device(fs_info->fs_devices, devid, NULL, NULL, true); in verify_one_dev_extent()
7597 devs = list_first_entry(&fs_info->fs_devices->seed_list, in verify_one_dev_extent()