Fix dev_change_tx_queue_len so it rolls back original value
upon a failure in dev_qdisc_change_tx_queue_len.
This is already done for notifirers' failures, share the code.

The revert of changes in dev_qdisc_change_tx_queue_len
in such case is needed but missing (marked as TODO), yet it is
still better to not apply the new requested value.

Fixes: 48bfd55e7e41 ("net_sched: plug in qdisc ops change_tx_queue_len")
Signed-off-by: Tariq Toukan <tar...@mellanox.com>
Reviewed-by: Eran Ben Elisha <era...@mellanox.com>
Reported-by: Ran Rozenstein <ra...@mellanox.com>
Cc: Cong Wang <xiyou.wangc...@gmail.com>
---
 net/core/dev.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/net/core/dev.c b/net/core/dev.c
index a5aa1c7444e6..559a91271f82 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -7149,16 +7149,19 @@ int dev_change_tx_queue_len(struct net_device *dev, 
unsigned long new_len)
                dev->tx_queue_len = new_len;
                res = call_netdevice_notifiers(NETDEV_CHANGE_TX_QUEUE_LEN, dev);
                res = notifier_to_errno(res);
-               if (res) {
-                       netdev_err(dev,
-                                  "refused to change device tx_queue_len\n");
-                       dev->tx_queue_len = orig_len;
-                       return res;
-               }
-               return dev_qdisc_change_tx_queue_len(dev);
+               if (res)
+                       goto err_rollback;
+               res = dev_qdisc_change_tx_queue_len(dev);
+               if (res)
+                       goto err_rollback;
        }
 
        return 0;
+
+err_rollback:
+       netdev_err(dev, "refused to change device tx_queue_len\n");
+       dev->tx_queue_len = orig_len;
+       return res;
 }
 
 /**
-- 
1.8.3.1

Reply via email to