<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">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-&gt;private;
+
+	return lc-&gt;start + (bi_sector - ti-&gt;begin);
+}
+
 static void linear_map_bio(struct dm_target *ti, struct bio *bio)
 {
 	struct linear_c *lc = ti-&gt;private;
 
 	bio-&gt;bi_bdev = lc-&gt;dev-&gt;bdev;
-	bio-&gt;bi_sector = lc-&gt;start + (bio-&gt;bi_sector - ti-&gt;begin);
+	bio-&gt;bi_sector = linear_map_sector(ti, bio-&gt;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-&gt;bd_inode, &amp;fake_file, bdev-&gt;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-&gt;private;
 	request_queue_t *q = bdev_get_queue(lc-&gt;dev-&gt;bdev);
 
-	if (q-&gt;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-&gt;bi_sector;
-		struct block_device *org_dev = bio-&gt;bi_bdev;
-
-		linear_map_bio(ti, bio);
-
-		len = q-&gt;merge_bvec_fn(q, bio, biovec);
-
-		/* FIXME Use helper function to restore this */
-		bio-&gt;bi_bdev = org_dev;
-		bio-&gt;bi_sector = org_sec;
-	}
+	if (!q-&gt;merge_bvec_fn)
+		return len;
 
-	return len;
+	return q-&gt;merge_bvec_fn(q, lc-&gt;dev-&gt;bdev,
+				linear_map_sector(ti, bi_sector),
+				len, bi_rw, biovec);
 }
 
 static struct target_type linear_target = {
</pre></body></html>