diff options
Diffstat (limited to 'net/sctp/bind_addr.c')
-rw-r--r-- | net/sctp/bind_addr.c | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/net/sctp/bind_addr.c b/net/sctp/bind_addr.c index faf71d179e46..6338413376c8 100644 --- a/net/sctp/bind_addr.c +++ b/net/sctp/bind_addr.c | |||
@@ -140,14 +140,12 @@ void sctp_bind_addr_init(struct sctp_bind_addr *bp, __u16 port) | |||
140 | /* Dispose of the address list. */ | 140 | /* Dispose of the address list. */ |
141 | static void sctp_bind_addr_clean(struct sctp_bind_addr *bp) | 141 | static void sctp_bind_addr_clean(struct sctp_bind_addr *bp) |
142 | { | 142 | { |
143 | struct sctp_sockaddr_entry *addr; | 143 | struct sctp_sockaddr_entry *addr, *temp; |
144 | struct list_head *pos, *temp; | ||
145 | 144 | ||
146 | /* Empty the bind address list. */ | 145 | /* Empty the bind address list. */ |
147 | list_for_each_safe(pos, temp, &bp->address_list) { | 146 | list_for_each_entry_safe(addr, temp, &bp->address_list, list) { |
148 | addr = list_entry(pos, struct sctp_sockaddr_entry, list); | 147 | list_del_rcu(&addr->list); |
149 | list_del(pos); | 148 | call_rcu(&addr->rcu, sctp_local_addr_free); |
150 | kfree(addr); | ||
151 | SCTP_DBG_OBJCNT_DEC(addr); | 149 | SCTP_DBG_OBJCNT_DEC(addr); |
152 | } | 150 | } |
153 | } | 151 | } |
@@ -219,7 +217,7 @@ int sctp_del_bind_addr(struct sctp_bind_addr *bp, union sctp_addr *del_addr) | |||
219 | } | 217 | } |
220 | 218 | ||
221 | if (found) { | 219 | if (found) { |
222 | call_rcu(&addr->rcu, sctp_local_addr_free); | 220 | kfree_rcu(addr, rcu); |
223 | SCTP_DBG_OBJCNT_DEC(addr); | 221 | SCTP_DBG_OBJCNT_DEC(addr); |
224 | return 0; | 222 | return 0; |
225 | } | 223 | } |