]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
scsi: qedi: Fix cleanup session block/unblock use
authorMike Christie <michael.christie@oracle.com>
Tue, 25 May 2021 18:18:18 +0000 (13:18 -0500)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 2 Jun 2021 05:28:23 +0000 (01:28 -0400)
Drivers shouldn't be calling block/unblock session for cmd cleanup because
the functions can change the session state from under libiscsi.  This adds
a new a driver level bit so it can block all I/O the host while it drains
the card.

Link: https://lore.kernel.org/r/20210525181821.7617-26-michael.christie@oracle.com
Reviewed-by: Manish Rangankar <mrangankar@marvell.com>
Signed-off-by: Mike Christie <michael.christie@oracle.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qedi/qedi.h
drivers/scsi/qedi/qedi_iscsi.c

index c342defc3f522d3e87c4fcfa6c6e0ee12769a450..ce199a7a16b80c3ba1b5e7f95479ad2942f4837e 100644 (file)
@@ -284,6 +284,7 @@ struct qedi_ctx {
 #define QEDI_IN_RECOVERY       5
 #define QEDI_IN_OFFLINE                6
 #define QEDI_IN_SHUTDOWN       7
+#define QEDI_BLOCK_IO          8
 
        u8 mac[ETH_ALEN];
        u32 src_ip[4];
index 0ece2c3b105bc397ed4e85a1d43adf2f3d79ccc8..ddb47784eb4a49e946e11ef6875d8888bfb89b28 100644 (file)
@@ -330,12 +330,22 @@ free_conn:
 
 void qedi_mark_device_missing(struct iscsi_cls_session *cls_session)
 {
-       iscsi_block_session(cls_session);
+       struct iscsi_session *session = cls_session->dd_data;
+       struct qedi_conn *qedi_conn = session->leadconn->dd_data;
+
+       spin_lock_bh(&session->frwd_lock);
+       set_bit(QEDI_BLOCK_IO, &qedi_conn->qedi->flags);
+       spin_unlock_bh(&session->frwd_lock);
 }
 
 void qedi_mark_device_available(struct iscsi_cls_session *cls_session)
 {
-       iscsi_unblock_session(cls_session);
+       struct iscsi_session *session = cls_session->dd_data;
+       struct qedi_conn *qedi_conn = session->leadconn->dd_data;
+
+       spin_lock_bh(&session->frwd_lock);
+       clear_bit(QEDI_BLOCK_IO, &qedi_conn->qedi->flags);
+       spin_unlock_bh(&session->frwd_lock);
 }
 
 static int qedi_bind_conn_to_iscsi_cid(struct qedi_ctx *qedi,
@@ -800,6 +810,9 @@ static int qedi_task_xmit(struct iscsi_task *task)
        if (test_bit(QEDI_IN_SHUTDOWN, &qedi_conn->qedi->flags))
                return -ENODEV;
 
+       if (test_bit(QEDI_BLOCK_IO, &qedi_conn->qedi->flags))
+               return -EACCES;
+
        cmd->state = 0;
        cmd->task = NULL;
        cmd->use_slowpath = false;