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-rc5/drivers/md/dm.c =================================================================== --- linux-2.6.21-rc5.orig/drivers/md/dm.c 2007-04-04 19:28:53.000000000 +0100 +++ linux-2.6.21-rc5/drivers/md/dm.c 2007-04-04 19:28:54.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-rc5/include/linux/device-mapper.h =================================================================== --- linux-2.6.21-rc5.orig/include/linux/device-mapper.h 2007-04-04 19:28:53.000000000 +0100 +++ linux-2.6.21-rc5/include/linux/device-mapper.h 2007-04-04 19:28:54.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);