summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--disk-utils/fdisk-list.c2
-rw-r--r--include/sysfs.h2
-rw-r--r--lib/sysfs.c18
-rw-r--r--libblkid/src/probe.c6
-rw-r--r--libblkid/src/verify.c2
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;
}