lkml.org 
[lkml]   [2014]   [Sep]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.14 084/114] md/raid1,raid10: always abort recover on write error.
    Date
    3.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: NeilBrown <neilb@suse.de>

    commit 2446dba03f9dabe0b477a126cbeb377854785b47 upstream.

    Currently we don't abort recovery on a write error if the write error
    to the recovering device was triggerd by normal IO (as opposed to
    recovery IO).

    This means that for one bitmap region, the recovery might write to the
    recovering device for a few sectors, then not bother for subsequent
    sectors (as it never writes to failed devices). In this case
    the bitmap bit will be cleared, but it really shouldn't.

    The result is that if the recovering device fails and is then re-added
    (after fixing whatever hardware problem triggerred the failure),
    the second recovery won't redo the region it was in the middle of,
    so some of the device will not be recovered properly.

    If we abort the recovery, the region being processes will be cancelled
    (bit not cleared) and the whole region will be retried.

    As the bug can result in data corruption the patch is suitable for
    -stable. For kernels prior to 3.11 there is a conflict in raid10.c
    which will require care.

    Original-from: jiao hui <jiaohui@bwstor.com.cn>
    Reported-and-tested-by: jiao hui <jiaohui@bwstor.com.cn>
    Signed-off-by: NeilBrown <neilb@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/md/raid1.c | 8 ++++----
    drivers/md/raid10.c | 11 +++++------
    2 files changed, 9 insertions(+), 10 deletions(-)

    --- a/drivers/md/raid1.c
    +++ b/drivers/md/raid1.c
    @@ -1501,12 +1501,12 @@ static void error(struct mddev *mddev, s
    mddev->degraded++;
    set_bit(Faulty, &rdev->flags);
    spin_unlock_irqrestore(&conf->device_lock, flags);
    - /*
    - * if recovery is running, make sure it aborts.
    - */
    - set_bit(MD_RECOVERY_INTR, &mddev->recovery);
    } else
    set_bit(Faulty, &rdev->flags);
    + /*
    + * if recovery is running, make sure it aborts.
    + */
    + set_bit(MD_RECOVERY_INTR, &mddev->recovery);
    set_bit(MD_CHANGE_DEVS, &mddev->flags);
    printk(KERN_ALERT
    "md/raid1:%s: Disk failure on %s, disabling device.\n"
    --- a/drivers/md/raid10.c
    +++ b/drivers/md/raid10.c
    @@ -1684,13 +1684,12 @@ static void error(struct mddev *mddev, s
    spin_unlock_irqrestore(&conf->device_lock, flags);
    return;
    }
    - if (test_and_clear_bit(In_sync, &rdev->flags)) {
    + if (test_and_clear_bit(In_sync, &rdev->flags))
    mddev->degraded++;
    - /*
    - * if recovery is running, make sure it aborts.
    - */
    - set_bit(MD_RECOVERY_INTR, &mddev->recovery);
    - }
    + /*
    + * If recovery is running, make sure it aborts.
    + */
    + set_bit(MD_RECOVERY_INTR, &mddev->recovery);
    set_bit(Blocked, &rdev->flags);
    set_bit(Faulty, &rdev->flags);
    set_bit(MD_CHANGE_DEVS, &mddev->flags);



    \
     
     \ /
      Last update: 2014-09-15 22:21    [W:4.159 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site