]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/s390/block/dasd.c
blk_end_request: changing s390 (take 4)
[linux-2.6-omap-h63xx.git] / drivers / s390 / block / dasd.c
index 1db15f3e5d20cc5e21fe4d144dd8840c08e5d009..d640427c74c816172b38cfae6bb2529f7b344e37 100644 (file)
@@ -1595,12 +1595,10 @@ void dasd_block_clear_timer(struct dasd_block *block)
 /*
  * posts the buffer_cache about a finalized request
  */
-static inline void dasd_end_request(struct request *req, int uptodate)
+static inline void dasd_end_request(struct request *req, int error)
 {
-       if (end_that_request_first(req, uptodate, req->hard_nr_sectors))
+       if (__blk_end_request(req, error, blk_rq_bytes(req)))
                BUG();
-       add_disk_randomness(req->rq_disk);
-       end_that_request_last(req, uptodate);
 }
 
 /*
@@ -1657,7 +1655,7 @@ static void __dasd_process_request_queue(struct dasd_block *block)
                                      "Rejecting write request %p",
                                      req);
                        blkdev_dequeue_request(req);
-                       dasd_end_request(req, 0);
+                       dasd_end_request(req, -EIO);
                        continue;
                }
                cqr = basedev->discipline->build_cp(basedev, block, req);
@@ -1686,7 +1684,7 @@ static void __dasd_process_request_queue(struct dasd_block *block)
                                      "on request %p",
                                      PTR_ERR(cqr), req);
                        blkdev_dequeue_request(req);
-                       dasd_end_request(req, 0);
+                       dasd_end_request(req, -EIO);
                        continue;
                }
                /*
@@ -1705,11 +1703,14 @@ static void __dasd_cleanup_cqr(struct dasd_ccw_req *cqr)
 {
        struct request *req;
        int status;
+       int error = 0;
 
        req = (struct request *) cqr->callback_data;
        dasd_profile_end(cqr->block, cqr, req);
        status = cqr->memdev->discipline->free_cp(cqr, req);
-       dasd_end_request(req, status);
+       if (status <= 0)
+               error = status ? status : -EIO;
+       dasd_end_request(req, error);
 }
 
 /*
@@ -2009,7 +2010,7 @@ static void dasd_flush_request_queue(struct dasd_block *block)
        spin_lock_irq(&block->request_queue_lock);
        while ((req = elv_next_request(block->request_queue))) {
                blkdev_dequeue_request(req);
-               dasd_end_request(req, 0);
+               dasd_end_request(req, -EIO);
        }
        spin_unlock_irq(&block->request_queue_lock);
 }