[libvirt] Re: [PATCH 2/3] qemu: Break out function to check if we can create/define/restore
Cole Robinson
crobinso at redhat.com
Tue Nov 3 16:27:36 UTC 2009
On 11/02/2009 02:52 PM, Cole Robinson wrote:
> Signed-off-by: Cole Robinson <crobinso at redhat.com>
> ---
> src/qemu/qemu_driver.c | 151 +++++++++++++++++++-----------------------------
> 1 files changed, 59 insertions(+), 92 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 7eed356..e038887 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -2594,6 +2594,59 @@ cleanup:
> return dom;
> }
>
> +static int
> +qemudDomainCanCreate(virConnectPtr conn,
> + virDomainDefPtr def,
> + unsigned int check_active)
> +{
> + struct qemud_driver *driver = conn->privateData;
> + int ret = 0;
> + virDomainObjPtr vm = NULL;
> +
> + /* See if a VM with matching UUID already exists */
> + vm = virDomainFindByUUID(&driver->domains, def->uuid);
> + if (vm) {
> + /* UUID matches, but if names don't match, refuse it */
> + if (STRNEQ(vm->def->name, def->name)) {
> + char uuidstr[VIR_UUID_STRING_BUFLEN];
> + virUUIDFormat(vm->def->uuid, uuidstr);
> + qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
> + _("domain '%s' is already defined with uuid %s"),
> + vm->def->name, uuidstr);
> + goto cleanup;
> + }
> +
> + if (check_active) {
> + /* UUID & name match, but if VM is already active, refuse it */
> + if (virDomainObjIsActive(vm)) {
> + qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_INVALID,
> + _("domain is already active as '%s'"),
> + vm->def->name);
> + goto cleanup;
> + }
> + }
> +
> + virDomainObjUnlock(vm);
> + } else {
> + /* UUID does not match, but if a name matches, refuse it */
> + vm = virDomainFindByName(&driver->domains, def->name);
> + if (vm) {
> + char uuidstr[VIR_UUID_STRING_BUFLEN];
> + virUUIDFormat(vm->def->uuid, uuidstr);
> + qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
> + _("domain '%s' already exists with uuid %s"),
> + def->name, uuidstr);
> + goto cleanup;
> + }
> + }
> +
> + ret = 1;
> +cleanup:
> + if (vm)
> + virDomainObjUnlock(vm);
> + return ret;
> +}
> +
> static int qemudGetVersion(virConnectPtr conn, unsigned long *version) {
> struct qemud_driver *driver = conn->privateData;
> int ret = -1;
> @@ -2648,38 +2701,8 @@ static virDomainPtr qemudDomainCreate(virConnectPtr conn, const char *xml,
> if (virSecurityDriverVerify(conn, def) < 0)
> goto cleanup;
>
> - /* See if a VM with matching UUID already exists */
> - vm = virDomainFindByUUID(&driver->domains, def->uuid);
> - if (vm) {
> - /* UUID matches, but if names don't match, refuse it */
> - if (STRNEQ(vm->def->name, def->name)) {
> - char uuidstr[VIR_UUID_STRING_BUFLEN];
> - virUUIDFormat(vm->def->uuid, uuidstr);
> - qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
> - _("domain '%s' is already defined with uuid %s"),
> - vm->def->name, uuidstr);
> - goto cleanup;
> - }
> -
> - /* UUID & name match, but if VM is already active, refuse it */
> - if (virDomainObjIsActive(vm)) {
> - qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
> - _("domain is already active as '%s'"), vm->def->name);
> - goto cleanup;
> - }
> - virDomainObjUnlock(vm);
> - } else {
> - /* UUID does not match, but if a name matches, refuse it */
> - vm = virDomainFindByName(&driver->domains, def->name);
> - if (vm) {
> - char uuidstr[VIR_UUID_STRING_BUFLEN];
> - virUUIDFormat(vm->def->uuid, uuidstr);
> - qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
> - _("domain '%s' is already defined with uuid %s"),
> - def->name, uuidstr);
> - goto cleanup;
> - }
> - }
> + if (!qemudDomainCanCreate(conn, def, 1))
> + goto cleanup;
>
> if (!(vm = virDomainAssignDef(conn,
> driver->caps,
> @@ -3709,38 +3732,8 @@ static int qemudDomainRestore(virConnectPtr conn,
> goto cleanup;
> }
>
> - /* See if a VM with matching UUID already exists */
> - vm = virDomainFindByUUID(&driver->domains, def->uuid);
> - if (vm) {
> - /* UUID matches, but if names don't match, refuse it */
> - if (STRNEQ(vm->def->name, def->name)) {
> - char uuidstr[VIR_UUID_STRING_BUFLEN];
> - virUUIDFormat(vm->def->uuid, uuidstr);
> - qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
> - _("domain '%s' is already defined with uuid %s"),
> - vm->def->name, uuidstr);
> - goto cleanup;
> - }
> -
> - /* UUID & name match, but if VM is already active, refuse it */
> - if (virDomainObjIsActive(vm)) {
> - qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_INVALID,
> - _("domain is already active as '%s'"), vm->def->name);
> - goto cleanup;
> - }
> - virDomainObjUnlock(vm);
> - } else {
> - /* UUID does not match, but if a name matches, refuse it */
> - vm = virDomainFindByName(&driver->domains, def->name);
> - if (vm) {
> - char uuidstr[VIR_UUID_STRING_BUFLEN];
> - virUUIDFormat(vm->def->uuid, uuidstr);
> - qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
> - _("domain '%s' is already defined with uuid %s"),
> - def->name, uuidstr);
> - goto cleanup;
> - }
> - }
> + if (!qemudDomainCanCreate(conn, def, 1))
> + goto cleanup;
>
> if (!(vm = virDomainAssignDef(conn,
> driver->caps,
> @@ -4197,34 +4190,8 @@ static virDomainPtr qemudDomainDefine(virConnectPtr conn, const char *xml) {
> if (virSecurityDriverVerify(conn, def) < 0)
> goto cleanup;
>
> - /* See if a VM with matching UUID already exists */
> - vm = virDomainFindByUUID(&driver->domains, def->uuid);
> - if (vm) {
> - /* UUID matches, but if names don't match, refuse it */
> - if (STRNEQ(vm->def->name, def->name)) {
> - char uuidstr[VIR_UUID_STRING_BUFLEN];
> - virUUIDFormat(vm->def->uuid, uuidstr);
> - qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
> - _("domain '%s' is already defined with uuid %s"),
> - vm->def->name, uuidstr);
> - goto cleanup;
> - }
> -
> - /* UUID & name match */
> - virDomainObjUnlock(vm);
> - newVM = 0;
Just noticed that the above line is dropped in this change. I'll send a
fixed patch.
- Cole
More information about the libvir-list
mailing list