From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:42271) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V5AgP-0003Id-NE for qemu-devel@nongnu.org; Fri, 02 Aug 2013 04:26:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1V5AgG-0001Ps-G3 for qemu-devel@nongnu.org; Fri, 02 Aug 2013 04:25:57 -0400 Received: from e28smtp01.in.ibm.com ([122.248.162.1]:53328) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V5AgF-0001Ot-MN for qemu-devel@nongnu.org; Fri, 02 Aug 2013 04:25:48 -0400 Received: from /spool/local by e28smtp01.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 2 Aug 2013 13:47:30 +0530 Received: from d28relay02.in.ibm.com (d28relay02.in.ibm.com [9.184.220.59]) by d28dlp01.in.ibm.com (Postfix) with ESMTP id 6E0E8E0053 for ; Fri, 2 Aug 2013 13:55:51 +0530 (IST) Received: from d28av05.in.ibm.com (d28av05.in.ibm.com [9.184.220.67]) by d28relay02.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r728Qlxf37421112 for ; Fri, 2 Aug 2013 13:56:48 +0530 Received: from d28av05.in.ibm.com (localhost [127.0.0.1]) by d28av05.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id r728PdnW012311 for ; Fri, 2 Aug 2013 13:55:39 +0530 Message-ID: <51FB6CD8.5050604@linux.vnet.ibm.com> Date: Fri, 02 Aug 2013 16:24:56 +0800 From: Wenchao Xia MIME-Version: 1.0 References: <1375265640-27307-1-git-send-email-famz@redhat.com> <1375265640-27307-7-git-send-email-famz@redhat.com> In-Reply-To: <1375265640-27307-7-git-send-email-famz@redhat.com> Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v3 6/7] xen_disk: simplify blk_disconnect with refcnt List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Fam Zheng Cc: kwolf@redhat.com, jcody@redhat.com, qemu-devel@nongnu.org, stefanha@redhat.com Better to split it into two patches: 1 bugfix: always call bdrv_detach_dev(). 2 use refcnt to manage lifecycle. > We call bdrv_attach_dev when initializing whether or not bs is created > locally, so call bdrv_detach_dev and let the refcnt handle the > lifecycle. > > Signed-off-by: Fam Zheng > --- > hw/block/xen_disk.c | 11 +++++------ > 1 file changed, 5 insertions(+), 6 deletions(-) > > diff --git a/hw/block/xen_disk.c b/hw/block/xen_disk.c > index 99537e8..39757d9 100644 > --- a/hw/block/xen_disk.c > +++ b/hw/block/xen_disk.c > @@ -812,6 +812,9 @@ static int blk_connect(struct XenDevice *xendev) > /* setup via qemu cmdline -> already setup for us */ > xen_be_printf(&blkdev->xendev, 2, "get configured bdrv (cmdline setup)\n"); > blkdev->bs = blkdev->dinfo->bdrv; > + /* blkdev->bs is not create by us, we get a reference > + * so we can bdrv_unref() unconditionally */ > + bdrv_ref(blkdev->bs); > } > bdrv_attach_dev_nofail(blkdev->bs, blkdev); > blkdev->file_size = bdrv_getlength(blkdev->bs); > @@ -910,12 +913,8 @@ static void blk_disconnect(struct XenDevice *xendev) > struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev); > > if (blkdev->bs) { > - if (!blkdev->dinfo) { > - /* close/delete only if we created it ourself */ > - bdrv_close(blkdev->bs); > - bdrv_detach_dev(blkdev->bs, blkdev); > - bdrv_unref(blkdev->bs); > - } > + bdrv_detach_dev(blkdev->bs, blkdev); > + bdrv_unref(blkdev->bs); > blkdev->bs = NULL; > } > xen_be_unbind_evtchn(&blkdev->xendev); > -- Best Regards Wenchao Xia