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
qemuAddSharedDisk(virQEMUDriverPtr driver,
const char *disk_path)
virDomainDiskDefPtr disk)
{
size_t *ref = NULL;
char *key = NULL;
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);
if (!(key = qemuGetSharedDiskKey(disk_path)))
if (!(key = qemuGetSharedDiskKey(disk->src)))
goto cleanup;
if ((ref = virHashLookup(driver->sharedDisks, key))) {
@ -882,14 +890,18 @@ cleanup:
*/
int
qemuRemoveSharedDisk(virQEMUDriverPtr driver,
const char *disk_path)
virDomainDiskDefPtr disk)
{
size_t *ref = NULL;
char *key = NULL;
int ret = -1;
if (disk->type != VIR_DOMAIN_DISK_TYPE_BLOCK ||
!disk->shared || !disk->src)
return 0;
qemuDriverLock(driver);
if (!(key = qemuGetSharedDiskKey(disk_path)))
if (!(key = qemuGetSharedDiskKey(disk->src)))
goto cleanup;
if (!(ref = virHashLookup(driver->sharedDisks, key)))

View File

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

View File

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

View File

@ -3447,6 +3447,13 @@ qemuSetUnprivSGIO(virDomainDiskDefPtr disk)
{
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)
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"));
#endif
if (disk->type == VIR_DOMAIN_DISK_TYPE_BLOCK && disk->shared) {
if (qemuAddSharedDisk(driver, disk->src) < 0)
goto cleanup;
if (qemuAddSharedDisk(driver, disk) < 0)
goto cleanup;
if (qemuCheckSharedDisk(driver, disk) < 0)
goto cleanup;
}
if (qemuCheckSharedDisk(driver, disk) < 0)
goto cleanup;
if (qemuSetUnprivSGIO(disk) < 0)
goto cleanup;
@ -4283,10 +4288,7 @@ void qemuProcessStop(virQEMUDriverPtr driver,
for (i = 0; i < vm->def->ndisks; i++) {
virDomainDiskDefPtr disk = vm->def->disks[i];
if (disk->type == VIR_DOMAIN_DISK_TYPE_BLOCK && disk->shared) {
ignore_value(qemuRemoveSharedDisk(driver, disk->src));
}
ignore_value(qemuRemoveSharedDisk(driver, disk));
}
/* Clear out dynamically assigned labels */