lkml.org 
[lkml]   [2014]   [Dec]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.10 37/45] iser-target: Handle DEVICE_REMOVAL event on network portal listener correctly
    Date
    3.10-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Sagi Grimberg <sagig@dev.mellanox.co.il>

    commit 3b726ae2de02a406cc91903f80132daee37b6f1b upstream.

    In this case the cm_id->context is the isert_np, and the cm_id->qp
    is NULL, so use that to distinct the cases.

    Since we don't expect any other events on this cm_id we can
    just return -1 for explicit termination of the cm_id by the
    cma layer.

    Signed-off-by: Sagi Grimberg <sagig@mellanox.com>
    Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/infiniband/ulp/isert/ib_isert.c | 29 +++++++++++++++++++----------
    1 file changed, 19 insertions(+), 10 deletions(-)

    --- a/drivers/infiniband/ulp/isert/ib_isert.c
    +++ b/drivers/infiniband/ulp/isert/ib_isert.c
    @@ -585,14 +585,25 @@ wake_up:
    complete(&isert_conn->conn_wait);
    }

    -static void
    +static int
    isert_disconnected_handler(struct rdma_cm_id *cma_id, bool disconnect)
    {
    - struct isert_conn *isert_conn = (struct isert_conn *)cma_id->context;
    + struct isert_conn *isert_conn;
    +
    + if (!cma_id->qp) {
    + struct isert_np *isert_np = cma_id->context;
    +
    + isert_np->np_cm_id = NULL;
    + return -1;
    + }
    +
    + isert_conn = (struct isert_conn *)cma_id->context;

    isert_conn->disconnect = disconnect;
    INIT_WORK(&isert_conn->conn_logout_work, isert_disconnect_work);
    schedule_work(&isert_conn->conn_logout_work);
    +
    + return 0;
    }

    static int
    @@ -607,6 +618,9 @@ isert_cma_handler(struct rdma_cm_id *cma
    switch (event->event) {
    case RDMA_CM_EVENT_CONNECT_REQUEST:
    ret = isert_connect_request(cma_id, event);
    + if (ret)
    + pr_err("isert_cma_handler failed RDMA_CM_EVENT: 0x%08x %d\n",
    + event->event, ret);
    break;
    case RDMA_CM_EVENT_ESTABLISHED:
    isert_connected_handler(cma_id);
    @@ -616,7 +630,7 @@ isert_cma_handler(struct rdma_cm_id *cma
    case RDMA_CM_EVENT_DEVICE_REMOVAL: /* FALLTHRU */
    disconnect = true;
    case RDMA_CM_EVENT_TIMEWAIT_EXIT: /* FALLTHRU */
    - isert_disconnected_handler(cma_id, disconnect);
    + ret = isert_disconnected_handler(cma_id, disconnect);
    break;
    case RDMA_CM_EVENT_CONNECT_ERROR:
    default:
    @@ -624,12 +638,6 @@ isert_cma_handler(struct rdma_cm_id *cma
    break;
    }

    - if (ret != 0) {
    - pr_err("isert_cma_handler failed RDMA_CM_EVENT: 0x%08x %d\n",
    - event->event, ret);
    - dump_stack();
    - }
    -
    return ret;
    }

    @@ -2233,7 +2241,8 @@ isert_free_np(struct iscsi_np *np)
    {
    struct isert_np *isert_np = (struct isert_np *)np->np_context;

    - rdma_destroy_id(isert_np->np_cm_id);
    + if (isert_np->np_cm_id)
    + rdma_destroy_id(isert_np->np_cm_id);

    np->np_context = NULL;
    kfree(isert_np);



    \
     
     \ /
      Last update: 2014-12-06 00:41    [W:4.386 / U:0.088 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site