Mailing List archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[linux-dvb] [patch 2.6.10-rc3-mm1 1/5] skystar2: PCI api update + leaks
PCI api update + leaks
- claim_adapter:
+ s/request_xxx_region/pci_request_region/
+ plug leaks on error path (requested io regions and enabled pci device);
+ propagate the status code;
- driver_halt:
+ missing pci_disable_device();
+ s/release_xxx_region/pci_release_region/
- driver_initialize:
+ s/release_xxx_region/pci_release_region/
Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
diff -puN drivers/media/dvb/b2c2/skystar2.c~dvb-010 drivers/media/dvb/b2c2/skystar2.c
--- linux-2.6.10-rc3/drivers/media/dvb/b2c2/skystar2.c~dvb-010 2004-12-14 23:27:52.657999830 +0100
+++ linux-2.6.10-rc3-romieu/drivers/media/dvb/b2c2/skystar2.c 2004-12-15 01:20:29.986235397 +0100
@@ -1784,21 +1784,24 @@ static struct pci_driver skystar2_pci_dr
static int claim_adapter(struct adapter *adapter)
{
struct pci_dev *pdev = adapter->pdev;
-
u16 var;
+ int ret;
- if (!request_region(pci_resource_start(pdev, 1), pci_resource_len(pdev, 1), skystar2_pci_driver.name))
- return -EBUSY;
+ ret = pci_request_region(pdev, 1, skystar2_pci_driver.name);
+ if (ret < 0)
+ goto out;
- if (!request_mem_region(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0), skystar2_pci_driver.name))
- return -EBUSY;
+ ret = pci_request_region(pdev, 0, skystar2_pci_driver.name);
+ if (ret < 0)
+ goto err_pci_release_1;
pci_read_config_byte(pdev, PCI_CLASS_REVISION, &adapter->card_revision);
dprintk("%s: card revision %x \n", __FUNCTION__, adapter->card_revision);
- if (pci_enable_device(pdev))
- return -EIO;
+ ret = pci_enable_device(pdev);
+ if (ret < 0)
+ goto err_pci_release_0;
pci_read_config_word(pdev, 4, &var);
@@ -1811,13 +1814,23 @@ static int claim_adapter(struct adapter
if (!adapter->io_mem) {
dprintk("%s: can not map io memory\n", __FUNCTION__);
-
- return 2;
+ ret = -EIO;
+ goto err_pci_disable;
}
dprintk("%s: io memory maped at %p\n", __FUNCTION__, adapter->io_mem);
- return 1;
+ ret = 1;
+out:
+ return ret;
+
+err_pci_disable:
+ pci_disable_device(pdev);
+err_pci_release_0:
+ pci_release_region(pdev, 0);
+err_pci_release_1:
+ pci_release_region(pdev, 1);
+ goto out;
}
/*
@@ -1933,8 +1946,8 @@ static int driver_initialize(struct pci_
printk("%s: This driver works only with FlexCopII(rev.130), FlexCopIIB(rev.195) and FlexCopIII(rev.192).\n", __FILE__);
free_adapter_object(adapter);
pci_set_drvdata(pdev, NULL);
- release_region(pci_resource_start(pdev, 1), pci_resource_len(pdev, 1));
- release_mem_region(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0));
+ pci_release_region(pdev, 1);
+ pci_release_region(pdev, 0);
return -ENODEV;
}
@@ -1998,9 +2011,9 @@ static void driver_halt(struct pci_dev *
pci_set_drvdata(pdev, NULL);
- release_region(pci_resource_start(pdev, 1), pci_resource_len(pdev, 1));
-
- release_mem_region(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0));
+ pci_disable_device(pdev);
+ pci_release_region(pdev, 1);
+ pci_release_region(pdev, 0);
}
static int dvb_start_feed(struct dvb_demux_feed *dvbdmxfeed)
_
Home |
Main Index |
Thread Index