From: Mike Christie
mainline inclusion
from mainline-v5.12-rc1
commit c8447e4c2eb77dbb96012ae96e7c83179cecf880
category: bugfix
issue: #I3ZXZF
CVE: NA
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?i...
-----------------------------------------------
If we lose the session then relogin, but the new cmdsn window has shrunk
(due to something like an admin changing a setting) we will have the old
exp/max_cmdsn values and will never be able to update them. For example,
max_cmdsn would be 64, but if on the target the user set the window to be
smaller then the target could try to return the max_cmdsn as 32. We will
see that new max_cmdsn in the rsp but because it's lower than the old
max_cmdsn when the window was larger we will not update it.
So this patch has us reset the window values during session cleanup so they
can be updated after a new login.
Link: https://lore.kernel.org/r/20210207044608.27585-8-michael.christie@oracle.com
Reviewed-by: Lee Duncan
Signed-off-by: Mike Christie
Signed-off-by: Martin K. Petersen
Signed-off-by: Ye Bin
Reviewed-by: Jason Yan
Signed-off-by: Chen Jun
Signed-off-by: Yu Changchun
---
drivers/scsi/libiscsi.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
index 583fb660e1f0..ed6a6bbfef23 100644
--- a/drivers/scsi/libiscsi.c
+++ b/drivers/scsi/libiscsi.c
@@ -3245,6 +3245,13 @@ int iscsi_conn_bind(struct iscsi_cls_session *cls_session,
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.
+ */
+ spin_lock_bh(&session->back_lock);
+ session->max_cmdsn = session->exp_cmdsn = session->cmdsn + 1;
+ spin_unlock_bh(&session->back_lock);
/*
* Unblock xmitworker(), Login Phase will pass through.
*/
--
2.22.0