static int iscsi_iser_conn_bind(struct iscsi_cls_session *cls_session, struct iscsi_cls_conn *cls_conn, uint64_t transport_eph, int is_leading) { struct iscsi_conn *conn = cls_conn->dd_data; struct iscsi_iser_conn *iser_conn; struct iser_conn *ib_conn; struct iscsi_endpoint *ep; int error; error = iscsi2_conn_bind(cls_session, cls_conn, is_leading); if (error) return error; /* the transport ep handle comes from user space so it must be * verified against the global ib connections list */ ep = iscsi2_lookup_endpoint(transport_eph); if (!ep) { iser_err("can't bind eph %llx\n", (unsigned long long)transport_eph); return -EINVAL; } ib_conn = ep->dd_data; /* binds the iSER connection retrieved from the previously * connected ep_handle to the iSCSI layer connection. exchanges * connection pointers */ iser_err("binding iscsi/iser conn %p %p to ib_conn %p\n", conn, conn->dd_data, ib_conn); iser_conn = conn->dd_data; ib_conn->iser_conn = iser_conn; iser_conn->ib_conn = ib_conn; iser_conn_get(ib_conn); /* ref iscsi/ib conn binding */ return 0; }
/** * beiscsi_conn_bind - Binds iscsi session/connection with TCP connection * @cls_session: pointer to iscsi cls session * @cls_conn: pointer to iscsi cls conn * @transport_fd: EP handle(64 bit) * * This function binds the TCP Conn with iSCSI Connection and Session. */ int beiscsi_conn_bind(struct iscsi_cls_session *cls_session, struct iscsi_cls_conn *cls_conn, u64 transport_fd, int is_leading) { struct iscsi_conn *conn = cls_conn->dd_data; struct beiscsi_conn *beiscsi_conn = conn->dd_data; struct Scsi_Host *shost = (struct Scsi_Host *)iscsi_session_to_shost(cls_session); struct beiscsi_hba *phba = (struct beiscsi_hba *)iscsi_host_priv(shost); struct beiscsi_endpoint *beiscsi_ep; struct iscsi_endpoint *ep; SE_DEBUG(DBG_LVL_8, "In beiscsi_conn_bind\n"); ep = iscsi2_lookup_endpoint(transport_fd); if (!ep) return -EINVAL; beiscsi_ep = ep->dd_data; if (iscsi2_conn_bind(cls_session, cls_conn, is_leading)) return -EINVAL; if (beiscsi_ep->phba != phba) { SE_DEBUG(DBG_LVL_8, "beiscsi_ep->hba=%p not equal to phba=%p \n", beiscsi_ep->phba, phba); return -EEXIST; } beiscsi_conn->beiscsi_conn_cid = beiscsi_ep->ep_cid; beiscsi_conn->ep = beiscsi_ep; beiscsi_ep->conn = beiscsi_conn; SE_DEBUG(DBG_LVL_8, "beiscsi_conn=%p conn=%p ep_cid=%d \n", beiscsi_conn, conn, beiscsi_ep->ep_cid); return beiscsi_bindconn_cid(phba, beiscsi_conn, beiscsi_ep->ep_cid); }