diff options
Diffstat (limited to 'net/rds/af_rds.c')
-rw-r--r-- | net/rds/af_rds.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/net/rds/af_rds.c b/net/rds/af_rds.c index aebfecbdb841..bb6ad81b671d 100644 --- a/net/rds/af_rds.c +++ b/net/rds/af_rds.c | |||
@@ -39,7 +39,15 @@ | |||
39 | #include <net/sock.h> | 39 | #include <net/sock.h> |
40 | 40 | ||
41 | #include "rds.h" | 41 | #include "rds.h" |
42 | #include "rdma.h" | 42 | |
43 | char *rds_str_array(char **array, size_t elements, size_t index) | ||
44 | { | ||
45 | if ((index < elements) && array[index]) | ||
46 | return array[index]; | ||
47 | else | ||
48 | return "unknown"; | ||
49 | } | ||
50 | EXPORT_SYMBOL(rds_str_array); | ||
43 | 51 | ||
44 | /* this is just used for stats gathering :/ */ | 52 | /* this is just used for stats gathering :/ */ |
45 | static DEFINE_SPINLOCK(rds_sock_lock); | 53 | static DEFINE_SPINLOCK(rds_sock_lock); |
@@ -62,7 +70,7 @@ static int rds_release(struct socket *sock) | |||
62 | struct rds_sock *rs; | 70 | struct rds_sock *rs; |
63 | unsigned long flags; | 71 | unsigned long flags; |
64 | 72 | ||
65 | if (sk == NULL) | 73 | if (!sk) |
66 | goto out; | 74 | goto out; |
67 | 75 | ||
68 | rs = rds_sk_to_rs(sk); | 76 | rs = rds_sk_to_rs(sk); |
@@ -73,7 +81,15 @@ static int rds_release(struct socket *sock) | |||
73 | * with the socket. */ | 81 | * with the socket. */ |
74 | rds_clear_recv_queue(rs); | 82 | rds_clear_recv_queue(rs); |
75 | rds_cong_remove_socket(rs); | 83 | rds_cong_remove_socket(rs); |
84 | |||
85 | /* | ||
86 | * the binding lookup hash uses rcu, we need to | ||
87 | * make sure we sychronize_rcu before we free our | ||
88 | * entry | ||
89 | */ | ||
76 | rds_remove_bound(rs); | 90 | rds_remove_bound(rs); |
91 | synchronize_rcu(); | ||
92 | |||
77 | rds_send_drop_to(rs, NULL); | 93 | rds_send_drop_to(rs, NULL); |
78 | rds_rdma_drop_keys(rs); | 94 | rds_rdma_drop_keys(rs); |
79 | rds_notify_queue_get(rs, NULL); | 95 | rds_notify_queue_get(rs, NULL); |
@@ -83,6 +99,8 @@ static int rds_release(struct socket *sock) | |||
83 | rds_sock_count--; | 99 | rds_sock_count--; |
84 | spin_unlock_irqrestore(&rds_sock_lock, flags); | 100 | spin_unlock_irqrestore(&rds_sock_lock, flags); |
85 | 101 | ||
102 | rds_trans_put(rs->rs_transport); | ||
103 | |||
86 | sock->sk = NULL; | 104 | sock->sk = NULL; |
87 | sock_put(sk); | 105 | sock_put(sk); |
88 | out: | 106 | out: |
@@ -514,7 +532,7 @@ out: | |||
514 | spin_unlock_irqrestore(&rds_sock_lock, flags); | 532 | spin_unlock_irqrestore(&rds_sock_lock, flags); |
515 | } | 533 | } |
516 | 534 | ||
517 | static void __exit rds_exit(void) | 535 | static void rds_exit(void) |
518 | { | 536 | { |
519 | sock_unregister(rds_family_ops.family); | 537 | sock_unregister(rds_family_ops.family); |
520 | proto_unregister(&rds_proto); | 538 | proto_unregister(&rds_proto); |
@@ -529,7 +547,7 @@ static void __exit rds_exit(void) | |||
529 | } | 547 | } |
530 | module_exit(rds_exit); | 548 | module_exit(rds_exit); |
531 | 549 | ||
532 | static int __init rds_init(void) | 550 | static int rds_init(void) |
533 | { | 551 | { |
534 | int ret; | 552 | int ret; |
535 | 553 | ||