94 lines
2.7 KiB
Diff
94 lines
2.7 KiB
Diff
|
From bde44c1e4808c8b3d7291d2ad22536d4b5d7e2f5 Mon Sep 17 00:00:00 2001
|
||
|
From: Chris Mason <chris.mason@oracle.com>
|
||
|
Date: Tue, 21 Feb 2012 15:56:10 -0500
|
||
|
Subject: [PATCH 17/18] Scan /dev/md and device mapper devices last
|
||
|
|
||
|
When we're using multipath or raid0, it is possible
|
||
|
that btrfs dev scan will find one of the component devices
|
||
|
instead of the proper virtual device the kernel creates.
|
||
|
|
||
|
We want to make sure the kernel scans the virtual devices last,
|
||
|
since it always remembers the last device it finds with a given fsid.
|
||
|
|
||
|
Signed-off-by: Chris Mason <chris.mason@oracle.com>
|
||
|
---
|
||
|
utils.c | 25 ++++++++++++++++++++++++-
|
||
|
volumes.c | 9 ++++++++-
|
||
|
2 files changed, 32 insertions(+), 2 deletions(-)
|
||
|
|
||
|
diff --git a/utils.c b/utils.c
|
||
|
index 2d82342..0beaf80 100644
|
||
|
--- a/utils.c
|
||
|
+++ b/utils.c
|
||
|
@@ -1156,7 +1156,10 @@ int btrfs_scan_block_devices(int run_ioctl)
|
||
|
int i;
|
||
|
char buf[1024];
|
||
|
char fullpath[110];
|
||
|
+ int scans = 0;
|
||
|
+ int special;
|
||
|
|
||
|
+scan_again:
|
||
|
proc_partitions = fopen("/proc/partitions","r");
|
||
|
if (!proc_partitions) {
|
||
|
fprintf(stderr, "Unable to open '/proc/partitions' for scanning\n");
|
||
|
@@ -1172,8 +1175,23 @@ int btrfs_scan_block_devices(int run_ioctl)
|
||
|
|
||
|
strcpy(fullpath,"/dev/");
|
||
|
while(fgets(buf, 1023, proc_partitions)) {
|
||
|
-
|
||
|
i = sscanf(buf," %*d %*d %*d %99s", fullpath+5);
|
||
|
+
|
||
|
+ /*
|
||
|
+ * multipath and MD devices may register as a btrfs filesystem
|
||
|
+ * both through the original block device and through
|
||
|
+ * the special (/dev/mapper or /dev/mdX) entry.
|
||
|
+ * This scans the special entries last
|
||
|
+ */
|
||
|
+ special = strncmp(fullpath, "/dev/dm-", strlen("/dev/dm-")) == 0;
|
||
|
+ if (!special)
|
||
|
+ special = strncmp(fullpath, "/dev/md", strlen("/dev/md")) == 0;
|
||
|
+
|
||
|
+ if (scans == 0 && special)
|
||
|
+ continue;
|
||
|
+ if (scans > 0 && !special)
|
||
|
+ continue;
|
||
|
+
|
||
|
ret = lstat(fullpath, &st);
|
||
|
if (ret < 0) {
|
||
|
fprintf(stderr, "failed to stat %s\n", fullpath);
|
||
|
@@ -1198,6 +1216,11 @@ int btrfs_scan_block_devices(int run_ioctl)
|
||
|
}
|
||
|
|
||
|
fclose(proc_partitions);
|
||
|
+
|
||
|
+ if (scans == 0) {
|
||
|
+ scans++;
|
||
|
+ goto scan_again;
|
||
|
+ }
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
diff --git a/volumes.c b/volumes.c
|
||
|
index 74c88de..e7f4c3e 100644
|
||
|
--- a/volumes.c
|
||
|
+++ b/volumes.c
|
||
|
@@ -130,7 +130,14 @@ static int device_list_add(const char *path,
|
||
|
btrfs_stack_device_bytes_used(&disk_super->dev_item);
|
||
|
list_add(&device->dev_list, &fs_devices->devices);
|
||
|
device->fs_devices = fs_devices;
|
||
|
- }
|
||
|
+ } else if (!device->name || strcmp(device->name, path)) {
|
||
|
+ char *name = strdup(path);
|
||
|
+ if (!name)
|
||
|
+ return -ENOMEM;
|
||
|
+ kfree(device->name);
|
||
|
+ device->name = name;
|
||
|
+ }
|
||
|
+
|
||
|
|
||
|
if (found_transid > fs_devices->latest_trans) {
|
||
|
fs_devices->latest_devid = devid;
|
||
|
--
|
||
|
1.7.6.233.gd79bc
|
||
|
|