scsi: iscsi: Get ref to conn during reset handling
authorMike Christie <michael.christie@oracle.com>
Tue, 25 May 2021 18:18:05 +0000 (13:18 -0500)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 2 Jun 2021 05:28:21 +0000 (01:28 -0400)
The comment in iscsi_eh_session_reset is wrong and we don't wait for the
EH to complete before tearing down the conn. This has us get a ref to the
conn when we are not holding the eh_mutex/frwd_lock so it does not get
freed from under us.

Link: https://lore.kernel.org/r/20210525181821.7617-13-michael.christie@oracle.com
Reviewed-by: Lee Duncan <lduncan@suse.com>
Signed-off-by: Mike Christie <michael.christie@oracle.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/libiscsi.c

index 6ca3d35a3d1113dc7fea9ebca6042f43c3eb458b..b7445d9e99d675face8229b303a17693eb6e8133 100644 (file)
@@ -2492,7 +2492,6 @@ int iscsi_eh_session_reset(struct scsi_cmnd *sc)
 
        cls_session = starget_to_session(scsi_target(sc->device));
        session = cls_session->dd_data;
-       conn = session->leadconn;
 
        mutex_lock(&session->eh_mutex);
        spin_lock_bh(&session->frwd_lock);
@@ -2507,13 +2506,14 @@ failed:
                return FAILED;
        }
 
+       conn = session->leadconn;
+       iscsi_get_conn(conn->cls_conn);
+
        spin_unlock_bh(&session->frwd_lock);
        mutex_unlock(&session->eh_mutex);
-       /*
-        * we drop the lock here but the leadconn cannot be destoyed while
-        * we are in the scsi eh
-        */
+
        iscsi_conn_failure(conn, ISCSI_ERR_SCSI_EH_SESSION_RST);
+       iscsi_put_conn(conn->cls_conn);
 
        ISCSI_DBG_EH(session, "wait for relogin\n");
        wait_event_interruptible(conn->ehwait,