From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34036) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Ysovj-00087d-4F for qemu-devel@nongnu.org; Thu, 14 May 2015 04:55:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Ysovh-0000rX-TO for qemu-devel@nongnu.org; Thu, 14 May 2015 04:55:47 -0400 Message-ID: <55545FD0.7000006@cn.fujitsu.com> Date: Thu, 14 May 2015 16:41:52 +0800 From: Wen Congyang MIME-Version: 1.0 References: <1431076567-30371-1-git-send-email-wency@cn.fujitsu.com> <1431076567-30371-9-git-send-email-wency@cn.fujitsu.com> <555459EE.6000702@huawei.com> In-Reply-To: <555459EE.6000702@huawei.com> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH COLO v4 08/15] NBD client: implement block driver interfaces to connect/disconnect NBD server List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Gonglei , qemu devel , Fam Zheng , Max Reitz , Paolo Bonzini Cc: Kevin Wolf , Lai Jiangshan , qemu block , Jiang Yunhong , Dong Eddie , "Dr. David Alan Gilbert" , Stefan Hajnoczi , Yang Hongyang , zhanghailiang On 05/14/2015 04:16 PM, Gonglei wrote: > On 2015/5/8 17:16, Wen Congyang wrote: >> Signed-off-by: Wen Congyang >> Signed-off-by: zhanghailiang >> Signed-off-by: Gonglei >> --- >> block/nbd.c | 65 ++++++++++++++++++++++++++++++++++++++++++++----------------- >> 1 file changed, 47 insertions(+), 18 deletions(-) >> >> diff --git a/block/nbd.c b/block/nbd.c >> index 2176186..0624232 100644 >> --- a/block/nbd.c >> +++ b/block/nbd.c >> @@ -44,6 +44,8 @@ >> typedef struct BDRVNBDState { >> NbdClientSession client; >> QemuOpts *socket_opts; >> + char *export; >> + bool connected; >> } BDRVNBDState; >> >> static int nbd_parse_uri(const char *filename, QDict *options) >> @@ -254,34 +256,55 @@ static int nbd_establish_connection(BlockDriverState *bs, Error **errp) >> return sock; >> } >> >> -static int nbd_open(BlockDriverState *bs, QDict *options, int flags, >> - Error **errp) >> +static void nbd_connect_server(BlockDriverState *bs, Error **errp) >> { >> BDRVNBDState *s = bs->opaque; >> - char *export = NULL; >> - int result, sock; >> - Error *local_err = NULL; >> - >> - /* Pop the config into our state object. Exit if invalid. */ >> - nbd_config(s, options, &export, &local_err); >> - if (local_err) { >> - error_propagate(errp, local_err); >> - return -EINVAL; >> - } >> + int sock; >> >> /* establish TCP connection, return error if it fails >> * TODO: Configurable retry-until-timeout behaviour. >> */ >> sock = nbd_establish_connection(bs, errp); >> if (sock < 0) { >> - g_free(export); >> - return sock; >> + return; >> } >> >> /* NBD handshake */ >> - result = nbd_client_init(bs, sock, export, errp); >> - g_free(export); >> - return result; >> + nbd_client_init(bs, sock, s->export, errp); >> + >> + s->connected = true; >> +} >> + >> +static void nbd_disconnect_server(BlockDriverState *bs) >> +{ >> + BDRVNBDState *s = bs->opaque; >> + >> + if (s->connected) { >> + nbd_client_close(bs); >> + s->connected = false; >> + } >> +} >> + >> +static int nbd_open(BlockDriverState *bs, QDict *options, int flags, >> + Error **errp) >> +{ >> + BDRVNBDState *s = bs->opaque; >> + Error *local_err = NULL; >> + >> + /* Pop the config into our state object. Exit if invalid. */ >> + nbd_config(s, options, &s->export, &local_err); >> + if (local_err) { >> + error_propagate(errp, local_err); >> + return -EINVAL; >> + } >> + >> + nbd_connect_server(bs, &local_err); >> + if (local_err) { >> + error_propagate(errp, local_err); >> + return -EINVAL; >> + } >> + >> + return 0; >> } >> >> static int nbd_co_readv(BlockDriverState *bs, int64_t sector_num, >> @@ -318,7 +341,7 @@ static void nbd_close(BlockDriverState *bs) >> BDRVNBDState *s = bs->opaque; >> >> qemu_opts_del(s->socket_opts); >> - nbd_client_close(bs); >> + nbd_disconnect_server(bs); > > We should free s->export here, right? Yes. Will fix it in the next version. Thanks Wen Congyang > > Regards, > -Gonglei > >> } >> >> static int64_t nbd_getlength(BlockDriverState *bs) >> @@ -400,6 +423,8 @@ static BlockDriver bdrv_nbd = { >> .bdrv_detach_aio_context = nbd_detach_aio_context, >> .bdrv_attach_aio_context = nbd_attach_aio_context, >> .bdrv_refresh_filename = nbd_refresh_filename, >> + .bdrv_connect = nbd_connect_server, >> + .bdrv_disconnect = nbd_disconnect_server, >> }; >> >> static BlockDriver bdrv_nbd_tcp = { >> @@ -418,6 +443,8 @@ static BlockDriver bdrv_nbd_tcp = { >> .bdrv_detach_aio_context = nbd_detach_aio_context, >> .bdrv_attach_aio_context = nbd_attach_aio_context, >> .bdrv_refresh_filename = nbd_refresh_filename, >> + .bdrv_connect = nbd_connect_server, >> + .bdrv_disconnect = nbd_disconnect_server, >> }; >> >> static BlockDriver bdrv_nbd_unix = { >> @@ -436,6 +463,8 @@ static BlockDriver bdrv_nbd_unix = { >> .bdrv_detach_aio_context = nbd_detach_aio_context, >> .bdrv_attach_aio_context = nbd_attach_aio_context, >> .bdrv_refresh_filename = nbd_refresh_filename, >> + .bdrv_connect = nbd_connect_server, >> + .bdrv_disconnect = nbd_disconnect_server, >> }; >> >> static void bdrv_nbd_init(void) >> > > > . >