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

Reply via email to