IB/qib: Clean up properly if qib_init() fails
authorRalph Campbell <ralph.campbell@qlogic.com>
Thu, 1 Jul 2010 20:25:45 +0000 (20:25 +0000)
committerRoland Dreier <rolandd@cisco.com>
Tue, 6 Jul 2010 21:14:04 +0000 (14:14 -0700)
If qib_init() fails, the driver fails to free memory, unregister
device files, and unregister with the PCIe framework. The driver will
unload without error but a subsequent driver load will cause the
system to panic.  This was found by changing the 7220 code to load the
serdes microcode separately and not installing the microcode file.

Signed-off-by: Ralph Campbell <ralph.campbell@qlogic.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
drivers/infiniband/hw/qib/qib_init.c

index 7831ff835d15e4c03ea397f48f850617479838b8..a873dd596e8172a1b75ba276579936fdee997352 100644 (file)
@@ -1289,8 +1289,18 @@ static int __devinit qib_init_one(struct pci_dev *pdev,
 
        if (qib_mini_init || initfail || ret) {
                qib_stop_timers(dd);
+               flush_scheduled_work();
                for (pidx = 0; pidx < dd->num_pports; ++pidx)
                        dd->f_quiet_serdes(dd->pport + pidx);
+               if (qib_mini_init)
+                       goto bail;
+               if (!j) {
+                       (void) qibfs_remove(dd);
+                       qib_device_remove(dd);
+               }
+               if (!ret)
+                       qib_unregister_ib_device(dd);
+               qib_postinit_cleanup(dd);
                if (initfail)
                        ret = initfail;
                goto bail;