[libvirt] [PATCH 3/3] qemu: Forbid migration with cache != none

Shu Ming shuming at linux.vnet.ibm.com
Wed Feb 22 06:58:31 UTC 2012


On 2012-2-22 0:17, Jiri Denemark wrote:
> Migrating domains with disks using cache != none is unsafe unless the
> disk images are stored on coherent clustered filesystem. Thus we forbid
> migrating such domains unless VIR_MIGRATE_UNSAFE flags is used.
> ---
>   src/qemu/qemu_driver.c    |    3 ++-
>   src/qemu/qemu_migration.c |   36 ++++++++++++++++++++++++++++++++----
>   src/qemu/qemu_migration.h |    6 ++++--
>   3 files changed, 38 insertions(+), 7 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 717bdf1..63a0703 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -8767,7 +8767,8 @@ qemuDomainMigrateBegin3(virDomainPtr domain,
>           goto endjob;
>
>       if (!(xml = qemuMigrationBegin(driver, vm, xmlin, dname,
> -                                   cookieout, cookieoutlen)))
> +                                   cookieout, cookieoutlen,
> +                                   flags)))
>           goto endjob;
>
>       if ((flags&  VIR_MIGRATE_CHANGE_PROTECTION)) {
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index f0af494..127b35c 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -817,6 +817,27 @@ qemuMigrationIsAllowed(struct qemud_driver *driver, virDomainObjPtr vm,
>       return true;
>   }
>
> +static bool
> +qemuMigrationIsSafe(virDomainDefPtr def)
> +{
> +    int i;
> +
> +    for (i = 0 ; i<  def->ndisks ; i++) {
> +        virDomainDiskDefPtr disk = def->disks[i];
> +
> +        /* shared&&  !readonly implies cache=none */
> +        if (disk->cachemode != VIR_DOMAIN_DISK_CACHE_DISABLE&&

how about disk write through flag here?  This flag should also imply 
cache=none.

i.e, VIR_DOMAIN_DISK_CACHE_WRITETHRU



> +            (disk->cachemode || !disk->shared || disk->readonly)) {
> +            qemuReportError(VIR_ERR_MIGRATE_UNSAFE, "%s",
> +                            _("Migration may lead to data corruption if disks"
> +                              " use cache != none"));
> +            return false;
> +        }
> +    }
> +
> +    return true;
> +}
> +
>   /** qemuMigrationSetOffline
>    * Pause domain for non-live migration.
>    */
> @@ -1010,7 +1031,8 @@ char *qemuMigrationBegin(struct qemud_driver *driver,
>                            const char *xmlin,
>                            const char *dname,
>                            char **cookieout,
> -                         int *cookieoutlen)
> +                         int *cookieoutlen,
> +                         unsigned long flags)
>   {
>       char *rv = NULL;
>       qemuMigrationCookiePtr mig = NULL;
> @@ -1018,9 +1040,9 @@ char *qemuMigrationBegin(struct qemud_driver *driver,
>       qemuDomainObjPrivatePtr priv = vm->privateData;
>
>       VIR_DEBUG("driver=%p, vm=%p, xmlin=%s, dname=%s,"
> -              " cookieout=%p, cookieoutlen=%p",
> +              " cookieout=%p, cookieoutlen=%p, flags=%lx",
>                 driver, vm, NULLSTR(xmlin), NULLSTR(dname),
> -              cookieout, cookieoutlen);
> +              cookieout, cookieoutlen, flags);
>
>       /* Only set the phase if we are inside QEMU_ASYNC_JOB_MIGRATION_OUT.
>        * Otherwise we will start the async job later in the perform phase losing
> @@ -1032,6 +1054,9 @@ char *qemuMigrationBegin(struct qemud_driver *driver,
>       if (!qemuMigrationIsAllowed(driver, vm, NULL))
>           goto cleanup;
>
> +    if (!(flags&  VIR_MIGRATE_UNSAFE)&&  !qemuMigrationIsSafe(vm->def))
> +        goto cleanup;
> +
>       if (!(mig = qemuMigrationEatCookie(driver, vm, NULL, 0, 0)))
>           goto cleanup;
>
> @@ -2070,7 +2095,7 @@ static int doPeer2PeerMigrate3(struct qemud_driver *driver,
>        * a single job.  */
>
>       dom_xml = qemuMigrationBegin(driver, vm, xmlin, dname,
> -&cookieout,&cookieoutlen);
> +&cookieout,&cookieoutlen, flags);
>       if (!dom_xml)
>           goto cleanup;
>
> @@ -2354,6 +2379,9 @@ qemuMigrationPerformJob(struct qemud_driver *driver,
>       if (!qemuMigrationIsAllowed(driver, vm, NULL))
>           goto cleanup;
>
> +    if (!(flags&  VIR_MIGRATE_UNSAFE)&&  !qemuMigrationIsSafe(vm->def))
> +        goto cleanup;
> +
>       resume = virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING;
>
>       if ((flags&  (VIR_MIGRATE_TUNNELLED | VIR_MIGRATE_PEER2PEER))) {
> diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h
> index f806ca1..41e4eac 100644
> --- a/src/qemu/qemu_migration.h
> +++ b/src/qemu/qemu_migration.h
> @@ -35,7 +35,8 @@
>        VIR_MIGRATE_PAUSED |                       \
>        VIR_MIGRATE_NON_SHARED_DISK |              \
>        VIR_MIGRATE_NON_SHARED_INC |               \
> -     VIR_MIGRATE_CHANGE_PROTECTION)
> +     VIR_MIGRATE_CHANGE_PROTECTION |            \
> +     VIR_MIGRATE_UNSAFE)
>
>   enum qemuMigrationJobPhase {
>       QEMU_MIGRATION_PHASE_NONE = 0,
> @@ -81,7 +82,8 @@ char *qemuMigrationBegin(struct qemud_driver *driver,
>                            const char *xmlin,
>                            const char *dname,
>                            char **cookieout,
> -                         int *cookieoutlen);
> +                         int *cookieoutlen,
> +                         unsigned long flags);
>
>   int qemuMigrationPrepareTunnel(struct qemud_driver *driver,
>                                  virConnectPtr dconn,


-- 
Shu Ming<shuming at linux.vnet.ibm.com>
IBM China Systems and Technology Laboratory





More information about the libvir-list mailing list