28f4698a20
Fix floppy media change (bz #1341998)
120 lines
4.0 KiB
Diff
120 lines
4.0 KiB
Diff
From: Peter Krempa <pkrempa@redhat.com>
|
|
Date: Thu, 19 May 2016 15:29:02 +0200
|
|
Subject: [PATCH] qemu: process: Fix and improve disk data extraction
|
|
|
|
Extract information for all disks and update tray state and source only
|
|
for removable drives. Additionally store whether a drive is removable
|
|
and whether it has a tray.
|
|
|
|
(cherry picked from commit 894dc85fd1ebcd63d8c897b355c550e68a5f432d)
|
|
---
|
|
src/qemu/qemu_domain.h | 4 ++++
|
|
src/qemu/qemu_monitor.c | 18 ------------------
|
|
src/qemu/qemu_monitor.h | 3 ---
|
|
src/qemu/qemu_process.c | 28 +++++++++++++++-------------
|
|
4 files changed, 19 insertions(+), 34 deletions(-)
|
|
|
|
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
|
|
index fbf5b1c..15790ea 100644
|
|
--- a/src/qemu/qemu_domain.h
|
|
+++ b/src/qemu/qemu_domain.h
|
|
@@ -236,6 +236,10 @@ struct _qemuDomainDiskPrivate {
|
|
bool blockJobSync; /* the block job needs synchronized termination */
|
|
|
|
bool migrating; /* the disk is being migrated */
|
|
+
|
|
+ /* information about the device */
|
|
+ bool tray; /* device has tray */
|
|
+ bool removable; /* device media can be removed/changed */
|
|
};
|
|
|
|
struct qemuDomainDiskInfo {
|
|
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
|
|
index 96eac14..c994fec 100644
|
|
--- a/src/qemu/qemu_monitor.c
|
|
+++ b/src/qemu/qemu_monitor.c
|
|
@@ -1807,24 +1807,6 @@ qemuMonitorGetBlockInfo(qemuMonitorPtr mon)
|
|
}
|
|
|
|
|
|
-struct qemuDomainDiskInfo *
|
|
-qemuMonitorBlockInfoLookup(virHashTablePtr blockInfo,
|
|
- const char *dev)
|
|
-{
|
|
- struct qemuDomainDiskInfo *info;
|
|
-
|
|
- VIR_DEBUG("blockInfo=%p dev=%s", blockInfo, NULLSTR(dev));
|
|
-
|
|
- if (!(info = virHashLookup(blockInfo, dev))) {
|
|
- virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
- _("cannot find info for device '%s'"),
|
|
- NULLSTR(dev));
|
|
- }
|
|
-
|
|
- return info;
|
|
-}
|
|
-
|
|
-
|
|
/**
|
|
* qemuMonitorGetAllBlockStatsInfo:
|
|
* @mon: monitor object
|
|
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
|
|
index 7906361..1a9d009 100644
|
|
--- a/src/qemu/qemu_monitor.h
|
|
+++ b/src/qemu/qemu_monitor.h
|
|
@@ -385,9 +385,6 @@ int qemuMonitorSetMemoryStatsPeriod(qemuMonitorPtr mon,
|
|
|
|
int qemuMonitorBlockIOStatusToError(const char *status);
|
|
virHashTablePtr qemuMonitorGetBlockInfo(qemuMonitorPtr mon);
|
|
-struct qemuDomainDiskInfo *
|
|
-qemuMonitorBlockInfoLookup(virHashTablePtr blockInfo,
|
|
- const char *dev_name);
|
|
|
|
typedef struct _qemuBlockStats qemuBlockStats;
|
|
typedef qemuBlockStats *qemuBlockStatsPtr;
|
|
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
|
|
index f13d902..aa56ccd 100644
|
|
--- a/src/qemu/qemu_process.c
|
|
+++ b/src/qemu/qemu_process.c
|
|
@@ -6403,25 +6403,27 @@ qemuProcessRefreshDisks(virQEMUDriverPtr driver,
|
|
|
|
for (i = 0; i < vm->def->ndisks; i++) {
|
|
virDomainDiskDefPtr disk = vm->def->disks[i];
|
|
+ qemuDomainDiskPrivatePtr diskpriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
|
|
struct qemuDomainDiskInfo *info;
|
|
|
|
- if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK ||
|
|
- disk->device == VIR_DOMAIN_DISK_DEVICE_LUN) {
|
|
- continue;
|
|
- }
|
|
-
|
|
- info = qemuMonitorBlockInfoLookup(table, disk->info.alias);
|
|
- if (!info)
|
|
- goto cleanup;
|
|
+ if (!(info = virHashLookup(table, disk->info.alias)))
|
|
+ continue;
|
|
|
|
- if (info->tray_open) {
|
|
- if (virDomainDiskGetSource(disk))
|
|
+ if (info->removable) {
|
|
+ if (info->empty)
|
|
ignore_value(virDomainDiskSetSource(disk, NULL));
|
|
|
|
- disk->tray_status = VIR_DOMAIN_DISK_TRAY_OPEN;
|
|
- } else {
|
|
- disk->tray_status = VIR_DOMAIN_DISK_TRAY_CLOSED;
|
|
+ if (info->tray) {
|
|
+ if (info->tray_open)
|
|
+ disk->tray_status = VIR_DOMAIN_DISK_TRAY_OPEN;
|
|
+ else
|
|
+ disk->tray_status = VIR_DOMAIN_DISK_TRAY_CLOSED;
|
|
+ }
|
|
}
|
|
+
|
|
+ /* fill in additional data */
|
|
+ diskpriv->removable = info->removable;
|
|
+ diskpriv->tray = info->tray;
|
|
}
|
|
|
|
ret = 0;
|