diff options
| -rw-r--r-- | drivers/md/dm-stripe.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/drivers/md/dm-stripe.c b/drivers/md/dm-stripe.c index 779f47a0fe71..e2ad1ae5268d 100644 --- a/drivers/md/dm-stripe.c +++ b/drivers/md/dm-stripe.c | |||
| @@ -207,11 +207,20 @@ static void stripe_dtr(struct dm_target *ti) | |||
| 207 | kfree(sc); | 207 | kfree(sc); |
| 208 | } | 208 | } |
| 209 | 209 | ||
| 210 | static void stripe_map_sector(struct stripe_c *sc, sector_t sector, | ||
| 211 | uint32_t *stripe, sector_t *result) | ||
| 212 | { | ||
| 213 | sector_t offset = dm_target_offset(sc->ti, sector); | ||
| 214 | sector_t chunk = offset >> sc->chunk_shift; | ||
| 215 | |||
| 216 | *stripe = sector_div(chunk, sc->stripes); | ||
| 217 | *result = (chunk << sc->chunk_shift) | (offset & sc->chunk_mask); | ||
| 218 | } | ||
| 219 | |||
| 210 | static int stripe_map(struct dm_target *ti, struct bio *bio, | 220 | static int stripe_map(struct dm_target *ti, struct bio *bio, |
| 211 | union map_info *map_context) | 221 | union map_info *map_context) |
| 212 | { | 222 | { |
| 213 | struct stripe_c *sc = (struct stripe_c *) ti->private; | 223 | struct stripe_c *sc = ti->private; |
| 214 | sector_t offset, chunk; | ||
| 215 | uint32_t stripe; | 224 | uint32_t stripe; |
| 216 | unsigned target_request_nr; | 225 | unsigned target_request_nr; |
| 217 | 226 | ||
| @@ -222,13 +231,11 @@ static int stripe_map(struct dm_target *ti, struct bio *bio, | |||
| 222 | return DM_MAPIO_REMAPPED; | 231 | return DM_MAPIO_REMAPPED; |
| 223 | } | 232 | } |
| 224 | 233 | ||
| 225 | offset = dm_target_offset(ti, bio->bi_sector); | 234 | stripe_map_sector(sc, bio->bi_sector, &stripe, &bio->bi_sector); |
| 226 | chunk = offset >> sc->chunk_shift; | ||
| 227 | stripe = sector_div(chunk, sc->stripes); | ||
| 228 | 235 | ||
| 236 | bio->bi_sector += sc->stripe[stripe].physical_start; | ||
| 229 | bio->bi_bdev = sc->stripe[stripe].dev->bdev; | 237 | bio->bi_bdev = sc->stripe[stripe].dev->bdev; |
| 230 | bio->bi_sector = sc->stripe[stripe].physical_start + | 238 | |
| 231 | (chunk << sc->chunk_shift) + (offset & sc->chunk_mask); | ||
| 232 | return DM_MAPIO_REMAPPED; | 239 | return DM_MAPIO_REMAPPED; |
| 233 | } | 240 | } |
| 234 | 241 | ||
