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 start a new
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/ipvlan/ipvlan_main.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ipvlan/ipvlan_main.c b/drivers/net/ipvlan/ipvlan_main.c
index 696e245f6d00..063d7c30e944 100644
--- a/drivers/net/ipvlan/ipvlan_main.c
+++ b/drivers/net/ipvlan/ipvlan_main.c
@@ -9,7 +9,7 @@
 static int ipvlan_set_port_mode(struct ipvl_port *port, u16 nval,
                                struct netlink_ext_ack *extack)
 {
-       struct ipvl_dev *ipvlan;
+       struct ipvl_dev *ipvlan, *tmp = NULL;
        unsigned int flags;
        int err;
 
@@ -26,8 +26,10 @@ static int ipvlan_set_port_mode(struct ipvl_port *port, u16 
nval,
                                                       flags & ~IFF_NOARP,
                                                       extack);
                        }
-                       if (unlikely(err))
+                       if (unlikely(err)) {
+                               tmp = ipvlan;
                                goto fail;
+                       }
                }
                if (nval == IPVLAN_MODE_L3S) {
                        /* New mode is L3S */
@@ -43,6 +45,7 @@ static int ipvlan_set_port_mode(struct ipvl_port *port, u16 
nval,
        return 0;
 
 fail:
+       ipvlan = list_prepare_entry(tmp, &port->ipvlans, pnode);
        /* Undo the flags changes that have been done so far. */
        list_for_each_entry_continue_reverse(ipvlan, &port->ipvlans, pnode) {
                flags = ipvlan->dev->flags;
-- 
2.25.1

Reply via email to