[libvirt] [PATCH v4 1/2] util: Refactor virFileIsCDROM to virFileCheckCDROM
John Ferlan
jferlan at redhat.com
Tue Nov 6 17:17:43 UTC 2018
On 10/25/18 11:39 PM, Han Han wrote:
> Refactor virFileIsCDROM to virFileCheckCDROM for checking cdrom status.
> Add add enum type virFileCDRomStatus.
>
> Now virFileCheckCDROM could be used to check the cdrom drive status such
> as ok, no disc, tray open, drive not ready, or unknown.
>
> Signed-off-by: Han Han <hhan at redhat.com>
> ---
> src/libvirt_private.syms | 2 +-
> src/qemu/qemu_domain.c | 4 ++--
> src/util/virfile.c | 36 +++++++++++++++++++++++++++++++-----
> src/util/virfile.h | 12 +++++++++++-
> 4 files changed, 45 insertions(+), 9 deletions(-)
>
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 335210c31d..c61b613325 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1802,6 +1802,7 @@ virFileActivateDirOverride;
> virFileBindMountDevice;
> virFileBuildPath;
> virFileCanonicalizePath;
> +virFileCheckCDROM;
> virFileChownFiles;
> virFileClose;
> virFileComparePaths;
> @@ -1824,7 +1825,6 @@ virFileGetMountSubtree;
> virFileHasSuffix;
> virFileInData;
> virFileIsAbsPath;
> -virFileIsCDROM;
> virFileIsDir;
> virFileIsExecutable;
> virFileIsLink;
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index ba3fff607a..f34243d2b2 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -7806,7 +7806,7 @@ void qemuDomainObjCheckDiskTaint(virQEMUDriverPtr driver,
>
> if (disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM &&
> virStorageSourceGetActualType(disk->src) == VIR_STORAGE_TYPE_BLOCK &&
> - disk->src->path && virFileIsCDROM(disk->src->path) == 1)
> + disk->src->path && virFileCheckCDROM(disk->src->path, NULL) == 1)
> qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_CDROM_PASSTHROUGH,
> logCtxt);
>
> @@ -8760,7 +8760,7 @@ qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
> if (disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM &&
> src->format == VIR_STORAGE_FILE_RAW &&
> virStorageSourceIsBlockLocal(src) &&
> - virFileIsCDROM(src->path) == 1)
> + virFileCheckCDROM(src->path, NULL) == 1)
> src->hostcdrom = true;
>
> ret = 0;
> diff --git a/src/util/virfile.c b/src/util/virfile.c
> index f6f9e4ceda..04b4c274dd 100644
> --- a/src/util/virfile.c
> +++ b/src/util/virfile.c
> @@ -1957,18 +1957,22 @@ int virFileIsMountPoint(const char *file)
>
> #if defined(__linux__)
> /**
> - * virFileIsCDROM:
> + * virFileCheckCDROM:
> * @path: File to check
> + * @cd_status: Filled with the status of the CDROM if non-NULL. See
> + * virFileCDRomStatus.
> *
> * Returns 1 if @path is a cdrom device 0 if it is not a cdrom and -1 on
> * error. 'errno' of the failure is preserved and no libvirt errors are
> * reported.
Again @errno is not preserved, I'll replace that last sentence with:
If is up to the caller to use @cd_status in order to generate any error
to be reported (if desired).
> */
> int
> -virFileIsCDROM(const char *path)
> +virFileCheckCDROM(const char *path,
> + virFileCDRomStatus *cd_status)
> {
> struct stat st;
> VIR_AUTOCLOSE fd = -1;
> + int status;
>
> if ((fd = open(path, O_RDONLY | O_NONBLOCK)) < 0)
> return -1;
> @@ -1980,16 +1984,38 @@ virFileIsCDROM(const char *path)
> return 0;
>
> /* Attempt to detect via a CDROM specific ioctl */
> - if (ioctl(fd, CDROM_DRIVE_STATUS, CDSL_CURRENT) >= 0)
> + if ((status = ioctl(fd, CDROM_DRIVE_STATUS, CDSL_CURRENT)) < 0)
> + return 0;
> +
> + if (!cd_status)
> return 1;
>
> - return 0;
> + switch (status) {
> + case CDS_NO_INFO:
> + *cd_status = VIR_FILE_CDROM_UNKNOWN;
> + break;
I think perhaps this should be last *and* should included "default:"
(just in case).
> + case CDS_NO_DISC:
> + *cd_status = VIR_FILE_CDROM_NO_DISC;
> + break;
> + case CDS_TRAY_OPEN:
> + *cd_status = VIR_FILE_CDROM_TRAY_OPEN;
> + break;
> + case CDS_DRIVE_NOT_READY:
> + *cd_status = VIR_FILE_CDROM_DRIVE_NOT_READY;
> + break;
> + case CDS_DISC_OK:
> + *cd_status = VIR_FILE_CDROM_DISC_OK;
> + break;
> + }
> +
> + return 1;
> }
>
> #else
>
> int
> -virFileIsCDROM(const char *path)
> +virFileCheckCDROM(const char *path,
> + virFileCDRomStatus *cd_status ATTRIBUTE_UNUSED)
> {
Like I noted previously you could have :
if (cd_status)
*cd_status = VIR_FILE_CDROM_DISK_OK;
> if (STRPREFIX(path, "/dev/cd") ||
> STRPREFIX(path, "/dev/acd"))
Then before the return 0 added a:
if (cd_status)
*cd_status = VIR_FILE_CDROM_NO_DEVICE;
something new to add to your list below which could be handled by an
error message...
> diff --git a/src/util/virfile.h b/src/util/virfile.h
> index 0f7dece958..1e5127badb 100644
> --- a/src/util/virfile.h
> +++ b/src/util/virfile.h
> @@ -224,7 +224,17 @@ enum {
> int virFileIsSharedFSType(const char *path, int fstypes) ATTRIBUTE_NONNULL(1);
> int virFileIsSharedFS(const char *path) ATTRIBUTE_NONNULL(1);
> int virFileIsMountPoint(const char *file) ATTRIBUTE_NONNULL(1);
> -int virFileIsCDROM(const char *path)
> +
> +typedef enum {
> + VIR_FILE_CDROM_DISC_OK,
> + VIR_FILE_CDROM_UNKNOWN,
Order swap... Typically UNKNOWN is first... I can do that for you.
> + VIR_FILE_CDROM_NO_DISC,
> + VIR_FILE_CDROM_TRAY_OPEN,
> + VIR_FILE_CDROM_DRIVE_NOT_READY,
VIR_FILE_CDROM_NO_DEVICE,
I could make these changes for you, but in thinking about this, I'm not
sure the check added in patch2 is in the proper place.
John
> +} virFileCDRomStatus;
> +
> +int virFileCheckCDROM(const char *path,
> + virFileCDRomStatus *cd_status)
> ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
>
> int virFileGetMountSubtree(const char *mtabpath,
>
More information about the libvir-list
mailing list