mirror of
https://git.yoctoproject.org/meta-ti
synced 2026-07-16 22:38:04 +00:00
189ce92b4c
Signed-off-by: Koen Kooi <koen@dominion.thruhere.net> Signed-off-by: Denys Dmytriyenko <denys@ti.com>
57 lines
1.8 KiB
Diff
57 lines
1.8 KiB
Diff
From 4f2bf4b7d712836951cdbfa4807ae0309711487c Mon Sep 17 00:00:00 2001
|
|
From: NeilBrown <neilb@suse.de>
|
|
Date: Mon, 9 Jan 2012 01:41:51 +1100
|
|
Subject: [PATCH 039/129] md/raid1: perform bad-block tests for WriteMostly
|
|
devices too.
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
commit 307729c8bc5b5a41361af8af95906eee7552acb1 upstream.
|
|
|
|
We normally try to avoid reading from write-mostly devices, but when
|
|
we do we really have to check for bad blocks and be sure not to
|
|
try reading them.
|
|
|
|
With the current code, best_good_sectors might not get set and that
|
|
causes zero-length read requests to be send down which is very
|
|
confusing.
|
|
|
|
This bug was introduced in commit d2eb35acfdccbe2 and so the patch
|
|
is suitable for 3.1.x and 3.2.x
|
|
|
|
Reported-and-tested-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
|
|
Reported-and-tested-by: Art -kwaak- van Breemen <ard@telegraafnet.nl>
|
|
Signed-off-by: NeilBrown <neilb@suse.de>
|
|
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
|
|
---
|
|
drivers/md/raid1.c | 11 ++++++++++-
|
|
1 file changed, 10 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
|
|
index ede2461..7d9e071 100644
|
|
--- a/drivers/md/raid1.c
|
|
+++ b/drivers/md/raid1.c
|
|
@@ -525,8 +525,17 @@ static int read_balance(struct r1conf *conf, struct r1bio *r1_bio, int *max_sect
|
|
if (test_bit(WriteMostly, &rdev->flags)) {
|
|
/* Don't balance among write-mostly, just
|
|
* use the first as a last resort */
|
|
- if (best_disk < 0)
|
|
+ if (best_disk < 0) {
|
|
+ if (is_badblock(rdev, this_sector, sectors,
|
|
+ &first_bad, &bad_sectors)) {
|
|
+ if (first_bad < this_sector)
|
|
+ /* Cannot use this */
|
|
+ continue;
|
|
+ best_good_sectors = first_bad - this_sector;
|
|
+ } else
|
|
+ best_good_sectors = sectors;
|
|
best_disk = disk;
|
|
+ }
|
|
continue;
|
|
}
|
|
/* This is a reasonable device to use. It might
|
|
--
|
|
1.7.9.5
|
|
|