summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorTom Herbert <tom@quantonium.net>2017-12-04 13:31:41 -0500
committerDavid S. Miller <davem@davemloft.net>2017-12-11 09:58:38 -0500
commit97a6ec4ac021f7fbec05c15a3aa0c4aaf0461af5 (patch)
tree06f6f0559c003ac7f718d1453120bf21044d7a35 /net
parenta0b586fa75a69578ecf10b40582eed9b35de2432 (diff)
rhashtable: Change rhashtable_walk_start to return void
Most callers of rhashtable_walk_start don't care about a resize event which is indicated by a return value of -EAGAIN. So calls to rhashtable_walk_start are wrapped wih code to ignore -EAGAIN. Something like this is common: ret = rhashtable_walk_start(rhiter); if (ret && ret != -EAGAIN) goto out; Since zero and -EAGAIN are the only possible return values from the function this check is pointless. The condition never evaluates to true. This patch changes rhashtable_walk_start to return void. This simplifies code for the callers that ignore -EAGAIN. For the few cases where the caller cares about the resize event, particularly where the table can be walked in mulitple parts for netlink or seq file dump, the function rhashtable_walk_start_check has been added that returns -EAGAIN on a resize event. Signed-off-by: Tom Herbert <tom@quantonium.net> Acked-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r--net/ipv6/ila/ila_xlat.c4
-rw-r--r--net/ipv6/seg6.c4
-rw-r--r--net/mac80211/mesh_pathtbl.c34
-rw-r--r--net/netfilter/nft_set_hash.c10
-rw-r--r--net/netlink/af_netlink.c5
-rw-r--r--net/netlink/diag.c8
-rw-r--r--net/sctp/proc.c6
-rw-r--r--net/sctp/socket.c19
-rw-r--r--net/tipc/socket.c6
9 files changed, 26 insertions, 70 deletions
diff --git a/net/ipv6/ila/ila_xlat.c b/net/ipv6/ila/ila_xlat.c
index 6eb5e68f112a..44c39c5f0638 100644
--- a/net/ipv6/ila/ila_xlat.c
+++ b/net/ipv6/ila/ila_xlat.c
@@ -512,9 +512,7 @@ static int ila_nl_dump(struct sk_buff *skb, struct netlink_callback *cb)
512 struct ila_map *ila; 512 struct ila_map *ila;
513 int ret; 513 int ret;
514 514
515 ret = rhashtable_walk_start(rhiter); 515 rhashtable_walk_start(rhiter);
516 if (ret && ret != -EAGAIN)
517 goto done;
518 516
519 for (;;) { 517 for (;;) {
520 ila = rhashtable_walk_next(rhiter); 518 ila = rhashtable_walk_next(rhiter);
diff --git a/net/ipv6/seg6.c b/net/ipv6/seg6.c
index c81407770956..7f5621d09571 100644
--- a/net/ipv6/seg6.c
+++ b/net/ipv6/seg6.c
@@ -306,9 +306,7 @@ static int seg6_genl_dumphmac(struct sk_buff *skb, struct netlink_callback *cb)
306 struct seg6_hmac_info *hinfo; 306 struct seg6_hmac_info *hinfo;
307 int ret; 307 int ret;
308 308
309 ret = rhashtable_walk_start(iter); 309 rhashtable_walk_start(iter);
310 if (ret && ret != -EAGAIN)
311 goto done;
312 310
313 for (;;) { 311 for (;;) {
314 hinfo = rhashtable_walk_next(iter); 312 hinfo = rhashtable_walk_next(iter);
diff --git a/net/mac80211/mesh_pathtbl.c b/net/mac80211/mesh_pathtbl.c
index 86c8dfef56a4..a5125624a76d 100644
--- a/net/mac80211/mesh_pathtbl.c
+++ b/net/mac80211/mesh_pathtbl.c
@@ -257,9 +257,7 @@ __mesh_path_lookup_by_idx(struct mesh_table *tbl, int idx)
257 if (ret) 257 if (ret)
258 return NULL; 258 return NULL;
259 259
260 ret = rhashtable_walk_start(&iter); 260 rhashtable_walk_start(&iter);
261 if (ret && ret != -EAGAIN)
262 goto err;
263 261
264 while ((mpath = rhashtable_walk_next(&iter))) { 262 while ((mpath = rhashtable_walk_next(&iter))) {
265 if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN) 263 if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN)
@@ -269,7 +267,6 @@ __mesh_path_lookup_by_idx(struct mesh_table *tbl, int idx)
269 if (i++ == idx) 267 if (i++ == idx)
270 break; 268 break;
271 } 269 }
272err:
273 rhashtable_walk_stop(&iter); 270 rhashtable_walk_stop(&iter);
274 rhashtable_walk_exit(&iter); 271 rhashtable_walk_exit(&iter);
275 272
@@ -513,9 +510,7 @@ void mesh_plink_broken(struct sta_info *sta)
513 if (ret) 510 if (ret)
514 return; 511 return;
515 512
516 ret = rhashtable_walk_start(&iter); 513 rhashtable_walk_start(&iter);
517 if (ret && ret != -EAGAIN)
518 goto out;
519 514
520 while ((mpath = rhashtable_walk_next(&iter))) { 515 while ((mpath = rhashtable_walk_next(&iter))) {
521 if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN) 516 if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN)
@@ -535,7 +530,6 @@ void mesh_plink_broken(struct sta_info *sta)
535 WLAN_REASON_MESH_PATH_DEST_UNREACHABLE, bcast); 530 WLAN_REASON_MESH_PATH_DEST_UNREACHABLE, bcast);
536 } 531 }
537 } 532 }
538out:
539 rhashtable_walk_stop(&iter); 533 rhashtable_walk_stop(&iter);
540 rhashtable_walk_exit(&iter); 534 rhashtable_walk_exit(&iter);
541} 535}
@@ -584,9 +578,7 @@ void mesh_path_flush_by_nexthop(struct sta_info *sta)
584 if (ret) 578 if (ret)
585 return; 579 return;
586 580
587 ret = rhashtable_walk_start(&iter); 581 rhashtable_walk_start(&iter);
588 if (ret && ret != -EAGAIN)
589 goto out;
590 582
591 while ((mpath = rhashtable_walk_next(&iter))) { 583 while ((mpath = rhashtable_walk_next(&iter))) {
592 if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN) 584 if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN)
@@ -597,7 +589,7 @@ void mesh_path_flush_by_nexthop(struct sta_info *sta)
597 if (rcu_access_pointer(mpath->next_hop) == sta) 589 if (rcu_access_pointer(mpath->next_hop) == sta)
598 __mesh_path_del(tbl, mpath); 590 __mesh_path_del(tbl, mpath);
599 } 591 }
600out: 592
601 rhashtable_walk_stop(&iter); 593 rhashtable_walk_stop(&iter);
602 rhashtable_walk_exit(&iter); 594 rhashtable_walk_exit(&iter);
603} 595}
@@ -614,9 +606,7 @@ static void mpp_flush_by_proxy(struct ieee80211_sub_if_data *sdata,
614 if (ret) 606 if (ret)
615 return; 607 return;
616 608
617 ret = rhashtable_walk_start(&iter); 609 rhashtable_walk_start(&iter);
618 if (ret && ret != -EAGAIN)
619 goto out;
620 610
621 while ((mpath = rhashtable_walk_next(&iter))) { 611 while ((mpath = rhashtable_walk_next(&iter))) {
622 if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN) 612 if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN)
@@ -627,7 +617,7 @@ static void mpp_flush_by_proxy(struct ieee80211_sub_if_data *sdata,
627 if (ether_addr_equal(mpath->mpp, proxy)) 617 if (ether_addr_equal(mpath->mpp, proxy))
628 __mesh_path_del(tbl, mpath); 618 __mesh_path_del(tbl, mpath);
629 } 619 }
630out: 620
631 rhashtable_walk_stop(&iter); 621 rhashtable_walk_stop(&iter);
632 rhashtable_walk_exit(&iter); 622 rhashtable_walk_exit(&iter);
633} 623}
@@ -642,9 +632,7 @@ static void table_flush_by_iface(struct mesh_table *tbl)
642 if (ret) 632 if (ret)
643 return; 633 return;
644 634
645 ret = rhashtable_walk_start(&iter); 635 rhashtable_walk_start(&iter);
646 if (ret && ret != -EAGAIN)
647 goto out;
648 636
649 while ((mpath = rhashtable_walk_next(&iter))) { 637 while ((mpath = rhashtable_walk_next(&iter))) {
650 if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN) 638 if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN)
@@ -653,7 +641,7 @@ static void table_flush_by_iface(struct mesh_table *tbl)
653 break; 641 break;
654 __mesh_path_del(tbl, mpath); 642 __mesh_path_del(tbl, mpath);
655 } 643 }
656out: 644
657 rhashtable_walk_stop(&iter); 645 rhashtable_walk_stop(&iter);
658 rhashtable_walk_exit(&iter); 646 rhashtable_walk_exit(&iter);
659} 647}
@@ -873,9 +861,7 @@ void mesh_path_tbl_expire(struct ieee80211_sub_if_data *sdata,
873 if (ret) 861 if (ret)
874 return; 862 return;
875 863
876 ret = rhashtable_walk_start(&iter); 864 rhashtable_walk_start(&iter);
877 if (ret && ret != -EAGAIN)
878 goto out;
879 865
880 while ((mpath = rhashtable_walk_next(&iter))) { 866 while ((mpath = rhashtable_walk_next(&iter))) {
881 if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN) 867 if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN)
@@ -887,7 +873,7 @@ void mesh_path_tbl_expire(struct ieee80211_sub_if_data *sdata,
887 time_after(jiffies, mpath->exp_time + MESH_PATH_EXPIRE)) 873 time_after(jiffies, mpath->exp_time + MESH_PATH_EXPIRE))
888 __mesh_path_del(tbl, mpath); 874 __mesh_path_del(tbl, mpath);
889 } 875 }
890out: 876
891 rhashtable_walk_stop(&iter); 877 rhashtable_walk_stop(&iter);
892 rhashtable_walk_exit(&iter); 878 rhashtable_walk_exit(&iter);
893} 879}
diff --git a/net/netfilter/nft_set_hash.c b/net/netfilter/nft_set_hash.c
index f8166c1d5430..3f1624ee056f 100644
--- a/net/netfilter/nft_set_hash.c
+++ b/net/netfilter/nft_set_hash.c
@@ -251,11 +251,7 @@ static void nft_rhash_walk(const struct nft_ctx *ctx, struct nft_set *set,
251 if (err) 251 if (err)
252 return; 252 return;
253 253
254 err = rhashtable_walk_start(&hti); 254 rhashtable_walk_start(&hti);
255 if (err && err != -EAGAIN) {
256 iter->err = err;
257 goto out;
258 }
259 255
260 while ((he = rhashtable_walk_next(&hti))) { 256 while ((he = rhashtable_walk_next(&hti))) {
261 if (IS_ERR(he)) { 257 if (IS_ERR(he)) {
@@ -306,9 +302,7 @@ static void nft_rhash_gc(struct work_struct *work)
306 if (err) 302 if (err)
307 goto schedule; 303 goto schedule;
308 304
309 err = rhashtable_walk_start(&hti); 305 rhashtable_walk_start(&hti);
310 if (err && err != -EAGAIN)
311 goto out;
312 306
313 while ((he = rhashtable_walk_next(&hti))) { 307 while ((he = rhashtable_walk_next(&hti))) {
314 if (IS_ERR(he)) { 308 if (IS_ERR(he)) {
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index b9e0ee4e22f5..ab325d4d6fef 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -2478,8 +2478,9 @@ static int netlink_walk_start(struct nl_seq_iter *iter)
2478 return err; 2478 return err;
2479 } 2479 }
2480 2480
2481 err = rhashtable_walk_start(&iter->hti); 2481 rhashtable_walk_start(&iter->hti);
2482 return err == -EAGAIN ? 0 : err; 2482
2483 return 0;
2483} 2484}
2484 2485
2485static void netlink_walk_stop(struct nl_seq_iter *iter) 2486static void netlink_walk_stop(struct nl_seq_iter *iter)
diff --git a/net/netlink/diag.c b/net/netlink/diag.c
index 8faa20b4d457..7dda33b9b784 100644
--- a/net/netlink/diag.c
+++ b/net/netlink/diag.c
@@ -115,11 +115,7 @@ static int __netlink_diag_dump(struct sk_buff *skb, struct netlink_callback *cb,
115 if (!s_num) 115 if (!s_num)
116 rhashtable_walk_enter(&tbl->hash, hti); 116 rhashtable_walk_enter(&tbl->hash, hti);
117 117
118 ret = rhashtable_walk_start(hti); 118 rhashtable_walk_start(hti);
119 if (ret == -EAGAIN)
120 ret = 0;
121 if (ret)
122 goto stop;
123 119
124 while ((nlsk = rhashtable_walk_next(hti))) { 120 while ((nlsk = rhashtable_walk_next(hti))) {
125 if (IS_ERR(nlsk)) { 121 if (IS_ERR(nlsk)) {
@@ -146,8 +142,8 @@ static int __netlink_diag_dump(struct sk_buff *skb, struct netlink_callback *cb,
146 } 142 }
147 } 143 }
148 144
149stop:
150 rhashtable_walk_stop(hti); 145 rhashtable_walk_stop(hti);
146
151 if (ret) 147 if (ret)
152 goto done; 148 goto done;
153 149
diff --git a/net/sctp/proc.c b/net/sctp/proc.c
index 26b4be6b4172..4545bc2aff84 100644
--- a/net/sctp/proc.c
+++ b/net/sctp/proc.c
@@ -288,12 +288,8 @@ struct sctp_ht_iter {
288static void *sctp_transport_seq_start(struct seq_file *seq, loff_t *pos) 288static void *sctp_transport_seq_start(struct seq_file *seq, loff_t *pos)
289{ 289{
290 struct sctp_ht_iter *iter = seq->private; 290 struct sctp_ht_iter *iter = seq->private;
291 int err = sctp_transport_walk_start(&iter->hti);
292 291
293 if (err) { 292 sctp_transport_walk_start(&iter->hti);
294 iter->start_fail = 1;
295 return ERR_PTR(err);
296 }
297 293
298 iter->start_fail = 0; 294 iter->start_fail = 0;
299 return sctp_transport_get_idx(seq_file_net(seq), &iter->hti, *pos); 295 return sctp_transport_get_idx(seq_file_net(seq), &iter->hti, *pos);
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index eb17a911aa29..3e55daa37e66 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -4676,20 +4676,11 @@ int sctp_get_sctp_info(struct sock *sk, struct sctp_association *asoc,
4676EXPORT_SYMBOL_GPL(sctp_get_sctp_info); 4676EXPORT_SYMBOL_GPL(sctp_get_sctp_info);
4677 4677
4678/* use callback to avoid exporting the core structure */ 4678/* use callback to avoid exporting the core structure */
4679int sctp_transport_walk_start(struct rhashtable_iter *iter) 4679void sctp_transport_walk_start(struct rhashtable_iter *iter)
4680{ 4680{
4681 int err;
4682
4683 rhltable_walk_enter(&sctp_transport_hashtable, iter); 4681 rhltable_walk_enter(&sctp_transport_hashtable, iter);
4684 4682
4685 err = rhashtable_walk_start(iter); 4683 rhashtable_walk_start(iter);
4686 if (err && err != -EAGAIN) {
4687 rhashtable_walk_stop(iter);
4688 rhashtable_walk_exit(iter);
4689 return err;
4690 }
4691
4692 return 0;
4693} 4684}
4694 4685
4695void sctp_transport_walk_stop(struct rhashtable_iter *iter) 4686void sctp_transport_walk_stop(struct rhashtable_iter *iter)
@@ -4780,12 +4771,10 @@ int sctp_for_each_transport(int (*cb)(struct sctp_transport *, void *),
4780 struct net *net, int *pos, void *p) { 4771 struct net *net, int *pos, void *p) {
4781 struct rhashtable_iter hti; 4772 struct rhashtable_iter hti;
4782 struct sctp_transport *tsp; 4773 struct sctp_transport *tsp;
4783 int ret; 4774 int ret = 0;
4784 4775
4785again: 4776again:
4786 ret = sctp_transport_walk_start(&hti); 4777 sctp_transport_walk_start(&hti);
4787 if (ret)
4788 return ret;
4789 4778
4790 tsp = sctp_transport_get_idx(net, &hti, *pos + 1); 4779 tsp = sctp_transport_get_idx(net, &hti, *pos + 1);
4791 for (; !IS_ERR_OR_NULL(tsp); tsp = sctp_transport_get_next(net, &hti)) { 4780 for (; !IS_ERR_OR_NULL(tsp); tsp = sctp_transport_get_next(net, &hti)) {
diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index 5d18c0caa92b..22c4fd8a9dfe 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -2640,9 +2640,7 @@ void tipc_sk_reinit(struct net *net)
2640 rhashtable_walk_enter(&tn->sk_rht, &iter); 2640 rhashtable_walk_enter(&tn->sk_rht, &iter);
2641 2641
2642 do { 2642 do {
2643 tsk = ERR_PTR(rhashtable_walk_start(&iter)); 2643 rhashtable_walk_start(&iter);
2644 if (IS_ERR(tsk))
2645 goto walk_stop;
2646 2644
2647 while ((tsk = rhashtable_walk_next(&iter)) && !IS_ERR(tsk)) { 2645 while ((tsk = rhashtable_walk_next(&iter)) && !IS_ERR(tsk)) {
2648 spin_lock_bh(&tsk->sk.sk_lock.slock); 2646 spin_lock_bh(&tsk->sk.sk_lock.slock);
@@ -2651,7 +2649,7 @@ void tipc_sk_reinit(struct net *net)
2651 msg_set_orignode(msg, tn->own_addr); 2649 msg_set_orignode(msg, tn->own_addr);
2652 spin_unlock_bh(&tsk->sk.sk_lock.slock); 2650 spin_unlock_bh(&tsk->sk.sk_lock.slock);
2653 } 2651 }
2654walk_stop: 2652
2655 rhashtable_walk_stop(&iter); 2653 rhashtable_walk_stop(&iter);
2656 } while (tsk == ERR_PTR(-EAGAIN)); 2654 } while (tsk == ERR_PTR(-EAGAIN));
2657} 2655}