[IB] Fix leak on MAD initialization failure
authorRoland Dreier <rolandd@cisco.com>
Thu, 6 Oct 2005 20:28:16 +0000 (13:28 -0700)
committerRoland Dreier <rolandd@cisco.com>
Mon, 17 Oct 2005 22:20:28 +0000 (15:20 -0700)
There is a bug in ib_mad_init_device(): if ib_agent_port_open() fails
for a given port, then the current code doesn't call ib_mad_port_close()
for that port.

Signed-off-by: Roland Dreier <rolandd@cisco.com>
drivers/infiniband/core/mad.c

index a14ca87fda188566a98d3627a9d36061dffb0bd2..af302e830561c5e4f9fdb605a29ae7c2de96f7df 100644 (file)
@@ -2683,40 +2683,47 @@ static int ib_mad_port_close(struct ib_device *device, int port_num)
 
 static void ib_mad_init_device(struct ib_device *device)
 {
-       int num_ports, cur_port, i;
+       int start, end, i;
 
        if (device->node_type == IB_NODE_SWITCH) {
-               num_ports = 1;
-               cur_port = 0;
+               start = 0;
+               end   = 0;
        } else {
-               num_ports = device->phys_port_cnt;
-               cur_port = 1;
+               start = 1;
+               end   = device->phys_port_cnt;
        }
-       for (i = 0; i < num_ports; i++, cur_port++) {
-               if (ib_mad_port_open(device, cur_port)) {
+
+       for (i = start; i <= end; i++) {
+               if (ib_mad_port_open(device, i)) {
                        printk(KERN_ERR PFX "Couldn't open %s port %d\n",
-                              device->name, cur_port);
-                       goto error_device_open;
+                              device->name, i);
+                       goto error;
                }
-               if (ib_agent_port_open(device, cur_port)) {
+               if (ib_agent_port_open(device, i)) {
                        printk(KERN_ERR PFX "Couldn't open %s port %d "
                               "for agents\n",
-                              device->name, cur_port);
-                       goto error_device_open;
+                              device->name, i);
+                       goto error_agent;
                }
        }
        return;
 
-error_device_open:
-       while (i > 0) {
-               cur_port--;
-               if (ib_agent_port_close(device, cur_port))
+error_agent:
+       if (ib_mad_port_close(device, i))
+               printk(KERN_ERR PFX "Couldn't close %s port %d\n",
+                      device->name, i);
+
+error:
+       i--;
+
+       while (i >= start) {
+               if (ib_agent_port_close(device, i))
                        printk(KERN_ERR PFX "Couldn't close %s port %d "
                               "for agents\n",
-                              device->name, cur_port);
-               if (ib_mad_port_close(device, cur_port))
+                              device->name, i);
+               if (ib_mad_port_close(device, i))
                        printk(KERN_ERR PFX "Couldn't close %s port %d\n",
-                              device->name, cur_port);
+                              device->name, i);
                i--;
        }
 }