> -----Original Message-----
> From: Greg Kurz [mailto:gr...@kaod.org]
> Sent: Friday, March 31, 2017 7:27 PM
> To: qemu-devel@nongnu.org
> Cc: Eric Blake; 李强; Greg Kurz
> Subject: [for-2.9 PATCH 1/3] 9pfs: clear migration blocker at session reset
> 
> The migration blocker survives a device reset: if the guest mounts a 9p share
> and then gets rebooted with system_reset, it will be unmigratable until it
> remounts and umounts the 9p share again.
> 
> This happens because the migration blocker is supposed to be cleared when we
> put the last reference on the root fid, but virtfs_reset() wrongly calls
> free_fid() instead of put_fid().
> 
> This patch fixes virtfs_reset() so that it honor the way fids are supposed to 
> be
> manipulated: first get a reference and later put it back when you're done.
> 
> Signed-off-by: Greg Kurz <gr...@kaod.org>
> ---

Reviewed-by: Li Qiang <liqiang...@360.cn>

>  hw/9pfs/9p.c |   11 ++++++-----
>  1 file changed, 6 insertions(+), 5 deletions(-)
> 
> diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c index 48babce836b6..cc109367b030
> 100644
> --- a/hw/9pfs/9p.c
> +++ b/hw/9pfs/9p.c
> @@ -539,14 +539,15 @@ static void coroutine_fn virtfs_reset(V9fsPDU *pdu)
> 
>      /* Free all fids */
>      while (s->fid_list) {
> +        /* Get fid */
>          fidp = s->fid_list;
> +        fidp->ref++;
> +
> +        /* Clunk fid */
>          s->fid_list = fidp->next;
> +        fidp->clunked = 1;
> 
> -        if (fidp->ref) {
> -            fidp->clunked = 1;
> -        } else {
> -            free_fid(pdu, fidp);
> -        }
> +        put_fid(pdu, fidp);
>      }
>  }
> 

Reply via email to