Lines Matching refs:fs_devices

99 static void free_fs_devices(struct btrfs_fs_devices *fs_devices)  in free_fs_devices()  argument
102 WARN_ON(fs_devices->opened); in free_fs_devices()
103 while (!list_empty(&fs_devices->devices)) { in free_fs_devices()
104 device = list_entry(fs_devices->devices.next, in free_fs_devices()
110 kfree(fs_devices); in free_fs_devices()
128 struct btrfs_fs_devices *fs_devices; in btrfs_cleanup_fs_uuids() local
131 fs_devices = list_entry(fs_uuids.next, in btrfs_cleanup_fs_uuids()
133 list_del(&fs_devices->list); in btrfs_cleanup_fs_uuids()
134 free_fs_devices(fs_devices); in btrfs_cleanup_fs_uuids()
178 struct btrfs_fs_devices *fs_devices; in find_fsid() local
180 list_for_each_entry(fs_devices, &fs_uuids, list) { in find_fsid()
181 if (memcmp(fsid, fs_devices->fsid, BTRFS_FSID_SIZE) == 0) in find_fsid()
182 return fs_devices; in find_fsid()
379 fs_info->fs_devices->open_devices > 1) { in run_scheduled_bios()
458 struct btrfs_fs_devices *fs_devices; in device_list_add() local
463 fs_devices = find_fsid(disk_super->fsid); in device_list_add()
464 if (!fs_devices) { in device_list_add()
465 fs_devices = alloc_fs_devices(disk_super->fsid); in device_list_add()
466 if (IS_ERR(fs_devices)) in device_list_add()
467 return PTR_ERR(fs_devices); in device_list_add()
469 list_add(&fs_devices->list, &fs_uuids); in device_list_add()
473 device = __find_device(&fs_devices->devices, devid, in device_list_add()
478 if (fs_devices->opened) in device_list_add()
495 mutex_lock(&fs_devices->device_list_mutex); in device_list_add()
496 list_add_rcu(&device->dev_list, &fs_devices->devices); in device_list_add()
497 fs_devices->num_devices++; in device_list_add()
498 mutex_unlock(&fs_devices->device_list_mutex); in device_list_add()
501 device->fs_devices = fs_devices; in device_list_add()
529 if (!fs_devices->opened && found_transid < device->generation) { in device_list_add()
546 fs_devices->missing_devices--; in device_list_add()
557 if (!fs_devices->opened) in device_list_add()
560 *fs_devices_ret = fs_devices; in device_list_add()
567 struct btrfs_fs_devices *fs_devices; in clone_fs_devices() local
571 fs_devices = alloc_fs_devices(orig->fsid); in clone_fs_devices()
572 if (IS_ERR(fs_devices)) in clone_fs_devices()
573 return fs_devices; in clone_fs_devices()
576 fs_devices->total_devices = orig->total_devices; in clone_fs_devices()
600 list_add(&device->dev_list, &fs_devices->devices); in clone_fs_devices()
601 device->fs_devices = fs_devices; in clone_fs_devices()
602 fs_devices->num_devices++; in clone_fs_devices()
605 return fs_devices; in clone_fs_devices()
608 free_fs_devices(fs_devices); in clone_fs_devices()
612 void btrfs_close_extra_devices(struct btrfs_fs_devices *fs_devices, int step) in btrfs_close_extra_devices() argument
620 list_for_each_entry_safe(device, next, &fs_devices->devices, dev_list) { in btrfs_close_extra_devices()
648 fs_devices->open_devices--; in btrfs_close_extra_devices()
654 fs_devices->rw_devices--; in btrfs_close_extra_devices()
657 fs_devices->num_devices--; in btrfs_close_extra_devices()
662 if (fs_devices->seed) { in btrfs_close_extra_devices()
663 fs_devices = fs_devices->seed; in btrfs_close_extra_devices()
667 fs_devices->latest_bdev = latest_dev->bdev; in btrfs_close_extra_devices()
695 static int __btrfs_close_devices(struct btrfs_fs_devices *fs_devices) in __btrfs_close_devices() argument
699 if (--fs_devices->opened > 0) in __btrfs_close_devices()
702 mutex_lock(&fs_devices->device_list_mutex); in __btrfs_close_devices()
703 list_for_each_entry(device, &fs_devices->devices, dev_list) { in __btrfs_close_devices()
708 fs_devices->open_devices--; in __btrfs_close_devices()
713 fs_devices->rw_devices--; in __btrfs_close_devices()
717 fs_devices->missing_devices--; in __btrfs_close_devices()
731 new_device->fs_devices = device->fs_devices; in __btrfs_close_devices()
735 mutex_unlock(&fs_devices->device_list_mutex); in __btrfs_close_devices()
737 WARN_ON(fs_devices->open_devices); in __btrfs_close_devices()
738 WARN_ON(fs_devices->rw_devices); in __btrfs_close_devices()
739 fs_devices->opened = 0; in __btrfs_close_devices()
740 fs_devices->seeding = 0; in __btrfs_close_devices()
745 int btrfs_close_devices(struct btrfs_fs_devices *fs_devices) in btrfs_close_devices() argument
751 ret = __btrfs_close_devices(fs_devices); in btrfs_close_devices()
752 if (!fs_devices->opened) { in btrfs_close_devices()
753 seed_devices = fs_devices->seed; in btrfs_close_devices()
754 fs_devices->seed = NULL; in btrfs_close_devices()
759 fs_devices = seed_devices; in btrfs_close_devices()
760 seed_devices = fs_devices->seed; in btrfs_close_devices()
761 __btrfs_close_devices(fs_devices); in btrfs_close_devices()
762 free_fs_devices(fs_devices); in btrfs_close_devices()
773 static int __btrfs_open_devices(struct btrfs_fs_devices *fs_devices, in __btrfs_open_devices() argument
778 struct list_head *head = &fs_devices->devices; in __btrfs_open_devices()
830 fs_devices->rotating = 1; in __btrfs_open_devices()
832 fs_devices->open_devices++; in __btrfs_open_devices()
835 fs_devices->rw_devices++; in __btrfs_open_devices()
837 &fs_devices->alloc_list); in __btrfs_open_devices()
847 if (fs_devices->open_devices == 0) { in __btrfs_open_devices()
851 fs_devices->seeding = seeding; in __btrfs_open_devices()
852 fs_devices->opened = 1; in __btrfs_open_devices()
853 fs_devices->latest_bdev = latest_dev->bdev; in __btrfs_open_devices()
854 fs_devices->total_rw_bytes = 0; in __btrfs_open_devices()
859 int btrfs_open_devices(struct btrfs_fs_devices *fs_devices, in btrfs_open_devices() argument
865 if (fs_devices->opened) { in btrfs_open_devices()
866 fs_devices->opened++; in btrfs_open_devices()
869 ret = __btrfs_open_devices(fs_devices, flags, holder); in btrfs_open_devices()
1572 num_devices = root->fs_info->fs_devices->num_devices; in btrfs_rm_device()
1591 root->fs_info->fs_devices->rw_devices <= 2) { in btrfs_rm_device()
1596 root->fs_info->fs_devices->rw_devices <= 3) { in btrfs_rm_device()
1606 devices = &root->fs_info->fs_devices->devices; in btrfs_rm_device()
1649 if (device->writeable && root->fs_info->fs_devices->rw_devices == 1) { in btrfs_rm_device()
1657 device->fs_devices->rw_devices--; in btrfs_rm_device()
1690 cur_devices = device->fs_devices; in btrfs_rm_device()
1691 mutex_lock(&root->fs_info->fs_devices->device_list_mutex); in btrfs_rm_device()
1694 device->fs_devices->num_devices--; in btrfs_rm_device()
1695 device->fs_devices->total_devices--; in btrfs_rm_device()
1698 device->fs_devices->missing_devices--; in btrfs_rm_device()
1700 next_device = list_entry(root->fs_info->fs_devices->devices.next, in btrfs_rm_device()
1704 if (device->bdev == root->fs_info->fs_devices->latest_bdev) in btrfs_rm_device()
1705 root->fs_info->fs_devices->latest_bdev = next_device->bdev; in btrfs_rm_device()
1708 device->fs_devices->open_devices--; in btrfs_rm_device()
1717 mutex_unlock(&root->fs_info->fs_devices->device_list_mutex); in btrfs_rm_device()
1720 struct btrfs_fs_devices *fs_devices; in btrfs_rm_device() local
1721 fs_devices = root->fs_info->fs_devices; in btrfs_rm_device()
1722 while (fs_devices) { in btrfs_rm_device()
1723 if (fs_devices->seed == cur_devices) { in btrfs_rm_device()
1724 fs_devices->seed = cur_devices->seed; in btrfs_rm_device()
1727 fs_devices = fs_devices->seed; in btrfs_rm_device()
1802 &root->fs_info->fs_devices->alloc_list); in btrfs_rm_device()
1803 device->fs_devices->rw_devices++; in btrfs_rm_device()
1812 struct btrfs_fs_devices *fs_devices; in btrfs_rm_dev_replace_remove_srcdev() local
1814 WARN_ON(!mutex_is_locked(&fs_info->fs_devices->device_list_mutex)); in btrfs_rm_dev_replace_remove_srcdev()
1822 fs_devices = srcdev->fs_devices; in btrfs_rm_dev_replace_remove_srcdev()
1826 fs_devices->num_devices--; in btrfs_rm_dev_replace_remove_srcdev()
1828 fs_devices->missing_devices--; in btrfs_rm_dev_replace_remove_srcdev()
1831 fs_devices->rw_devices--; in btrfs_rm_dev_replace_remove_srcdev()
1837 fs_devices->open_devices--; in btrfs_rm_dev_replace_remove_srcdev()
1843 struct btrfs_fs_devices *fs_devices = srcdev->fs_devices; in btrfs_rm_dev_replace_free_srcdev() local
1851 BUG_ON(!fs_devices->num_devices && !fs_devices->seeding); in btrfs_rm_dev_replace_free_srcdev()
1854 if (!fs_devices->num_devices) { in btrfs_rm_dev_replace_free_srcdev()
1857 tmp_fs_devices = fs_info->fs_devices; in btrfs_rm_dev_replace_free_srcdev()
1859 if (tmp_fs_devices->seed == fs_devices) { in btrfs_rm_dev_replace_free_srcdev()
1860 tmp_fs_devices->seed = fs_devices->seed; in btrfs_rm_dev_replace_free_srcdev()
1865 fs_devices->seed = NULL; in btrfs_rm_dev_replace_free_srcdev()
1866 __btrfs_close_devices(fs_devices); in btrfs_rm_dev_replace_free_srcdev()
1867 free_fs_devices(fs_devices); in btrfs_rm_dev_replace_free_srcdev()
1878 mutex_lock(&fs_info->fs_devices->device_list_mutex); in btrfs_destroy_dev_replace_tgtdev()
1881 fs_info->fs_devices->open_devices--; in btrfs_destroy_dev_replace_tgtdev()
1883 fs_info->fs_devices->num_devices--; in btrfs_destroy_dev_replace_tgtdev()
1885 next_device = list_entry(fs_info->fs_devices->devices.next, in btrfs_destroy_dev_replace_tgtdev()
1889 if (tgtdev->bdev == fs_info->fs_devices->latest_bdev) in btrfs_destroy_dev_replace_tgtdev()
1890 fs_info->fs_devices->latest_bdev = next_device->bdev; in btrfs_destroy_dev_replace_tgtdev()
1895 mutex_unlock(&fs_info->fs_devices->device_list_mutex); in btrfs_destroy_dev_replace_tgtdev()
1935 devices = &root->fs_info->fs_devices->devices; in btrfs_find_device_missing_or_by_path()
1963 struct btrfs_fs_devices *fs_devices = root->fs_info->fs_devices; in btrfs_prepare_sprout() local
1971 if (!fs_devices->seeding) in btrfs_prepare_sprout()
1978 old_devices = clone_fs_devices(fs_devices); in btrfs_prepare_sprout()
1986 memcpy(seed_devices, fs_devices, sizeof(*seed_devices)); in btrfs_prepare_sprout()
1992 mutex_lock(&root->fs_info->fs_devices->device_list_mutex); in btrfs_prepare_sprout()
1993 list_splice_init_rcu(&fs_devices->devices, &seed_devices->devices, in btrfs_prepare_sprout()
1996 device->fs_devices = seed_devices; in btrfs_prepare_sprout()
1999 list_splice_init(&fs_devices->alloc_list, &seed_devices->alloc_list); in btrfs_prepare_sprout()
2002 fs_devices->seeding = 0; in btrfs_prepare_sprout()
2003 fs_devices->num_devices = 0; in btrfs_prepare_sprout()
2004 fs_devices->open_devices = 0; in btrfs_prepare_sprout()
2005 fs_devices->missing_devices = 0; in btrfs_prepare_sprout()
2006 fs_devices->rotating = 0; in btrfs_prepare_sprout()
2007 fs_devices->seed = seed_devices; in btrfs_prepare_sprout()
2009 generate_random_uuid(fs_devices->fsid); in btrfs_prepare_sprout()
2010 memcpy(root->fs_info->fsid, fs_devices->fsid, BTRFS_FSID_SIZE); in btrfs_prepare_sprout()
2011 memcpy(disk_super->fsid, fs_devices->fsid, BTRFS_FSID_SIZE); in btrfs_prepare_sprout()
2012 mutex_unlock(&root->fs_info->fs_devices->device_list_mutex); in btrfs_prepare_sprout()
2081 if (device->fs_devices->seeding) { in btrfs_finish_sprout()
2109 if ((sb->s_flags & MS_RDONLY) && !root->fs_info->fs_devices->seeding) in btrfs_init_new_device()
2117 if (root->fs_info->fs_devices->seeding) { in btrfs_init_new_device()
2125 devices = &root->fs_info->fs_devices->devices; in btrfs_init_new_device()
2127 mutex_lock(&root->fs_info->fs_devices->device_list_mutex); in btrfs_init_new_device()
2132 &root->fs_info->fs_devices->device_list_mutex); in btrfs_init_new_device()
2136 mutex_unlock(&root->fs_info->fs_devices->device_list_mutex); in btrfs_init_new_device()
2186 device->fs_devices = root->fs_info->fs_devices; in btrfs_init_new_device()
2188 mutex_lock(&root->fs_info->fs_devices->device_list_mutex); in btrfs_init_new_device()
2190 list_add_rcu(&device->dev_list, &root->fs_info->fs_devices->devices); in btrfs_init_new_device()
2192 &root->fs_info->fs_devices->alloc_list); in btrfs_init_new_device()
2193 root->fs_info->fs_devices->num_devices++; in btrfs_init_new_device()
2194 root->fs_info->fs_devices->open_devices++; in btrfs_init_new_device()
2195 root->fs_info->fs_devices->rw_devices++; in btrfs_init_new_device()
2196 root->fs_info->fs_devices->total_devices++; in btrfs_init_new_device()
2197 root->fs_info->fs_devices->total_rw_bytes += device->total_bytes; in btrfs_init_new_device()
2204 root->fs_info->fs_devices->rotating = 1; in btrfs_init_new_device()
2224 mutex_unlock(&root->fs_info->fs_devices->device_list_mutex); in btrfs_init_new_device()
2318 if (fs_info->fs_devices->seeding) { in btrfs_init_dev_replace_tgtdev()
2332 devices = &fs_info->fs_devices->devices; in btrfs_init_dev_replace_tgtdev()
2367 mutex_lock(&root->fs_info->fs_devices->device_list_mutex); in btrfs_init_dev_replace_tgtdev()
2386 device->fs_devices = fs_info->fs_devices; in btrfs_init_dev_replace_tgtdev()
2387 list_add(&device->dev_list, &fs_info->fs_devices->devices); in btrfs_init_dev_replace_tgtdev()
2388 fs_info->fs_devices->num_devices++; in btrfs_init_dev_replace_tgtdev()
2389 fs_info->fs_devices->open_devices++; in btrfs_init_dev_replace_tgtdev()
2390 mutex_unlock(&root->fs_info->fs_devices->device_list_mutex); in btrfs_init_dev_replace_tgtdev()
2403 WARN_ON(fs_info->fs_devices->rw_devices == 0); in btrfs_init_dev_replace_tgtdev_for_resume()
2464 struct btrfs_fs_devices *fs_devices; in btrfs_grow_device() local
2481 fs_devices = device->dev_root->fs_info->fs_devices; in btrfs_grow_device()
2484 device->fs_devices->total_rw_bytes += diff; in btrfs_grow_device()
2491 &fs_devices->resized_devices); in btrfs_grow_device()
3162 devices = &fs_info->fs_devices->devices; in __btrfs_balance()
3380 num_devices = fs_info->fs_devices->num_devices; in btrfs_balance()
3989 device->fs_devices->total_rw_bytes -= diff; in btrfs_shrink_device()
4053 device->fs_devices->total_rw_bytes += diff; in btrfs_shrink_device()
4072 &root->fs_info->fs_devices->resized_devices); in btrfs_shrink_device()
4222 struct btrfs_fs_devices *fs_devices = info->fs_devices; in __btrfs_alloc_chunk() local
4251 if (list_empty(&fs_devices->alloc_list)) in __btrfs_alloc_chunk()
4270 if (fs_devices->total_rw_bytes > 50ULL * 1024 * 1024 * 1024) in __btrfs_alloc_chunk()
4289 max_chunk_size = min(div_factor(fs_devices->total_rw_bytes, 1), in __btrfs_alloc_chunk()
4292 devices_info = kcalloc(fs_devices->rw_devices, sizeof(*devices_info), in __btrfs_alloc_chunk()
4297 cur = fs_devices->alloc_list.next; in __btrfs_alloc_chunk()
4304 while (cur != &fs_devices->alloc_list) { in __btrfs_alloc_chunk()
4344 if (ndevs == fs_devices->rw_devices) { in __btrfs_alloc_chunk()
4346 __func__, fs_devices->rw_devices); in __btrfs_alloc_chunk()
5921 cur_devices = fs_info->fs_devices; in btrfs_find_device()
5936 struct btrfs_fs_devices *fs_devices, in add_missing_dev() argument
5945 list_add(&device->dev_list, &fs_devices->devices); in add_missing_dev()
5946 device->fs_devices = fs_devices; in add_missing_dev()
5947 fs_devices->num_devices++; in add_missing_dev()
5950 fs_devices->missing_devices++; in add_missing_dev()
6076 add_missing_dev(root, root->fs_info->fs_devices, in read_one_chunk()
6121 struct btrfs_fs_devices *fs_devices; in open_seed_devices() local
6126 fs_devices = root->fs_info->fs_devices->seed; in open_seed_devices()
6127 while (fs_devices) { in open_seed_devices()
6128 if (!memcmp(fs_devices->fsid, fsid, BTRFS_UUID_SIZE)) in open_seed_devices()
6129 return fs_devices; in open_seed_devices()
6131 fs_devices = fs_devices->seed; in open_seed_devices()
6134 fs_devices = find_fsid(fsid); in open_seed_devices()
6135 if (!fs_devices) { in open_seed_devices()
6139 fs_devices = alloc_fs_devices(fsid); in open_seed_devices()
6140 if (IS_ERR(fs_devices)) in open_seed_devices()
6141 return fs_devices; in open_seed_devices()
6143 fs_devices->seeding = 1; in open_seed_devices()
6144 fs_devices->opened = 1; in open_seed_devices()
6145 return fs_devices; in open_seed_devices()
6148 fs_devices = clone_fs_devices(fs_devices); in open_seed_devices()
6149 if (IS_ERR(fs_devices)) in open_seed_devices()
6150 return fs_devices; in open_seed_devices()
6152 ret = __btrfs_open_devices(fs_devices, FMODE_READ, in open_seed_devices()
6155 free_fs_devices(fs_devices); in open_seed_devices()
6156 fs_devices = ERR_PTR(ret); in open_seed_devices()
6160 if (!fs_devices->seeding) { in open_seed_devices()
6161 __btrfs_close_devices(fs_devices); in open_seed_devices()
6162 free_fs_devices(fs_devices); in open_seed_devices()
6163 fs_devices = ERR_PTR(-EINVAL); in open_seed_devices()
6167 fs_devices->seed = root->fs_info->fs_devices->seed; in open_seed_devices()
6168 root->fs_info->fs_devices->seed = fs_devices; in open_seed_devices()
6170 return fs_devices; in open_seed_devices()
6177 struct btrfs_fs_devices *fs_devices = root->fs_info->fs_devices; in read_one_dev() local
6191 fs_devices = open_seed_devices(root, fs_uuid); in read_one_dev()
6192 if (IS_ERR(fs_devices)) in read_one_dev()
6193 return PTR_ERR(fs_devices); in read_one_dev()
6202 device = add_missing_dev(root, fs_devices, devid, dev_uuid); in read_one_dev()
6216 device->fs_devices->missing_devices++; in read_one_dev()
6221 if (device->fs_devices != fs_devices) { in read_one_dev()
6224 list_move(&device->dev_list, &fs_devices->devices); in read_one_dev()
6225 device->fs_devices->num_devices--; in read_one_dev()
6226 fs_devices->num_devices++; in read_one_dev()
6228 device->fs_devices->missing_devices--; in read_one_dev()
6229 fs_devices->missing_devices++; in read_one_dev()
6231 device->fs_devices = fs_devices; in read_one_dev()
6235 if (device->fs_devices != root->fs_info->fs_devices) { in read_one_dev()
6245 device->fs_devices->total_rw_bytes += device->total_bytes; in read_one_dev()
6428 struct btrfs_fs_devices *fs_devices = fs_info->fs_devices; in btrfs_init_devices_late() local
6431 while (fs_devices) { in btrfs_init_devices_late()
6432 mutex_lock(&fs_devices->device_list_mutex); in btrfs_init_devices_late()
6433 list_for_each_entry(device, &fs_devices->devices, dev_list) in btrfs_init_devices_late()
6435 mutex_unlock(&fs_devices->device_list_mutex); in btrfs_init_devices_late()
6437 fs_devices = fs_devices->seed; in btrfs_init_devices_late()
6454 struct btrfs_fs_devices *fs_devices = fs_info->fs_devices; in btrfs_init_dev_stats() local
6468 mutex_lock(&fs_devices->device_list_mutex); in btrfs_init_dev_stats()
6469 list_for_each_entry(device, &fs_devices->devices, dev_list) { in btrfs_init_dev_stats()
6503 mutex_unlock(&fs_devices->device_list_mutex); in btrfs_init_dev_stats()
6580 struct btrfs_fs_devices *fs_devices = fs_info->fs_devices; in btrfs_run_dev_stats() local
6585 mutex_lock(&fs_devices->device_list_mutex); in btrfs_run_dev_stats()
6586 list_for_each_entry(device, &fs_devices->devices, dev_list) { in btrfs_run_dev_stats()
6595 mutex_unlock(&fs_devices->device_list_mutex); in btrfs_run_dev_stats()
6644 struct btrfs_fs_devices *fs_devices = root->fs_info->fs_devices; in btrfs_get_dev_stats() local
6647 mutex_lock(&fs_devices->device_list_mutex); in btrfs_get_dev_stats()
6649 mutex_unlock(&fs_devices->device_list_mutex); in btrfs_get_dev_stats()
6699 struct btrfs_fs_devices *fs_devices = fs_info->fs_devices; in btrfs_update_commit_device_size() local
6702 if (list_empty(&fs_devices->resized_devices)) in btrfs_update_commit_device_size()
6705 mutex_lock(&fs_devices->device_list_mutex); in btrfs_update_commit_device_size()
6707 list_for_each_entry_safe(curr, next, &fs_devices->resized_devices, in btrfs_update_commit_device_size()
6713 mutex_unlock(&fs_devices->device_list_mutex); in btrfs_update_commit_device_size()