]> git.openfabrics.org - ~shefty/librdmacm.git/commitdiff
rsocket: Fix hang in rrecv() after disconnecting
authorSean Hefty <sean.hefty@intel.com>
Sat, 26 May 2012 00:24:08 +0000 (17:24 -0700)
committerSean Hefty <sean.hefty@intel.com>
Sat, 26 May 2012 00:24:08 +0000 (17:24 -0700)
If a user calls rrecv() after a blocking rsocket has been disconnected,
it will hang.  This problem was reported by Sirdhar Samudrala
<samudrala@us.ibm.com>.  It can be reproduced by running netserver -f -D
using the rs-preload library.

Signed-off-by: Pradeep Satyanarayana <pradeeps@linux.vnet.ibm.com>
Signed-off-by: Sean Hefty <sean.hefty@intel.com>
src/rsocket.c

index 5eec5d9c6a8f0cfa5f34e3d945a5baec3f49fa3e..dc6fc70837caa36a19a06611bd3d7a0574183e35 100644 (file)
@@ -121,6 +121,9 @@ struct rs_conn_data {
        struct rs_sge     data_buf;
 };
 
+/*
+ * rsocket states are ordered as connecting, connected, disconnected.
+ */
 enum rs_state {
        rs_init,
        rs_bound,
@@ -994,9 +997,7 @@ ssize_t rrecv(int socket, void *buf, size_t len, int flags)
        int ret;
 
        rs = idm_at(&idm, socket);
-       if (rs->state != rs_connected &&
-           (rs->state == rs_resolving_addr || rs->state == rs_resolving_route ||
-            rs->state == rs_connecting || rs->state == rs_accepting)) {
+       if (rs->state < rs_connected) {
                ret = rs_do_connect(rs);
                if (ret) {
                        if (errno == EINPROGRESS)
@@ -1098,7 +1099,7 @@ ssize_t rsend(int socket, const void *buf, size_t len, int flags)
        int ret = 0;
 
        rs = idm_at(&idm, socket);
-       if (rs->state != rs_connected) {
+       if (rs->state < rs_connected) {
                ret = rs_do_connect(rs);
                if (ret) {
                        if (errno == EINPROGRESS)