public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] scsi/sr.c resource alloc checking
       [not found] <20001209151425.E859@conectiva.com.br>
@ 2000-12-09 19:40 ` Arnaldo Carvalho de Melo
  2000-12-09 19:49   ` [PATCH] drivers/net/sbni.c irq release on failure Arnaldo Carvalho de Melo
  0 siblings, 1 reply; 4+ messages in thread
From: Arnaldo Carvalho de Melo @ 2000-12-09 19:40 UTC (permalink / raw)
  To: Alan Cox; +Cc: Jens Axboe, linux-kernel

Alan/Jens,

	Please consider applying, a similar patch is already in 2.4. In
sr_init we don't need zeroing the data allocated with scsi_init_malloc, as
scsi_init_malloc already does this for us.

- Arnaldo

--- linux-2.2.18-pre25/drivers/scsi/sr.c	Sat Dec  9 15:08:24 2000
+++ linux-2.2.18-pre25.acme/drivers/scsi/sr.c	Sat Dec  9 17:33:54 2000
@@ -26,6 +26,8 @@
  *	Modified by Jens Axboe <axboe@suse.de> - support DVD-RAM
  *	transparently and loose the GHOST hack
  *
+ *	Modified by Arnaldo Carvalho de Melo <acme@conectiva.com.br>
+ *	check resource allocation in sr_init and some cleanups - 2000/12/09
  */
 
 #include <linux/module.h>
@@ -70,10 +72,10 @@
 	sr_finish, sr_attach, sr_detach
 };
 
-Scsi_CD *scsi_CDs = NULL;
-static int *sr_sizes = NULL;
+Scsi_CD *scsi_CDs;
+static int *sr_sizes;
 
-static int *sr_blocksizes = NULL;
+static int *sr_blocksizes;
 
 static int sr_open(struct cdrom_device_info *, int);
 void get_sectorsize(int);
@@ -1113,16 +1115,21 @@
 	}
 	if (scsi_CDs)
 		return 0;
