• Tomasz Majchrzak's avatar
    md: don't fail an array if there are unacknowledged bad blocks · dcbcb486
    Tomasz Majchrzak authored
    
    
    If external metadata handler supports bad blocks and unacknowledged bad
    blocks are present, don't report disk via sysfs as faulty. Such
    situation can be still handled so disk just has to be blocked for a
    moment. It makes it consistent with kernel state as corresponding rdev
    flag is also not set.
    
    When the disk in being unblocked there are few cases:
    1. Disk has been in blocked and faulty state, it is being unblocked but
    it still remains in faulty state. Metadata handler will remove it from
    array in the next call.
    2. There is no bad block support in external metadata handler and bad
    blocks are present - put the disk in blocked and faulty state (see
    case 1).
    3. There is bad block support in external metadata handler and all bad
    blocks are acknowledged - clear all flags, continue.
    4. There is bad block support in external metadata handler but there are
    still unacknowledged bad blocks - clear all flags, continue. It is fine
    to clear Blocked flag because it was probably not set anyway (if it was
    it is case 1). BlockedBadBlocks flag can also be cleared because the
    request waiting for it will set it again when it finds out that some bad
    block is still not acknowledged. Recovery is not necessary but there are
    no problems if the flag is set. Sysfs rdev state is still reported as
    blocked (due to unacknowledged bad blocks) so metadata handler will
    process remaining bad blocks and unblock disk again.
    Signed-off-by: default avatarTomasz Majchrzak <tomasz.majchrzak@intel.com>
    Signed-off-by: default avatarShaohua Li <shli@fb.com>
    dcbcb486
md.c 233 KB