From 3a1fc5e248717d04e0ca1cebab4b7b11e481e9dd Mon Sep 17 00:00:00 2001 From: Sean Hefty Date: Mon, 25 Jun 2012 14:19:54 -0700 Subject: [PATCH] rsocket: Handle SHUT_WR shutdown option Signed-off-by: Sean Hefty --- src/rsocket.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/rsocket.c b/src/rsocket.c index ed994fe3..8263def6 100644 --- a/src/rsocket.c +++ b/src/rsocket.c @@ -321,7 +321,7 @@ static int rs_set_nonblocking(struct rsocket *rs, long arg) if (rs->cm_id->recv_cq_channel) ret = fcntl(rs->cm_id->recv_cq_channel->fd, F_SETFL, arg); - if (!ret && rs->state != rs_connected) + if (!ret && rs->state < rs_connected) ret = fcntl(rs->cm_id->channel->fd, F_SETFL, arg); return ret; @@ -907,7 +907,7 @@ static int rs_poll_cq(struct rsocket *rs) } } - if (rs->state == rs_connected) { + if (rs->state != rs_error) { while (!ret && rcnt--) ret = rdma_post_recvv(rs->cm_id, NULL, NULL, 0); @@ -932,7 +932,7 @@ static int rs_get_cq_event(struct rsocket *rs) if (!ret) { ibv_ack_cq_events(rs->cm_id->recv_cq, 1); rs->cq_armed = 0; - } else if (errno != EAGAIN && rs->state == rs_connected) { + } else if (errno != EAGAIN) { rs->state = rs_error; } @@ -1466,10 +1466,12 @@ static int rs_poll_rs(struct rsocket *rs, int events, revents |= POLLIN; if ((events & POLLOUT) && rs_can_send(rs)) revents |= POLLOUT; - if (rs->state == rs_disconnected) - revents |= POLLHUP; - else if (rs->state == rs_error) - revents |= POLLERR; + if (rs->state > rs_connected) { + if (rs->state == rs_error) + revents |= POLLERR; + else + revents |= POLLHUP; + } return revents; case rs_connect_error: @@ -1690,12 +1692,16 @@ int rshutdown(int socket, int how) struct rsocket *rs; int ret = 0; + if (how == SHUT_RD) + return 0; + rs = idm_at(&idm, socket); if (rs->fd_flags & O_NONBLOCK) rs_set_nonblocking(rs, 0); if (rs->state == rs_connected) { - rs->state = rs_disconnected; + if (how == SHUT_RDWR) + rs->state = rs_disconnected; if (!rs_can_send_ctrl(rs)) { ret = rs_process_cq(rs, 0, rs_can_send_ctrl); if (ret) @@ -1711,6 +1717,9 @@ int rshutdown(int socket, int how) if (!rs_all_sends_done(rs) && rs->state != rs_error) rs_process_cq(rs, 0, rs_all_sends_done); + if ((rs->fd_flags & O_NONBLOCK) && (how == SHUT_WR)) + rs_set_nonblocking(rs, 1); + return 0; } -- 2.45.2