-	sr_template.dev_max =
-	    sr_template.dev_noticed + SR_EXTRA_DEVS;
-	scsi_CDs = (Scsi_CD *) scsi_init_malloc(sr_template.dev_max * sizeof(Scsi_CD), GFP_ATOMIC);
-	memset(scsi_CDs, 0, sr_template.dev_max * sizeof(Scsi_CD));
-
-	sr_sizes = (int *) scsi_init_malloc(sr_template.dev_max * sizeof(int), GFP_ATOMIC);
-	memset(sr_sizes, 0, sr_template.dev_max * sizeof(int));
-
-	sr_blocksizes = (int *) scsi_init_malloc(sr_template.dev_max *
-						 sizeof(int), GFP_ATOMIC);
+	sr_template.dev_max = sr_template.dev_noticed + SR_EXTRA_DEVS;
+	scsi_CDs = scsi_init_malloc(sr_template.dev_max * sizeof(Scsi_CD),
+					GFP_ATOMIC);
+	if (!scsi_CDs)
+		goto cleanup_register;
+
+	sr_sizes = scsi_init_malloc(sr_template.dev_max * sizeof(int),
+					GFP_ATOMIC);
+	if (!sr_sizes)
+		goto cleanup_cds;
+
+	sr_blocksizes = scsi_init_malloc(sr_template.dev_max * sizeof(int),
+					GFP_ATOMIC);
+	if (!sr_blocksizes)
+		goto cleanup_sizes;
 
 	/*
 	 * These are good guesses for the time being.
@@ -1131,6 +1138,18 @@
 		sr_blocksizes[i] = 2048;
 	blksize_size[MAJOR_NR] = sr_blocksizes;
 	return 0;
+cleanup_sizes:
+	scsi_init_free((char *) sr_sizes, sr_template.dev_max * sizeof(int));
+	sr_sizes = NULL;
+cleanup_cds:
+	scsi_init_free((char *) scsi_CDs,
+		       (sr_template.dev_noticed + SR_EXTRA_DEVS) *
+		       sizeof(Scsi_CD));
+	scsi_CDs = NULL;
+cleanup_register:
+	unregister_blkdev(MAJOR_NR, "sr");
+	sr_registered--;
+	return 1;
 }
 
 void sr_finish()
@@ -1241,7 +1260,7 @@
 		scsi_init_free((char *) scsi_CDs,
 			       (sr_template.dev_noticed + SR_EXTRA_DEVS)
 			       * sizeof(Scsi_CD));
-
+		scsi_CDs = NULL;
 		scsi_init_free((char *) sr_sizes, sr_template.dev_max * sizeof(int));
 		sr_sizes = NULL;
 
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

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

* [PATCH] drivers/net/sbni.c irq release on failure
  2000-12-09 19:40 ` [PATCH] scsi/sr.c resource alloc checking Arnaldo Carvalho de Melo
@ 2000-12-09 19:49   ` Arnaldo Carvalho de Melo
  2000-12-09 20:03     ` [PATCH] 2.2: drivers/scsi/3c-xxxx.c resource " Arnaldo Carvalho de Melo
  2000-12-10  8:59     ` [PATCH] drivers/net/sbni.c irq " Yaroslav S. Polyakov
  0 siblings, 2 replies; 4+ messages in thread
From: Arnaldo Carvalho de Melo @ 2000-12-09 19:49 UTC (permalink / raw)
  To: Alan Cox, Yaroslav Polyakov; +Cc: linux-kernel

Alan/Yaroslav,

	Please consider applying, a similar patch is already in 2.4.

- Arnaldo

--- linux-2.2.18-pre25/drivers/net/sbni.c	Sat Dec  9 15:08:17 2000
+++ linux-2.2.18-pre25.acme/drivers/net/sbni.c	Sat Dec  9 17:44:53 2000
@@ -456,6 +456,7 @@
 	if(dev->priv == NULL)
 	{
 		DP( printk("%s: cannot allocate memory\n", dev->name); )
+		free_irq(dev->irq, dev);
 		return -ENOMEM;
 	}
    
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

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

* [PATCH] 2.2: drivers/scsi/3c-xxxx.c resource release on failure
  2000-12-09 19:49   ` [PATCH] drivers/net/sbni.c irq release on failure Arnaldo Carvalho de Melo
@ 2000-12-09 20:03     ` Arnaldo Carvalho de Melo
  2000-12-10  8:59     ` [PATCH] drivers/net/sbni.c irq " Yaroslav S. Polyakov
  1 sibling, 0 replies; 4+ messages in thread
From: Arnaldo Carvalho de Melo @ 2000-12-09 20:03 UTC (permalink / raw)
  To: Alan Cox, Adam Radford; +Cc: linux-kernel

Alan/Adam,

	Please consider applying, a similar patch is already in 2.4.

- Arnaldo

--- linux-2.2.18-pre25/drivers/scsi/3w-xxxx.c	Tue Sep  5 19:13:35 2000
+++ linux-2.2.18-pre25.acme/drivers/scsi/3w-xxxx.c	Sat Dec  9 17:59:22 2000
@@ -3,6 +3,8 @@
 
    Written By: Adam Radford <linux@3ware.com>
    Modifications By: Joel Jacobson <linux@3ware.com>
+		     Arnaldo Carvalho de Melo <acme@conectiva.com.br>
+
 
    Copyright (C) 1999-2000 3ware Inc.
 
@@ -64,6 +66,8 @@
                  Bug fix so hot spare drives don't show up.
    1.02.00.002 - Fix bug with tw_setfeature() call that caused oops on some
                  systems.
+   12/09/2000  - release previously allocated resources on failure at
+		 tw_allocate_memory (acme)
 */
 
 #include <linux/module.h>
