ChangeSet 1.2231.1.2, 2005/03/28 19:16:47-08:00, [EMAIL PROTECTED]
[PATCH] pcmcia: don't lock up in rsrc_nonstatic pcmcia_validate_mem
struct socket_data wasn't zeroed, so pcmcia_validate_mem() didn't get
called.
If it is called, though, one possible code-path already holds skt_sem,
so
lockups occur. Therefore, change calling conventions to
pcmcia_validate_mem().
Signed-off-by: Dominik Brodowski <[EMAIL PROTECTED]>
Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
ds.c | 4 ++++
rsrc_nonstatic.c | 8 ++------
2 files changed, 6 insertions(+), 6 deletions(-)
diff -Nru a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c
--- a/drivers/pcmcia/ds.c 2005-03-28 21:06:37 -08:00
+++ b/drivers/pcmcia/ds.c 2005-03-28 21:06:37 -08:00
@@ -1386,7 +1386,9 @@
buf->config.Function, &buf->config);
break;
case DS_GET_FIRST_TUPLE:
+ down(&s->parent->skt_sem);
pcmcia_validate_mem(s->parent);
+ up(&s->parent->skt_sem);
ret = pccard_get_first_tuple(s->parent, BIND_FN_ALL, &buf->tuple);
break;
case DS_GET_NEXT_TUPLE:
@@ -1412,7 +1414,9 @@
ret = pccard_get_status(s->parent, buf->status.Function, &buf->status);
break;
case DS_VALIDATE_CIS:
+ down(&s->parent->skt_sem);
pcmcia_validate_mem(s->parent);
+ up(&s->parent->skt_sem);
ret = pccard_validate_cis(s->parent, BIND_FN_ALL, &buf->cisinfo);
break;
case DS_SUSPEND_CARD:
diff -Nru a/drivers/pcmcia/rsrc_nonstatic.c b/drivers/pcmcia/rsrc_nonstatic.c
--- a/drivers/pcmcia/rsrc_nonstatic.c 2005-03-28 21:06:37 -08:00
+++ b/drivers/pcmcia/rsrc_nonstatic.c 2005-03-28 21:06:37 -08:00
@@ -474,8 +474,7 @@
/*
- * Locking note: this is the only place where we take
- * both rsrc_sem and skt_sem.
+ * Locking note: Must be called with skt_sem held!
*/
static void pcmcia_nonstatic_validate_mem(struct pcmcia_socket *s)
{
@@ -492,12 +491,8 @@
if (probe_mask & ~s_data->rsrc_mem_probe) {
s_data->rsrc_mem_probe |= probe_mask;
- down(&s->skt_sem);
-
if (s->state & SOCKET_PRESENT)
validate_mem(s, probe_mask);
-
- up(&s->skt_sem);
}
up(&rsrc_sem);
@@ -781,6 +776,7 @@
data = kmalloc(sizeof(struct socket_data), GFP_KERNEL);
if (!data)
return -ENOMEM;
+ memset(data, 0, sizeof(struct socket_data));
data->mem_db.next = &data->mem_db;
data->io_db.next = &data->io_db;
-
To unsubscribe from this list: send the line "unsubscribe bk-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html