it821x: fix kzalloc() failure handling
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Sat, 26 Apr 2008 15:36:42 +0000 (17:36 +0200)
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Sat, 26 Apr 2008 15:36:42 +0000 (17:36 +0200)
Allocate 'struct it821x_dev' objects for both ports in it821x_init_one().

Fixes potential OOPS in it821x_quirkproc() (uses 'itdev' unconditionally)
and other problems ('itdev' is needed for correct operation of the driver).

Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
drivers/ide/pci/it821x.c

index b9f9e0d78f8420ae2685ee9e41ca468a50c6ae19..a38ec47423a0e67e08c82b9171ec84190c6447b7 100644 (file)
@@ -523,16 +523,12 @@ static void __devinit it821x_quirkproc(ide_drive_t *drive)
 static void __devinit init_hwif_it821x(ide_hwif_t *hwif)
 {
        struct pci_dev *dev = to_pci_dev(hwif->dev);
-       struct it821x_dev *idev = kzalloc(sizeof(struct it821x_dev), GFP_KERNEL);
+       struct it821x_dev **itdevs = (struct it821x_dev **)pci_get_drvdata(dev);
+       struct it821x_dev *idev = itdevs[hwif->channel];
        u8 conf;
 
        hwif->quirkproc = &it821x_quirkproc;
 
-       if (idev == NULL) {
-               printk(KERN_ERR "it821x: out of memory, falling back to legacy behaviour.\n");
-               return;
-       }
-
        ide_set_hwifdata(hwif, idev);
 
        pci_read_config_byte(dev, 0x50, &conf);
@@ -641,6 +637,22 @@ static const struct ide_port_info it821x_chipsets[] __devinitdata = {
 
 static int __devinit it821x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
+       struct it821x_dev *itdevs[2] = { NULL, NULL} , *itdev;
+       unsigned int i;
+
+       for (i = 0; i < 2; i++) {
+               itdev = kzalloc(sizeof(*itdev), GFP_KERNEL);
+               if (itdev == NULL) {
+                       kfree(itdevs[0]);
+                       printk(KERN_ERR "it821x: out of memory\n");
+                       return -ENOMEM;
+               }
+
+               itdevs[i] = itdev;
+       }
+
+       pci_set_drvdata(dev, itdevs);
+
        return ide_setup_pci_device(dev, &it821x_chipsets[id->driver_data]);
 }