qemu: Add checking in helpers for sgio setting

This moves the various checking into the helpers, to avoid the
callers missing the checking.
This commit is contained in:
Osier Yang 2013-02-19 20:27:40 +08:00
parent 6ea7b3e8d1
commit dab878a861
4 changed files with 35 additions and 25 deletions

View File

@ -852,14 +852,22 @@ qemuGetSharedDiskKey(const char *disk_path)
*/ */
int int
qemuAddSharedDisk(virQEMUDriverPtr driver, qemuAddSharedDisk(virQEMUDriverPtr driver,
const char *disk_path) virDomainDiskDefPtr disk)
{ {
size_t *ref = NULL; size_t *ref = NULL;
char *key = NULL; char *key = NULL;
int ret = -1; int ret = -1;
/* Currently the only conflicts we have to care about
* for the shared disk is "sgio" setting, which is only
* valid for block disk.
*/
if (disk->type != VIR_DOMAIN_DISK_TYPE_BLOCK ||
!disk->shared || !disk->src)
return 0;
qemuDriverLock(driver); qemuDriverLock(driver);
if (!(key = qemuGetSharedDiskKey(disk_path))) if (!(key = qemuGetSharedDiskKey(disk->src)))
goto cleanup; goto cleanup;
if ((ref = virHashLookup(driver->sharedDisks, key))) { if ((ref = virHashLookup(driver->sharedDisks, key))) {
@ -882,14 +890,18 @@ cleanup:
*/ */
int int
qemuRemoveSharedDisk(virQEMUDriverPtr driver, qemuRemoveSharedDisk(virQEMUDriverPtr driver,
const char *disk_path) virDomainDiskDefPtr disk)
{ {
size_t *ref = NULL; size_t *ref = NULL;
char *key = NULL; char *key = NULL;
int ret = -1; int ret = -1;
if (disk->type != VIR_DOMAIN_DISK_TYPE_BLOCK ||
!disk->shared || !disk->src)
return 0;
qemuDriverLock(driver); qemuDriverLock(driver);
if (!(key = qemuGetSharedDiskKey(disk_path))) if (!(key = qemuGetSharedDiskKey(disk->src)))
goto cleanup; goto cleanup;
if (!(ref = virHashLookup(driver->sharedDisks, key))) if (!(ref = virHashLookup(driver->sharedDisks, key)))

View File

@ -273,11 +273,11 @@ void qemuDriverCloseCallbackRunAll(virQEMUDriverPtr driver,
virConnectPtr conn); virConnectPtr conn);
int qemuAddSharedDisk(virQEMUDriverPtr driver, int qemuAddSharedDisk(virQEMUDriverPtr driver,
const char *disk_path) virDomainDiskDefPtr disk)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
int qemuRemoveSharedDisk(virQEMUDriverPtr driver, int qemuRemoveSharedDisk(virQEMUDriverPtr driver,
const char *disk_path) virDomainDiskDefPtr disk)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
char * qemuGetSharedDiskKey(const char *disk_path) char * qemuGetSharedDiskKey(const char *disk_path)
ATTRIBUTE_NONNULL(1); ATTRIBUTE_NONNULL(1);

View File

@ -5771,11 +5771,9 @@ qemuDomainAttachDeviceDiskLive(virConnectPtr conn,
} }
if (ret == 0) { if (ret == 0) {
if (disk->type == VIR_DOMAIN_DISK_TYPE_BLOCK && disk->shared) { if (qemuAddSharedDisk(driver, disk) < 0)
if (qemuAddSharedDisk(driver, disk->src) < 0) VIR_WARN("Failed to add disk '%s' to shared disk table",
VIR_WARN("Failed to add disk '%s' to shared disk table", disk->src);
disk->src);
}
if (qemuSetUnprivSGIO(disk) < 0) if (qemuSetUnprivSGIO(disk) < 0)
VIR_WARN("Failed to set unpriv_sgio of disk '%s'", disk->src); VIR_WARN("Failed to set unpriv_sgio of disk '%s'", disk->src);
@ -5896,10 +5894,8 @@ qemuDomainDetachDeviceDiskLive(virQEMUDriverPtr driver,
break; break;
} }
if (ret == 0 && if (ret == 0) {
disk->type == VIR_DOMAIN_DISK_TYPE_BLOCK && if (qemuRemoveSharedDisk(driver, disk) < 0)
disk->shared) {
if (qemuRemoveSharedDisk(driver, disk->src) < 0)
VIR_WARN("Failed to remove disk '%s' from shared disk table", VIR_WARN("Failed to remove disk '%s' from shared disk table",
disk->src); disk->src);
} }

View File

@ -3447,6 +3447,13 @@ qemuSetUnprivSGIO(virDomainDiskDefPtr disk)
{ {
int val = -1; int val = -1;
/* "sgio" is only valid for block disk; cdrom
* and floopy disk can have empty source.
*/
if (disk->type != VIR_DOMAIN_DISK_TYPE_BLOCK ||
!disk->src)
return 0;
if (disk->sgio) if (disk->sgio)
val = (disk->sgio == VIR_DOMAIN_DISK_SGIO_UNFILTERED); val = (disk->sgio == VIR_DOMAIN_DISK_SGIO_UNFILTERED);
@ -3873,13 +3880,11 @@ int qemuProcessStart(virConnectPtr conn,
_("Raw I/O is not supported on this platform")); _("Raw I/O is not supported on this platform"));
#endif #endif
if (disk->type == VIR_DOMAIN_DISK_TYPE_BLOCK && disk->shared) { if (qemuAddSharedDisk(driver, disk) < 0)
if (qemuAddSharedDisk(driver, disk->src) < 0) goto cleanup;
goto cleanup;
if (qemuCheckSharedDisk(driver, disk) < 0) if (qemuCheckSharedDisk(driver, disk) < 0)
goto cleanup; goto cleanup;
}
if (qemuSetUnprivSGIO(disk) < 0) if (qemuSetUnprivSGIO(disk) < 0)
goto cleanup; goto cleanup;
@ -4283,10 +4288,7 @@ void qemuProcessStop(virQEMUDriverPtr driver,
for (i = 0; i < vm->def->ndisks; i++) { for (i = 0; i < vm->def->ndisks; i++) {
virDomainDiskDefPtr disk = vm->def->disks[i]; virDomainDiskDefPtr disk = vm->def->disks[i];
ignore_value(qemuRemoveSharedDisk(driver, disk));
if (disk->type == VIR_DOMAIN_DISK_TYPE_BLOCK && disk->shared) {
ignore_value(qemuRemoveSharedDisk(driver, disk->src));
}
} }
/* Clear out dynamically assigned labels */ /* Clear out dynamically assigned labels */