If two or more instances of 'ip link set' commands race and first one
already brings the interface up (or down), the subsequent instances
can simply return without redoing the up/down operation.

Fixes: ed651a10875f ("ibmvnic: Updated reset handling")
Reported-by: Abdul Haleem <abdha...@in.ibm.com>
Tested-by: Abdul Haleem <abdha...@in.ibm.com>
Signed-off-by: Sukadev Bhattiprolu <suka...@linux.ibm.com>
---
 drivers/net/ethernet/ibm/ibmvnic.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/drivers/net/ethernet/ibm/ibmvnic.c 
b/drivers/net/ethernet/ibm/ibmvnic.c
index cb7ddfefb03e..84b772921f35 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -1219,6 +1219,13 @@ static int ibmvnic_open(struct net_device *netdev)
                goto out;
        }
 
+       /* If adapter is already open, we don't have to do anything. */
+       if (adapter->state == VNIC_OPEN) {
+               netdev_dbg(netdev, "[S:%d] adapter already open\n",
+                          adapter->state);
+               return 0;
+       }
+
        if (adapter->state != VNIC_CLOSED) {
                rc = ibmvnic_login(netdev);
                if (rc)
@@ -1392,6 +1399,12 @@ static int ibmvnic_close(struct net_device *netdev)
                return 0;
        }
 
+       /* If adapter is already closed, we don't have to do anything. */
+       if (adapter->state == VNIC_CLOSED) {
+               netdev_dbg(netdev, "[S:%d] adapter already closed\n",
+                          adapter->state);
+               return 0;
+       }
        rc = __ibmvnic_close(netdev);
        ibmvnic_cleanup(netdev);
 
-- 
2.26.2

Reply via email to