• Q
    btrfs: raid56: extract the vertical stripe recovery code into recover_vertical() · 9c5ff9b4
    Qu Wenruo 提交于
    This refactor includes the following behavior change first:
    
    - Don't error out if only P/Q is corrupted
    
      The old code will directly error out if only P/Q is corrupted.
      Although it is an logical error if we go into rebuild path with
      only P/Q corrupted, there is no need to error out.
    
      Just skip the rebuild and return the already good data.
    
    Then comes the following refactor which shouldn't cause behavior
    changes:
    
    - Introduce a helper to do vertical stripe recovery
    
      This not only reduce one indent level, but also paves the road for
      later data checksum verification in RMW cycles.
    
    - Sort rbio->faila/b before recovery
    
      So we don't need to do the same swap every vertical stripe
    
    - Replace a BUG_ON() with ASSERT()
    
      Or checkpatch won't let me pass.
    
    - Mark recovered sectors uptodate after the recover loop
    
    - Do the cleanup for pointers unconditionally
    
      We only need to initialize @pointers and @unmap_array to NULL, so
      we can safely free them unconditionally.
    
    - Mark the repaired sector uptodate in recover_vertical()
    Signed-off-by: NQu Wenruo <wqu@suse.com>
    Signed-off-by: NDavid Sterba <dsterba@suse.com>
    9c5ff9b4
raid56.c 73.5 KB