On Tue, 21 Oct 2008 20:33:52 +0200 <volker.jaenisch at inqbus.de> wrote: > Hi Tomonori! > > (Is this the right salutation? Mike Christy called you tomo ..) > > Thanks a lot for the patch! My colleague (I'm on vacation) has tried the > patch - it compiles, tgtd works. > But if a second sessions is negotiating to the target the tgtd dies. > > It may not be the intention of the patch but this prevents deadly sure that > never two sessions aquire the same target :-)). > > My colleague will join the list asap to report the issue. He did the patch > by hand into > version tgt-20080805, which we choose to run our production environment. > > Is the patch version dependend? Which version do you recommend to work on? > I learned today that the 0.91-Version is going to get released soon. Oops, can you try this patch (please ignore the previous patch)? This can be applied to tgt-20080805 (0.90, and the latest git tree too). diff --git a/usr/iscsi/iscsid.c b/usr/iscsi/iscsid.c index cb2ba0b..c22a6f6 100644 --- a/usr/iscsi/iscsid.c +++ b/usr/iscsi/iscsid.c @@ -498,6 +498,7 @@ static void login_finish(struct iscsi_connection *conn) { struct iscsi_login_rsp *rsp = (struct iscsi_login_rsp *) &conn->rsp.bhs; int ret; + uint8_t class, detail; switch (conn->session_type) { case SESSION_NORMAL: @@ -513,25 +514,25 @@ static void login_finish(struct iscsi_connection *conn) */ ret = conn->tp->ep_login_complete(conn); if (ret) { - rsp->flags = 0; - rsp->status_class = ISCSI_STATUS_CLS_TARGET_ERR; - rsp->status_detail = ISCSI_LOGIN_STATUS_NO_RESOURCES; - conn->state = STATE_EXIT; - break; + class = ISCSI_STATUS_CLS_TARGET_ERR; + detail = ISCSI_LOGIN_STATUS_NO_RESOURCES; + goto fail; } if (!conn->session) { - session_create(conn); + ret = session_create(conn); + if (ret) { + class = ISCSI_STATUS_CLS_TARGET_ERR; + detail = ISCSI_LOGIN_STATUS_TARGET_ERROR; + goto fail; + } } else { if (conn->tp->rdma ^ conn->session->rdma) { eprintf("new conn rdma %d, but session %d\n", conn->tp->rdma, conn->session->rdma); - rsp->flags = 0; - rsp->status_class = - ISCSI_STATUS_CLS_INITIATOR_ERR; - rsp->status_detail = - ISCSI_LOGIN_STATUS_INVALID_REQUEST; - conn->state = STATE_EXIT; - break; + + class = ISCSI_STATUS_CLS_INITIATOR_ERR; + detail =ISCSI_LOGIN_STATUS_INVALID_REQUEST; + goto fail; } } memcpy(conn->isid, conn->session->isid, sizeof(conn->isid)); @@ -542,6 +543,14 @@ static void login_finish(struct iscsi_connection *conn) conn->tsih = 1; break; } + + return; +fail: + rsp->flags = 0; + rsp->status_class = class; + rsp->status_detail = detail; + conn->state = STATE_EXIT; + return; } static int cmnd_exec_auth(struct iscsi_connection *conn) diff --git a/usr/target.c b/usr/target.c index dc30c87..91085dc 100644 --- a/usr/target.c +++ b/usr/target.c @@ -248,6 +248,9 @@ int it_nexus_create(int tid, uint64_t itn_id, int host_no, char *info) target = target_lookup(tid); + if (!list_empty(&target->it_nexus_list)) + return -EEXIST; + itn = zalloc(sizeof(*itn)); if (!itn) return -ENOMEM; -- To unsubscribe from this list: send the line "unsubscribe stgt" in the body of a message to majordomo at vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html |