We don't need the frwd_lock to access the lead conn. It's setup at creation time and then only cleared during destruction. It was from when we supported MC/s before this code was merged upstream. We've only supported the single conn session for 15 years now. This cleans up the non iscsi and SCSI EH paths. The frwd lock is kind of intertwined with multiple checks in those paths and I have a another patchset to fix up the tmf handling. Signed-off-by: Mike Christie <michael.christie@xxxxxxxxxx> --- drivers/scsi/libiscsi.c | 6 +----- include/scsi/libiscsi.h | 4 ++-- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c index e7d1b69c07b5..211c56fc6488 100644 --- a/drivers/scsi/libiscsi.c +++ b/drivers/scsi/libiscsi.c @@ -1813,15 +1813,14 @@ int iscsi_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *sc) goto fault; } - spin_lock_bh(&session->frwd_lock); conn = session->leadconn; if (!conn) { - spin_unlock_bh(&session->frwd_lock); reason = FAILURE_SESSION_FREED; sc->result = DID_NO_CONNECT << 16; goto fault; } + spin_lock_bh(&session->frwd_lock); if (test_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx)) { spin_unlock_bh(&session->frwd_lock); reason = FAILURE_SESSION_IN_RECOVERY; @@ -3441,11 +3440,8 @@ int iscsi_conn_bind(struct iscsi_cls_session *cls_session, struct iscsi_session *session = cls_session->dd_data; struct iscsi_conn *conn = cls_conn->dd_data; - spin_lock_bh(&session->frwd_lock); if (is_leading) session->leadconn = conn; - spin_unlock_bh(&session->frwd_lock); - /* * The target could have reduced it's window size between logins, so * we have to reset max/exp cmdsn so we can see the new values. diff --git a/include/scsi/libiscsi.h b/include/scsi/libiscsi.h index 8001c5a26a00..c053de831c2c 100644 --- a/include/scsi/libiscsi.h +++ b/include/scsi/libiscsi.h @@ -351,8 +351,8 @@ struct iscsi_session { struct iscsi_conn *leadconn; /* leading connection */ spinlock_t frwd_lock; /* protects queued_cmdsn, * * cmdsn, suspend_bit, * - * leadconn, _stage, * - * tmf_state and queues */ + * _stage, tmf_state and * + * queues */ /* * frwd_lock must be held when transitioning states, but not needed * if just checking the state in the scsi-ml or iscsi callouts. -- 2.25.1