[SCSI] SCSI sd: fix module init/exit error handling

- Properly handle and unwind errors in init_sd(). Fixes leaks on error,
if class_register() or scsi_register_driver() failed.

- Ensure that exit_sd() execution order is the perfect inverse of
initialization order.

FIXME: If some-but-not-all register_blkdev() calls fail, we wind up
calling unregister_blkdev() for block devices we did not register.
This was a pre-existing bug.

Signed-off-by: Jeff Garzik <jeff@garzik.org>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>

authored by Jeff Garzik and committed by James Bottomley 5e4009ba 37e0333c

+18 -5
+18 -5
drivers/scsi/sd.c
··· 1795 **/ 1796 static int __init init_sd(void) 1797 { 1798 - int majors = 0, i; 1799 1800 SCSI_LOG_HLQUEUE(3, printk("init_sd: sd driver entry point\n")); 1801 ··· 1806 if (!majors) 1807 return -ENODEV; 1808 1809 - class_register(&sd_disk_class); 1810 1811 - return scsi_register_driver(&sd_template.gendrv); 1812 } 1813 1814 /** ··· 1836 SCSI_LOG_HLQUEUE(3, printk("exit_sd: exiting sd driver\n")); 1837 1838 scsi_unregister_driver(&sd_template.gendrv); 1839 for (i = 0; i < SD_MAJORS; i++) 1840 unregister_blkdev(sd_major(i), "sd"); 1841 - 1842 - class_unregister(&sd_disk_class); 1843 } 1844 1845 module_init(init_sd);
··· 1795 **/ 1796 static int __init init_sd(void) 1797 { 1798 + int majors = 0, i, err; 1799 1800 SCSI_LOG_HLQUEUE(3, printk("init_sd: sd driver entry point\n")); 1801 ··· 1806 if (!majors) 1807 return -ENODEV; 1808 1809 + err = class_register(&sd_disk_class); 1810 + if (err) 1811 + goto err_out; 1812 1813 + err = scsi_register_driver(&sd_template.gendrv); 1814 + if (err) 1815 + goto err_out_class; 1816 + 1817 + return 0; 1818 + 1819 + err_out_class: 1820 + class_unregister(&sd_disk_class); 1821 + err_out: 1822 + for (i = 0; i < SD_MAJORS; i++) 1823 + unregister_blkdev(sd_major(i), "sd"); 1824 + return err; 1825 } 1826 1827 /** ··· 1823 SCSI_LOG_HLQUEUE(3, printk("exit_sd: exiting sd driver\n")); 1824 1825 scsi_unregister_driver(&sd_template.gendrv); 1826 + class_unregister(&sd_disk_class); 1827 + 1828 for (i = 0; i < SD_MAJORS; i++) 1829 unregister_blkdev(sd_major(i), "sd"); 1830 } 1831 1832 module_init(init_sd);