public inbox for linux-scsi@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] SCSI sd: fix module init/exit error handling
@ 2006-10-04  9:32 Jeff Garzik
  2006-10-10  9:37 ` Christoph Hellwig
  0 siblings, 1 reply; 2+ messages in thread
From: Jeff Garzik @ 2006-10-04  9:32 UTC (permalink / raw)
  To: linux-scsi; +Cc: Andrew Morton, LKML


- 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>

---

 drivers/scsi/sd.c |   23 ++++++++++++++++++-----
 1 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index 10bc99c..d9a118e 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -1794,7 +1794,7 @@ static void sd_shutdown(struct device *d
  **/
 static int __init init_sd(void)
 {
-	int majors = 0, i;
+	int majors = 0, i, err;
 
 	SCSI_LOG_HLQUEUE(3, printk("init_sd: sd driver entry point\n"));
 
@@ -1805,9 +1805,22 @@ static int __init init_sd(void)
 	if (!majors)
 		return -ENODEV;
 
-	class_register(&sd_disk_class);
+	err = class_register(&sd_disk_class);
+	if (err) 
+		goto err_out;
 
-	return scsi_register_driver(&sd_template.gendrv);
+	err = scsi_register_driver(&sd_template.gendrv);
+	if (err)
+		goto err_out_class;
+	
+	return 0;
+
+err_out_class:
+	class_unregister(&sd_disk_class);
+err_out:
+	for (i = 0; i < SD_MAJORS; i++)
+		unregister_blkdev(sd_major(i), "sd");
+	return err;
 }
 
 /**
@@ -1822,10 +1835,10 @@ static void __exit exit_sd(void)
 	SCSI_LOG_HLQUEUE(3, printk("exit_sd: exiting sd driver\n"));
 
 	scsi_unregister_driver(&sd_template.gendrv);
+	class_unregister(&sd_disk_class);
+
 	for (i = 0; i < SD_MAJORS; i++)
 		unregister_blkdev(sd_major(i), "sd");
-
-	class_unregister(&sd_disk_class);
 }
 
 module_init(init_sd);

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] SCSI sd: fix module init/exit error handling
  2006-10-04  9:32 [PATCH] SCSI sd: fix module init/exit error handling Jeff Garzik
@ 2006-10-10  9:37 ` Christoph Hellwig
  0 siblings, 0 replies; 2+ messages in thread
From: Christoph Hellwig @ 2006-10-10  9:37 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: linux-scsi, Andrew Morton, LKML

On Wed, Oct 04, 2006 at 05:32:54AM -0400, Jeff Garzik wrote:
> 
> - 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>

Ok.


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2006-10-10  9:37 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-10-04  9:32 [PATCH] SCSI sd: fix module init/exit error handling Jeff Garzik
2006-10-10  9:37 ` Christoph Hellwig

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox