summaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c6
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.c7
-rw-r--r--fs/gfs2/glock.c7
-rw-r--r--include/linux/rhashtable.h8
-rw-r--r--include/net/sctp/sctp.h2
-rw-r--r--lib/rhashtable.c10
-rw-r--r--lib/test_rhashtable.c6
-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
16 files changed, 48 insertions, 94 deletions
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c
index 9807214da206..2ae5ed151369 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c
@@ -1412,11 +1412,7 @@ bnxt_tc_flow_stats_batch_prep(struct bnxt *bp,
1412 void *flow_node; 1412 void *flow_node;
1413 int rc, i; 1413 int rc, i;
1414 1414
1415 rc = rhashtable_walk_start(iter); 1415 rhashtable_walk_start(iter);
1416 if (rc && rc != -EAGAIN) {
1417 i = 0;
1418 goto done;
1419 }
1420 1416
1421 rc = 0; 1417 rc = 0;
1422 for (i = 0; i < BNXT_FLOW_STATS_BATCH_MAX; i++) { 1418 for (i = 0; i < BNXT_FLOW_STATS_BATCH_MAX; i++) {
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.c
index a12b894f135d..9b9f3f99b39d 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.c
@@ -763,9 +763,7 @@ static void ch_flower_stats_handler(struct work_struct *work)
763 763
764 rhashtable_walk_enter(&adap->flower_tbl, &iter); 764 rhashtable_walk_enter(&adap->flower_tbl, &iter);
765 do { 765 do {
766 flower_entry = ERR_PTR(rhashtable_walk_start(&iter)); 766 rhashtable_walk_start(&iter);
767 if (IS_ERR(flower_entry))
768 goto walk_stop;
769 767
770 while ((flower_entry = rhashtable_walk_next(&iter)) && 768 while ((flower_entry = rhashtable_walk_next(&iter)) &&
771 !IS_ERR(flower_entry)) { 769 !IS_ERR(flower_entry)) {
@@ -784,8 +782,9 @@ static void ch_flower_stats_handler(struct work_struct *work)
784 spin_unlock(&flower_entry->lock); 782 spin_unlock(&flower_entry->lock);
785 } 783 }
786 } 784 }
787walk_stop: 785
788 rhashtable_walk_stop(&iter); 786 rhashtable_walk_stop(&iter);
787
789 } while (flower_entry == ERR_PTR(-EAGAIN)); 788 } while (flower_entry == ERR_PTR(-EAGAIN));
790 rhashtable_walk_exit(&iter); 789 rhashtable_walk_exit(&iter);
791 mod_timer(&adap->flower_stats_timer, jiffies + STATS_CHECK_PERIOD); 790 mod_timer(&adap->flower_stats_timer, jiffies + STATS_CHECK_PERIOD);
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c
index 11066d8647d2..90af87ff29ba 100644
--- a/fs/gfs2/glock.c
+++ b/fs/gfs2/glock.c
@@ -1549,16 +1549,13 @@ static void glock_hash_walk(glock_examiner examiner, const struct gfs2_sbd *sdp)
1549 rhashtable_walk_enter(&gl_hash_table, &iter); 1549 rhashtable_walk_enter(&gl_hash_table, &iter);
1550 1550
1551 do { 1551 do {
1552 gl = ERR_PTR(rhashtable_walk_start(&iter)); 1552 rhashtable_walk_start(&iter);
1553 if (IS_ERR(gl))
1554 goto walk_stop;
1555 1553
1556 while ((gl = rhashtable_walk_next(&iter)) && !IS_ERR(gl)) 1554 while ((gl = rhashtable_walk_next(&iter)) && !IS_ERR(gl))
1557 if (gl->gl_name.ln_sbd == sdp && 1555 if (gl->gl_name.ln_sbd == sdp &&
1558 lockref_get_not_dead(&gl->gl_lockref)) 1556 lockref_get_not_dead(&gl->gl_lockref))
1559 examiner(gl); 1557 examiner(gl);
1560 1558
1561walk_stop:
1562 rhashtable_walk_stop(&iter); 1559 rhashtable_walk_stop(&iter);
1563 } while (cond_resched(), gl == ERR_PTR(-EAGAIN)); 1560 } while (cond_resched(), gl == ERR_PTR(-EAGAIN));
1564 1561
@@ -1947,7 +1944,7 @@ static void *gfs2_glock_seq_start(struct seq_file *seq, loff_t *pos)
1947 loff_t n = *pos; 1944 loff_t n = *pos;
1948 1945
1949 rhashtable_walk_enter(&gl_hash_table, &gi->hti); 1946 rhashtable_walk_enter(&gl_hash_table, &gi->hti);
1950 if (rhashtable_walk_start(&gi->hti) != 0) 1947 if (rhashtable_walk_start_check(&gi->hti) != 0)
1951 return NULL; 1948 return NULL;
1952 1949
1953 do { 1950 do {
diff --git a/include/linux/rhashtable.h b/include/linux/rhashtable.h
index 361c08e35dbc..13ccc483738d 100644
--- a/include/linux/rhashtable.h
+++ b/include/linux/rhashtable.h
@@ -378,7 +378,13 @@ void *rhashtable_insert_slow(struct rhashtable *ht, const void *key,
378void rhashtable_walk_enter(struct rhashtable *ht, 378void rhashtable_walk_enter(struct rhashtable *ht,
379 struct rhashtable_iter *iter); 379 struct rhashtable_iter *iter);
380void rhashtable_walk_exit(struct rhashtable_iter *iter); 380void rhashtable_walk_exit(struct rhashtable_iter *iter);
381int rhashtable_walk_start(struct rhashtable_iter *iter) __acquires(RCU); 381int rhashtable_walk_start_check(struct rhashtable_iter *iter) __acquires(RCU);
382
383static inline void rhashtable_walk_start(struct rhashtable_iter *iter)
384{
385 (void)rhashtable_walk_start_check(iter);
386}
387
382void *rhashtable_walk_next(struct rhashtable_iter *iter); 388void *rhashtable_walk_next(struct rhashtable_iter *iter);
383void rhashtable_walk_stop(struct rhashtable_iter *iter) __releases(RCU); 389void rhashtable_walk_stop(struct rhashtable_iter *iter) __releases(RCU);
384 390
diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h
index 906a9c0efa71..6f79415f6634 100644
--- a/include/net/sctp/sctp.h
+++ b/include/net/sctp/sctp.h
@@ -116,7 +116,7 @@ extern struct percpu_counter sctp_sockets_allocated;
116int sctp_asconf_mgmt(struct sctp_sock *, struct sctp_sockaddr_entry *); 116int sctp_asconf_mgmt(struct sctp_sock *, struct sctp_sockaddr_entry *);
117struct sk_buff *sctp_skb_recv_datagram(struct sock *, int, int, int *); 117struct sk_buff *sctp_skb_recv_datagram(struct sock *, int, int, int *);
118 118
119int sctp_transport_walk_start(struct rhashtable_iter *iter); 119void sctp_transport_walk_start(struct rhashtable_iter *iter);
120void sctp_transport_walk_stop(struct rhashtable_iter *iter); 120void sctp_transport_walk_stop(struct rhashtable_iter *iter);
121struct sctp_transport *sctp_transport_get_next(struct net *net, 121struct sctp_transport *sctp_transport_get_next(struct net *net,
122 struct rhashtable_iter *iter); 122 struct rhashtable_iter *iter);
diff --git a/lib/rhashtable.c b/lib/rhashtable.c
index ddd7dde87c3c..1935e86ed477 100644
--- a/lib/rhashtable.c
+++ b/lib/rhashtable.c
@@ -732,7 +732,7 @@ void rhashtable_walk_exit(struct rhashtable_iter *iter)
732EXPORT_SYMBOL_GPL(rhashtable_walk_exit); 732EXPORT_SYMBOL_GPL(rhashtable_walk_exit);
733 733
734/** 734/**
735 * rhashtable_walk_start - Start a hash table walk 735 * rhashtable_walk_start_check - Start a hash table walk
736 * @iter: Hash table iterator 736 * @iter: Hash table iterator
737 * 737 *
738 * Start a hash table walk at the current iterator position. Note that we take 738 * Start a hash table walk at the current iterator position. Note that we take
@@ -744,8 +744,12 @@ EXPORT_SYMBOL_GPL(rhashtable_walk_exit);
744 * Returns -EAGAIN if resize event occured. Note that the iterator 744 * Returns -EAGAIN if resize event occured. Note that the iterator
745 * will rewind back to the beginning and you may use it immediately 745 * will rewind back to the beginning and you may use it immediately
746 * by calling rhashtable_walk_next. 746 * by calling rhashtable_walk_next.
747 *
748 * rhashtable_walk_start is defined as an inline variant that returns
749 * void. This is preferred in cases where the caller would ignore
750 * resize events and always continue.
747 */ 751 */
748int rhashtable_walk_start(struct rhashtable_iter *iter) 752int rhashtable_walk_start_check(struct rhashtable_iter *iter)
749 __acquires(RCU) 753 __acquires(RCU)
750{ 754{
751 struct rhashtable *ht = iter->ht; 755 struct rhashtable *ht = iter->ht;
@@ -764,7 +768,7 @@ int rhashtable_walk_start(struct rhashtable_iter *iter)
764 768
765 return 0; 769 return 0;
766} 770}
767EXPORT_SYMBOL_GPL(rhashtable_walk_start); 771EXPORT_SYMBOL_GPL(rhashtable_walk_start_check);
768 772
769/** 773/**
770 * rhashtable_walk_next - Return the next object and advance the iterator 774 * rhashtable_walk_next - Return the next object and advance the iterator
diff --git a/lib/test_rhashtable.c b/lib/test_rhashtable.c
index 8e83cbdc049c..76d3667fdea2 100644
--- a/lib/test_rhashtable.c
+++ b/lib/test_rhashtable.c
@@ -162,11 +162,7 @@ static void test_bucket_stats(struct rhashtable *ht, unsigned int entries)
162 return; 162 return;
163 } 163 }
164 164
165 err = rhashtable_walk_start(&hti); 165 rhashtable_walk_start(&hti);
166 if (err && err != -EAGAIN) {
167 pr_warn("Test failed: iterator failed: %d\n", err);
168 return;
169 }
170 166
171 while ((pos = rhashtable_walk_next(&hti))) { 167 while ((pos = rhashtable_walk_next(&hti))) {
172 if (PTR_ERR(pos) == -EAGAIN) { 168 if (PTR_ERR(pos) == -EAGAIN) {
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}