[SCSI] zfcp: incorrect reaction on incoming RSCN
authorSwen Schillig <swen@vnet.ibm.com>
Mon, 2 Mar 2009 12:09:07 +0000 (13:09 +0100)
committerJames Bottomley <James.Bottomley@HansenPartnership.com>
Thu, 12 Mar 2009 17:58:21 +0000 (12:58 -0500)
After an error condition resolved a remote storage port was never
re-opened. The incoming RSCN was not processed accordingly due
to a misinterpreted status flag / return value combination.

Signed-off-by: Swen Schillig <swen@vnet.ibm.com>
Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
drivers/s390/scsi/zfcp_fc.c
drivers/s390/scsi/zfcp_fsf.c

index ec700b3c210041a91253652ff85ceb620cd2b692..49a7a90501b615eec51f360147fa43148f70b6a2 100644 (file)
@@ -145,16 +145,10 @@ static void _zfcp_fc_incoming_rscn(struct zfcp_fsf_req *fsf_req, u32 range,
        struct zfcp_port *port;
 
        read_lock_irqsave(&zfcp_data.config_lock, flags);
-       list_for_each_entry(port, &fsf_req->adapter->port_list_head, list) {
-               if (!(atomic_read(&port->status) & ZFCP_STATUS_PORT_PHYS_OPEN))
-                       /* Try to connect to unused ports anyway. */
-                       zfcp_erp_port_reopen(port,
-                                            ZFCP_STATUS_COMMON_ERP_FAILED,
-                                            "fcirsc1", fsf_req);
-               else if ((port->d_id & range) == (elem->nport_did & range))
-                       /* Check connection status for connected ports */
+       list_for_each_entry(port, &fsf_req->adapter->port_list_head, list)
+               if ((port->d_id & range) == (elem->nport_did & range))
                        zfcp_test_link(port);
-       }
+
        read_unlock_irqrestore(&zfcp_data.config_lock, flags);
 }
 
@@ -381,8 +375,10 @@ static void zfcp_fc_adisc_handler(unsigned long data)
        if (!port->wwnn)
                port->wwnn = ls_adisc->wwnn;
 
-       if (port->wwpn != ls_adisc->wwpn)
-               zfcp_erp_port_reopen(port, 0, "fcadh_2", NULL);
+       if ((port->wwpn != ls_adisc->wwpn) ||
+           !(atomic_read(&port->status) & ZFCP_STATUS_COMMON_OPEN))
+               zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED,
+                                    "fcadh_2", NULL);
 
  out:
        zfcp_port_put(port);
index b4c9ba085093f78655da266abe0015258de16c6a..71c32f3ffcb779fb5a373996195f043dff95f206 100644 (file)
@@ -1161,10 +1161,6 @@ int zfcp_fsf_send_els(struct zfcp_send_els *els)
        struct fsf_qtcb_bottom_support *bottom;
        int ret = -EIO;
 
-       if (unlikely(!(atomic_read(&els->port->status) &
-                      ZFCP_STATUS_COMMON_UNBLOCKED)))
-               return -EBUSY;
-
        spin_lock_bh(&adapter->req_q_lock);
        if (zfcp_fsf_req_sbal_get(adapter))
                goto out;