--- drivers/cdrom/mcdx.c.orig 2007-04-02 00:25:09.000000000 +0200 +++ drivers/cdrom/mcdx.c 2007-04-02 00:37:53.000000000 +0200 @@ -577,11 +577,20 @@ if (!req) return; + if (!blk_fs_request(req)) { + spin_lock_irq(q->queue_lock); + end_request(req, 0); + goto again; + } + + spin_unlock_irq(q->queue_lock); + stuffp = req->rq_disk->private_data; if (!stuffp->present) { xwarn("do_request(): bad device: %s\n",req->rq_disk->disk_name); xtrace(REQUEST, "end_request(0): bad device\n"); + spin_lock_irq(q->queue_lock); end_request(req, 0); return; } @@ -589,6 +598,7 @@ if (stuffp->audio) { xwarn("do_request() attempt to read from audio cd\n"); xtrace(REQUEST, "end_request(0): read from audio\n"); + spin_lock_irq(q->queue_lock); end_request(req, 0); return; } @@ -596,9 +606,10 @@ xtrace(REQUEST, "do_request() (%lu + %lu)\n", req->sector, req->nr_sectors); - if (req->cmd != READ) { + if (rq_data_dir(req) != READ) { xwarn("do_request(): non-read command to cd!!\n"); xtrace(REQUEST, "end_request(0): write\n"); + spin_lock_irq(q->queue_lock); end_request(req, 0); return; } @@ -613,6 +624,7 @@ req->nr_sectors); if (i == -1) { + spin_lock_irq(q->queue_lock); end_request(req, 0); goto again; } @@ -620,10 +632,12 @@ req->nr_sectors -= i; req->buffer += (i * 512); } + spin_lock_irq(q->queue_lock); end_request(req, 1); goto again; xtrace(REQUEST, "end_request(1)\n"); + spin_lock_irq(q->queue_lock); end_request(req, 1); }