pcmcia: avoid sysfs-related lockup for cardbus
In cb_free(), we remove some sysfs files -- other sysfs files might grab ops_mutex, so we cannot hold it while removing sysfs files. This fixes http://lkml.org/lkml/2010/1/17/88 . Tested-by: Wolfram Sang <w.sang@pengutronix.de> Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
This commit is contained in:
parent
aa584ca4cd
commit
c3bfc96ef7
1 changed files with 10 additions and 2 deletions
|
@ -400,10 +400,19 @@ static void socket_shutdown(struct pcmcia_socket *s)
|
|||
s->lock_count = 0;
|
||||
kfree(s->fake_cis);
|
||||
s->fake_cis = NULL;
|
||||
s->functions = 0;
|
||||
|
||||
/* From here on we can be sure that only we (that is, the
|
||||
* pccardd thread) accesses this socket, and all (16-bit)
|
||||
* PCMCIA interactions are gone. Therefore, release
|
||||
* ops_mutex so that we don't get a sysfs-related lockdep
|
||||
* warning.
|
||||
*/
|
||||
mutex_unlock(&s->ops_mutex);
|
||||
|
||||
#ifdef CONFIG_CARDBUS
|
||||
cb_free(s);
|
||||
#endif
|
||||
s->functions = 0;
|
||||
|
||||
/* give socket some time to power down */
|
||||
msleep(100);
|
||||
|
@ -415,7 +424,6 @@ static void socket_shutdown(struct pcmcia_socket *s)
|
|||
}
|
||||
|
||||
s->state &= ~SOCKET_INUSE;
|
||||
mutex_unlock(&s->ops_mutex);
|
||||
}
|
||||
|
||||
static int socket_setup(struct pcmcia_socket *skt, int initial_delay)
|
||||
|
|
Loading…
Reference in a new issue