|
|
@@ -850,6 +850,35 @@ static noinline struct btrfs_device *device_list_add(const char *path,
|
|
|
return ERR_PTR(-EEXIST);
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * We are going to replace the device path for a given devid,
|
|
|
+ * make sure it's the same device if the device is mounted
|
|
|
+ */
|
|
|
+ if (device->bdev) {
|
|
|
+ struct block_device *path_bdev;
|
|
|
+
|
|
|
+ path_bdev = lookup_bdev(path);
|
|
|
+ if (IS_ERR(path_bdev)) {
|
|
|
+ mutex_unlock(&fs_devices->device_list_mutex);
|
|
|
+ return ERR_CAST(path_bdev);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (device->bdev != path_bdev) {
|
|
|
+ bdput(path_bdev);
|
|
|
+ mutex_unlock(&fs_devices->device_list_mutex);
|
|
|
+ btrfs_warn_in_rcu(device->fs_info,
|
|
|
+ "duplicate device fsid:devid for %pU:%llu old:%s new:%s",
|
|
|
+ disk_super->fsid, devid,
|
|
|
+ rcu_str_deref(device->name), path);
|
|
|
+ return ERR_PTR(-EEXIST);
|
|
|
+ }
|
|
|
+ bdput(path_bdev);
|
|
|
+ btrfs_info_in_rcu(device->fs_info,
|
|
|
+ "device fsid %pU devid %llu moved old:%s new:%s",
|
|
|
+ disk_super->fsid, devid,
|
|
|
+ rcu_str_deref(device->name), path);
|
|
|
+ }
|
|
|
+
|
|
|
name = rcu_string_strdup(path, GFP_NOFS);
|
|
|
if (!name) {
|
|
|
mutex_unlock(&fs_devices->device_list_mutex);
|