IB/srpt: Log out all initiators if a port is disabled
authorBart Van Assche <bart.vanassche@sandisk.com>
Thu, 11 Feb 2016 19:09:28 +0000 (11:09 -0800)
committerDoug Ledford <dledford@redhat.com>
Mon, 29 Feb 2016 22:12:36 +0000 (17:12 -0500)
If an initiator observes LUN deletion during shutdown of the
target stack then that will trigger an I/O error even when using
multipathd. Users need a way to avoid that shutting down the
target stack causes I/O errors, e.g. by providing a way to force
initiator logout. Hence close all sessions if a target port is
disabled.

Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Alex Estrin <alex.estrin@intel.com>
Cc: Sagi Grimberg <sagig@mellanox.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/ulp/srpt/ib_srpt.c

index 12cc695c445599d4813de968d4f46985054b1edf..cba2c1f877b4e05a338f6fa62fe90a97be009122 100644 (file)
@@ -3152,6 +3152,8 @@ static ssize_t srpt_tpg_enable_store(struct config_item *item,
 {
        struct se_portal_group *se_tpg = to_tpg(item);
        struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
+       struct srpt_device *sdev = sport->sdev;
+       struct srpt_rdma_ch *ch;
        unsigned long tmp;
         int ret;
 
@@ -3165,11 +3167,24 @@ static ssize_t srpt_tpg_enable_store(struct config_item *item,
                pr_err("Illegal value for srpt_tpg_store_enable: %lu\n", tmp);
                return -EINVAL;
        }
-       if (tmp == 1)
-               sport->enabled = true;
-       else
-               sport->enabled = false;
+       if (sport->enabled == tmp)
+               goto out;
+       sport->enabled = tmp;
+       if (sport->enabled)
+               goto out;
 
+       mutex_lock(&sdev->mutex);
+       list_for_each_entry(ch, &sdev->rch_list, list) {
+               if (ch->sport == sport) {
+                       pr_debug("%s: ch %p %s-%d\n", __func__, ch,
+                                ch->sess_name, ch->qp->qp_num);
+                       srpt_disconnect_ch(ch);
+                       srpt_close_ch(ch);
+               }
+       }
+       mutex_unlock(&sdev->mutex);
+
+out:
        return count;
 }