diff options
author | Zach Brown <zach.brown@oracle.com> | 2010-07-23 10:30:45 -0700 |
---|---|---|
committer | Andy Grover <andy.grover@oracle.com> | 2010-09-08 18:16:45 -0700 |
commit | fe8ff6b58f040dd52d2db45972db8e0301847f1c (patch) | |
tree | e332f689cfd9838b585f6106ff493672ce1db598 /net/rds/connection.c | |
parent | ea819867b788728aca60717e4fdacb3df771f670 (diff) | |
download | op-kernel-dev-fe8ff6b58f040dd52d2db45972db8e0301847f1c.zip op-kernel-dev-fe8ff6b58f040dd52d2db45972db8e0301847f1c.tar.gz |
RDS: lock rds_conn_count decrement in rds_conn_destroy()
rds_conn_destroy() can race with all other modifications of the
rds_conn_count but it was modifying the count without locking.
Signed-off-by: Zach Brown <zach.brown@oracle.com>
Diffstat (limited to 'net/rds/connection.c')
-rw-r--r-- | net/rds/connection.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/net/rds/connection.c b/net/rds/connection.c index 0de40d9..75a1a37 100644 --- a/net/rds/connection.c +++ b/net/rds/connection.c @@ -313,6 +313,7 @@ void rds_conn_shutdown(struct rds_connection *conn) void rds_conn_destroy(struct rds_connection *conn) { struct rds_message *rm, *rtmp; + unsigned long flags; rdsdebug("freeing conn %p for %pI4 -> " "%pI4\n", conn, &conn->c_laddr, @@ -350,7 +351,9 @@ void rds_conn_destroy(struct rds_connection *conn) BUG_ON(!list_empty(&conn->c_retrans)); kmem_cache_free(rds_conn_slab, conn); + spin_lock_irqsave(&rds_conn_lock, flags); rds_conn_count--; + spin_unlock_irqrestore(&rds_conn_lock, flags); } EXPORT_SYMBOL_GPL(rds_conn_destroy); |