Merge series "Use raw spinlocks in the ls-extirq driver" from Vladimir Oltean <vladim...
[linux-2.6-microblaze.git] / drivers / scsi / bnx2i / bnx2i_iscsi.c
index 1e6d8f6..1b5f3e1 100644 (file)
@@ -791,7 +791,7 @@ struct bnx2i_hba *bnx2i_alloc_hba(struct cnic_dev *cnic)
                return NULL;
        shost->dma_boundary = cnic->pcidev->dma_mask;
        shost->transportt = bnx2i_scsi_xport_template;
-       shost->max_id = ISCSI_MAX_CONNS_PER_HBA;
+       shost->max_id = ISCSI_MAX_CONNS_PER_HBA - 1;
        shost->max_channel = 0;
        shost->max_lun = 512;
        shost->max_cmd_len = 16;
@@ -1420,17 +1420,23 @@ static int bnx2i_conn_bind(struct iscsi_cls_session *cls_session,
         * Forcefully terminate all in progress connection recovery at the
         * earliest, either in bind(), send_pdu(LOGIN), or conn_start()
         */
-       if (bnx2i_adapter_ready(hba))
-               return -EIO;
+       if (bnx2i_adapter_ready(hba)) {
+               ret_code = -EIO;
+               goto put_ep;
+       }
 
        bnx2i_ep = ep->dd_data;
        if ((bnx2i_ep->state == EP_STATE_TCP_FIN_RCVD) ||
-           (bnx2i_ep->state == EP_STATE_TCP_RST_RCVD))
+           (bnx2i_ep->state == EP_STATE_TCP_RST_RCVD)) {
                /* Peer disconnect via' FIN or RST */
-               return -EINVAL;
+               ret_code = -EINVAL;
+               goto put_ep;
+       }
 
-       if (iscsi_conn_bind(cls_session, cls_conn, is_leading))
-               return -EINVAL;
+       if (iscsi_conn_bind(cls_session, cls_conn, is_leading)) {
+               ret_code = -EINVAL;
+               goto put_ep;
+       }
 
        if (bnx2i_ep->hba != hba) {
                /* Error - TCP connection does not belong to this device
@@ -1441,7 +1447,8 @@ static int bnx2i_conn_bind(struct iscsi_cls_session *cls_session,
                iscsi_conn_printk(KERN_ALERT, cls_conn->dd_data,
                                  "belong to hba (%s)\n",
                                  hba->netdev->name);
-               return -EEXIST;
+               ret_code = -EEXIST;
+               goto put_ep;
        }
        bnx2i_ep->conn = bnx2i_conn;
        bnx2i_conn->ep = bnx2i_ep;
@@ -1458,6 +1465,8 @@ static int bnx2i_conn_bind(struct iscsi_cls_session *cls_session,
                bnx2i_put_rq_buf(bnx2i_conn, 0);
 
        bnx2i_arm_cq_event_coalescing(bnx2i_conn->ep, CNIC_ARM_CQE);
+put_ep:
+       iscsi_put_endpoint(ep);
        return ret_code;
 }
 
@@ -2113,7 +2122,6 @@ static void bnx2i_ep_disconnect(struct iscsi_endpoint *ep)
 {
        struct bnx2i_endpoint *bnx2i_ep;
        struct bnx2i_conn *bnx2i_conn = NULL;
-       struct iscsi_conn *conn = NULL;
        struct bnx2i_hba *hba;
 
        bnx2i_ep = ep->dd_data;
@@ -2126,11 +2134,8 @@ static void bnx2i_ep_disconnect(struct iscsi_endpoint *ep)
                !time_after(jiffies, bnx2i_ep->timestamp + (12 * HZ)))
                msleep(250);
 
-       if (bnx2i_ep->conn) {
+       if (bnx2i_ep->conn)
                bnx2i_conn = bnx2i_ep->conn;
-               conn = bnx2i_conn->cls_conn->dd_data;
-               iscsi_suspend_queue(conn);
-       }
        hba = bnx2i_ep->hba;
 
        mutex_lock(&hba->net_dev_lock);
@@ -2276,6 +2281,7 @@ struct iscsi_transport bnx2i_iscsi_transport = {
        .destroy_session        = bnx2i_session_destroy,
        .create_conn            = bnx2i_conn_create,
        .bind_conn              = bnx2i_conn_bind,
+       .unbind_conn            = iscsi_conn_unbind,
        .destroy_conn           = bnx2i_conn_destroy,
        .attr_is_visible        = bnx2i_attr_is_visible,
        .set_param              = iscsi_set_param,