From: Karel Zak Date: Tue, 7 Jan 2020 15:48:34 +0000 (+0100) Subject: libblkid: check for medium on CDMROMs probing X-Git-Tag: v2.35-rc2~6 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=dc30fd4383e57a0440cdb0e16ba5c4336a43b290;p=thirdparty%2Futil-linux.git libblkid: check for medium on CDMROMs probing The commit 39f5af25982d8b0244000e92a9d0e0e6557d0e17 introduces O_NONBLOCK to avoid the tray close on open(). The side effect is that open() is successful when there is no medium. This is usually no problem for standard tools because the next read() will fail. Unfortunately, libblkid ignores I/O errors for (and only for) CDROMs to support some crazy hybrid data+audio disks. The final result is many I/O errors in system log when O_NONBLOCK is enabled. This patch add CDROM_DRIVE_STATUS to stop probing when there is no disk or when the tray is open. Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1787973 Signed-off-by: Karel Zak --- diff --git a/libblkid/src/probe.c b/libblkid/src/probe.c index f6dd5573d5..871cd9bf21 100644 --- a/libblkid/src/probe.c +++ b/libblkid/src/probe.c @@ -945,6 +945,14 @@ int blkid_probe_set_device(blkid_probe pr, int fd, blkid_probe_is_wholedisk(pr) && ioctl(fd, CDROM_GET_CAPABILITY, NULL) >= 0) { +# ifdef CDROM_DRIVE_STATUS + switch (ioctl(fd, CDROM_DRIVE_STATUS, 0)) { + case CDS_TRAY_OPEN: + case CDS_NO_DISC: + errno = ENOMEDIUM; + goto err; + } +# endif pr->flags |= BLKID_FL_CDROM_DEV; cdrom_size_correction(pr); } diff --git a/misc-utils/blkid.c b/misc-utils/blkid.c index 0df9f6b6f2..88a90578b0 100644 --- a/misc-utils/blkid.c +++ b/misc-utils/blkid.c @@ -504,8 +504,12 @@ static int lowprobe_device(blkid_probe pr, const char *devname, warn(_("error: %s"), devname); return BLKID_EXIT_NOTFOUND; } - if (blkid_probe_set_device(pr, fd, ctl->offset, ctl->size)) + errno = 0; + if (blkid_probe_set_device(pr, fd, ctl->offset, ctl->size)) { + if (errno) + warn(_("error: %s"), devname); goto done; + } if (ctl->lowprobe_topology) rc = lowprobe_topology(pr);