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>
struct rs_sge data_buf;
};
+/*
+ * rsocket states are ordered as connecting, connected, disconnected.
+ */
enum rs_state {
rs_init,
rs_bound,
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)
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)