From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44816) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YsoPH-0007ab-9f for qemu-devel@nongnu.org; Thu, 14 May 2015 04:22:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YsoPG-00022r-7l for qemu-devel@nongnu.org; Thu, 14 May 2015 04:22:15 -0400 Message-ID: <555459EE.6000702@huawei.com> Date: Thu, 14 May 2015 16:16:46 +0800 From: Gonglei 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> In-Reply-To: <1431076567-30371-9-git-send-email-wency@cn.fujitsu.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: Wen Congyang , 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 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? 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) >