static 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 (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state) &&
            device->devid != BTRFS_DEV_REPLACE_DEVID) {
                fs_devices->missing_devices--;
 
        btrfs_close_bdev(device);
-       if (device->bdev)
+       if (device->bdev) {
                fs_devices->open_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);
+               device->bdev = NULL;
        }
+       clear_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state);
 
-       list_replace_rcu(&device->dev_list, &new_device->dev_list);
-       new_device->fs_devices = device->fs_devices;
+       device->fs_info = NULL;
+       atomic_set(&device->dev_stats_ccnt, 0);
+       extent_io_tree_release(&device->alloc_state);
 
-       synchronize_rcu();
-       btrfs_free_device(device);
+       /* Verify the device is back in a pristine state  */
+       ASSERT(!test_bit(BTRFS_DEV_STATE_FLUSH_SENT, &device->dev_state));
+       ASSERT(!test_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state));
+       ASSERT(list_empty(&device->dev_alloc_list));
+       ASSERT(list_empty(&device->post_commit_list));
+       ASSERT(atomic_read(&device->reada_in_flight) == 0);
 }
 
 static int close_fs_devices(struct btrfs_fs_devices *fs_devices)