diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index e29df07124..825036cb1d 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -307,7 +307,9 @@ struct _qemuDomainDiskPrivate { struct qemuDomainDiskInfo { bool removable; bool locked; + bool tray; bool tray_open; + bool empty; int io_status; }; diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 64a87656d2..0508fe6d0c 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -1832,11 +1832,13 @@ int qemuMonitorJSONGetBlockInfo(qemuMonitorPtr mon, goto cleanup; } - /* Don't check for success here, because 'tray_open' is presented iff - * medium is ejected. - */ - ignore_value(virJSONValueObjectGetBoolean(dev, "tray_open", - &info->tray_open)); + /* 'tray_open' is present only if the device has a tray */ + if (virJSONValueObjectGetBoolean(dev, "tray_open", &info->tray_open) == 0) + info->tray = true; + + /* presence of 'inserted' notifies that a medium is in the device */ + if (!virJSONValueObjectGetObject(dev, "inserted")) + info->empty = true; /* Missing io-status indicates no error */ if ((status = virJSONValueObjectGetString(dev, "io-status"))) { diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index 229ccac504..87b1a8f4ae 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -114,6 +114,14 @@ const char *queryBlockReply = " }," " \"tray_open\": false," " \"type\": \"unknown\"" +" }," +" {" +" \"io-status\": \"ok\"," +" \"device\": \"drive-ide0-1-1\"," +" \"locked\": false," +" \"removable\": true," +" \"tray_open\": false," +" \"type\": \"unknown\"" " }" " ]," " \"id\": \"libvirt-10\"" @@ -1404,12 +1412,27 @@ testQemuMonitorJSONqemuMonitorJSONGetBlockInfo(const void *data) info->locked = true; info->removable = true; + info->tray = true; + if (virHashAddEntry(expectedBlockDevices, "ide0-1-0", info) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", "Unable to create expectedBlockDevices hash table"); goto cleanup; } + if (VIR_ALLOC(info) < 0) + goto cleanup; + + info->removable = true; + info->tray = true; + info->empty = true; + + if (virHashAddEntry(expectedBlockDevices, "ide0-1-1", info) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + "Unable to create expectedBlockDevices hash table"); + goto cleanup; + } + if (qemuMonitorTestAddItem(test, "query-block", queryBlockReply) < 0) goto cleanup;