projects
/
firefly-linux-kernel-4.4.55.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
RDS: don't call rds_conn_shutdown() from rds_conn_destroy()
[firefly-linux-kernel-4.4.55.git]
/
net
/
rds
/
connection.c
diff --git
a/net/rds/connection.c
b/net/rds/connection.c
index 968b7a798398fce90eeb2d8b2d2b1073770a5950..519b4fe962b6057e68b04621b5459617d2a27cc4 100644
(file)
--- a/
net/rds/connection.c
+++ b/
net/rds/connection.c
@@
-312,6
+312,10
@@
void rds_conn_shutdown(struct rds_connection *conn)
/*
* Stop and free a connection.
/*
* Stop and free a connection.
+ *
+ * This can only be used in very limited circumstances. It assumes that once
+ * the conn has been shutdown that no one else is referencing the connection.
+ * We can only ensure this in the rmmod path in the current code.
*/
void rds_conn_destroy(struct rds_connection *conn)
{
*/
void rds_conn_destroy(struct rds_connection *conn)
{
@@
-326,10
+330,11
@@
void rds_conn_destroy(struct rds_connection *conn)
spin_lock_irq(&rds_conn_lock);
hlist_del_init_rcu(&conn->c_hash_node);
spin_unlock_irq(&rds_conn_lock);
spin_lock_irq(&rds_conn_lock);
hlist_del_init_rcu(&conn->c_hash_node);
spin_unlock_irq(&rds_conn_lock);
-
synchronize_rcu();
synchronize_rcu();
- rds_conn_shutdown(conn);
+ /* shut the connection down */
+ rds_conn_drop(conn);
+ flush_work(&conn->c_down_w);
/* tear down queued messages */
list_for_each_entry_safe(rm, rtmp,
/* tear down queued messages */
list_for_each_entry_safe(rm, rtmp,