|
@@ -510,6 +510,7 @@ static int xs_nospace(struct rpc_task *task)
|
|
|
struct rpc_rqst *req = task->tk_rqstp;
|
|
|
struct rpc_xprt *xprt = req->rq_xprt;
|
|
|
struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
|
|
|
+ struct sock *sk = transport->inet;
|
|
|
int ret = -EAGAIN;
|
|
|
|
|
|
dprintk("RPC: %5u xmit incomplete (%u left of %u)\n",
|
|
@@ -527,7 +528,7 @@ static int xs_nospace(struct rpc_task *task)
|
|
|
* window size
|
|
|
*/
|
|
|
set_bit(SOCK_NOSPACE, &transport->sock->flags);
|
|
|
- transport->inet->sk_write_pending++;
|
|
|
+ sk->sk_write_pending++;
|
|
|
/* ...and wait for more buffer space */
|
|
|
xprt_wait_for_buffer_space(task, xs_nospace_callback);
|
|
|
}
|
|
@@ -537,6 +538,9 @@ static int xs_nospace(struct rpc_task *task)
|
|
|
}
|
|
|
|
|
|
spin_unlock_bh(&xprt->transport_lock);
|
|
|
+
|
|
|
+ /* Race breaker in case memory is freed before above code is called */
|
|
|
+ sk->sk_write_space(sk);
|
|
|
return ret;
|
|
|
}
|
|
|
|