linux-raid.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] md/raid5: don't do chunk aligned read on degraded array.
@ 2015-03-19  5:39 Eric Mei
  2015-03-19  6:02 ` NeilBrown
  0 siblings, 1 reply; 4+ messages in thread
From: Eric Mei @ 2015-03-19  5:39 UTC (permalink / raw)
  To: NeilBrown; +Cc: linux-raid

From: Eric Mei <eric.mei@seagate.com>

When array is degraded, read data landed on failed drives will result in 
reading rest of data in a stripe. So a single sequential read would 
result in same data being read twice.

This patch is to avoid chunk aligned read for degraded array. The 
downside is to involve stripe cache which means associated CPU overhead 
and extra memory copy.

Signed-off-by: Eric Mei <eric.mei@seagate.com>
---
  drivers/md/raid5.c |   15 ++++++++++++---
  1 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index cd2f96b..763c64a 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -4180,8 +4180,12 @@ static int raid5_mergeable_bvec(struct mddev *mddev,
         unsigned int chunk_sectors = mddev->chunk_sectors;
         unsigned int bio_sectors = bvm->bi_size >> 9;

-       if ((bvm->bi_rw & 1) == WRITE)
-               return biovec->bv_len; /* always allow writes to be 
mergeable */
+       /*
+        * always allow writes to be mergeable, read as well if array
+        * is degraded as we'll go through stripe cache anyway.
+        */
+       if ((bvm->bi_rw & 1) == WRITE || mddev->degraded)
+               return biovec->bv_len;

         if (mddev->new_chunk_sectors < mddev->chunk_sectors)
                 chunk_sectors = mddev->new_chunk_sectors;
@@ -4656,7 +4660,12 @@ static void make_request(struct mddev *mddev, 
struct bio * bi)

         md_write_start(mddev, bi);

-       if (rw == READ &&
+       /*
+        * If array is degraded, better not do chunk aligned read because
+        * later we might have to read it again in order to reconstruct
+        * data on failed drives.
+        */
+       if (rw == READ && mddev->degraded == 0 &&
              mddev->reshape_position == MaxSector &&
              chunk_aligned_read(mddev,bi))
                 return;
-- 
1.7.1

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

end of thread, other threads:[~2015-04-20  6:20 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-03-19  5:39 [PATCH] md/raid5: don't do chunk aligned read on degraded array Eric Mei
2015-03-19  6:02 ` NeilBrown
2015-03-19 19:41   ` Eric Mei
2015-04-20  6:20     ` NeilBrown

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).