Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

dm: linear add merge

This patch implements biovec merge function for linear target.

If the underlying device has merge function defined, call it.
If not, keep precomputed value.

Signed-off-by: Milan Broz <mbroz@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>

authored by

Milan Broz and committed by
Alasdair G Kergon
7bc3447b f6fccb12

+33 -5
+33 -5
drivers/md/dm-linear.c
··· 69 69 kfree(lc); 70 70 } 71 71 72 + static sector_t linear_map_sector(struct dm_target *ti, sector_t bi_sector) 73 + { 74 + struct linear_c *lc = ti->private; 75 + 76 + return lc->start + (bi_sector - ti->begin); 77 + } 78 + 79 + static void linear_map_bio(struct dm_target *ti, struct bio *bio) 80 + { 81 + struct linear_c *lc = ti->private; 82 + 83 + bio->bi_bdev = lc->dev->bdev; 84 + bio->bi_sector = linear_map_sector(ti, bio->bi_sector); 85 + } 86 + 72 87 static int linear_map(struct dm_target *ti, struct bio *bio, 73 88 union map_info *map_context) 74 89 { 75 - struct linear_c *lc = (struct linear_c *) ti->private; 76 - 77 - bio->bi_bdev = lc->dev->bdev; 78 - bio->bi_sector = lc->start + (bio->bi_sector - ti->begin); 90 + linear_map_bio(ti, bio); 79 91 80 92 return DM_MAPIO_REMAPPED; 81 93 } ··· 126 114 return blkdev_driver_ioctl(bdev->bd_inode, &fake_file, bdev->bd_disk, cmd, arg); 127 115 } 128 116 117 + static int linear_merge(struct dm_target *ti, struct bvec_merge_data *bvm, 118 + struct bio_vec *biovec, int max_size) 119 + { 120 + struct linear_c *lc = ti->private; 121 + struct request_queue *q = bdev_get_queue(lc->dev->bdev); 122 + 123 + if (!q->merge_bvec_fn) 124 + return max_size; 125 + 126 + bvm->bi_bdev = lc->dev->bdev; 127 + bvm->bi_sector = linear_map_sector(ti, bvm->bi_sector); 128 + 129 + return min(max_size, q->merge_bvec_fn(q, bvm, biovec)); 130 + } 131 + 129 132 static struct target_type linear_target = { 130 133 .name = "linear", 131 - .version= {1, 0, 2}, 134 + .version= {1, 0, 3}, 132 135 .module = THIS_MODULE, 133 136 .ctr = linear_ctr, 134 137 .dtr = linear_dtr, 135 138 .map = linear_map, 136 139 .status = linear_status, 137 140 .ioctl = linear_ioctl, 141 + .merge = linear_merge, 138 142 }; 139 143 140 144 int __init dm_linear_init(void)