]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libblkid: don't use CDROM_GET_CAPABILITY ioctl for DM devices
authorKarel Zak <kzak@redhat.com>
Wed, 12 Jul 2017 12:35:53 +0000 (14:35 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 17 Jul 2017 09:46:09 +0000 (11:46 +0200)
For some reason kernel commit e980f62353c697cbf0c4325e43df6e44399aeb64
add extra warning when the ioctl is used for DM devices. It seems we
can avoid this ioctl when the device has dm/uuid.

Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1469532
Signed-off-by: Karel Zak <kzak@redhat.com>
disk-utils/fdisk-list.c
include/sysfs.h
lib/sysfs.c
libblkid/src/probe.c
libblkid/src/verify.c

index 0985bd51fb44a09424479e74ec684378c640367b..5adf3d116de1e7d39165123f37a3478f64ef3291 100644 (file)
@@ -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;
 
index 36d3cbd4f00f9565b98e1ba81f809c260ccd8d80..7e715ee8584e16bc3d14ece19d585a5fdbbf8298 100644 (file)
@@ -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,
index cc290faac49e893a228c3b909200c6f32cdd30c5..0bca2d9ee4f69b1cd2bd300d8e914622b1f11b8a 100644 (file)
@@ -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;
 }
 
index 7eaceac6d99a348c918f345165d515563877314f..4ccffd8f674122ef050f3be45f6c12ac6dabaadb 100644 (file)
@@ -801,6 +801,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_buffer(pr);
@@ -864,7 +865,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;
        }
@@ -872,6 +874,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) {
 
@@ -879,6 +882,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));
index 412eb66ba856611c1abad82fe5ade242f741a5c4..d84894b108af1748fadd18aada8a3e465466b01d 100644 (file)
@@ -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;
        }