Skip to content

Commit

Permalink
pcmcia: avoid sysfs-related lockup for cardbus
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Dominik Brodowski committed Feb 17, 2010
1 parent aa584ca commit c3bfc96
Showing 1 changed file with 10 additions and 2 deletions.
12 changes: 10 additions & 2 deletions drivers/pcmcia/cs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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)
Expand Down

0 comments on commit c3bfc96

Please sign in to comment.