RDS: don't call rds_conn_shutdown() from rds_conn_destroy()
[firefly-linux-kernel-4.4.55.git] / net / rds / connection.c
index 968b7a798398fce90eeb2d8b2d2b1073770a5950..519b4fe962b6057e68b04621b5459617d2a27cc4 100644 (file)
@@ -312,6 +312,10 @@ void rds_conn_shutdown(struct rds_connection *conn)
 
 /*
  * 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)
 {
@@ -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);
-
        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,