On Tue, Jul 03, 2018 at 10:29:39 +0800, Han Han wrote:
Implement virFileCdromStatus() in virStorageBackendVolOpen to show
detailed errors or warnings of cdrom instead of general Input/output error.
Resolves:
https://bugzilla.redhat.com/show_bug.cgi?id=1596096
Signed-off-by: Han Han <hhan(a)redhat.com>
---
src/storage/storage_util.c | 38 ++++++++++++++++++++++++++++++++++++++
1 file changed, 38 insertions(+)
diff --git a/src/storage/storage_util.c b/src/storage/storage_util.c
index a701a75702..5a7ed4c76f 100644
--- a/src/storage/storage_util.c
+++ b/src/storage/storage_util.c
@@ -1538,6 +1538,44 @@ virStorageBackendVolOpen(const char *path, struct stat *sb,
return -1;
}
+ if (virFileIsCDROM(path) == 1) {
+ switch (virFileCdromStatus(path)) {
+ case VIR_FILE_CDROM_NO_INFO :
I think this is such a corner case that it does not make sense to
provide as detailed error messages as you can see below.
Treating this as any other storage volume which is lacking the backing
file should be sufficient. That means that it might be required to skip
the error in case of the CDROM but reporting this status is IMO overkill
and definitely not worth the code complexity.
+ if (noerror) {
+ VIR_WARN("ignoring unavailable information of %s", path);
+ return -2;
+ }
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Cdrom %s information is unavailable"),
path);
+ return -1;
+ case VIR_FILE_CDROM_NO_DISC :
+ if (noerror) {
+ VIR_WARN("ignoring no disc %s", path);
+ return -2;
+ }
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Cdrom %s has no disc"), path);
+ return -1;
+ case VIR_FILE_CDROM_TREY_OPEN :
+ if (noerror) {
+ VIR_WARN("ignoring trey open of %s", path);
+ return -2;
+ }
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Cdrom %s is on trey-open status"), path);
+ return -1;
+ case VIR_FILE_CDROM_DRIVE_NOT_READY :
+ if (noerror) {
+ VIR_WARN("ignoring %s not ready", path);
+ return -2;
+ }
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Cdrom %s is on not ready"), path);
+ return -1;
+ case VIR_FILE_CDROM_DISC_OK :
+ VIR_INFO("Cdrom %s status is ok", path);
+ }
+ }
/* 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
--
2.17.1
--
libvir-list mailing list
libvir-list(a)redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list