nbd client refactoring and fixing
v3 cover nbd client refactoring and fixing
v3: dropped all controversial things. I'll try to implement minimal structured reply and block status over this small residue.
Vladimir Sementsov-Ogievskiy (3):
block/nbd-client: refactor nbd_co_receive_reply block/nbd-client: simplify check in nbd_co_receive_reply block/nbd-client: nbd_co_send_request: fix return code
block/nbd-client.c | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-)
Signature · 1 line
2.11.1
PATCH v3 1/3 block/nbd-client: refactor nbd_co_receive_reply
"NBDReply *reply" parameter of nbd_co_receive_reply is used only to pass return value for nbd_co_request (reply.error). Remove it and use function return value instead.
--- block/nbd-client.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-)
block/nbd-client.c +15 -15
@@ -178,26 +178,26 @@ err:return rc; } -static void nbd_co_receive_reply (NBDClientSession *s, -NBDRequest *request, -NBDReply *reply, -QEMUIOVector *qiov) +static int nbd_co_receive_reply (NBDClientSession *s, +NBDRequest *request, +QEMUIOVector *qiov) { +int ret;int i =HANDLE_TO_INDEX (s, request->handle);/* Wait until we're woken up by nbd_read_reply_entry. */ s->requests[i].receiving = true;qemu_coroutine_yield (); s->requests[i].receiving = false; - *reply = s->reply; -if (reply->handle != request->handle || !s->ioc || s->quit) { - reply->error =EIO ; +if (s->reply.handle != request->handle || !s->ioc || s->quit) { + ret = -EIO ; }else { -if (qiov && reply->error ==0 ) { + ret = -s->reply.error; +if (qiov && s->reply.error ==0 ) {assert (request->len ==iov_size (qiov->iov, qiov->niov));if (qio_channel_readv_all (s->ioc, qiov->iov, qiov->niov,NULL ) <0 ) { - reply->error =EIO ; + ret = -EIO ; s->quit = true; } }
@@ -217,6 +217,8 @@ static void nbd_co_receive_reply(NBDClientSession *s, s->in_flight--;qemu_co_queue_next (&s->free_sema);qemu_co_mutex_unlock (&s->send_mutex); + +return ret; } static int nbd_co_request(BlockDriverState *bs,
@@ -224,7 +226,6 @@ static int nbd_co_request(BlockDriverState *bs, QEMUIOVector *qiov) {NBDClientSession *client =nbd_get_client_session (bs); -NBDReply reply;int ret; assert(!qiov || request->type == NBD_CMD_WRITE ||
@@ -232,12 +233,11 @@ static int nbd_co_request(BlockDriverState *bs, ret =nbd_co_send_request (bs, request, request->type ==NBD_CMD_WRITE ? qiov :NULL );if (ret <0 ) { - reply.error = -ret; - }else { -nbd_co_receive_reply (client, request, &reply, - request->type ==NBD_CMD_READ ? qiov :NULL ); +return ret; } -return -reply.error; + +return nbd_co_receive_reply (client, request, + request->type ==NBD_CMD_READ ? qiov :NULL ); } int nbd_client_co_preadv(BlockDriverState *bs, uint64_t offset,
Signature · 1 line
2.11.1
PATCH v3 2/3 block/nbd-client: simplify check in nbd_co_receive_reply
In reply to Vladimir Sementsov-OgievskiyIf we are woken up from while() loop in nbd_read_reply_entry handles must be equal. If we are woken up from nbd_recv_coroutines_wake_all s->quit must be true, so we do not need checking handles equality.
--- block/nbd-client.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
block/nbd-client.c +2 -1
@@ -189,9 +189,10 @@ static int nbd_co_receive_reply(NBDClientSession *s, s->requests[i].receiving = true;qemu_coroutine_yield (); s->requests[i].receiving = false; -if (s->reply.handle != request->handle || !s->ioc || s->quit) { +if (!s->ioc || s->quit) { ret = -EIO ; }else { +assert (s->reply.handle == request->handle); ret = -s->reply.error;if (qiov && s->reply.error ==0 ) {assert (request->len ==iov_size (qiov->iov, qiov->niov));
Signature · 1 line
2.11.1
Re: [Qemu-devel] [PATCH v3 2/3] block/nbd-client: simplify check in nbd_co_receive_reply
Quoted 9 lines · Vladimir Sementsov-Ogievskiy
If we are woken up from
while()loop innbd_read_reply_entryhandles must be equal. If we are woken up fromnbd_recv_coroutines_wake_alls->quitmust be true, so we do not need checking handles equality.Signed-off-by Vladimir Sementsov-Ogievskiy <[email protected]>--- block/nbd-client.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
Quoted 18 lines
block/nbd-client.c +2
-1@@ -189,9 +189,10 @@ static int nbd_co_receive_reply(NBDClientSession *s, s->requests[i].receiving = true;qemu_coroutine_yield (); s->requests[i].receiving = false; -if (s->reply.handle != request->handle || !s->ioc || s->quit) { +if (!s->ioc || s->quit) { ret = -EIO ; }else { +assert (s->reply.handle == request->handle); ret = -s->reply.error;if (qiov && s->reply.error ==0 ) {assert (request->len ==iov_size (qiov->iov, qiov->niov));
Signature · 3 lines
Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3266 Virtualization: qemu.org | libvirt.org
PATCH v3 3/3 block/nbd-client: nbd_co_send_request: fix return code
In reply to Vladimir Sementsov-OgievskiyIt's incorrect to return success rc >= 0 if we skip qio_channel_writev_all() call due to s->quit.
--- block/nbd-client.c | 2 ++ 1 file changed, 2 insertions(+)
block/nbd-client.c +2 -0
@@ -161,6 +161,8 @@ static int nbd_co_send_request(BlockDriverState *bs, NULL) < 0) { rc = -EIO ; } + }else if (rc >=0 ) { + rc = -EIO ; }qio_channel_set_cork (s->ioc, false); }else {
Signature · 1 line
2.11.1
Re: [Qemu-devel] [PATCH v3 3/3] block/nbd-client: nbd_co_send_request: fix return code
Quoted 7 lines · Vladimir Sementsov-Ogievskiy
It's incorrect to return success rc >= 0 if we skip
qio_channel_writev_all()call due tos->quit.Signed-off-by Vladimir Sementsov-Ogievskiy <[email protected]>--- block/nbd-client.c | 2 ++ 1 file changed, 2 insertions(+)
Quoted 15 lines
block/nbd-client.c +2
-0@@ -161,6 +161,8 @@ static int nbd_co_send_request(BlockDriverState *bs, NULL) < 0) { rc = -EIO ; } + }else if (rc >=0 ) { + rc = -EIO ; }qio_channel_set_cork (s->ioc, false); }else {
Signature · 3 lines
Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3266 Virtualization: qemu.org | libvirt.org
Quoted 7 lines · Vladimir Sementsov-Ogievskiy
v3: dropped all controversial things. I'll try to implement minimal structured reply and block status over this small residue.
Vladimir Sementsov-Ogievskiy (3):
block/nbd-client: refactornbd_co_receive_replyblock/nbd-client: simplify check innbd_co_receive_replyblock/nbd-client:nbd_co_send_request: fix return code
Thanks; queued on my NBD tree, will send pull request after a bit more time to see if it collects further reviews:git://repo.or.cz/qemu/ericb.git nbd
Signature · 3 lines
Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3266 Virtualization: qemu.org | libvirt.org
Quoted 4 lines · Eric Blake
Quoted 3 lines · Vladimir Sementsov-Ogievskiy
v3: dropped all controversial things. I'll try to implement minimal structured reply and block status over this small residue.
Quoted 8 lines
Quoted 4 lines
Vladimir Sementsov-Ogievskiy (3):
block/nbd-client: refactornbd_co_receive_replyblock/nbd-client: simplify check innbd_co_receive_replyblock/nbd-client:nbd_co_send_request: fix return codeThanks; queued on my NBD tree, will send pull request after a bit more time to see if it collects further reviews:
git://repo.or.cz/qemu/ericb.gitnbd
Thank you, Eric!
Signature · 2 lines
Best regards, Vladimir