Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3001ca77 authored by NeilBrown's avatar NeilBrown Committed by Jens Axboe
Browse files

New function blk_req_append_bio



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: default avatarNeil Brown <neilb@suse.de>

diff .prev/block/ll_rw_blk.c ./block/ll_rw_blk.c
Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
parent eea9befa
Loading
Loading
Loading
Loading
+22 −16
Original line number Diff line number Diff line
@@ -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;
	}

	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);
+1 −10
Original line number Diff line number Diff line
@@ -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)
+2 −2
Original line number Diff line number Diff line
@@ -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