From: Chien-Hua Yen Date: Wed, 17 Jul 2013 22:54:52 +0000 (-0700) Subject: rdma_cm: CMA_QUERY_HANDLER: BAD STATUS -110 and -22 X-Git-Tag: v4.1.12-92~293^2~1^2~16 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=a8ae62260246dee71a830da27b3d452b13c8e258;p=users%2Fjedix%2Flinux-maple.git rdma_cm: CMA_QUERY_HANDLER: BAD STATUS -110 and -22 Orabug: 16708786 Signed-off-by: Chien-Hua Yen (cherry picked from commit 0d0e27b60592d65b15cdc2926fbb032eaaa9351c) Signed-off-by: Ajaykumar Hotchandani Conflicts: drivers/infiniband/core/cma.c --- diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c index f48e4501ef97b..0fe0706136b79 100644 --- a/drivers/infiniband/core/cma.c +++ b/drivers/infiniband/core/cma.c @@ -1776,6 +1776,7 @@ static void cma_query_handler(int status, struct ib_sa_path_rec *path_rec, { struct cma_work *work = context; struct rdma_route *route; + struct rdma_id_private *id_priv = work->id; route = &work->id->id.route; @@ -1783,6 +1784,9 @@ static void cma_query_handler(int status, struct ib_sa_path_rec *path_rec, route->num_paths = 1; *route->path_rec = *path_rec; } else { + if (status != -EBUSY && status != -ETIMEDOUT) + if (printk_ratelimit()) + cma_warn(id_priv, "bad status %d from path query\n", status); work->old_state = RDMA_CM_ROUTE_QUERY; work->new_state = RDMA_CM_ADDR_RESOLVED; work->event.event = RDMA_CM_EVENT_ROUTE_ERROR; diff --git a/drivers/infiniband/core/sa_query.c b/drivers/infiniband/core/sa_query.c index 80461aff9c66e..fb6a32af0f79b 100644 --- a/drivers/infiniband/core/sa_query.c +++ b/drivers/infiniband/core/sa_query.c @@ -1137,12 +1137,18 @@ static void recv_handler(struct ib_mad_agent *mad_agent, query = mad_buf->context[0]; if (query->callback) { - if (mad_recv_wc->wc->status == IB_WC_SUCCESS) - query->callback(query, - mad_recv_wc->recv_buf.mad->mad_hdr.status ? - -EINVAL : 0, + if (mad_recv_wc->wc->status == IB_WC_SUCCESS) { + int mad_status = mad_recv_wc->recv_buf.mad->mad_hdr.status; + int status = 0; + + if ((mad_status & IB_MGMT_MAD_STATUS_BUSY) && (mad_status & \ + ~(IB_MGMT_MAD_STATUS_BUSY|IB_MGMT_MAD_STATUS_REDIRECT_REQD)) == 0) + status = -EBUSY; + else if (mad_status) + status = -EINVAL; + query->callback(query, status, (struct ib_sa_mad *) mad_recv_wc->recv_buf.mad); - else + } else query->callback(query, -EIO, NULL); }