New function blk_req_append_bio
NeilBrown [Thu, 16 Aug 2007 11:31:27 +0000 (13:31 +0200)]
ll_back_merge_fn is currently exported to SCSI where is it used,
together with blk_rq_bio_prep, in exactly the same way these
functions are used in __blk_rq_map_user.

So move the common code into a new function (blk_rq_append_bio), and
don't export ll_back_merge_fn any longer.

Signed-off-by: Neil Brown <neilb@suse.de>

diff .prev/block/ll_rw_blk.c ./block/ll_rw_blk.c
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>

block/ll_rw_blk.c
drivers/scsi/scsi_lib.c
include/linux/blkdev.h

index 094c0fa..2de9bad 100644 (file)
@@ -1441,7 +1441,8 @@ static inline int ll_new_hw_segment(struct request_queue *q,
        return 1;
 }
 
-int ll_back_merge_fn(struct request_queue *q, struct request *req, struct bio *bio)
+static int ll_back_merge_fn(struct request_queue *q, struct request *req,
+                           struct bio *bio)
 {
        unsigned short max_sectors;
        int len;
@@ -1477,7 +1478,6 @@ int ll_back_merge_fn(struct request_queue *q, struct request *req, struct bio *b
 
        return ll_new_hw_segment(q, req, bio);
 }
-EXPORT_SYMBOL(ll_back_merge_fn);
 
 static int ll_front_merge_fn(struct request_queue *q, struct request *req, 
                             struct bio *bio)
@@ -2367,6 +2367,23 @@ static int __blk_rq_unmap_user(struct bio *bio)
        return ret;
 }
 
+int blk_rq_append_bio(struct request_queue *q, struct request *rq,
+                     struct bio *bio)
+{
+       if (!rq->bio)
+               blk_rq_bio_prep(q, rq, bio);
+       else if (!ll_back_merge_fn(q, rq, bio))
+               return -EINVAL;
+       else {
+               rq->biotail->bi_next = bio;
+               rq->biotail = bio;
+
+               rq->data_len += bio->bi_size;
+       }
+       return 0;
+}
+EXPORT_SYMBOL(blk_rq_append_bio);
+
 static int __blk_rq_map_user(struct request_queue *q, struct request *rq,
                             void __user *ubuf, unsigned int len)
 {
@@ -2398,21 +2415,10 @@ static int __blk_rq_map_user(struct request_queue *q, struct request *rq,
         */
        bio_get(bio);
 
-       if (!rq->bio)
-               blk_rq_bio_prep(q, rq, bio);
-       else if (!ll_back_merge_fn(q, rq, bio)) {
-               ret = -EINVAL;
-               goto unmap_bio;
-       } else {
-               rq->biotail->bi_next = bio;
-               rq->biotail = bio;
-
-               rq->data_len += bio->bi_size;
-       }
-
-       return bio->bi_size;
+       ret = blk_rq_append_bio(q, rq, bio);
+       if (!ret)
+               return bio->bi_size;
 
-unmap_bio:
        /* if it was boucned we must call the end io function */
        bio_endio(bio, bio->bi_size, 0);
        __blk_rq_unmap_user(orig_bio);
index a417a6f..59b3985 100644 (file)
@@ -263,16 +263,7 @@ static int scsi_merge_bio(struct request *rq, struct bio *bio)
                bio->bi_rw |= (1 << BIO_RW);
        blk_queue_bounce(q, &bio);
 
-       if (!rq->bio)
-               blk_rq_bio_prep(q, rq, bio);
-       else if (!ll_back_merge_fn(q, rq, bio))
-               return -EINVAL;
-       else {
-               rq->biotail->bi_next = bio;
-               rq->biotail = bio;
-       }
-
-       return 0;
+       return blk_rq_append_bio(q, rq, bio);
 }
 
 static int scsi_bi_endio(struct bio *bio, unsigned int bytes_done, int error)
index a4b13b8..3021a5b 100644 (file)
@@ -675,8 +675,8 @@ extern int sg_scsi_ioctl(struct file *, struct request_queue *,
 /*
  * Temporary export, until SCSI gets fixed up.
  */
-extern int ll_back_merge_fn(struct request_queue *, struct request *,
-               struct bio *);
+extern int blk_rq_append_bio(struct request_queue *q, struct request *rq,
+                            struct bio *bio);
 
 /*
  * A queue has just exitted congestion.  Note this in the global counter of