@@ -416,37 +420,29 @@
 /* This function will allocate memory and check if it is 16 d-word aligned */
 int tw_allocate_memory(TW_Device_Extension *tw_dev, int request_id, int size, int which)
 {
-	u32 *virt_addr;
+	u32 *virt_addr = kmalloc(size, GFP_ATOMIC);
 
 	dprintk(KERN_NOTICE "3w-xxxx: tw_allocate_memory()\n");
 
+	if (!virt_addr) {
+		printk(KERN_WARNING "3w-xxxx: tw_allocate_memory(): kmalloc() failed.\n");
+		return 1;
+	}
+
+	if ((u32)virt_addr % TW_ALIGNMENT) {
+		kfree(virt_addr);
+		printk(KERN_WARNING "3w-xxxx: tw_allocate_memory(): Found unaligned address.\n");
+		return 1;
+	}
+
 	if (which == 0) {
-		/* Allocate command packet memory */
-		virt_addr = kmalloc(size, GFP_ATOMIC);
-		if (virt_addr == NULL) {
-			printk(KERN_WARNING "3w-xxxx: tw_allocate_memory(): kmalloc() failed.\n");
-			return 1;
-		}
-		if ((u32)virt_addr % TW_ALIGNMENT) {
-			printk(KERN_WARNING "3w-xxxx: tw_allocate_memory(): Found unaligned address.\n");
-			return 1;
-		}
 		tw_dev->command_packet_virtual_address[request_id] = virt_addr;
 		tw_dev->command_packet_physical_address[request_id] = 
-		virt_to_bus(virt_addr);
+			virt_to_bus(virt_addr);
 	} else {
-		/* Allocate generic buffer */
-		virt_addr = kmalloc(size, GFP_ATOMIC);
-		if (virt_addr == NULL) {
-			printk(KERN_WARNING "3w-xxxx: tw_allocate_memory(): kmalloc() failed.\n");
-			return 1;
-		}
-		if ((u32)virt_addr % TW_ALIGNMENT) {
-			printk(KERN_WARNING "3w-xxxx: tw_allocate_memory(): Found unaligned address.\n");
-			return 1;
-		}
 		tw_dev->alignment_virtual_address[request_id] = virt_addr;
-		tw_dev->alignment_physical_address[request_id] = virt_to_bus(virt_addr);
+		tw_dev->alignment_physical_address[request_id] =
+			virt_to_bus(virt_addr);
 	}
 	return 0;
 } /* End tw_allocate_memory() */
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

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

* Re: [PATCH] drivers/net/sbni.c irq release on failure
  2000-12-09 19:49   ` [PATCH] drivers/net/sbni.c irq release on failure Arnaldo Carvalho de Melo
  2000-12-09 20:03     ` [PATCH] 2.2: drivers/scsi/3c-xxxx.c resource " Arnaldo Carvalho de Melo
@ 2000-12-10  8:59     ` Yaroslav S. Polyakov
  1 sibling, 0 replies; 4+ messages in thread
From: Yaroslav S. Polyakov @ 2000-12-10  8:59 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Alan Cox, Yaroslav Polyakov, linux-kernel

Hi!

On Sat, 9 Dec 2000, Arnaldo Carvalho de Melo wrote:

> Alan/Yaroslav,
> 
> 	Please consider applying, a similar patch is already in 2.4.
I want to release new version of sbni driver soon (after QA
procedures). This new version will be ported to 2.4 kernel.
this version already have your patch applied. Thanks! :)

> - Arnaldo
> 
> --- linux-2.2.18-pre25/drivers/net/sbni.c	Sat Dec  9 15:08:17 2000
> +++ linux-2.2.18-pre25.acme/drivers/net/sbni.c	Sat Dec  9 17:44:53 2000
> @@ -456,6 +456,7 @@
>  	if(dev->priv == NULL)
>  	{
>  		DP( printk("%s: cannot allocate memory\n", dev->name); )
> +		free_irq(dev->irq, dev);
>  		return -ENOMEM;
>  	}
>     
> 

                                       .
                            Si vis pacem, para bellum
                          Granch ltd.  Security Analyst

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

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

end of thread, other threads:[~2000-12-10 10:11 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <20001209151425.E859@conectiva.com.br>
2000-12-09 19:40 ` [PATCH] scsi/sr.c resource alloc checking Arnaldo Carvalho de Melo
2000-12-09 19:49   ` [PATCH] drivers/net/sbni.c irq release on failure Arnaldo Carvalho de Melo
2000-12-09 20:03     ` [PATCH] 2.2: drivers/scsi/3c-xxxx.c resource " Arnaldo Carvalho de Melo
2000-12-10  8:59     ` [PATCH] drivers/net/sbni.c irq " Yaroslav S. Polyakov

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