libblkid: don't use CDROM_GET_CAPABILITY ioctl for DM devices
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>
This commit is contained in:
parent
288acb4eee
commit
884659b32a
|
@ -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;
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
18
lib/sysfs.c
18
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue