From: Eldad Zinger Date: Wed, 7 Jul 2010 15:48:27 +0000 (+0300) Subject: sdp: if can't recv or send, and the qp is not active, return -EPIPE instead of 0 X-Git-Tag: v4.1.12-92~264^2~5^2~147 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=2409cdab42bcebc29ccf875f972b71adf8c20455;p=users%2Fjedix%2Flinux-maple.git sdp: if can't recv or send, and the qp is not active, return -EPIPE instead of 0 This fixes an endles loop problem where userspace programs are looping on recv or send until all required bytes processed or until an error returned. Signed-off-by: Eldad Zinger --- diff --git a/drivers/infiniband/ulp/sdp/sdp_main.c b/drivers/infiniband/ulp/sdp/sdp_main.c index f1d148aff5338..d8bfe308e13ef 100644 --- a/drivers/infiniband/ulp/sdp/sdp_main.c +++ b/drivers/infiniband/ulp/sdp/sdp_main.c @@ -2120,6 +2120,12 @@ out_err: fin: posts_handler_put(ssk); + if (!err && !ssk->qp_active) { + err = -EPIPE; + sdp_set_error(sk, err); + sdp_dbg(sk, "can't send anymore\n"); + } + release_sock(sk); return err; @@ -2507,6 +2513,12 @@ out: posts_handler_put(ssk); sdp_auto_moderation(ssk); + + if (!err && !ssk->qp_active) { + err = -EPIPE; + sdp_set_error(sk, err); + sdp_dbg(sk, "data won't be available anymore\n"); + } release_sock(sk); sdp_dbg_data(sk, "recvmsg finished. ret = %d\n", err);