diff options
author | Dominik Brodowski <linux@dominikbrodowski.net> | 2010-01-16 13:06:40 +0100 |
---|---|---|
committer | Dominik Brodowski <linux@dominikbrodowski.net> | 2010-02-17 17:48:23 +0100 |
commit | 3f565232c561fbd9d5e03354aac29b90cb2bc78a (patch) | |
tree | e8da4dc6a2ed90777f9d122fd86eea92c47d61a1 | |
parent | 94a819f80297e1f635a7cde4ed5317612e512ba7 (diff) | |
download | linux-3.10-3f565232c561fbd9d5e03354aac29b90cb2bc78a.tar.gz linux-3.10-3f565232c561fbd9d5e03354aac29b90cb2bc78a.tar.bz2 linux-3.10-3f565232c561fbd9d5e03354aac29b90cb2bc78a.zip |
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>
-rw-r--r-- | drivers/pcmcia/ds.c | 16 | ||||
-rw-r--r-- | include/pcmcia/ds.h | 2 |
2 files changed, 9 insertions, 9 deletions
diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c index 83b51ddd3da..253d9aca5f7 100644 --- a/drivers/pcmcia/ds.c +++ b/drivers/pcmcia/ds.c @@ -124,9 +124,9 @@ pcmcia_store_new_id(struct device_driver *driver, const char *buf, size_t count) dynid->id.device_no = device_no; 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); - spin_unlock(&pdrv->dynids.lock); + mutex_unlock(&pdrv->dynids.lock); if (get_driver(&pdrv->drv)) { retval = driver_attach(&pdrv->drv); @@ -144,12 +144,12 @@ pcmcia_free_dynids(struct pcmcia_driver *drv) { 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_del(&dynid->node); kfree(dynid); } - spin_unlock(&drv->dynids.lock); + mutex_unlock(&drv->dynids.lock); } static int @@ -180,7 +180,7 @@ int pcmcia_register_driver(struct pcmcia_driver *driver) /* initialize common fields */ driver->drv.bus = &pcmcia_bus_type; driver->drv.owner = driver->owner; - spin_lock_init(&driver->dynids.lock); + mutex_init(&driver->dynids.lock); INIT_LIST_HEAD(&driver->dynids.list); 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; /* 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) { dev_dbg(dev, "trying to match to %s\n", drv->name); if (pcmcia_devmatch(p_dev, &dynid->id)) { dev_dbg(dev, "matched to %s\n", drv->name); - spin_unlock(&p_drv->dynids.lock); + mutex_unlock(&p_drv->dynids.lock); return 1; } } - spin_unlock(&p_drv->dynids.lock); + mutex_unlock(&p_drv->dynids.lock); #ifdef CONFIG_PCMCIA_IOCTL /* matching by cardmgr */ diff --git a/include/pcmcia/ds.h b/include/pcmcia/ds.h index ee148573c11..d57847f2f6c 100644 --- a/include/pcmcia/ds.h +++ b/include/pcmcia/ds.h @@ -40,7 +40,7 @@ struct net_device; * Documentation/pcmcia/driver.txt for details. */ struct pcmcia_dynids { - spinlock_t lock; + struct mutex lock; struct list_head list; }; |