Skip to content

Commit 5e4009b

Browse files
Jeff GarzikJames Bottomley
authored andcommitted
[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 <[email protected]> Signed-off-by: James Bottomley <[email protected]>
1 parent 37e0333 commit 5e4009b

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

drivers/scsi/sd.c

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1795,7 +1795,7 @@ static void sd_shutdown(struct device *dev)
17951795
**/
17961796
static int __init init_sd(void)
17971797
{
1798-
int majors = 0, i;
1798+
int majors = 0, i, err;
17991799

18001800
SCSI_LOG_HLQUEUE(3, printk("init_sd: sd driver entry point\n"));
18011801

@@ -1806,9 +1806,22 @@ static int __init init_sd(void)
18061806
if (!majors)
18071807
return -ENODEV;
18081808

1809-
class_register(&sd_disk_class);
1809+
err = class_register(&sd_disk_class);
1810+
if (err)
1811+
goto err_out;
18101812

1811-
return scsi_register_driver(&sd_template.gendrv);
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;
18121825
}
18131826

18141827
/**
@@ -1823,10 +1836,10 @@ static void __exit exit_sd(void)
18231836
SCSI_LOG_HLQUEUE(3, printk("exit_sd: exiting sd driver\n"));
18241837

18251838
scsi_unregister_driver(&sd_template.gendrv);
1839+
class_unregister(&sd_disk_class);
1840+
18261841
for (i = 0; i < SD_MAJORS; i++)
18271842
unregister_blkdev(sd_major(i), "sd");
1828-
1829-
class_unregister(&sd_disk_class);
18301843
}
18311844

18321845
module_init(init_sd);

0 commit comments

Comments
 (0)