In preparation to limit the scope of the list iterator variable to the
list traversal loop, use a dedicated pointer to iterate through the
list [1].

Since that variable should not be used past the loop iteration, a
separate variable is used to 'remember the current location within the
loop'.

To either continue iterating from that position or skip the iteration
(if the previous iteration was complete) list_prepare_entry() is used.

Link: 
https://lore.kernel.org/all/CAHk-=wgRr_D8CB-D9Kg-c=ehreask5sqxpwr9y7k9sa6cwx...@mail.gmail.com/
 [1]
Signed-off-by: Jakob Koschel <jakobkosc...@gmail.com>
---
 drivers/net/team/team.c | 20 +++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c
index b07dde6f0abf..688c4393f099 100644
--- a/drivers/net/team/team.c
+++ b/drivers/net/team/team.c
@@ -2425,17 +2425,17 @@ static int team_nl_send_options_get(struct team *team, 
u32 portid, u32 seq,
                                    int flags, team_nl_send_func_t *send_func,
                                    struct list_head *sel_opt_inst_list)
 {
+       struct team_option_inst *opt_inst, *tmp = NULL;
        struct nlattr *option_list;
        struct nlmsghdr *nlh;
        void *hdr;
-       struct team_option_inst *opt_inst;
        int err;
        struct sk_buff *skb = NULL;
        bool incomplete;
        int i;
 
-       opt_inst = list_first_entry(sel_opt_inst_list,
-                                   struct team_option_inst, tmp_list);
+       tmp = list_first_entry(sel_opt_inst_list,
+                              struct team_option_inst, tmp_list);
 
 start_again:
        err = __send_and_alloc_skb(&skb, team, portid, send_func);
@@ -2456,7 +2456,9 @@ static int team_nl_send_options_get(struct team *team, 
u32 portid, u32 seq,
                goto nla_put_failure;
 
        i = 0;
+       opt_inst = list_prepare_entry(tmp, sel_opt_inst_list, tmp_list);
        incomplete = false;
+       tmp = NULL;
        list_for_each_entry_from(opt_inst, sel_opt_inst_list, tmp_list) {
                err = team_nl_fill_one_option_get(skb, team, opt_inst);
                if (err) {
@@ -2464,6 +2466,7 @@ static int team_nl_send_options_get(struct team *team, 
u32 portid, u32 seq,
                                if (!i)
                                        goto errout;
                                incomplete = true;
+                               tmp = opt_inst;
                                break;
                        }
                        goto errout;
@@ -2707,14 +2710,14 @@ static int team_nl_send_port_list_get(struct team 
*team, u32 portid, u32 seq,
        struct nlattr *port_list;
        struct nlmsghdr *nlh;
        void *hdr;
-       struct team_port *port;
+       struct team_port *port, *tmp = NULL;
        int err;
        struct sk_buff *skb = NULL;
        bool incomplete;
        int i;
 
-       port = list_first_entry_or_null(&team->port_list,
-                                       struct team_port, list);
+       tmp = list_first_entry_or_null(&team->port_list,
+                                      struct team_port, list);
 
 start_again:
        err = __send_and_alloc_skb(&skb, team, portid, send_func);
@@ -2744,7 +2747,9 @@ static int team_nl_send_port_list_get(struct team *team, 
u32 portid, u32 seq,
                err = team_nl_fill_one_port_get(skb, one_port);
                if (err)
                        goto errout;
-       } else if (port) {
+       } else {
+               port = list_prepare_entry(tmp, &team->port_list, list);
+               tmp = NULL;
                list_for_each_entry_from(port, &team->port_list, list) {
                        err = team_nl_fill_one_port_get(skb, port);
                        if (err) {
@@ -2752,6 +2757,7 @@ static int team_nl_send_port_list_get(struct team *team, 
u32 portid, u32 seq,
                                        if (!i)
                                                goto errout;
                                        incomplete = true;
+                                       tmp = port;
                                        break;
                                }
                                goto errout;
-- 
2.25.1

Reply via email to