dm-devel.redhat.com archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] dm-stripe: move sector translation to a function
@ 2010-07-27 21:38 Mikulas Patocka
  2010-07-27 21:42 ` [PATCH 2/2] dm-stripe: discard support Mikulas Patocka
  2010-07-28 17:09 ` [PATCH 1/2 v2] dm stripe: move sector translation to a function Mike Snitzer
  0 siblings, 2 replies; 11+ messages in thread
From: Mikulas Patocka @ 2010-07-27 21:38 UTC (permalink / raw)
  To: dm-devel; +Cc: Mike Snitzer, Alasdair G Kergon

Abstract sector translation in dm-stripe

Abstract sector -> stripe, sector translation to a function.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>

---
 drivers/md/dm-stripe.c |   18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

Index: linux-2.6.35-rc6-fast/drivers/md/dm-stripe.c
===================================================================
--- linux-2.6.35-rc6-fast.orig/drivers/md/dm-stripe.c	2010-07-27 22:43:40.000000000 +0200
+++ linux-2.6.35-rc6-fast/drivers/md/dm-stripe.c	2010-07-27 23:08:28.000000000 +0200
@@ -207,11 +207,19 @@ static void stripe_dtr(struct dm_target 
 	kfree(sc);
 }
 
+static void stripe_map_sector(struct stripe_c *sc, sector_t sector,
+			      uint32_t *stripe, sector_t *result)
+{
+	sector_t offset = sector - sc->ti->begin;
+	sector_t chunk = offset >> sc->chunk_shift;
+	*stripe = sector_div(chunk, sc->stripes);
+	*result = (chunk << sc->chunk_shift) | (offset & sc->chunk_mask);
+}
+
 static int stripe_map(struct dm_target *ti, struct bio *bio,
 		      union map_info *map_context)
 {
 	struct stripe_c *sc = (struct stripe_c *) ti->private;
-	sector_t offset, chunk;
 	uint32_t stripe;
 
 	if (unlikely(bio_empty_barrier(bio))) {
@@ -220,13 +228,11 @@ static int stripe_map(struct dm_target *
 		return DM_MAPIO_REMAPPED;
 	}
 
-	offset = bio->bi_sector - ti->begin;
-	chunk = offset >> sc->chunk_shift;
-	stripe = sector_div(chunk, sc->stripes);
+	stripe_map_sector(sc, bio->bi_sector, &stripe, &bio->bi_sector);
 
+	bio->bi_sector += sc->stripe[stripe].physical_start;
 	bio->bi_bdev = sc->stripe[stripe].dev->bdev;
-	bio->bi_sector = sc->stripe[stripe].physical_start +
-	    (chunk << sc->chunk_shift) + (offset & sc->chunk_mask);
+
 	return DM_MAPIO_REMAPPED;
 }
 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 2/2] dm-stripe: discard support
  2010-07-27 21:38 [PATCH 1/2] dm-stripe: move sector translation to a function Mikulas Patocka
@ 2010-07-27 21:42 ` Mikulas Patocka
  2010-07-27 22:12   ` [PATCH 1.5/2] dm-stripe: optimize sector division Mikulas Patocka
                     ` (2 more replies)
  2010-07-28 17:09 ` [PATCH 1/2 v2] dm stripe: move sector translation to a function Mike Snitzer
  1 sibling, 3 replies; 11+ messages in thread
From: Mikulas Patocka @ 2010-07-27 21:42 UTC (permalink / raw)
  To: dm-devel; +Cc: Mike Snitzer, Alasdair G Kergon

A simplified discard support.

Note --- it is untested (I tested only non-discard requests). Mike, please 
test.

Mikulas

---

Support discard request on stripe target

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>

---
 drivers/md/dm-stripe.c |   36 ++++++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)

