On Fri, Nov 11, 2022 at 03:24:18PM +0100, Laszlo Ersek wrote:
Hi Rich,
On 11/09/22 14:52, Laszlo Ersek wrote:
A SCSI floppy drive with no disk inserted looks like a normal /dev/sd* node, but causes the nbdkit file plugin to fail with ENOMEDIUM. Filter out such devices altogether -- unlike CD-ROMs (for which we create a device model in the target, albeit with no medium inserted), empty floppies should not be converted in any way.
https://bugzilla.redhat.com/show_bug.cgi?id=2140997 Signed-off-by: Laszlo Ersek <lersek@redhat.com> ---
Notes: This patch still needs testing; the ISO image is at <http://lacos.interhost.hu/exclude-floppies-rhbz-2140997/b19895a5acd1/livecd-p2v-202211091434.iso>, sha256 sum: b0666a9140b03e12829982179bf7da2ac5477737fb53760d2e8c527d8a2bf55a.
disks.c | 58 ++++++++++++++++++++ 1 file changed, 58 insertions(+)
diff --git a/disks.c b/disks.c index 4eb006246d84..aafe467f9e9a 100644 --- a/disks.c +++ b/disks.c @@ -20,6 +20,7 @@ #include <dirent.h> #include <errno.h> #include <error.h> +#include <fcntl.h> #include <inttypes.h> #include <stdio.h> #include <stdlib.h> @@ -67,6 +68,57 @@ partition_parent (dev_t part_dev) return makedev (parent_major, parent_minor); }
+/** + * Return true if the named device (eg. C<dev == "sda">) is a Removable Media + * SCSI Disk with no media inserted. This covers floppy drives, but not CD-ROM + * drives (intentionally). + */ +static int +device_has_no_media (const char *dev) +{ + int ret; + gchar *sysfs_pathname; + gchar *sysfs_contents; + gsize sysfs_size; + gchar *dev_pathname; + int dev_fd; + + ret = 0; + + if (!STRPREFIX (dev, "sd")) + return ret; + + sysfs_pathname = g_strdup_printf ("/sys/block/%s/removable", dev); + + if (!g_file_get_contents (sysfs_pathname, &sysfs_contents, &sysfs_size, NULL)) + goto free_sysfs_pathname; + + if (sysfs_size < 2 || sysfs_contents[0] != '1' || sysfs_contents[1] != '\n') + goto free_sysfs_contents; + + dev_pathname = g_strdup_printf ("/dev/%s", dev); + + dev_fd = open (dev_pathname, O_RDONLY | O_CLOEXEC); + if (dev_fd == -1) { + if (errno == ENOMEDIUM) + ret = 1; + + goto free_dev_pathname; + } + close (dev_fd); + +free_dev_pathname: + g_free (dev_pathname); + +free_sysfs_contents: + g_free (sysfs_contents); + +free_sysfs_pathname: + g_free (sysfs_pathname); + + return ret; +} + /** * Return true if the named device (eg. C<dev == "sda">) contains the * root filesystem. C<root_device> is the major:minor of the root @@ -139,6 +191,12 @@ find_all_disks (char ***disks, char ***removable) STRPREFIX (d->d_name, "ubd") || STRPREFIX (d->d_name, "vd")) { char *p; + /* Skip SCSI disk drives with removable media that have no media inserted + * -- effectively, empty floppy drives. Note that SCSI CD-ROMs are named + * C<sr*> and thus handled on the other branch. + */ + if (device_has_no_media (d->d_name)) + continue;
/* Skip the device containing the root filesystem. */ if (device_contains (d->d_name, root_device)) _______________________________________________ Libguestfs mailing list Libguestfs@redhat.com https://listman.redhat.com/mailman/listinfo/libguestfs
Tingting and Vera have verified this patch, in <https://bugzilla.redhat.com/show_bug.cgi?id=2140997>. Are you OK with the patch? (Sorry for asking if it has been on your radar already!)
I was on holiday! Patch looks fine though, so ACK. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com virt-top is 'top' for virtual machines. Tiny program with many powerful monitoring features, net stats, disk stats, logging, etc. http://people.redhat.com/~rjones/virt-top