scsi: iscsi: Rel ref after iscsi_lookup_endpoint()
[linux-2.6-microblaze.git] / drivers / scsi / bnx2i / bnx2i_iscsi.c
index 9a4f477..26cb1c6 100644 (file)
@@ -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;
 }