can: j1939: transport: j1939_cancel_active_session(): use hrtimer_try_to_cancel(...
authorOleksij Rempel <o.rempel@pengutronix.de>
Fri, 8 Nov 2019 13:02:10 +0000 (14:02 +0100)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Wed, 13 Nov 2019 09:42:34 +0000 (10:42 +0100)
This part of the code protected by lock used in the hrtimer as well.
Using hrtimer_cancel() will trigger dead lock.

Fixes: 9d71dd0c7009 ("can: add support of SAE J1939 protocol")
Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
net/can/j1939/transport.c

index afc2adfd97e475dd64a0e126ccaef3291fae09a6..0c62b8fc4b20cc00d9c0d65b376e723fcc8ae4ba 100644 (file)
@@ -2039,7 +2039,11 @@ int j1939_cancel_active_session(struct j1939_priv *priv, struct sock *sk)
                                 &priv->active_session_list,
                                 active_session_list_entry) {
                if (!sk || sk == session->sk) {
-                       j1939_session_timers_cancel(session);
+                       if (hrtimer_try_to_cancel(&session->txtimer) == 1)
+                               j1939_session_put(session);
+                       if (hrtimer_try_to_cancel(&session->rxtimer) == 1)
+                               j1939_session_put(session);
+
                        session->err = ESHUTDOWN;
                        j1939_session_deactivate_locked(session);
                }