diff mbox series

[1/7] block/nbd: Delete reconnect delay timer when done

Message ID 20220203163024.38913-2-hreitz@redhat.com
State New
Headers show
Series block/nbd: Move s->ioc on AioContext change | expand

Commit Message

Hanna Czenczek Feb. 3, 2022, 4:30 p.m. UTC
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(+)

Comments

Vladimir Sementsov-Ogievskiy Feb. 4, 2022, 8:50 a.m. UTC | #1
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 mbox series

Patch

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)