diff mbox series

[1/1] Avoid migration if guest is in postmigrated status

Message ID 20201209072029.2338351-1-li.zhang@cloud.ionos.com
State New
Headers show
Series [1/1] Avoid migration if guest is in postmigrated status | expand

Commit Message

Li Zhang Dec. 9, 2020, 7:20 a.m. UTC
This patch is to avoid executing migrations twice, which causes
coredump. After the migration has been completed, guest is in postmigrated
status on source host and the block device is inactive. If executing 
migration again, it will cause coredump and a block error. For exmaple, 
executing #migrate "exec:cat>file" twice on source host, block error:
bdrv_inactivate_recurse: Assertion `!(bs->open_flags & BDRV_O_INACTIVE)' failed

Signed-off-by: Li Zhang <li.zhang@cloud.ionos.com>
---
 migration/migration.c | 5 +++++
 1 file changed, 5 insertions(+)

Comments

David Edmondson Dec. 9, 2020, 9:23 a.m. UTC | #1
On Wednesday, 2020-12-09 at 07:20:29 GMT, Li Zhang wrote:

> This patch is to avoid executing migrations twice, which causes
> coredump. After the migration has been completed, guest is in postmigrated
> status on source host and the block device is inactive. If executing 
> migration again, it will cause coredump and a block error. For exmaple, 
> executing #migrate "exec:cat>file" twice on source host, block error:
> bdrv_inactivate_recurse: Assertion `!(bs->open_flags & BDRV_O_INACTIVE)' failed
>
> Signed-off-by: Li Zhang <li.zhang@cloud.ionos.com>

There is an existing proposal for this (the same approach) in
https://lore.kernel.org/r/6b704294ad2e405781c38fb38d68c744@h3c.com.

> ---
>  migration/migration.c | 5 +++++
>  1 file changed, 5 insertions(+)
>
> diff --git a/migration/migration.c b/migration/migration.c
> index 87a9b59f83..113f7e1e41 100644
> --- a/migration/migration.c
> +++ b/migration/migration.c
> @@ -2115,6 +2115,11 @@ static bool migrate_prepare(MigrationState *s, bool blk, bool blk_inc,
>          return false;
>      }
>  
> +    if (runstate_check(RUN_STATE_POSTMIGRATE)) {
> +        error_setg(errp, "Unable to migrate, guest has been migrated");
> +        return false;
> +    }
> +
>      if (migration_is_blocked(errp)) {
>          return false;
>      }
> -- 
> 2.18.4

dme.
Li Zhang Dec. 9, 2020, 9:55 a.m. UTC | #2
Thanks for telling me that. I didn't notice this patch.
I just caught this error when I used it and read the source code, it should
be fixed.

Thanks
Li

On Wed, Dec 9, 2020 at 5:23 PM David Edmondson <dme@dme.org> wrote:

> On Wednesday, 2020-12-09 at 07:20:29 GMT, Li Zhang wrote:
>
> > This patch is to avoid executing migrations twice, which causes
> > coredump. After the migration has been completed, guest is in
> postmigrated
> > status on source host and the block device is inactive. If executing
> > migration again, it will cause coredump and a block error. For exmaple,
> > executing #migrate "exec:cat>file" twice on source host, block error:
> > bdrv_inactivate_recurse: Assertion `!(bs->open_flags & BDRV_O_INACTIVE)'
> failed
> >
> > Signed-off-by: Li Zhang <li.zhang@cloud.ionos.com>
>
> There is an existing proposal for this (the same approach) in
> https://lore.kernel.org/r/6b704294ad2e405781c38fb38d68c744@h3c.com.
>
> > ---
> >  migration/migration.c | 5 +++++
> >  1 file changed, 5 insertions(+)
> >
> > diff --git a/migration/migration.c b/migration/migration.c
> > index 87a9b59f83..113f7e1e41 100644
> > --- a/migration/migration.c
> > +++ b/migration/migration.c
> > @@ -2115,6 +2115,11 @@ static bool migrate_prepare(MigrationState *s,
> bool blk, bool blk_inc,
> >          return false;
> >      }
> >
> > +    if (runstate_check(RUN_STATE_POSTMIGRATE)) {
> > +        error_setg(errp, "Unable to migrate, guest has been migrated");
> > +        return false;
> > +    }
> > +
> >      if (migration_is_blocked(errp)) {
> >          return false;
> >      }
> > --
> > 2.18.4
>
> dme.
> --
> Ah, oh your hair is beautiful.
>
diff mbox series

Patch

diff --git a/migration/migration.c b/migration/migration.c
index 87a9b59f83..113f7e1e41 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -2115,6 +2115,11 @@  static bool migrate_prepare(MigrationState *s, bool blk, bool blk_inc,
         return false;
     }
 
+    if (runstate_check(RUN_STATE_POSTMIGRATE)) {
+        error_setg(errp, "Unable to migrate, guest has been migrated");
+        return false;
+    }
+
     if (migration_is_blocked(errp)) {
         return false;
     }