|
@@ -448,6 +448,14 @@ static void pending_bios_fn(struct btrfs_work *work)
|
|
|
run_scheduled_bios(device);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Add new device to list of registered devices
|
|
|
+ *
|
|
|
+ * Returns:
|
|
|
+ * 1 - first time device is seen
|
|
|
+ * 0 - device already known
|
|
|
+ * < 0 - error
|
|
|
+ */
|
|
|
static noinline int device_list_add(const char *path,
|
|
|
struct btrfs_super_block *disk_super,
|
|
|
u64 devid, struct btrfs_fs_devices **fs_devices_ret)
|
|
@@ -455,6 +463,7 @@ static noinline int device_list_add(const char *path,
|
|
|
struct btrfs_device *device;
|
|
|
struct btrfs_fs_devices *fs_devices;
|
|
|
struct rcu_string *name;
|
|
|
+ int ret = 0;
|
|
|
u64 found_transid = btrfs_super_generation(disk_super);
|
|
|
|
|
|
fs_devices = find_fsid(disk_super->fsid);
|
|
@@ -495,6 +504,7 @@ static noinline int device_list_add(const char *path,
|
|
|
fs_devices->num_devices++;
|
|
|
mutex_unlock(&fs_devices->device_list_mutex);
|
|
|
|
|
|
+ ret = 1;
|
|
|
device->fs_devices = fs_devices;
|
|
|
} else if (!device->name || strcmp(device->name->str, path)) {
|
|
|
name = rcu_string_strdup(path, GFP_NOFS);
|
|
@@ -513,7 +523,8 @@ static noinline int device_list_add(const char *path,
|
|
|
fs_devices->latest_trans = found_transid;
|
|
|
}
|
|
|
*fs_devices_ret = fs_devices;
|
|
|
- return 0;
|
|
|
+
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
static struct btrfs_fs_devices *clone_fs_devices(struct btrfs_fs_devices *orig)
|
|
@@ -910,17 +921,19 @@ int btrfs_scan_one_device(const char *path, fmode_t flags, void *holder,
|
|
|
transid = btrfs_super_generation(disk_super);
|
|
|
total_devices = btrfs_super_num_devices(disk_super);
|
|
|
|
|
|
- if (disk_super->label[0]) {
|
|
|
- if (disk_super->label[BTRFS_LABEL_SIZE - 1])
|
|
|
- disk_super->label[BTRFS_LABEL_SIZE - 1] = '\0';
|
|
|
- printk(KERN_INFO "BTRFS: device label %s ", disk_super->label);
|
|
|
- } else {
|
|
|
- printk(KERN_INFO "BTRFS: device fsid %pU ", disk_super->fsid);
|
|
|
- }
|
|
|
-
|
|
|
- printk(KERN_CONT "devid %llu transid %llu %s\n", devid, transid, path);
|
|
|
-
|
|
|
ret = device_list_add(path, disk_super, devid, fs_devices_ret);
|
|
|
+ if (ret > 0) {
|
|
|
+ if (disk_super->label[0]) {
|
|
|
+ if (disk_super->label[BTRFS_LABEL_SIZE - 1])
|
|
|
+ disk_super->label[BTRFS_LABEL_SIZE - 1] = '\0';
|
|
|
+ printk(KERN_INFO "BTRFS: device label %s ", disk_super->label);
|
|
|
+ } else {
|
|
|
+ printk(KERN_INFO "BTRFS: device fsid %pU ", disk_super->fsid);
|
|
|
+ }
|
|
|
+
|
|
|
+ printk(KERN_CONT "devid %llu transid %llu %s\n", devid, transid, path);
|
|
|
+ ret = 0;
|
|
|
+ }
|
|
|
if (!ret && fs_devices_ret)
|
|
|
(*fs_devices_ret)->total_devices = total_devices;
|
|
|
|