Update previous patch to use modified merge_bvec_fn interface.

---
 drivers/md/dm.c               |   16 +++++++++-------
 include/linux/device-mapper.h |    5 +++--
 2 files changed, 12 insertions(+), 9 deletions(-)

Index: linux-2.6.21/drivers/md/dm.c
===================================================================
--- linux-2.6.21.orig/drivers/md/dm.c	2007-05-01 17:40:57.000000000 +0100
+++ linux-2.6.21/drivers/md/dm.c	2007-05-01 17:40:57.000000000 +0100
@@ -792,8 +792,9 @@ static void __split_bio(struct mapped_de
  * CRUD END
  *---------------------------------------------------------------*/
 
-static int dm_merge_bvec(request_queue_t *q, struct bio *bio,
-			 struct bio_vec *biovec)
+static int dm_merge_bvec(request_queue_t *q, struct block_device *bi_bdev,
+			 sector_t bi_sector, unsigned bi_size,
+			 unsigned long bi_rw, struct bio_vec *biovec)
 {
 	struct mapped_device *md = q->queuedata;
 	struct dm_table *map = dm_get_table(md);
@@ -804,23 +805,24 @@ static int dm_merge_bvec(request_queue_t
 	if (unlikely(!map))
 		return 0;
 
-	ti = dm_table_find_target(map, bio->bi_sector);
+	ti = dm_table_find_target(map, bi_sector);
 
 	/*
 	 * Find maximum bytes of I/O that won't need splitting
 	 */
-	max_sectors = min(max_io_len(md, bio->bi_sector, ti), (sector_t) BIO_MAX_SECTORS);
-	len = (max_sectors << SECTOR_SHIFT) - bio->bi_size;
+	max_sectors = min(max_io_len(md, bi_sector, ti),
+			  (sector_t) BIO_MAX_SECTORS);
+	len = (max_sectors << SECTOR_SHIFT) - bi_size;
 	if (len < 0)
 		len = 0;
 
 	if (len > 0 && ti->type->merge)
-		len = ti->type->merge(ti, bio, biovec, len);
+		len = ti->type->merge(ti, bi_sector, bi_rw, biovec, len);
 
 	/*
 	 * Always allow an entire first page
 	 */
-	if (len <= biovec->bv_len && bio_sectors(bio) == 0)
+	if (len <= biovec->bv_len && !(bi_size >> SECTOR_SHIFT))
 		len = biovec->bv_len;
 
 	dm_table_put(map);
Index: linux-2.6.21/include/linux/device-mapper.h
===================================================================
--- linux-2.6.21.orig/include/linux/device-mapper.h	2007-05-01 17:40:57.000000000 +0100
+++ linux-2.6.21/include/linux/device-mapper.h	2007-05-01 17:40:57.000000000 +0100
@@ -73,8 +73,9 @@ typedef int (*dm_ioctl_fn) (struct dm_ta
 			    struct file *filp, unsigned int cmd,
 			    unsigned long arg);
 
-typedef int (*dm_merge_fn) (struct dm_target *ti, struct bio *bio,
-			    struct bio_vec *biovec, int len);
+typedef int (*dm_merge_fn) (struct dm_target *ti, sector_t bi_sector,
+			    unsigned long bi_rw, struct bio_vec *biovec,
+			    int len);
 
 void dm_error(const char *message);