gdrom: dequeue in-flight request
authorTejun Heo <tj@kernel.org>
Fri, 8 May 2009 02:54:14 +0000 (11:54 +0900)
committerJens Axboe <jens.axboe@oracle.com>
Mon, 11 May 2009 07:52:17 +0000 (09:52 +0200)
gdrom already dequeues and fully completes requests on normal path and
the error paths can be easily converted to do so too.  Clean it up and
dequeue requests on error paths too.

While at it remove superflous blk_fs_request() && !blk_rq_sectors()
condition check.

[ Impact: dequeue in-flight request, cleanup ]

Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Adrian McMenamin <adrian@mcmen.demon.co.uk>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
drivers/cdrom/gdrom.c

index 488423cab51afd3ac93c56f296ab684adeb412b8..3cc02bfe828dde005c28f2cb44ea135d694913da 100644 (file)
@@ -638,33 +638,31 @@ static void gdrom_readdisk_dma(struct work_struct *work)
        kfree(read_command);
 }
 
-static void gdrom_request_handler_dma(struct request *req)
-{
-       /* dequeue, add to list of deferred work
-       * and then schedule workqueue */
-       blkdev_dequeue_request(req);
-       list_add_tail(&req->queuelist, &gdrom_deferred);
-       schedule_work(&work);
-}
-
 static void gdrom_request(struct request_queue *rq)
 {
        struct request *req;
 
        while ((req = elv_next_request(rq)) != NULL) {
+               blkdev_dequeue_request(req);
+
                if (!blk_fs_request(req)) {
                        printk(KERN_DEBUG "GDROM: Non-fs request ignored\n");
-                       __blk_end_request_cur(req, -EIO);
+                       __blk_end_request_all(req, -EIO);
+                       continue;
                }
                if (rq_data_dir(req) != READ) {
                        printk(KERN_NOTICE "GDROM: Read only device -");
                        printk(" write request ignored\n");
-                       __blk_end_request_cur(req, -EIO);
+                       __blk_end_request_all(req, -EIO);
+                       continue;
                }
-               if (blk_rq_sectors(req))
-                       gdrom_request_handler_dma(req);
-               else
-                       __blk_end_request_cur(req, -EIO);
+
+               /*
+                * Add to list of deferred work and then schedule
+                * workqueue.
+                */
+               list_add_tail(&req->queuelist, &gdrom_deferred);
+               schedule_work(&work);
        }
 }