qemu/include/block
Roman Kagan 5082fc82a6 nbd: make nbd_read* return -EIO on error
NBD reconnect logic considers the error code from the functions that
read NBD messages to tell if reconnect should be attempted or not: it is
attempted on -EIO, otherwise the client transitions to NBD_CLIENT_QUIT
state (see nbd_channel_error).  This error code is propagated from the
primitives like nbd_read.

The problem, however, is that nbd_read itself turns every error into -1
rather than -EIO.  As a result, if the NBD server happens to die while
sending the message, the client in QEMU receives less data than it
expects, considers it as a fatal error, and wouldn't attempt
reestablishing the connection.

Fix it by turning every negative return from qio_channel_read_all into
-EIO returned from nbd_read.  Apparently that was the original behavior,
but got broken later.  Also adjust nbd_readXX to follow.

Fixes: e6798f06a6 ("nbd: generalize usage of nbd_read")
Signed-off-by: Roman Kagan <rvkagan@yandex-team.ru>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Message-Id: <20210129073859.683063-4-rvkagan@yandex-team.ru>
Signed-off-by: Eric Blake <eblake@redhat.com>
2021-02-03 08:17:12 -06:00
..
accounting.h block: add empty account cookie type 2019-10-10 10:56:18 +02:00
aio_task.h block: introduce aio task pool 2019-10-10 10:56:17 +02:00
aio-wait.h qemu/atomic.h: rename atomic_ to qatomic_ 2020-09-23 16:07:44 +01:00
aio.h util/async: Add aio_co_reschedule_self() 2020-10-09 07:08:20 +02:00
block_backup.h block/backup: drop unused synchronization interface 2018-12-14 11:52:40 +01:00
block_int.h block/io: use int64_t bytes in copy_range 2021-02-03 08:17:12 -06:00
block-copy.h block/block-copy: drop unused argument of block_copy() 2021-01-26 14:36:37 +01:00
block-hmp-cmds.h monitor/hmp: move hmp_info_block* to block-hmp-cmds.c 2020-03-09 18:20:21 +00:00
block.h block/io: use int64_t bytes in copy_range 2021-02-03 08:17:12 -06:00
blockjob_int.h blockjob: add set_speed to BlockJobDriver 2021-01-26 14:36:37 +01:00
blockjob.h blockdev: blockdev_mark_auto_del: drop usage of bs->job 2019-06-18 16:41:10 +02:00
dirty-bitmap.h block/dirty-bitmap: add bdrv_has_named_bitmaps helper 2020-05-28 13:15:22 -05:00
export.h block/export: Move blk to BlockExport 2020-10-02 15:46:40 +02:00
fuse.h fuse: Allow exporting BDSs via FUSE 2020-12-11 17:52:39 +01:00
nbd.h nbd: make nbd_read* return -EIO on error 2021-02-03 08:17:12 -06:00
nvme.h block/nvme: Introduce Completion Queue definitions 2020-11-03 19:06:21 +00:00
qapi.h qapi: Allow getting flat output from 'query-named-block-nodes' 2020-02-20 16:43:42 +01:00
qdict.h block: Factor out qobject_input_visitor_new_flat_confused() 2018-06-15 14:49:44 +02:00
raw-aio.h block/io_uring: implements interfaces for io_uring 2020-01-30 20:59:41 +00:00
snapshot.h migration: introduce icount field for snapshots 2020-10-06 08:34:49 +02:00
thread-pool.h Clean up decorations and whitespace around header guards 2016-07-12 16:20:46 +02:00
throttle-groups.h block/throttle-groups: throttle_group_co_io_limits_intercept(): 64bit bytes 2021-02-03 08:14:00 -06:00
write-threshold.h include: Make headers more self-contained 2019-08-16 13:31:51 +02:00