From 2409cdab42bcebc29ccf875f972b71adf8c20455 Mon Sep 17 00:00:00 2001 From: Eldad Zinger Date: Wed, 7 Jul 2010 18:48:27 +0300 Subject: [PATCH] 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 --- drivers/infiniband/ulp/sdp/sdp_main.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/infiniband/ulp/sdp/sdp_main.c b/drivers/infiniband/ulp/sdp/sdp_main.c index f1d148aff533..d8bfe308e13e 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); -- 2.51.0