[PATCH v5 4/4] rsockets: Support calling listen multiple times on same rsocket

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Note: The modified fix from Sean is being resent for completeness of changes
      Also attached the patch file for convenience

From: Sreedhar Kodali <srkodali@xxxxxxxxxxxxxxxxxx>
Date:   Thu Sep 18 14:51:58 2014 +0530

    Standard sockets allows an application to call listen() multiple
times on the same socket without error. This allows a multi-threaded
    app to call listen from all threads.

    rsockets will fail the second listen call.  Modify the behavior to
    match standard sockets.

    Problem reported by: Sreedhar Kodali <srkodali@xxxxxxxxxxxxxxxxxx>

    Signed-off-by: Sean Hefty <sean.hefty@xxxxxxxxx>
    ---

diff --git a/src/rsocket.c b/src/rsocket.c
index 16792cf..ae72a00 100644
--- a/src/rsocket.c
+++ b/src/rsocket.c
@@ -1179,9 +1179,15 @@ int rlisten(int socket, int backlog)
        rs = idm_lookup(&idm, socket);
        if (!rs)
                return ERR(EBADF);
-       ret = rdma_listen(rs->cm_id, backlog);
-       if (!ret)
-               rs->state = rs_listening;
+
+       if (rs->state != rs_listening) {
+               ret = rdma_listen(rs->cm_id, backlog);
+               if (!ret)
+                       rs->state = rs_listening;
+       } else {
+               ret = 0;
+       }
+
        return ret;
 }
commit 79d3f5cbfc92b48de33ad1cd22437aa6ce24cc52
Author: Sreedhar Kodali <srkodali@xxxxxxxxxxxxxxxxxx>
Date:   Thu Sep 18 14:51:58 2014 +0530

    Standard sockets allows an application to call listen() multiple
    times on the same socket without error.  This allows a multi-threaded
    app to call listen from all threads.
    
    rsockets will fail the second listen call.  Modify the behavior to
    match standard sockets.
    
    Problem reported by: Sreedhar Kodali <srkodali@xxxxxxxxxxxxxxxxxx>
    
    Signed-off-by: Sean Hefty <sean.hefty@xxxxxxxxx>
    ---

diff --git a/src/rsocket.c b/src/rsocket.c
index 16792cf..ae72a00 100644
--- a/src/rsocket.c
+++ b/src/rsocket.c
@@ -1179,9 +1179,15 @@ int rlisten(int socket, int backlog)
 	rs = idm_lookup(&idm, socket);
 	if (!rs)
 		return ERR(EBADF);
-	ret = rdma_listen(rs->cm_id, backlog);
-	if (!ret)
-		rs->state = rs_listening;
+
+	if (rs->state != rs_listening) {
+		ret = rdma_listen(rs->cm_id, backlog);
+		if (!ret)
+			rs->state = rs_listening;
+	} else {
+		ret = 0;
+	}
+
 	return ret;
 }
 

[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux