In mana_probe(), if mana_probe_port() fails for any port, the error
is stored in 'err' and the loop breaks. However, the subsequent
unconditional 'err = add_adev(gd, "eth")' overwrites this error.
If add_adev() succeeds, mana_probe() returns success despite ports
being left in a partially initialized state (ac->ports[i] == NULL).

Only call add_adev() when there is no prior error, so the probe
correctly fails and triggers mana_remove() cleanup.

Fixes: ced82fce77e9 ("net: mana: Probe rdma device in mana driver")
Signed-off-by: Erni Sri Satya Vennela <[email protected]>
---
Changes in v3:
*  Fix inaccurate comments.
Changes in v2:
* Apply the patch in net instead of net-next.
---
 drivers/net/ethernet/microsoft/mana/mana_en.c | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c 
b/drivers/net/ethernet/microsoft/mana/mana_en.c
index ce1b7ec46a27..39b18577fb51 100644
--- a/drivers/net/ethernet/microsoft/mana/mana_en.c
+++ b/drivers/net/ethernet/microsoft/mana/mana_en.c
@@ -3680,10 +3680,9 @@ int mana_probe(struct gdma_dev *gd, bool resuming)
        if (!resuming) {
                for (i = 0; i < ac->num_ports; i++) {
                        err = mana_probe_port(ac, i, &ac->ports[i]);
-                       /* we log the port for which the probe failed and stop
-                        * probes for subsequent ports.
-                        * Note that we keep running ports, for which the probes
-                        * were successful, unless add_adev fails too
+                       /* Log the port for which the probe failed, stop probing
+                        * subsequent ports, and skip add_adev.
+                        * mana_remove() will clean up already-probed ports.
                         */
                        if (err) {
                                dev_err(dev, "Probe Failed for port %d\n", i);
@@ -3697,10 +3696,9 @@ int mana_probe(struct gdma_dev *gd, bool resuming)
                        enable_work(&apc->queue_reset_work);
                        err = mana_attach(ac->ports[i]);
                        rtnl_unlock();
-                       /* we log the port for which the attach failed and stop
-                        * attach for subsequent ports
-                        * Note that we keep running ports, for which the attach
-                        * were successful, unless add_adev fails too
+                       /* Log the port for which the attach failed, stop
+                        * attaching subsequent ports, and skip add_adev.
+                        * mana_remove() will clean up already-attached ports.
                         */
                        if (err) {
                                dev_err(dev, "Attach Failed for port %d\n", i);
@@ -3709,7 +3707,8 @@ int mana_probe(struct gdma_dev *gd, bool resuming)
                }
        }
 
-       err = add_adev(gd, "eth");
+       if (!err)
+               err = add_adev(gd, "eth");
 
        schedule_delayed_work(&ac->gf_stats_work, MANA_GF_STATS_PERIOD);
 
-- 
2.34.1


Reply via email to