• Q
    btrfs: scrub: move scrub_remap_extent() call into scrub_extent() · a13467ee
    Qu Wenruo 提交于
    [SUSPICIOUS CODE]
    When refactoring scrub code, I noticed a very strange behavior around
    scrub_remap_extent():
    
    	if (sctx->is_dev_replace)
    		scrub_remap_extent(fs_info, cur_logical, scrub_len,
    				   &cur_physical, &target_dev, &cur_mirror);
    
    As replace target is a 1:1 copy of the source device, thus physical
    offset inside the target should be the same as physical inside source,
    thus this remap call makes no sense to me.
    
    [REAL FUNCTIONALITY]
    After more investigation, the function name scrub_remap_extent()
    doesn't tell anything of the truth, nor does its if () condition.
    
    The real story behind this function is that, for scrub_pages() we never
    expect missing device, even for replacing missing device.
    
    What scrub_remap_extent() is really doing is to find a live mirror, and
    make later scrub_pages() to read data from the good copy, other than
    from the missing device and increase error counters unnecessarily.
    
    [IMPROVEMENT]
    We have no need to bother scrub_remap_extent() in scrub_simple_mirror()
    at all, we only need to call it before we call scrub_pages().
    
    And rename the function to scrub_find_live_copy(), add extra comments on
    them.
    
    By this we can remove one parameter from scrub_extent(), and reduce the
    unnecessary calls to scrub_remap_extent() for regular replace.
    Signed-off-by: NQu Wenruo <wqu@suse.com>
    Signed-off-by: NDavid Sterba <dsterba@suse.com>
    a13467ee
scrub.c 119.6 KB