libblkid: check for medium on CDMROMs probing

The commit 39f5af2598 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 <kzak@redhat.com>
This commit is contained in:
Karel Zak 2020-01-07 16:48:34 +01:00
parent 4ae96cf77b
commit dc30fd4383
2 changed files with 13 additions and 1 deletions

View File

@ -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);
}

View File

@ -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);