mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-23 06:05:27 +00:00
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:
parent
6ea7b3e8d1
commit
dab878a861
@ -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)))
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user