|
@@ -764,36 +764,7 @@ static int __btrfs_close_devices(struct btrfs_fs_devices *fs_devices)
|
|
|
|
|
|
mutex_lock(&fs_devices->device_list_mutex);
|
|
|
list_for_each_entry_safe(device, tmp, &fs_devices->devices, dev_list) {
|
|
|
- struct btrfs_device *new_device;
|
|
|
- struct rcu_string *name;
|
|
|
-
|
|
|
- if (device->bdev)
|
|
|
- fs_devices->open_devices--;
|
|
|
-
|
|
|
- if (device->writeable &&
|
|
|
- device->devid != BTRFS_DEV_REPLACE_DEVID) {
|
|
|
- list_del_init(&device->dev_alloc_list);
|
|
|
- fs_devices->rw_devices--;
|
|
|
- }
|
|
|
-
|
|
|
- if (device->missing)
|
|
|
- fs_devices->missing_devices--;
|
|
|
-
|
|
|
- new_device = btrfs_alloc_device(NULL, &device->devid,
|
|
|
- device->uuid);
|
|
|
- BUG_ON(IS_ERR(new_device)); /* -ENOMEM */
|
|
|
-
|
|
|
- /* Safe because we are under uuid_mutex */
|
|
|
- if (device->name) {
|
|
|
- name = rcu_string_strdup(device->name->str, GFP_NOFS);
|
|
|
- BUG_ON(!name); /* -ENOMEM */
|
|
|
- rcu_assign_pointer(new_device->name, name);
|
|
|
- }
|
|
|
-
|
|
|
- list_replace_rcu(&device->dev_list, &new_device->dev_list);
|
|
|
- new_device->fs_devices = device->fs_devices;
|
|
|
-
|
|
|
- call_rcu(&device->rcu, free_device);
|
|
|
+ btrfs_close_one_device(device);
|
|
|
}
|
|
|
mutex_unlock(&fs_devices->device_list_mutex);
|
|
|
|
|
@@ -6834,3 +6805,38 @@ void btrfs_reset_fs_info_ptr(struct btrfs_fs_info *fs_info)
|
|
|
fs_devices = fs_devices->seed;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+void btrfs_close_one_device(struct btrfs_device *device)
|
|
|
+{
|
|
|
+ struct btrfs_fs_devices *fs_devices = device->fs_devices;
|
|
|
+ struct btrfs_device *new_device;
|
|
|
+ struct rcu_string *name;
|
|
|
+
|
|
|
+ if (device->bdev)
|
|
|
+ fs_devices->open_devices--;
|
|
|
+
|
|
|
+ if (device->writeable &&
|
|
|
+ device->devid != BTRFS_DEV_REPLACE_DEVID) {
|
|
|
+ list_del_init(&device->dev_alloc_list);
|
|
|
+ fs_devices->rw_devices--;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (device->missing)
|
|
|
+ fs_devices->missing_devices--;
|
|
|
+
|
|
|
+ new_device = btrfs_alloc_device(NULL, &device->devid,
|
|
|
+ device->uuid);
|
|
|
+ BUG_ON(IS_ERR(new_device)); /* -ENOMEM */
|
|
|
+
|
|
|
+ /* Safe because we are under uuid_mutex */
|
|
|
+ if (device->name) {
|
|
|
+ name = rcu_string_strdup(device->name->str, GFP_NOFS);
|
|
|
+ BUG_ON(!name); /* -ENOMEM */
|
|
|
+ rcu_assign_pointer(new_device->name, name);
|
|
|
+ }
|
|
|
+
|
|
|
+ list_replace_rcu(&device->dev_list, &new_device->dev_list);
|
|
|
+ new_device->fs_devices = device->fs_devices;
|
|
|
+
|
|
|
+ call_rcu(&device->rcu, free_device);
|
|
|
+}
|