[libvirt] [PATCH 2/6] qemu: Merge qemuCheckSharedDisk into qemuAddSharedDisk
John Ferlan
jferlan at redhat.com
Tue Feb 19 01:28:08 UTC 2013
On 02/13/2013 09:57 AM, Osier Yang wrote:
> Based on moving various checking into qemuAddSharedDisk, this
> avoids the caller using it in wrong ways.
> ---
> src/qemu/qemu_conf.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++
> src/qemu/qemu_driver.c | 5 ---
> src/qemu/qemu_process.c | 53 -------------------------------------
> src/qemu/qemu_process.h | 3 --
> 4 files changed, 66 insertions(+), 61 deletions(-)
>
> diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
> index d0ee80b..6e735c6 100644
> --- a/src/qemu/qemu_conf.c
> +++ b/src/qemu/qemu_conf.c
> @@ -821,6 +821,69 @@ qemuGetSharedDiskKey(const char *disk_path)
> return key;
> }
>
> +/* 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.
> + */
> +static int
> +qemuCheckSharedDisk(virHashTablePtr sharedDisks,
> + virDomainDiskDefPtr disk)
> +{
> + int val;
> + size_t *ref = NULL;
> + char *sysfs_path = NULL;
> + char *key = NULL;
> + int ret = 0;
> +
> + if (!(sysfs_path = virGetUnprivSGIOSysfsPath(disk->src, NULL))) {
> + ret = -1;
> + goto cleanup;
> + }
> +
> + /* It can't be conflict if unpriv_sgio is not supported
> + * by kernel.
> + */
> + if (!virFileExists(sysfs_path))
> + goto cleanup;
> +
> +
> + if (!(key = qemuGetSharedDiskKey(disk->src))) {
> + ret = -1;
> + goto cleanup;
> + }
> +
> + /* It can't be conflict if no other domain is
> + * is sharing it.
> + */
> + if (!(ref = virHashLookup(sharedDisks, key)))
> + goto cleanup;
The code you deleted below checked if (ref == (void)0x1) - so that's not
necessary now? "ref" isn't used as far as I can see (oh and of course
the next patch removes that).
> +
> + 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(sysfs_path);
> + VIR_FREE(key);
> + return ret;
> +}
> +
> /* Increase ref count if the entry already exists, otherwise
> * add a new entry.
> */
> @@ -840,6 +903,9 @@ qemuAddSharedDisk(virQEMUDriverPtr driver,
> !disk->shared || !disk->src)
> return 0;
>
> + if (qemuCheckSharedDisk(driver->sharedDisks, disk) < 0)
> + return -1;
> +
> if (!(key = qemuGetSharedDiskKey(disk->src)))
> goto cleanup;
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index f98bd9b..86f9674 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -5825,11 +5825,6 @@ qemuDomainAttachDeviceDiskLive(virConnectPtr conn,
> goto end;
> }
>
> - if (disk->type == VIR_DOMAIN_DISK_TYPE_BLOCK &&
> - disk->shared &&
> - (qemuCheckSharedDisk(driver, disk) < 0))
> - goto end;
> -
There's a lot of work going on in this module that all becomes for
naught if it's not a shared disk. In fact if we fail to add the disk in
this module, I also note that this code path would still call
qemuSetUnprivSGIO() (in the live case, if AddShared) - so if it's not a
sharable disk, then we're setting something we may expect to set, right?
> if (qemuDomainDetermineDiskChain(driver, disk, false) < 0)
> goto end;
>
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index 8425cbb..6ffb680 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -3556,56 +3556,6 @@ 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(virQEMUDriverPtr driver,
> - 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(driver->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,
> @@ -3962,9 +3912,6 @@ int qemuProcessStart(virConnectPtr conn,
> if (qemuAddSharedDisk(driver, disk) < 0)
> goto cleanup;
>
> - if (qemuCheckSharedDisk(driver, disk) < 0)
> - goto cleanup;
> -
> if (qemuSetUnprivSGIO(disk) < 0)
> goto cleanup;
> }
> diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h
> index cbdab24..7c620d4 100644
> --- a/src/qemu/qemu_process.h
> +++ b/src/qemu/qemu_process.h
> @@ -100,7 +100,4 @@ virBitmapPtr qemuPrepareCpumap(virQEMUDriverPtr driver,
> virBitmapPtr nodemask);
> int qemuSetUnprivSGIO(virDomainDiskDefPtr disk);
>
> -int qemuCheckSharedDisk(virQEMUDriverPtr driver,
> - virDomainDiskDefPtr disk);
> -
> #endif /* __QEMU_PROCESS_H__ */
>
More information about the libvir-list
mailing list