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-rc5/drivers/md/dm-linear.c =================================================================== --- linux-2.6.21-rc5.orig/drivers/md/dm-linear.c 2007-04-04 19:28:55.000000000 +0100 +++ linux-2.6.21-rc5/drivers/md/dm-linear.c 2007-04-04 19:28:56.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 = {