• NeilBrown's avatar
    md/raid1: fix: IO can block resync indefinitely · f2c771a6
    NeilBrown authored
    While performing a resync/recovery, raid1 divides the
    array space into three regions:
     - before the resync
     - at or shortly after the resync point
     - much further ahead of the resync point.
    
    Write requests to the first or third do not need to wait.  Write
    requests to the middle region do need to wait if resync requests are
    pending.
    
    If there are any active write requests in the middle region, resync
    will wait for them.
    
    Due to an accounting error, there is a small range of addresses,
    between conf->next_resync and conf->start_next_window, where write
    requests will *not* be blocked, but *will* be counted in the middle
    region.  This can effectively block resync indefinitely if filesystem
    writes happen repeatedly to this region.
    
    As ->next_window_requests is incremented when the sector is after
      conf->start_next_window + NEXT_NORMALIO_DISTANCE
    the same boundary should be used for determining when write requests
    should wait.
    Signed-off-by: default avatarNeilBrown <neilb@suse.com>
    Signed-off-by: default avatarShaohua Li <shli@fb.com>
    f2c771a6
raid1.c 87 KB