Message ID | 1518702707-7077-5-git-send-email-vsementsov@virtuozzo.com |
---|---|
State | New |
Headers | show |
Series | [1/9] nbd/server: add nbd_opt_invalid helper | expand |
On 02/15/2018 07:51 AM, Vladimir Sementsov-Ogievskiy wrote: > It is ok, that fatal error hides previous not fatal, but hiding > first fatal error is a bad feature. > > Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> > --- > block/nbd-client.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > Can this trigger in 2.11 clients with structured reads to the point where we'd want to add qemu-stable in CC? Or did you only hit it once block_status was added to the mix? Note that comparing 2.11 server with 2.11 client doesn't help - because 2.11 as server only sends a single chunk per structured read (as the only structured reply); it wasn't until commit 418638d3 that we have a qemu server that can send multiple chunks, and it looks like you need multiple chunks before multiple errors becomes a possibility. At any rate, Reviewed-by: Eric Blake <eblake@redhat.com>
diff --git a/block/nbd-client.c b/block/nbd-client.c index 9206652e45..b1cbe95b13 100644 --- a/block/nbd-client.c +++ b/block/nbd-client.c @@ -481,6 +481,7 @@ static coroutine_fn int nbd_co_receive_one_chunk( typedef struct NBDReplyChunkIter { int ret; + bool fatal; Error *err; bool done, only_structured; } NBDReplyChunkIter; @@ -490,11 +491,12 @@ static void nbd_iter_error(NBDReplyChunkIter *iter, bool fatal, { assert(ret < 0); - if (fatal || iter->ret == 0) { + if ((fatal && !iter->fatal) || iter->ret == 0) { if (iter->ret != 0) { error_free(iter->err); iter->err = NULL; } + iter->fatal = fatal; iter->ret = ret; error_propagate(&iter->err, *local_err); } else {
It is ok, that fatal error hides previous not fatal, but hiding first fatal error is a bad feature. Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> --- block/nbd-client.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)