Version: 1
-Previous: fed3462835b91d164a6f35f82d19f7240041f828
-Head: b2b48ba0a9ade70864e201b41e4cc7214081b452
+Previous: 4efbd0d33d93cd51bb292fb9fa817815acce7bda
+Head: 5a51c2ae068e7c4cfc0ca29ba2c1bbfb76595aa9
Applied:
v6only: 3afce107e2baec86c5541ed0acd992e37bcb992a
rselect: 7d25968d337e976e0e22fdba69c8a2a2f5d35008
shut_wr: b2b48ba0a9ade70864e201b41e4cc7214081b452
+ refresh-temp: 5a51c2ae068e7c4cfc0ca29ba2c1bbfb76595aa9
Unapplied:
rs-1sge: 8ec392829399dec7ed5c608b8697a482e5faa2de
ip6-opt: 7e43a759255e9890d1e41f1edf71792836f53941
--- /dev/null
+Bottom: 1264339bc4c5c10bfdee4de6e8d685732a67024a
+Top: 1c160ef5df5740a60dc56e2b865de959ae19f00c
+Author: Sean Hefty <sean.hefty@intel.com>
+Date: 2012-06-26 17:47:35 -0700
+
+Refresh of shut_wr
+
+---
+
+diff --git a/src/rsocket.c b/src/rsocket.c
+index 4ed646b..581ecd8 100644
+--- a/src/rsocket.c
++++ b/src/rsocket.c
+@@ -167,7 +167,7 @@ struct rsocket {
+ uint64_t so_opts;
+ uint64_t tcp_opts;
+ uint64_t ipv6_opts;
+- enum rs_state state;
++ int state;
+ int cq_armed;
+ int retries;
+ int err;
+@@ -757,6 +757,14 @@ int rconnect(int socket, const struct sockaddr *addr, socklen_t addrlen)
+ return rs_do_connect(rs);
+ }
+
++static int rs_shutdown_state(struct rsocket *rs, int state)
++{
++ rs->state &= ~state;
++ if (rs->state == rs_connected)
++ rs->state = rs_disconnected;
++ return rs->state == rs_disconnected;
++}
++
+ static int rs_post_write(struct rsocket *rs, uint64_t wr_id,
+ struct ibv_sge *sgl, int nsge,
+ uint32_t imm_data, int flags,
+@@ -889,7 +897,8 @@ static int rs_poll_cq(struct rsocket *rs)
+ rs->state = rs_disconnected;
+ return ERR(ECONNRESET);
+ } else if (rs_msg_data(imm_data) == RS_CTRL_SHUTDOWN) {
+- rs->state &= ~rs_connect_rd;
++ if (rs_shutdown_state(rs, rs_connect_rd))
++ return ERR(ECONNRESET);
+ }
+ break;
+ default:
+@@ -1702,9 +1711,7 @@ int rshutdown(int socket, int how)
+
+ rs = idm_at(&idm, socket);
+ if (how == SHUT_RD) {
+- rs->state &= ~rs_connect_rd;
+- if (rs->state == rs_connected)
+- rs->state = rs_disconnected;
++ rs_shutdown_state(rs, rs_connect_rd);
+ return 0;
+ }
+
+@@ -1716,8 +1723,8 @@ int rshutdown(int socket, int how)
+ ctrl = RS_CTRL_DISCONNECT;
+ rs->state = rs_disconnected;
+ } else {
+- ctrl = RS_CTRL_SHUTDOWN;
+- rs->state &= ~rs_connect_wr;
++ ctrl = rs_shutdown_state(rs, rs_connect_wr) ?
++ RS_CTRL_DISCONNECT : RS_CTRL_SHUTDOWN;
+ }
+ if (!rs_can_send_ctrl(rs)) {
+ ret = rs_process_cq(rs, 0, rs_can_send_ctrl);