Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:12.2:ARM
btrfsprogs
0168-Scan-dev-md-and-device-mapper-devices-last...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0168-Scan-dev-md-and-device-mapper-devices-last.patch of Package btrfsprogs
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
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor