From: Sean Hefty Date: Sat, 11 Aug 2012 05:26:38 +0000 (-0700) Subject: refresh (create temporary patch) X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=90d17655cedff2d7b2deb196c0a018edbb478a04;p=~shefty%2Flibrdmacm.git refresh (create temporary patch) --- diff --git a/meta b/meta index e1dc3e50..50367c89 100644 --- a/meta +++ b/meta @@ -1,11 +1,12 @@ Version: 1 -Previous: f1b0b772fe7fe9a44c0ea2f6606fb6f0071dd7d7 -Head: 0b26f0861db82da1458125921f1a6cf57d438ab8 +Previous: e509b95526999096b8bf1109f9e745ef761d107e +Head: 2f33e3b27447a71889836a14329da06ed5adca65 Applied: real-close: 3409f8d6af187d25c63a5d1f8ee8bff5f14555e2 dup2: ca5813e7cf95dee5933fc417e4a34d26f2b01824 oobinline: ac51c1095f505373a6ec54b8f1d990259fb34d97 fork-connect: 0b26f0861db82da1458125921f1a6cf57d438ab8 + refresh-temp: 2f33e3b27447a71889836a14329da06ed5adca65 Unapplied: dbg-out: 04273ee712db4d53efb390462c1b738bb54a57df fstat: a62c653906870422edef5f6388dac9f76c953e35 diff --git a/patches/refresh-temp b/patches/refresh-temp new file mode 100644 index 00000000..67ad2a0c --- /dev/null +++ b/patches/refresh-temp @@ -0,0 +1,75 @@ +Bottom: 64baa18c546931a07eef988a8d6bdef26a73feab +Top: 8e79723d04b7d3effe0d91fe456426c68892b6bb +Author: Sean Hefty +Date: 2012-08-10 22:26:38 -0700 + +Refresh of fork-connect + +--- + +diff --git a/src/preload.c b/src/preload.c +index e5d3fcb..9bc6c13 100644 +--- a/src/preload.c ++++ b/src/preload.c +@@ -486,8 +486,7 @@ int accept(int socket, struct sockaddr *addr, socklen_t *addrlen) + * We can't fork RDMA connections and pass them from the parent to the child + * process. Instead, we need to establish the RDMA connection after calling + * fork. To do this, we delay establishing the RDMA connection until we try +- * to send/receive on the server side. On the client side, we don't expect +- * to fork, so we switch from a TCP connection to an rsocket when connecting. ++ * to send/receive on the server side. + */ + static int fork_active(int socket, const struct sockaddr *addr, socklen_t addrlen) + { +@@ -498,9 +497,12 @@ static int fork_active(int socket, const struct sockaddr *addr, socklen_t addrle + fd = fd_getd(socket); + flags = real.fcntl(fd, F_GETFL); + real.fcntl(fd, F_SETFL, 0); +- ret = real.connect(fd, addr, addrlen); +- if (ret) +- return ret; ++ ++ if (!(flags & O_NONBLOCK)) { ++ ret = real.connect(fd, addr, addrlen); ++ if (ret) ++ return ret; ++ } + + ret = real.recv(fd, &msg, sizeof msg, MSG_PEEK); + if ((ret != sizeof msg) || msg) { +@@ -598,7 +600,7 @@ static inline enum fd_type fd_fork_get(int index, int *fd) + if (fdi->type == fd_fork_passive) + fork_passive(index); + else if (fdi->type == fd_fork_active) +- fork_active(index); ++ fork_active(index); /* NEED addr, addrlen */ + *fd = fdi->fd; + return fdi->type; + +@@ -611,6 +613,7 @@ static inline enum fd_type fd_fork_get(int index, int *fd) + int connect(int socket, const struct sockaddr *addr, socklen_t addrlen) + { + int fd, ret; ++ long flags; + + if (fd_get(socket, &fd) == fd_rsocket) { + ret = rconnect(fd, addr, addrlen); +@@ -623,10 +626,15 @@ int connect(int socket, const struct sockaddr *addr, socklen_t addrlen) + + rclose(fd); + fd = ret; +- } else { +- /* Set state to fork_active if nonblocking. if blocking fork_active */ +- return real.connect(fd, addr, addrlen); ++ } else if (fd_gets(socket) == fd_fork) { ++ flags = real.fcntl(fd, F_GETFL); ++ if (!(flags & O_NONBLOCK)) ++ return fork_active(socket, addr, addrlen); ++ ++ fd_store(socket, fd, fd_normal, fd_fork_active); + } ++ ++ return real.connect(fd, addr, addrlen); + } + + ssize_t recv(int socket, void *buf, size_t len, int flags)