diff options
-rw-r--r-- | disk-utils/fdisk-list.c | 2 | ||||
-rw-r--r-- | include/sysfs.h | 2 | ||||
-rw-r--r-- | lib/sysfs.c | 18 | ||||
-rw-r--r-- | libblkid/src/probe.c | 6 | ||||
-rw-r--r-- | libblkid/src/verify.c | 2 |
5 files changed, 19 insertions, 11 deletions
diff --git a/disk-utils/fdisk-list.c b/disk-utils/fdisk-list.c index 08732e95a..a46883d18 100644 --- a/disk-utils/fdisk-list.c +++ b/disk-utils/fdisk-list.c @@ -334,7 +334,7 @@ char *next_proc_partition(FILE **f) if (devno <= 0) continue; - if (sysfs_devno_is_lvm_private(devno) || + if (sysfs_devno_is_lvm_private(devno, NULL) || sysfs_devno_is_wholedisk(devno) <= 0) continue; diff --git a/include/sysfs.h b/include/sysfs.h index 36d3cbd4f..7e715ee85 100644 --- a/include/sysfs.h +++ b/include/sysfs.h @@ -81,7 +81,7 @@ extern int sysfs_is_partition_dirent(DIR *dir, struct dirent *d, extern int sysfs_devno_to_wholedisk(dev_t dev, char *diskname, size_t len, dev_t *diskdevno); -extern int sysfs_devno_is_lvm_private(dev_t devno); +extern int sysfs_devno_is_lvm_private(dev_t devno, char **uuid); extern int sysfs_devno_is_wholedisk(dev_t devno); extern int sysfs_scsi_get_hctl(struct sysfs_cxt *cxt, int *h, diff --git a/lib/sysfs.c b/lib/sysfs.c index 68b43aaa3..e8125e511 100644 --- a/lib/sysfs.c +++ b/lib/sysfs.c @@ -833,31 +833,35 @@ err: } /* - * Returns 1 if the device is private LVM device. + * Returns 1 if the device is private LVM device. The @uuid (if not NULL) + * returns DM device UUID, use free() to deallocate. */ -int sysfs_devno_is_lvm_private(dev_t devno) +int sysfs_devno_is_lvm_private(dev_t devno, char **uuid) { struct sysfs_cxt cxt = UL_SYSFSCXT_EMPTY; - char *uuid = NULL; + char *id = NULL; int rc = 0; if (sysfs_init(&cxt, devno, NULL) != 0) return 0; - uuid = sysfs_strdup(&cxt, "dm/uuid"); + id = sysfs_strdup(&cxt, "dm/uuid"); /* Private LVM devices use "LVM-<uuid>-<name>" uuid format (important * is the "LVM" prefix and "-<name>" postfix). */ - if (uuid && strncmp(uuid, "LVM-", 4) == 0) { - char *p = strrchr(uuid + 4, '-'); + if (id && strncmp(id, "LVM-", 4) == 0) { + char *p = strrchr(id + 4, '-'); if (p && *(p + 1)) rc = 1; } sysfs_deinit(&cxt); - free(uuid); + if (uuid) + *uuid = id; + else + free(id); return rc; } diff --git a/libblkid/src/probe.c b/libblkid/src/probe.c index 9f56f528f..21cd790e9 100644 --- a/libblkid/src/probe.c +++ b/libblkid/src/probe.c @@ -862,6 +862,7 @@ int blkid_probe_set_device(blkid_probe pr, int fd, { struct stat sb; uint64_t devsiz = 0; + char *dm_uuid = NULL; blkid_reset_probe(pr); blkid_probe_reset_buffers(pr); @@ -925,7 +926,8 @@ int blkid_probe_set_device(blkid_probe pr, int fd, if (pr->size <= 1440 * 1024 && !S_ISCHR(sb.st_mode)) pr->flags |= BLKID_FL_TINY_DEV; - if (S_ISBLK(sb.st_mode) && sysfs_devno_is_lvm_private(sb.st_rdev)) { + if (S_ISBLK(sb.st_mode) && + sysfs_devno_is_lvm_private(sb.st_rdev, &dm_uuid)) { DBG(LOWPROBE, ul_debug("ignore private LVM device")); pr->flags |= BLKID_FL_NOSCAN_DEV; } @@ -933,6 +935,7 @@ int blkid_probe_set_device(blkid_probe pr, int fd, #ifdef CDROM_GET_CAPABILITY else if (S_ISBLK(sb.st_mode) && !blkid_probe_is_tiny(pr) && + !dm_uuid && blkid_probe_is_wholedisk(pr) && ioctl(fd, CDROM_GET_CAPABILITY, NULL) >= 0) { @@ -940,6 +943,7 @@ int blkid_probe_set_device(blkid_probe pr, int fd, cdrom_size_correction(pr); } #endif + free(dm_uuid); DBG(LOWPROBE, ul_debug("ready for low-probing, offset=%"PRIu64", size=%"PRIu64"", pr->off, pr->size)); diff --git a/libblkid/src/verify.c b/libblkid/src/verify.c index 412eb66ba..d84894b10 100644 --- a/libblkid/src/verify.c +++ b/libblkid/src/verify.c @@ -114,7 +114,7 @@ blkid_dev blkid_verify(blkid_cache cache, blkid_dev dev) (unsigned long)diff)); #endif - if (sysfs_devno_is_lvm_private(st.st_rdev)) { + if (sysfs_devno_is_lvm_private(st.st_rdev, NULL)) { blkid_free_dev(dev); return NULL; } |