mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
qemu: Check if the shared disk's cdbfilter conflicts with others
This prevents domain starting and disk attaching if the shared disk's setting conflicts with other active domain(s), E.g. A domain with "sgio" set as "filtered", however, another active domain is using it set as "unfiltered".
This commit is contained in:
parent
278f87c4b5
commit
1279e421b2
@ -5814,6 +5814,11 @@ qemuDomainAttachDeviceDiskLive(virConnectPtr conn,
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (disk->type == VIR_DOMAIN_DISK_TYPE_BLOCK &&
|
||||
disk->shared &&
|
||||
(qemuCheckSharedDisk(driver->sharedDisks, disk) < 0))
|
||||
goto end;
|
||||
|
||||
if (qemuDomainDetermineDiskChain(driver, disk, false) < 0)
|
||||
goto end;
|
||||
|
||||
|
@ -3437,6 +3437,56 @@ qemuSetUnprivSGIO(virDomainDiskDefPtr disk)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Check if a shared disk's setting conflicts with the conf
|
||||
* used by other domain(s). Currently only checks the sgio
|
||||
* setting. Note that this should only be called for disk with
|
||||
* block source.
|
||||
*
|
||||
* Returns 0 if no conflicts, otherwise returns -1.
|
||||
*/
|
||||
int
|
||||
qemuCheckSharedDisk(virHashTablePtr sharedDisks,
|
||||
virDomainDiskDefPtr disk)
|
||||
{
|
||||
int val;
|
||||
size_t *ref = NULL;
|
||||
char *key = NULL;
|
||||
int ret = 0;
|
||||
|
||||
if (!(key = qemuGetSharedDiskKey(disk->src)))
|
||||
return -1;
|
||||
|
||||
/* It can't be conflict if no other domain is
|
||||
* is sharing it.
|
||||
*/
|
||||
if (!(ref = virHashLookup(sharedDisks, key)))
|
||||
goto cleanup;
|
||||
|
||||
if (ref == (void *)0x1)
|
||||
goto cleanup;
|
||||
|
||||
if (virGetDeviceUnprivSGIO(disk->src, NULL, &val) < 0) {
|
||||
ret = -1;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if ((val == 0 &&
|
||||
(disk->sgio == VIR_DOMAIN_DISK_SGIO_FILTERED ||
|
||||
disk->sgio == VIR_DOMAIN_DISK_SGIO_DEFAULT)) ||
|
||||
(val == 1 &&
|
||||
disk->sgio == VIR_DOMAIN_DISK_SGIO_UNFILTERED))
|
||||
goto cleanup;
|
||||
|
||||
virReportError(VIR_ERR_OPERATION_INVALID,
|
||||
_("sgio of shared disk '%s' conflicts with other "
|
||||
"active domains"), disk->src);
|
||||
ret = -1;
|
||||
|
||||
cleanup:
|
||||
VIR_FREE(key);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int qemuProcessStart(virConnectPtr conn,
|
||||
virQEMUDriverPtr driver,
|
||||
virDomainObjPtr vm,
|
||||
@ -3785,6 +3835,9 @@ int qemuProcessStart(virConnectPtr conn,
|
||||
if (disk->type == VIR_DOMAIN_DISK_TYPE_BLOCK && disk->shared) {
|
||||
if (qemuAddSharedDisk(driver->sharedDisks, disk->src) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (qemuCheckSharedDisk(driver->sharedDisks, disk) < 0)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (qemuSetUnprivSGIO(disk) < 0)
|
||||
|
@ -100,4 +100,7 @@ virBitmapPtr qemuPrepareCpumap(virQEMUDriverPtr driver,
|
||||
virBitmapPtr nodemask);
|
||||
int qemuSetUnprivSGIO(virDomainDiskDefPtr disk);
|
||||
|
||||
int qemuCheckSharedDisk(virHashTablePtr sharedDisks,
|
||||
virDomainDiskDefPtr disk);
|
||||
|
||||
#endif /* __QEMU_PROCESS_H__ */
|
||||
|
Loading…
x
Reference in New Issue
Block a user