lkml.org 
[lkml]   [2023]   [Dec]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 2/2] md/raid1: support read error check
    Date
    From: Li Nan <linan122@huawei.com>

    After commit 1e50915fe0bb ("raid: improve MD/raid10 handling of correctable
    read errors."), rdev will be set to faulty if it reads data error to many
    times in raid10. Add this mechanism to raid1 now.

    Signed-off-by: Li Nan <linan122@huawei.com>
    ---
    drivers/md/raid1.c | 17 ++++++++++++-----
    1 file changed, 12 insertions(+), 5 deletions(-)

    diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
    index 156b81de49fc..42236ed91226 100644
    --- a/drivers/md/raid1.c
    +++ b/drivers/md/raid1.c
    @@ -2273,16 +2273,24 @@ static void sync_request_write(struct mddev *mddev, struct r1bio *r1_bio)
    * 3. Performs writes following reads for array synchronising.
    */

    -static void fix_read_error(struct r1conf *conf, int read_disk,
    - sector_t sect, int sectors)
    +static void fix_read_error(struct r1conf *conf, struct r1bio *r1_bio)
    {
    + sector_t sect = r1_bio->sector;
    + int sectors = r1_bio->sectors;
    + int read_disk = r1_bio->read_disk;
    struct mddev *mddev = conf->mddev;
    + struct md_rdev *rdev = rcu_dereference(conf->mirrors[read_disk].rdev);
    +
    + if (exceed_read_errors(mddev, rdev)) {
    + r1_bio->bios[r1_bio->read_disk] = IO_BLOCKED;
    + return;
    + }
    +
    while(sectors) {
    int s = sectors;
    int d = read_disk;
    int success = 0;
    int start;
    - struct md_rdev *rdev;

    if (s > (PAGE_SIZE>>9))
    s = PAGE_SIZE >> 9;
    @@ -2531,8 +2539,7 @@ static void handle_read_error(struct r1conf *conf, struct r1bio *r1_bio)
    if (mddev->ro == 0
    && !test_bit(FailFast, &rdev->flags)) {
    freeze_array(conf, 1);
    - fix_read_error(conf, r1_bio->read_disk,
    - r1_bio->sector, r1_bio->sectors);
    + fix_read_error(conf, r1_bio);
    unfreeze_array(conf);
    } else if (mddev->ro == 0 && test_bit(FailFast, &rdev->flags)) {
    md_error(mddev, rdev);
    --
    2.39.2

    \
     
     \ /
      Last update: 2023-12-15 03:45    [W:2.476 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site