aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZach Brown <zach.brown@oracle.com>2010-05-24 13:14:59 -0700
committerAndy Grover <andy.grover@oracle.com>2010-09-08 18:15:15 -0700
commita46ca94e7fb2c93a59e08b42fd77d8c478fda5fc (patch)
tree2c7e4be2d85d55c0fc69d60c18504d8eec4acfe2
parentrds: Fix reference counting on the for xmit_atomic and xmit_rdma (diff)
downloadlinux-dev-a46ca94e7fb2c93a59e08b42fd77d8c478fda5fc.tar.xz
linux-dev-a46ca94e7fb2c93a59e08b42fd77d8c478fda5fc.zip
RDS/IB: rds_ib_cm_handle_connect() forgot to unlock c_cm_lock
rds_ib_cm_handle_connect() could return without unlocking the c_conn_lock if rds_setup_qp() failed. Rather than adding another imbalanced mutex_unlock() to this error path we only unlock the mutex once as we exit the function, reducing the likelyhood of making this same mistake in the future. We remove the previous mulitple return sites, leaving one unambigious return path. Signed-off-by: Zach Brown <zach.brown@oracle.com>
-rw-r--r--net/rds/ib_cm.c15
1 files changed, 6 insertions, 9 deletions
diff --git a/net/rds/ib_cm.c b/net/rds/ib_cm.c
index b5d0b60a26bc..73253f7c1fa3 100644
--- a/net/rds/ib_cm.c
+++ b/net/rds/ib_cm.c
@@ -428,7 +428,7 @@ int rds_ib_cm_handle_connect(struct rdma_cm_id *cm_id,
struct rds_ib_connection *ic = NULL;
struct rdma_conn_param conn_param;
u32 version;
- int err, destroy = 1;
+ int err = 1, destroy = 1;
/* Check whether the remote protocol version matches ours. */
version = rds_ib_protocol_compatible(event);
@@ -467,7 +467,6 @@ int rds_ib_cm_handle_connect(struct rdma_cm_id *cm_id,
/* Wait and see - our connect may still be succeeding */
rds_ib_stats_inc(s_ib_connect_raced);
}
- mutex_unlock(&conn->c_cm_lock);
goto out;
}
@@ -504,16 +503,14 @@ int rds_ib_cm_handle_connect(struct rdma_cm_id *cm_id,
/* rdma_accept() calls rdma_reject() internally if it fails */
err = rdma_accept(cm_id, &conn_param);
- mutex_unlock(&conn->c_cm_lock);
- if (err) {
+ if (err)
rds_ib_conn_error(conn, "rdma_accept failed (%d)\n", err);
- goto out;
- }
-
- return 0;
out:
- rdma_reject(cm_id, NULL, 0);
+ if (conn)
+ mutex_unlock(&conn->c_cm_lock);
+ if (err)
+ rdma_reject(cm_id, NULL, 0);
return destroy;
}