[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [for-2.9 PATCH 1/3] 9pfs: clear migration blocker at se
From: |
李强 |
Subject: |
Re: [Qemu-devel] [for-2.9 PATCH 1/3] 9pfs: clear migration blocker at session reset |
Date: |
Sat, 1 Apr 2017 01:32:38 +0000 |
> -----Original Message-----
> From: Greg Kurz [mailto:address@hidden
> Sent: Friday, March 31, 2017 7:27 PM
> To: address@hidden
> 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 <address@hidden>
> ---
Reviewed-by: Li Qiang <address@hidden>
> 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);
> }
> }
>