|
@@ -473,7 +473,16 @@ static int xs_nospace(struct rpc_task *task)
|
|
spin_unlock_bh(&xprt->transport_lock);
|
|
spin_unlock_bh(&xprt->transport_lock);
|
|
|
|
|
|
/* Race breaker in case memory is freed before above code is called */
|
|
/* Race breaker in case memory is freed before above code is called */
|
|
- sk->sk_write_space(sk);
|
|
|
|
|
|
+ if (ret == -EAGAIN) {
|
|
|
|
+ struct socket_wq *wq;
|
|
|
|
+
|
|
|
|
+ rcu_read_lock();
|
|
|
|
+ wq = rcu_dereference(sk->sk_wq);
|
|
|
|
+ set_bit(SOCKWQ_ASYNC_NOSPACE, &wq->flags);
|
|
|
|
+ rcu_read_unlock();
|
|
|
|
+
|
|
|
|
+ sk->sk_write_space(sk);
|
|
|
|
+ }
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|