From nobody Thu Apr 25 15:39:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1531302314086304.52665101815217; Wed, 11 Jul 2018 02:45:14 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1A1063082A26; Wed, 11 Jul 2018 09:45:12 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id D763B60BE4; Wed, 11 Jul 2018 09:45:11 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 42B323F64F; Wed, 11 Jul 2018 09:45:11 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w6B9j8pG010367 for ; Wed, 11 Jul 2018 05:45:08 -0400 Received: by smtp.corp.redhat.com (Postfix) id 38D372026D74; Wed, 11 Jul 2018 09:45:08 +0000 (UTC) Received: from hansolo.nay.redhat.com (wlan-69-196.nay.redhat.com [10.66.69.196]) by smtp.corp.redhat.com (Postfix) with ESMTP id C89992026D6B; Wed, 11 Jul 2018 09:45:05 +0000 (UTC) From: Han Han To: libvir-list@redhat.com Date: Wed, 11 Jul 2018 17:44:41 +0800 Message-Id: <20180711094442.18303-2-hhan@redhat.com> In-Reply-To: <20180711094442.18303-1-hhan@redhat.com> References: <20180711094442.18303-1-hhan@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-loop: libvir-list@redhat.com Cc: Han Han Subject: [libvirt] [PATCH v3 1/2] util: Refactor virFileIsCDROM to virFileCheckCDROM X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.45]); Wed, 11 Jul 2018 09:45:13 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Rename virFileIsCDROM to virFileCheckCDROM and add enum type virFileCDRomStatus of cdrom statuses. Add argument cd_status in virFileCheckCDROM filled with cdrom status. Now virFileCheckCDROM could be used to check the cdrom drive status such as no info, no disc, tray open, drive not ready or ok. Signed-off-by: Han Han --- src/libvirt_private.syms | 2 +- src/qemu/qemu_domain.c | 4 ++-- src/util/virfile.c | 41 ++++++++++++++++++++++++++++++++++------ src/util/virfile.h | 13 ++++++++++++- 4 files changed, 50 insertions(+), 10 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index e688981c3e..ea2452c235 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1789,6 +1789,7 @@ virFileActivateDirOverride; virFileBindMountDevice; virFileBuildPath; virFileCanonicalizePath; +virFileCheckCDROM; virFileChownFiles; virFileClose; virFileComparePaths; @@ -1811,7 +1812,6 @@ virFileGetMountSubtree; virFileHasSuffix; virFileInData; virFileIsAbsPath; -virFileIsCDROM; virFileIsDir; virFileIsExecutable; virFileIsLink; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index ed76495309..f443eb4d8f 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -7487,7 +7487,7 @@ void qemuDomainObjCheckDiskTaint(virQEMUDriverPtr dri= ver, =20 if (disk->device =3D=3D VIR_DOMAIN_DISK_DEVICE_CDROM && virStorageSourceGetActualType(disk->src) =3D=3D VIR_STORAGE_TYPE_B= LOCK && - disk->src->path && virFileIsCDROM(disk->src->path) =3D=3D 1) + disk->src->path && virFileCheckCDROM(disk->src->path, NULL) =3D=3D= 1) qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_CDROM_PASSTHROUGH, logCtxt); =20 @@ -8394,7 +8394,7 @@ qemuDomainDetermineDiskChain(virQEMUDriverPtr driver, if (disk->device =3D=3D VIR_DOMAIN_DISK_DEVICE_CDROM && src->format =3D=3D VIR_STORAGE_FILE_RAW && virStorageSourceIsBlockLocal(src) && - virFileIsCDROM(src->path) =3D=3D 1) + virFileCheckCDROM(src->path, NULL) =3D=3D 1) src->hostcdrom =3D true; =20 ret =3D 0; diff --git a/src/util/virfile.c b/src/util/virfile.c index 378d03ecf0..869499dc78 100644 --- a/src/util/virfile.c +++ b/src/util/virfile.c @@ -1990,19 +1990,22 @@ int virFileIsMountPoint(const char *file) =20 #if defined(__linux__) /** - * virFileIsCDROM: + * virFileCheckCDROM: * @path: File to check + * @cd_status: Filled with the status of the CDROM if non-NULL. See virFil= eCDRomStatus. * * 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. */ int -virFileIsCDROM(const char *path) +virFileCheckCDROM(const char *path, + virFileCDRomStatus *cd_status) { struct stat st; int fd; int ret =3D -1; + int status; =20 if ((fd =3D open(path, O_RDONLY | O_NONBLOCK)) < 0) goto cleanup; @@ -2016,10 +2019,35 @@ virFileIsCDROM(const char *path) } =20 /* Attempt to detect via a CDROM specific ioctl */ - if (ioctl(fd, CDROM_DRIVE_STATUS, CDSL_CURRENT) >=3D 0) - ret =3D 1; - else + status =3D ioctl(fd, CDROM_DRIVE_STATUS, CDSL_CURRENT); + + if (status < 0) { ret =3D 0; + goto cleanup; + } + + ret =3D 1; + + if (!cd_status) + goto cleanup; + + switch (status) { + case CDS_NO_INFO: + *cd_status =3D VIR_FILE_CDROM_NO_INFO; + break; + case CDS_NO_DISC: + *cd_status =3D VIR_FILE_CDROM_NO_DISC; + break; + case CDS_TRAY_OPEN: + *cd_status =3D VIR_FILE_CDROM_TRAY_OPEN; + break; + case CDS_DRIVE_NOT_READY: + *cd_status =3D VIR_FILE_CDROM_DRIVE_NOT_READY; + break; + case CDS_DISC_OK: + *cd_status =3D VIR_FILE_CDROM_DISC_OK; + break; + } =20 cleanup: VIR_FORCE_CLOSE(fd); @@ -2029,7 +2057,8 @@ virFileIsCDROM(const char *path) #else =20 int -virFileIsCDROM(const char *path) +virFileCheckCDROM(const char *path, + virFileCDRomStatus *cd_status) { if (STRPREFIX(path, "/dev/cd") || STRPREFIX(path, "/dev/acd")) diff --git a/src/util/virfile.h b/src/util/virfile.h index 6f1e802fde..767ee6ebaa 100644 --- a/src/util/virfile.h +++ b/src/util/virfile.h @@ -210,7 +210,18 @@ 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_IS_NOT_CDROM, + VIR_FILE_CDROM_DISC_OK, + VIR_FILE_CDROM_NO_INFO, + VIR_FILE_CDROM_NO_DISC, + VIR_FILE_CDROM_TRAY_OPEN, + VIR_FILE_CDROM_DRIVE_NOT_READY, +} virFileCDRomStatus; + +int virFileCheckCDROM(const char *path, + virFileCDRomStatus *cd_status) ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK; =20 int virFileGetMountSubtree(const char *mtabpath, --=20 2.17.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Thu Apr 25 15:39:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1531302323408190.90788386813563; Wed, 11 Jul 2018 02:45:23 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id BAAB43082146; Wed, 11 Jul 2018 09:45:21 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 7C5A65D9C9; Wed, 11 Jul 2018 09:45:21 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 082823D3BC; Wed, 11 Jul 2018 09:45:21 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w6B9jBCD010381 for ; Wed, 11 Jul 2018 05:45:11 -0400 Received: by smtp.corp.redhat.com (Postfix) id 6C7D72026D74; Wed, 11 Jul 2018 09:45:11 +0000 (UTC) Received: from hansolo.nay.redhat.com (wlan-69-196.nay.redhat.com [10.66.69.196]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7BCFE2026D6B; Wed, 11 Jul 2018 09:45:08 +0000 (UTC) From: Han Han To: libvir-list@redhat.com Date: Wed, 11 Jul 2018 17:44:42 +0800 Message-Id: <20180711094442.18303-3-hhan@redhat.com> In-Reply-To: <20180711094442.18303-1-hhan@redhat.com> References: <20180711094442.18303-1-hhan@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-loop: libvir-list@redhat.com Cc: Han Han Subject: [libvirt] [PATCH v3 2/2] storage: Improve error handling on cdrom backend X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.42]); Wed, 11 Jul 2018 09:45:22 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Implement virFileCheckCDROM in virStorageBackendVolOpen to check if cdrom backend is ready. Skip the error of cdrom not ready. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=3D1596096 Signed-off-by: Han Han --- src/storage/storage_util.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/storage/storage_util.c b/src/storage/storage_util.c index da99043e0a..08b625d136 100644 --- a/src/storage/storage_util.c +++ b/src/storage/storage_util.c @@ -1509,6 +1509,7 @@ virStorageBackendVolOpen(const char *path, struct sta= t *sb, int fd, mode =3D 0; char *base =3D last_component(path); bool noerror =3D (flags & VIR_STORAGE_VOL_OPEN_NOERROR); + virFileCDRomStatus cd_status; =20 if (lstat(path, sb) < 0) { if (errno =3D=3D ENOENT) { @@ -1545,6 +1546,13 @@ virStorageBackendVolOpen(const char *path, struct st= at *sb, return -1; } =20 + if (virFileCheckCDROM(path, &cd_status)) { + if (cd_status !=3D VIR_FILE_CDROM_DISC_OK) { + VIR_WARN("ignoring CDROM %s is not ready", path); + return -2; + } + } + /* O_NONBLOCK should only matter during open() for fifos and * sockets, which we already filtered; but using it prevents a * TOCTTOU race. However, later on we will want to read() the --=20 2.17.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list