qlcnic: fix memory leak in qlcnic_blink_led.
authorSucheta Chakraborty <sucheta.chakraborty@qlogic.com>
Wed, 27 Apr 2011 14:43:44 +0000 (14:43 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 28 Apr 2011 20:43:49 +0000 (13:43 -0700)
o Memory allocated in ETHTOOL_ACTIVE mode, is not getting freed. So,
  in ETHTOOL_ID_INACTIVE mode, return after freeing allocated memory.
o Using set bit instead of blink_down field, as it is also required
  in internal Loopback test and etc.

Signed-off-by: Sucheta Chakraborty <sucheta.chakraborty@qlogic.com>
Signed-off-by: Amit Kumar Salecha <amit.salecha@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/qlcnic/qlcnic.h
drivers/net/qlcnic/qlcnic_ethtool.c

index fa5b15c..f7acb80 100644 (file)
@@ -884,6 +884,7 @@ struct qlcnic_ipaddr {
 #define __QLCNIC_RESETTING             2
 #define __QLCNIC_START_FW              4
 #define __QLCNIC_AER                   5
+#define __QLCNIC_DIAG_RES_ALLOC                6
 
 #define QLCNIC_INTERRUPT_TEST          1
 #define QLCNIC_LOOPBACK_TEST           2
@@ -913,7 +914,6 @@ struct qlcnic_adapter {
        struct net_device *netdev;
        struct pci_dev *pdev;
 
-       bool            blink_was_down;
        unsigned long state;
        u32 flags;
 
index 615a5ab..de65847 100644 (file)
@@ -772,7 +772,6 @@ static int qlcnic_set_led(struct net_device *dev,
 
        switch (state) {
        case ETHTOOL_ID_ACTIVE:
-               adapter->blink_was_down = false;
                if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
                        if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
                                return -EIO;
@@ -781,7 +780,7 @@ static int qlcnic_set_led(struct net_device *dev,
                                clear_bit(__QLCNIC_RESETTING, &adapter->state);
                                return -EIO;
                        }
-                       adapter->blink_was_down = true;
+                       set_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state);
                }
 
                if (adapter->nic_ops->config_led(adapter, 1, 0xf) == 0)
@@ -792,18 +791,17 @@ static int qlcnic_set_led(struct net_device *dev,
                break;
 
        case ETHTOOL_ID_INACTIVE:
-               if (adapter->nic_ops->config_led(adapter, 0, 0xf) == 0)
-                       return 0;
+               if (adapter->nic_ops->config_led(adapter, 0, 0xf))
+                       dev_err(&adapter->pdev->dev,
+                               "Failed to reset LED blink state.\n");
 
-               dev_err(&adapter->pdev->dev,
-                       "Failed to reset LED blink state.\n");
                break;
 
        default:
                return -EINVAL;
        }
 
-       if (adapter->blink_was_down) {
+       if (test_and_clear_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state)) {
                qlcnic_diag_free_res(dev, max_sds_rings);
                clear_bit(__QLCNIC_RESETTING, &adapter->state);
        }