Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
[linux-2.6-microblaze.git] / net / sunrpc / xprtrdma / transport.c
index 42e375d..6b7e10e 100644 (file)
@@ -235,8 +235,11 @@ xprt_rdma_connect_worker(struct work_struct *work)
        struct rpcrdma_xprt *r_xprt = container_of(work, struct rpcrdma_xprt,
                                                   rx_connect_worker.work);
        struct rpc_xprt *xprt = &r_xprt->rx_xprt;
+       unsigned int pflags = current->flags;
        int rc;
 
+       if (atomic_read(&xprt->swapper))
+               current->flags |= PF_MEMALLOC;
        rc = rpcrdma_xprt_connect(r_xprt);
        xprt_clear_connecting(xprt);
        if (!rc) {
@@ -250,6 +253,7 @@ xprt_rdma_connect_worker(struct work_struct *work)
                rpcrdma_xprt_disconnect(r_xprt);
        xprt_unlock_connect(xprt, r_xprt);
        xprt_wake_pending_tasks(xprt, rc);
+       current_restore_flags(pflags, PF_MEMALLOC);
 }
 
 /**
@@ -517,7 +521,7 @@ xprt_rdma_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task)
        return;
 
 out_sleep:
-       task->tk_status = -EAGAIN;
+       task->tk_status = -ENOMEM;
        xprt_add_backlog(xprt, task);
 }
 
@@ -570,8 +574,8 @@ xprt_rdma_allocate(struct rpc_task *task)
        gfp_t flags;
 
        flags = RPCRDMA_DEF_GFP;
-       if (RPC_IS_SWAPPER(task))
-               flags = __GFP_MEMALLOC | GFP_NOWAIT | __GFP_NOWARN;
+       if (RPC_IS_ASYNC(task))
+               flags = GFP_NOWAIT | __GFP_NOWARN;
 
        if (!rpcrdma_check_regbuf(r_xprt, req->rl_sendbuf, rqst->rq_callsize,
                                  flags))