Message ID | 20220203163024.38913-2-hreitz@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | block/nbd: Move s->ioc on AioContext change | expand |
03.02.2022 19:30, Hanna Reitz wrote: > We start the reconnect delay timer to cancel the reconnection attempt > after a while. Once nbd_co_do_establish_connection() has returned, this > attempt is over, and we no longer need the timer. > > Delete it before returning from nbd_reconnect_attempt(), so that it does > not persist beyond the I/O request that was paused for reconnecting; we > do not want it to fire in a drained section, because all sort of things > can happen in such a section (e.g. the AioContext might be changed, and > we do not want the timer to fire in the wrong context; or the BDS might > even be deleted, and so the timer CB would access already-freed data). > > Signed-off-by: Hanna Reitz<hreitz@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
diff --git a/block/nbd.c b/block/nbd.c index 63dbfa807d..16cd7fef77 100644 --- a/block/nbd.c +++ b/block/nbd.c @@ -381,6 +381,13 @@ static coroutine_fn void nbd_reconnect_attempt(BDRVNBDState *s) } nbd_co_do_establish_connection(s->bs, NULL); + + /* + * The reconnect attempt is done (maybe successfully, maybe not), so + * we no longer need this timer. Delete it so it will not outlive + * this I/O request (so draining removes all timers). + */ + reconnect_delay_timer_del(s); } static coroutine_fn int nbd_receive_replies(BDRVNBDState *s, uint64_t handle)
We start the reconnect delay timer to cancel the reconnection attempt after a while. Once nbd_co_do_establish_connection() has returned, this attempt is over, and we no longer need the timer. Delete it before returning from nbd_reconnect_attempt(), so that it does not persist beyond the I/O request that was paused for reconnecting; we do not want it to fire in a drained section, because all sort of things can happen in such a section (e.g. the AioContext might be changed, and we do not want the timer to fire in the wrong context; or the BDS might even be deleted, and so the timer CB would access already-freed data). Signed-off-by: Hanna Reitz <hreitz@redhat.com> --- block/nbd.c | 7 +++++++ 1 file changed, 7 insertions(+)