[Libguestfs] [p2v PATCH] disks.c: skip SCSI floppy drives with no disk inserted
Laszlo Ersek
lersek at redhat.com
Tue Nov 15 14:26:32 UTC 2022
On 11/15/22 11:35, Richard W.M. Jones wrote:
> 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 at 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 at 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!
Oops, apologies. :)
> Patch looks fine though, so ACK.
Commit 2082cf98add8.
Thanks!
Laszlo
More information about the Libguestfs
mailing list