Update previous patch to use modified merge_bvec_fn interface.
---
 drivers/md/dm-linear.c |   33 +++++++++++++++------------------
 1 files changed, 15 insertions(+), 18 deletions(-)

Index: linux-2.6.21/drivers/md/dm-linear.c
===================================================================
--- linux-2.6.21.orig/drivers/md/dm-linear.c	2007-05-01 17:40:58.000000000 +0100
+++ linux-2.6.21/drivers/md/dm-linear.c	2007-05-01 17:40:58.000000000 +0100
@@ -69,12 +69,19 @@ static void linear_dtr(struct dm_target 
 	kfree(lc);
 }
 
+static sector_t linear_map_sector(struct dm_target *ti, sector_t bi_sector)
+{
+	struct linear_c *lc = ti->private;
+
+	return lc->start + (bi_sector - ti->begin);
+}
+
 static void linear_map_bio(struct dm_target *ti, struct bio *bio)
 {
 	struct linear_c *lc = ti->private;
 
 	bio->bi_bdev = lc->dev->bdev;
-	bio->bi_sector = lc->start + (bio->bi_sector - ti->begin);
+	bio->bi_sector = linear_map_sector(ti, bio->bi_sector);
 }
 
 static int linear_map(struct dm_target *ti, struct bio *bio,
@@ -119,28 +126,18 @@ static int linear_ioctl(struct dm_target
 	return blkdev_driver_ioctl(bdev->bd_inode, &fake_file, bdev->bd_disk, cmd, arg);
 }
 
-static int linear_merge(struct dm_target *ti, struct bio *bio,
-			struct bio_vec *biovec, int len)
+static int linear_merge(struct dm_target *ti, sector_t bi_sector,
+			unsigned long bi_rw, struct bio_vec *biovec, int len)
 {
 	struct linear_c *lc = ti->private;
 	request_queue_t *q = bdev_get_queue(lc->dev->bdev);
 
-	if (q->merge_bvec_fn) {
-		/* FIXME Yuck.  Shouldn't these be merge_bvec_fn parameters?  Why does the bio get passed around here at all? */
-		/* FIXME Use helper function (or macro) to save this for now. */
-		sector_t org_sec = bio->bi_sector;
-		struct block_device *org_dev = bio->bi_bdev;
-
-		linear_map_bio(ti, bio);
-
-		len = q->merge_bvec_fn(q, bio, biovec);
-
-		/* FIXME Use helper function to restore this */
-		bio->bi_bdev = org_dev;
-		bio->bi_sector = org_sec;
-	}
+	if (!q->merge_bvec_fn)
+		return len;
 
-	return len;
+	return q->merge_bvec_fn(q, lc->dev->bdev,
+				linear_map_sector(ti, bi_sector),
+				len, bi_rw, biovec);
 }
 
 static struct target_type linear_target = {