]> git.baikalelectronics.ru Git - kernel.git/commit
btrfs: scrub: move scrub_remap_extent() call into scrub_extent()
authorQu Wenruo <wqu@suse.com>
Fri, 11 Mar 2022 07:38:49 +0000 (15:38 +0800)
committerDavid Sterba <dsterba@suse.com>
Mon, 16 May 2022 15:17:31 +0000 (17:17 +0200)
commitffff8457b4260a8088a1cbf800678f131fcf4f7e
tree600bddf173fcc7832a0a0275035ad28991351eb1
parent402028ea50477149664a5bd4c93a3528948b6a90
btrfs: scrub: move scrub_remap_extent() call into scrub_extent()

[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: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/scrub.c