]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
rdma_cm: CMA_QUERY_HANDLER: BAD STATUS -110 and -22
authorChien-Hua Yen <chien.yen@oracle.com>
Wed, 17 Jul 2013 22:54:52 +0000 (15:54 -0700)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Tue, 7 Jul 2015 21:58:49 +0000 (14:58 -0700)
Orabug: 16708786

Signed-off-by: Chien-Hua Yen <chien.yen@oracle.com>
(cherry picked from commit 0d0e27b60592d65b15cdc2926fbb032eaaa9351c)

Signed-off-by: Ajaykumar Hotchandani <ajaykumar.hotchandani@oracle.com>
Conflicts:
drivers/infiniband/core/cma.c

drivers/infiniband/core/cma.c
drivers/infiniband/core/sa_query.c

index f48e4501ef97bb4f88400a3d2b72a39335f32a14..0fe0706136b79d9939f71f6724a08728a49584c2 100644 (file)
@@ -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;
index 80461aff9c66e57bea715457647f145a4a76c202..fb6a32af0f79b5609697f098888ae429fed7c082 100644 (file)
@@ -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);
        }