Index: linux-2.6.35-rc6-fast/drivers/md/dm-stripe.c
===================================================================
--- linux-2.6.35-rc6-fast.orig/drivers/md/dm-stripe.c	2010-07-27 23:32:57.000000000 +0200
+++ linux-2.6.35-rc6-fast/drivers/md/dm-stripe.c	2010-07-27 23:39:32.000000000 +0200
@@ -167,6 +167,7 @@ static int stripe_ctr(struct dm_target *
 	sc->stripe_width = width;
 	ti->split_io = chunk_size;
 	ti->num_flush_requests = stripes;
+	ti->num_discard_requests = stripes;
 
 	sc->chunk_mask = ((sector_t) chunk_size) - 1;
 	for (sc->chunk_shift = 0; chunk_size; sc->chunk_shift++)
@@ -216,6 +217,37 @@ static void stripe_map_sector(struct str
 	*result = (chunk << sc->chunk_shift) | (offset & sc->chunk_mask);
 }
 
+static void stripe_map_range_sector(struct stripe_c *sc, sector_t sector,
+				    uint32_t target_stripe, sector_t *result)
+{
+	uint32_t stripe;
+	stripe_map_sector(sc, sector, &stripe, result);
+	if (stripe == target_stripe)
+		return;
+	*result &= ~sc->chunk_mask;			/* round down */
+	if (target_stripe < stripe)
+		*result += sc->chunk_mask + 1;		/* next chunk */
+}
+
+static int stripe_map_discard(struct stripe_c *sc, struct bio *bio,
+			      uint32_t target_stripe)
+{
+	sector_t begin, end;
+	stripe_map_range_sector(sc, bio->bi_sector, target_stripe, &begin);
+	stripe_map_range_sector(sc, bio->bi_sector + bio_sectors(bio),
+				  target_stripe, &end);
+	if (begin < end) {
+		bio->bi_bdev = sc->stripe[target_stripe].dev->bdev;
+		bio->bi_sector = begin + sc->stripe[target_stripe].physical_start;
+		bio->bi_size = to_bytes(end - begin);
+		return DM_MAPIO_REMAPPED;
+	} else {
+		/* The range doesn't map to the target stripe */
+		bio_endio(bio, 0);
+		return DM_MAPIO_SUBMITTED;
+	}
+}
+
 static int stripe_map(struct dm_target *ti, struct bio *bio,
 		      union map_info *map_context)
 {
@@ -227,6 +259,10 @@ static int stripe_map(struct dm_target *
 		bio->bi_bdev = sc->stripe[map_context->request_nr].dev->bdev;
 		return DM_MAPIO_REMAPPED;
 	}
+	if (unlikely(bio_rw_flagged(bio, BIO_RW_DISCARD))) {
+		BUG_ON(map_context->request_nr >= sc->stripes);
+		return stripe_map_discard(sc, bio, map_context->request_nr);
+	}
 
 	stripe_map_sector(sc, bio->bi_sector, &stripe, &bio->bi_sector);
 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1.5/2] dm-stripe: optimize sector division
  2010-07-27 21:42 ` [PATCH 2/2] dm-stripe: discard support Mikulas Patocka
@ 2010-07-27 22:12   ` Mikulas Patocka
  2010-07-27 23:10     ` Mike Snitzer
  2010-07-28 13:53     ` Mike Snitzer
  2010-07-27 22:39   ` [PATCH 2/2] dm-stripe: discard support Mike Snitzer
  2010-07-28  0:03   ` [PATCH 2/2 v2] dm stripe: enable " Mike Snitzer
  2 siblings, 2 replies; 11+ messages in thread
From: Mikulas Patocka @ 2010-07-27 22:12 UTC (permalink / raw)
  To: dm-devel; +Cc: Mike Snitzer, Alasdair G Kergon

Optimize sector division

Optimize sector division --- if the number of stripes is a power of two,
we don't have to do expensive division and can do shift and mask instead.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>

---
 drivers/md/dm-stripe.c |   11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

Index: linux-2.6.35-rc6-fast/drivers/md/dm-stripe.c
===================================================================
--- linux-2.6.35-rc6-fast.orig/drivers/md/dm-stripe.c	2010-07-28 00:01:04.000000000 +0200
+++ linux-2.6.35-rc6-fast/drivers/md/dm-stripe.c	2010-07-28 00:06:19.000000000 +0200
@@ -25,6 +25,7 @@ struct stripe {
 
 struct stripe_c {
 	uint32_t stripes;
+	int stripes_shift;
 
 	/* The size of this target / num. stripes */
 	sector_t stripe_width;
@@ -164,6 +165,10 @@ static int stripe_ctr(struct dm_target *
 	sc->ti = ti;
 
 	sc->stripes = stripes;
+	if (!(stripes & (stripes - 1)))
+		sc->stripes_shift = ffs(stripes) - 1;
+	else
+		sc->stripes_shift = -1;
 	sc->stripe_width = width;
 	ti->split_io = chunk_size;
 	ti->num_flush_requests = stripes;
@@ -212,7 +217,11 @@ static void stripe_map_sector(struct str
 {
 	sector_t offset = sector - sc->ti->begin;
 	sector_t chunk = offset >> sc->chunk_shift;
-	*stripe = sector_div(chunk, sc->stripes);
+	if (likely(sc->stripes_shift >= 0))
+		*stripe = chunk & ((1 << sc->stripes_shift) - 1),
+		chunk >>= sc->stripes_shift;
+	else
+		*stripe = sector_div(chunk, sc->stripes);
 	*result = (chunk << sc->chunk_shift) | (offset & sc->chunk_mask);
 }
 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/2] dm-stripe: discard support
  2010-07-27 21:42 ` [PATCH 2/2] dm-stripe: discard support Mikulas Patocka
  2010-07-27 22:12   ` [PATCH 1.5/2] dm-stripe: optimize sector division Mikulas Patocka
@ 2010-07-27 22:39   ` Mike Snitzer
  2010-07-28  0:03   ` [PATCH 2/2 v2] dm stripe: enable " Mike Snitzer
  2 siblings, 0 replies; 11+ messages in thread
From: Mike Snitzer @ 2010-07-27 22:39 UTC (permalink / raw)
  To: Mikulas Patocka; +Cc: dm-devel, Alasdair G Kergon

On Tue, Jul 27 2010 at  5:42pm -0400,
Mikulas Patocka <mpatocka@redhat.com> wrote:

> A simplified discard support.
> 
> Note --- it is untested (I tested only non-discard requests). Mike, please 
> test.

Looks good.  My test cases work as expected.  I added some DMDEBUG to
help debugging (will send as a separate patch in case we'd prefer to
drop it).

I've rebased it to work with a 'for-2.6.36' block change and the latest
discard patches that Alasdair recently queued.

I'll post v2 of your 2nd patch shortly.

Thanks,
Mike

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1.5/2] dm-stripe: optimize sector division
  2010-07-27 22:12   ` [PATCH 1.5/2] dm-stripe: optimize sector division Mikulas Patocka
@ 2010-07-27 23:10     ` Mike Snitzer
  2010-07-28 13:53     ` Mike Snitzer
  1 sibling, 0 replies; 11+ messages in thread
From: Mike Snitzer @ 2010-07-27 23:10 UTC (permalink / raw)
  To: Mikulas Patocka; +Cc: dm-devel, Alasdair G Kergon

On Tue, Jul 27 2010 at  6:12pm -0400,
Mikulas Patocka <mpatocka@redhat.com> wrote:

> Optimize sector division
> 
> Optimize sector division --- if the number of stripes is a power of two,
> we don't have to do expensive division and can do shift and mask instead.
> 
> Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>

(Tested and)

Reviewed-by: Mike Snitzer <snitzer@redhat.com>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 2/2 v2] dm stripe: enable discard support
  2010-07-27 21:42 ` [PATCH 2/2] dm-stripe: discard support Mikulas Patocka
  2010-07-27 22:12   ` [PATCH 1.5/2] dm-stripe: optimize sector division Mikulas Patocka
  2010-07-27 22:39   ` [PATCH 2/2] dm-stripe: discard support Mike Snitzer
@ 2010-07-28  0:03   ` Mike Snitzer
  2010-07-28  0:06     ` Mike Snitzer
  2 siblings, 1 reply; 11+ messages in thread
From: Mike Snitzer @ 2010-07-28  0:03 UTC (permalink / raw)
  To: Mikulas Patocka; +Cc: dm-devel, Alasdair G Kergon

The DM core will submit a discard bio to the stripe target for each
stripe in a striped DM device.  The stripe target will determine
stripe-specific portions of the supplied bio to be remapped into
individual (at most 'num_discard_requests' extents).  If a given
stripe-specific discard bio doesn't touch a particular stripe the bio
will be dropped.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
---
 drivers/md/dm-stripe.c |   39 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

Index: linux-2.6-block/drivers/md/dm-stripe.c
===================================================================
--- linux-2.6-block.orig/drivers/md/dm-stripe.c
+++ linux-2.6-block/drivers/md/dm-stripe.c
@@ -167,6 +167,7 @@ static int stripe_ctr(struct dm_target *
 	sc->stripe_width = width;
 	ti->split_io = chunk_size;
 	ti->num_flush_requests = stripes;
+	ti->num_discard_requests = stripes;
 
 	sc->chunk_mask = ((sector_t) chunk_size) - 1;
 	for (sc->chunk_shift = 0; chunk_size; sc->chunk_shift++)
@@ -216,6 +217,39 @@ static void stripe_map_sector(struct str
 	*result = (chunk << sc->chunk_shift) | (offset & sc->chunk_mask);
 }
 
+static void stripe_map_range_sector(struct stripe_c *sc, sector_t sector,
+				    uint32_t target_stripe, sector_t *result)
+{
+	uint32_t stripe;
+
+	stripe_map_sector(sc, sector, &stripe, result);
+	if (stripe == target_stripe)
+		return;
+	*result &= ~sc->chunk_mask;			/* round down */
+	if (target_stripe < stripe)
+		*result += sc->chunk_mask + 1;		/* next chunk */
+}
+
+static int stripe_map_discard(struct stripe_c *sc, struct bio *bio,
+			      uint32_t target_stripe)
+{
+	sector_t begin, end;
+
+	stripe_map_range_sector(sc, bio->bi_sector, target_stripe, &begin);
+	stripe_map_range_sector(sc, bio->bi_sector + bio_sectors(bio),
+				target_stripe, &end);
+	if (begin < end) {
+		bio->bi_bdev = sc->stripe[target_stripe].dev->bdev;
+		bio->bi_sector = begin + sc->stripe[target_stripe].physical_start;
+		bio->bi_size = to_bytes(end - begin);
+		return DM_MAPIO_REMAPPED;
+	} else {
+		/* The range doesn't map to the target stripe */
+		bio_endio(bio, 0);
+		return DM_MAPIO_SUBMITTED;
+	}
+}
+
 static int stripe_map(struct dm_target *ti, struct bio *bio,
 		      union map_info *map_context)
 {
@@ -229,6 +263,11 @@ static int stripe_map(struct dm_target *
 		bio->bi_bdev = sc->stripe[target_request_nr].dev->bdev;
 		return DM_MAPIO_REMAPPED;
 	}
+	if (unlikely(bio->bi_rw & REQ_DISCARD)) {
+		target_request_nr = map_context->target_request_nr;
+		BUG_ON(target_request_nr >= sc->stripes);
+		return stripe_map_discard(sc, bio, target_request_nr);
+	}
 
 	stripe_map_sector(sc, bio->bi_sector, &stripe, &bio->bi_sector);
 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/2 v2] dm stripe: enable discard support
  2010-07-28  0:03   ` [PATCH 2/2 v2] dm stripe: enable " Mike Snitzer
@ 2010-07-28  0:06     ` Mike Snitzer
  0 siblings, 0 replies; 11+ messages in thread
From: Mike Snitzer @ 2010-07-28  0:06 UTC (permalink / raw)
  To: Alasdair G Kergon; +Cc: dm-devel, Mikulas Patocka

Alasdair,

I forgot to use the following in the patch header:

From: Mikulas Patocka <mpatocka@redhat.com>

please adjust, thanks!

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1.5/2] dm-stripe: optimize sector division
  2010-07-27 22:12   ` [PATCH 1.5/2] dm-stripe: optimize sector division Mikulas Patocka
  2010-07-27 23:10     ` Mike Snitzer
@ 2010-07-28 13:53     ` Mike Snitzer
  2010-07-28 14:43       ` Mikulas Patocka
  1 sibling, 1 reply; 11+ messages in thread
From: Mike Snitzer @ 2010-07-28 13:53 UTC (permalink / raw)
  To: Mikulas Patocka; +Cc: dm-devel, Alasdair G Kergon

Looking closer I'm seeing something odd:

On Tue, Jul 27 2010 at  6:12pm -0400,
Mikulas Patocka <mpatocka@redhat.com> wrote:

> @@ -212,7 +217,11 @@ static void stripe_map_sector(struct str
>  {
>  	sector_t offset = sector - sc->ti->begin;
>  	sector_t chunk = offset >> sc->chunk_shift;
> -	*stripe = sector_div(chunk, sc->stripes);
> +	if (likely(sc->stripes_shift >= 0))
> +		*stripe = chunk & ((1 << sc->stripes_shift) - 1),
> +		chunk >>= sc->stripes_shift;

What's going on here with the comma?  Shouldn't it be a semi-colon?  And
if so we need curly-braces around the if (likely...).

> +	else
> +		*stripe = sector_div(chunk, sc->stripes);
>  	*result = (chunk << sc->chunk_shift) | (offset & sc->chunk_mask);
>  }

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1.5/2] dm-stripe: optimize sector division
  2010-07-28 13:53     ` Mike Snitzer
@ 2010-07-28 14:43       ` Mikulas Patocka
  2010-07-28 15:21         ` [PATCH 1.5/2 v2] dm stripe: " Mike Snitzer
  0 siblings, 1 reply; 11+ messages in thread
From: Mikulas Patocka @ 2010-07-28 14:43 UTC (permalink / raw)
  To: Mike Snitzer; +Cc: dm-devel, Alasdair G Kergon

On Wed, 28 Jul 2010, Mike Snitzer wrote:

> Looking closer I'm seeing something odd:
> 
> On Tue, Jul 27 2010 at  6:12pm -0400,
> Mikulas Patocka <mpatocka@redhat.com> wrote:
> 
> > @@ -212,7 +217,11 @@ static void stripe_map_sector(struct str
> >  {
> >  	sector_t offset = sector - sc->ti->begin;
> >  	sector_t chunk = offset >> sc->chunk_shift;
> > -	*stripe = sector_div(chunk, sc->stripes);
> > +	if (likely(sc->stripes_shift >= 0))
> > +		*stripe = chunk & ((1 << sc->stripes_shift) - 1),
> > +		chunk >>= sc->stripes_shift;
> 
> What's going on here with the comma?  Shouldn't it be a semi-colon?  And
> if so we need curly-braces around the if (likely...).

I'ts just a syntactic trick to avoid the braces. If you think it is weird, 
you can change it to:
if (likely(sc->stripes_shift >= 0)) {
	*stripe = chunk & ((1 << sc->stripes_shift) - 1);
	chunk >>= sc->stripes_shift;
} else

The comma operator in C (if not used to denote function arguments) means 
"evaluate the expression before the comma and discard the result, then 
evaluate the expression after the comma and return the result".

Comma has the lowest priority of all operators. Even lower than "=".

So "a = (1, 2, 3);" means "a = 3;"
"a = 1, 2, 3" is parsed as "(a = 1), 2, 3" and it assigns 1 to a, discards 
2 and returns 3 (if used as part of another expression; if used 
standalone, it discards that 3).

"if (c) a = 1, b = 2;" assigns 1 to a and 2 to b if c is non-zero. It is 
equivalent to "if (c) { a = 1; b = 2; }"

Another common use for comma is to stuff arbitrary function calls into the 
expression --- i.e. for example
#define read_register(x) (printk("reading register %x\n", x), inb(BASE + (x)))
which could then be used as
int r3 = read_register(3);

Mikulas

> > +	else
> > +		*stripe = sector_div(chunk, sc->stripes);
> >  	*result = (chunk << sc->chunk_shift) | (offset & sc->chunk_mask);
> >  }
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1.5/2 v2] dm stripe: optimize sector division
  2010-07-28 14:43       ` Mikulas Patocka
@ 2010-07-28 15:21         ` Mike Snitzer
  0 siblings, 0 replies; 11+ messages in thread
From: Mike Snitzer @ 2010-07-28 15:21 UTC (permalink / raw)
  To: Mikulas Patocka; +Cc: dm-devel, Alasdair G Kergon

From: Mikulas Patocka <mpatocka@redhat.com>

Optimize sector division --- if the number of stripes is a power of two,
we don't have to do expensive division and can do shift and mask instead.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
---
 drivers/md/dm-stripe.c |   12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

v2: minor code cleanup in stripe_map_sector

Index: linux-2.6-block/drivers/md/dm-stripe.c
===================================================================
--- linux-2.6-block.orig/drivers/md/dm-stripe.c
+++ linux-2.6-block/drivers/md/dm-stripe.c
@@ -25,6 +25,7 @@ struct stripe {
 
 struct stripe_c {
 	uint32_t stripes;
+	int stripes_shift;
 
 	/* The size of this target / num. stripes */
 	sector_t stripe_width;
@@ -164,6 +165,10 @@ static int stripe_ctr(struct dm_target *
 	sc->ti = ti;
 
 	sc->stripes = stripes;
+	if (!(stripes & (stripes - 1)))
+		sc->stripes_shift = ffs(stripes) - 1;
+	else
+		sc->stripes_shift = -1;
 	sc->stripe_width = width;
 	ti->split_io = chunk_size;
 	ti->num_flush_requests = stripes;
@@ -213,7 +218,12 @@ static void stripe_map_sector(struct str
 {
 	sector_t offset = sector - sc->ti->begin;
 	sector_t chunk = offset >> sc->chunk_shift;
-	*stripe = sector_div(chunk, sc->stripes);
+
+	if (likely(sc->stripes_shift >= 0)) {
+		*stripe = chunk & ((1 << sc->stripes_shift) - 1);
+		chunk >>= sc->stripes_shift;
+	} else
+		*stripe = sector_div(chunk, sc->stripes);
 	*result = (chunk << sc->chunk_shift) | (offset & sc->chunk_mask);
 }
 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/2 v2] dm stripe: move sector translation to a function
  2010-07-27 21:38 [PATCH 1/2] dm-stripe: move sector translation to a function Mikulas Patocka
  2010-07-27 21:42 ` [PATCH 2/2] dm-stripe: discard support Mikulas Patocka
@ 2010-07-28 17:09 ` Mike Snitzer
  1 sibling, 0 replies; 11+ messages in thread
From: Mike Snitzer @ 2010-07-28 17:09 UTC (permalink / raw)
  To: Mikulas Patocka; +Cc: dm-devel, Alasdair G Kergon

From: Mikulas Patocka <mpatocka@redhat.com>

Abstract sector -> stripe translation to a function.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
---
 drivers/md/dm-stripe.c |   18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

v2: fix conflict with newly staged dm_target_offset changes

Index: linux-2.6/drivers/md/dm-stripe.c
===================================================================
--- linux-2.6.orig/drivers/md/dm-stripe.c
+++ linux-2.6/drivers/md/dm-stripe.c
@@ -207,11 +207,19 @@ static void stripe_dtr(struct dm_target 
 	kfree(sc);
 }
 
+static void stripe_map_sector(struct stripe_c *sc, sector_t sector,
+			      uint32_t *stripe, sector_t *result)
+{
+	sector_t offset = dm_target_offset(sc->ti, sector);
+	sector_t chunk = offset >> sc->chunk_shift;
+	*stripe = sector_div(chunk, sc->stripes);
+	*result = (chunk << sc->chunk_shift) | (offset & sc->chunk_mask);
+}
+
 static int stripe_map(struct dm_target *ti, struct bio *bio,
 		      union map_info *map_context)
 {
 	struct stripe_c *sc = (struct stripe_c *) ti->private;
-	sector_t offset, chunk;
 	uint32_t stripe;
 	unsigned target_request_nr;
 
@@ -222,13 +230,11 @@ static int stripe_map(struct dm_target *
 		return DM_MAPIO_REMAPPED;
 	}
 
-	offset = dm_target_offset(ti, bio->bi_sector);
-	chunk = offset >> sc->chunk_shift;
-	stripe = sector_div(chunk, sc->stripes);
+	stripe_map_sector(sc, bio->bi_sector, &stripe, &bio->bi_sector);
 
+	bio->bi_sector += sc->stripe[stripe].physical_start;
 	bio->bi_bdev = sc->stripe[stripe].dev->bdev;
-	bio->bi_sector = sc->stripe[stripe].physical_start +
-	    (chunk << sc->chunk_shift) + (offset & sc->chunk_mask);
+
 	return DM_MAPIO_REMAPPED;
 }
 

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2010-07-28 17:09 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-07-27 21:38 [PATCH 1/2] dm-stripe: move sector translation to a function Mikulas Patocka
2010-07-27 21:42 ` [PATCH 2/2] dm-stripe: discard support Mikulas Patocka
2010-07-27 22:12   ` [PATCH 1.5/2] dm-stripe: optimize sector division Mikulas Patocka
2010-07-27 23:10     ` Mike Snitzer
2010-07-28 13:53     ` Mike Snitzer
2010-07-28 14:43       ` Mikulas Patocka
2010-07-28 15:21         ` [PATCH 1.5/2 v2] dm stripe: " Mike Snitzer
2010-07-27 22:39   ` [PATCH 2/2] dm-stripe: discard support Mike Snitzer
2010-07-28  0:03   ` [PATCH 2/2 v2] dm stripe: enable " Mike Snitzer
2010-07-28  0:06     ` Mike Snitzer
2010-07-28 17:09 ` [PATCH 1/2 v2] dm stripe: move sector translation to a function Mike Snitzer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).