summaryrefslogtreecommitdiff
path: root/drivers/md/linear.c
diff options
context:
space:
mode:
authorJens Axboe <axboe@suse.de>2002-10-27 17:53:39 -0800
committerJens Axboe <axboe@suse.de>2002-10-27 17:53:39 -0800
commit14ff27c5aadb76d34bfda3ebe13317b8c187dbf2 (patch)
tree5184e111a73b93da0805c7ec9ba44a0da33ade95 /drivers/md/linear.c
parente00cb941e9a48672c5b2e501b205973390b7136e (diff)
[PATCH] queue merge_bvec_fn() changes
Make merge_bvec_fn() return number of bytes we can accept at a given offset, instead of a bool.
Diffstat (limited to 'drivers/md/linear.c')
-rw-r--r--drivers/md/linear.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/md/linear.c b/drivers/md/linear.c
index 019af8fd1fcd..66db51bcd9c4 100644
--- a/drivers/md/linear.c
+++ b/drivers/md/linear.c
@@ -52,19 +52,21 @@ static inline dev_info_t *which_dev(mddev_t *mddev, sector_t sector)
* @bio: the buffer head that's been built up so far
* @biovec: the request that could be merged to it.
*
- * Return 1 if the merge is not permitted (because the
- * result would cross a device boundary), 0 otherwise.
+ * Return amount of bytes we can take at this offset
*/
static int linear_mergeable_bvec(request_queue_t *q, struct bio *bio, struct bio_vec *biovec)
{
mddev_t *mddev = q->queuedata;
- dev_info_t *dev0, *dev1;
+ dev_info_t *dev0;
+ int maxsectors, bio_sectors = (bio->bi_size + biovec->bv_len) >> 9;
dev0 = which_dev(mddev, bio->bi_sector);
- dev1 = which_dev(mddev, bio->bi_sector +
- ((bio->bi_size + biovec->bv_len - 1) >> 9));
+ maxsectors = (dev0->size << 1) - (bio->bi_sector - (dev0->offset<<1));
- return dev0 != dev1;
+ if (bio_sectors <= maxsectors)
+ return biovec->bv_len;
+
+ return (maxsectors << 9) - bio->bi_size;
}
static int linear_run (mddev_t *mddev)