mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06: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
|
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)))
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user