9p: Fix soft lockup in virtio transport
Eric Van Hensbergen [Thu, 7 Feb 2008 01:25:07 +0000 (19:25 -0600)]
This fixes a poorly placed spinlock which could result in a
soft lockup condition.

Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>

net/9p/trans_virtio.c

index 0f59022..7853c31 100644 (file)
@@ -232,7 +232,6 @@ p9_virtio_rpc(struct p9_trans *t, struct p9_fcall *tc, struct p9_fcall **rc,
 
        rdata = (char *)*rc+sizeof(struct p9_fcall);
 
-       spin_lock_irqsave(&chan->lock, flags);
        n = P9_NOTAG;
        if (tc->id != P9_TVERSION) {
                n = p9_idpool_get(chan->tagpool);
@@ -240,6 +239,7 @@ p9_virtio_rpc(struct p9_trans *t, struct p9_fcall *tc, struct p9_fcall **rc,
                        return -ENOMEM;
        }
 
+       spin_lock_irqsave(&chan->lock, flags);
        req = p9_lookup_tag(chan, n);
        spin_unlock_irqrestore(&chan->lock, flags);