pcmcia: use mutex for dynid lock

Even though we weren't calling a blocking function within the dynid
spinlock, we do not need a spinlock here but can and should be using
a mutex.

Reported-by: Jiri Slaby <jirislaby@gmail.com>
Tested-by: Wolfram Sang <w.sang@pengutronix.de>
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
This commit is contained in:
Dominik Brodowski 2010-01-16 13:06:40 +01:00
parent 94a819f802
commit 3f565232c5
2 changed files with 9 additions and 9 deletions

View file

@ -124,9 +124,9 @@ pcmcia_store_new_id(struct device_driver *driver, const char *buf, size_t count)
dynid->id.device_no = device_no; dynid->id.device_no = device_no;
memcpy(dynid->id.prod_id_hash, prod_id_hash, sizeof(__u32) * 4); memcpy(dynid->id.prod_id_hash, prod_id_hash, sizeof(__u32) * 4);
spin_lock(&pdrv->dynids.lock); mutex_lock(&pdrv->dynids.lock);
list_add_tail(&dynid->node, &pdrv->dynids.list); list_add_tail(&dynid->node, &pdrv->dynids.list);
spin_unlock(&pdrv->dynids.lock); mutex_unlock(&pdrv->dynids.lock);
if (get_driver(&pdrv->drv)) { if (get_driver(&pdrv->drv)) {
retval = driver_attach(&pdrv->drv); retval = driver_attach(&pdrv->drv);
@ -144,12 +144,12 @@ pcmcia_free_dynids(struct pcmcia_driver *drv)
{ {
struct pcmcia_dynid *dynid, *n; struct pcmcia_dynid *dynid, *n;
spin_lock(&drv->dynids.lock); mutex_lock(&drv->dynids.lock);
list_for_each_entry_safe(dynid, n, &drv->dynids.list, node) { list_for_each_entry_safe(dynid, n, &drv->dynids.list, node) {
list_del(&dynid->node); list_del(&dynid->node);
kfree(dynid); kfree(dynid);
} }
spin_unlock(&drv->dynids.lock); mutex_unlock(&drv->dynids.lock);
} }
static int static int
@ -180,7 +180,7 @@ int pcmcia_register_driver(struct pcmcia_driver *driver)
/* initialize common fields */ /* initialize common fields */
driver->drv.bus = &pcmcia_bus_type; driver->drv.bus = &pcmcia_bus_type;
driver->drv.owner = driver->owner; driver->drv.owner = driver->owner;
spin_lock_init(&driver->dynids.lock); mutex_init(&driver->dynids.lock);
INIT_LIST_HEAD(&driver->dynids.list); INIT_LIST_HEAD(&driver->dynids.list);
pr_debug("registering driver %s\n", driver->drv.name); pr_debug("registering driver %s\n", driver->drv.name);
@ -894,16 +894,16 @@ static int pcmcia_bus_match(struct device *dev, struct device_driver *drv)
struct pcmcia_dynid *dynid; struct pcmcia_dynid *dynid;
/* match dynamic devices first */ /* match dynamic devices first */
spin_lock(&p_drv->dynids.lock); mutex_lock(&p_drv->dynids.lock);
list_for_each_entry(dynid, &p_drv->dynids.list, node) { list_for_each_entry(dynid, &p_drv->dynids.list, node) {
dev_dbg(dev, "trying to match to %s\n", drv->name); dev_dbg(dev, "trying to match to %s\n", drv->name);
if (pcmcia_devmatch(p_dev, &dynid->id)) { if (pcmcia_devmatch(p_dev, &dynid->id)) {
dev_dbg(dev, "matched to %s\n", drv->name); dev_dbg(dev, "matched to %s\n", drv->name);
spin_unlock(&p_drv->dynids.lock); mutex_unlock(&p_drv->dynids.lock);
return 1; return 1;
} }
} }
spin_unlock(&p_drv->dynids.lock); mutex_unlock(&p_drv->dynids.lock);
#ifdef CONFIG_PCMCIA_IOCTL #ifdef CONFIG_PCMCIA_IOCTL
/* matching by cardmgr */ /* matching by cardmgr */

View file

@ -40,7 +40,7 @@ struct net_device;
* Documentation/pcmcia/driver.txt for details. * Documentation/pcmcia/driver.txt for details.
*/ */
struct pcmcia_dynids { struct pcmcia_dynids {
spinlock_t lock; struct mutex lock;
struct list_head list; struct list_head list;
}; };