On Fri, Feb 05, 2021 at 06:13:09PM +0800, Jiahui Cen wrote: > Add retry_request_cb in BlockDevOps to do device specific retry action. > Backend's timer would be registered only when the backend is set 'retry' > on errors and the device supports retry action. > > Signed-off-by: Jiahui Cen > Signed-off-by: Ying Fang > --- > block/block-backend.c | 8 ++++++++ > include/sysemu/block-backend.h | 4 ++++ > 2 files changed, 12 insertions(+) > > diff --git a/block/block-backend.c b/block/block-backend.c > index 3a9d55cbe3..a8bfaf6e4a 100644 > --- a/block/block-backend.c > +++ b/block/block-backend.c > @@ -995,6 +995,14 @@ void blk_set_dev_ops(BlockBackend *blk, const BlockDevOps *ops, > blk->dev_ops = ops; > blk->dev_opaque = opaque; > > + if ((blk->on_read_error == BLOCKDEV_ON_ERROR_RETRY || > + blk->on_write_error == BLOCKDEV_ON_ERROR_RETRY) && > + ops->retry_request_cb) { > + blk->retry_timer = aio_timer_new(blk->ctx, QEMU_CLOCK_REALTIME, > + SCALE_MS, ops->retry_request_cb, > + opaque); > + } I didn't see anything that handles AioContext changes. If the BlockBackend is detached from the current AioContext and attached to a different one, then it is necessary to delete the old timer and create a new one. Stefan