Message ID | a76c376dfb6b391b96986c03664ecb657a24b012.1618402032.git.fdmanana@suse.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | btrfs: zoned: fix unpaired block group unfreeze during device replace | expand |
On 14/04/2021 14:09, fdmanana@kernel.org wrote: > From: Filipe Manana <fdmanana@suse.com> > > When doing a device replace on a zoned filesystem, if we find a block > group with ->to_copy == 0, we jump to the label 'done', which will result > in later calling btrfs_unfreeze_block_group(), even though at this point > we never called btrfs_freeze_block_group(). > > Since at this point we have neither turned the block group to RO mode nor > made any progress, we don't need to jump to the label 'done'. So fix this > by jumping instead to the label 'skip' and dropping our reference on the > block group before the jump. > > Fixes: 78ce9fc269af6e ("btrfs: zoned: mark block groups to copy for device-replace") > Signed-off-by: Filipe Manana <fdmanana@suse.com> > --- > fs/btrfs/scrub.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c > index 17e49caad1f9..e0d54ed9acee 100644 > --- a/fs/btrfs/scrub.c > +++ b/fs/btrfs/scrub.c > @@ -3674,8 +3674,8 @@ int scrub_enumerate_chunks(struct scrub_ctx *sctx, > spin_lock(&cache->lock); > if (!cache->to_copy) { > spin_unlock(&cache->lock); > - ro_set = 0; > - goto done; > + btrfs_put_block_group(cache); > + goto skip; > } > spin_unlock(&cache->lock); > } > I think we can remove the 'done' label as well, as after this patch it is unused (at least on my clone of misc-next). Otherwise, Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
On Wed, Apr 14, 2021 at 1:35 PM Johannes Thumshirn <Johannes.Thumshirn@wdc.com> wrote: > > On 14/04/2021 14:09, fdmanana@kernel.org wrote: > > From: Filipe Manana <fdmanana@suse.com> > > > > When doing a device replace on a zoned filesystem, if we find a block > > group with ->to_copy == 0, we jump to the label 'done', which will result > > in later calling btrfs_unfreeze_block_group(), even though at this point > > we never called btrfs_freeze_block_group(). > > > > Since at this point we have neither turned the block group to RO mode nor > > made any progress, we don't need to jump to the label 'done'. So fix this > > by jumping instead to the label 'skip' and dropping our reference on the > > block group before the jump. > > > > Fixes: 78ce9fc269af6e ("btrfs: zoned: mark block groups to copy for device-replace") > > Signed-off-by: Filipe Manana <fdmanana@suse.com> > > --- > > fs/btrfs/scrub.c | 4 ++-- > > 1 file changed, 2 insertions(+), 2 deletions(-) > > > > diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c > > index 17e49caad1f9..e0d54ed9acee 100644 > > --- a/fs/btrfs/scrub.c > > +++ b/fs/btrfs/scrub.c > > @@ -3674,8 +3674,8 @@ int scrub_enumerate_chunks(struct scrub_ctx *sctx, > > spin_lock(&cache->lock); > > if (!cache->to_copy) { > > spin_unlock(&cache->lock); > > - ro_set = 0; > > - goto done; > > + btrfs_put_block_group(cache); > > + goto skip; > > } > > spin_unlock(&cache->lock); > > } > > > > I think we can remove the 'done' label as well, as after this patch it is > unused (at least on my clone of misc-next). Indeed, I missed that. Removed in v2, thanks. > > Otherwise, > Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Hi,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on kdave/for-next]
[also build test WARNING on v5.12-rc7 next-20210414]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/fdmanana-kernel-org/btrfs-zoned-fix-unpaired-block-group-unfreeze-during-device-replace/20210414-201003
base: https://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git for-next
config: x86_64-randconfig-r033-20210414 (attached as .config)
compiler: clang version 13.0.0 (https://github.com/llvm/llvm-project 9829f5e6b1bca9b61efc629770d28bb9014dec45)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install x86_64 cross compiling tool for clang build
# apt-get install binutils-x86-64-linux-gnu
# https://github.com/0day-ci/linux/commit/31f44555b4f7341b558a9062f0977e8fe817045d
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review fdmanana-kernel-org/btrfs-zoned-fix-unpaired-block-group-unfreeze-during-device-replace/20210414-201003
git checkout 31f44555b4f7341b558a9062f0977e8fe817045d
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 ARCH=x86_64
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
>> fs/btrfs/scrub.c:3836:1: warning: unused label 'done' [-Wunused-label]
done:
^~~~~
1 warning generated.
vim +/done +3836 fs/btrfs/scrub.c
de17addce7a20d Naohiro Aota 2021-02-04 3586
a2de733c78fa7a Arne Jansen 2011-03-08 3587 static noinline_for_stack
a36cf8b8933e4a Stefan Behrens 2012-11-02 3588 int scrub_enumerate_chunks(struct scrub_ctx *sctx,
32934280967d00 Omar Sandoval 2018-08-14 3589 struct btrfs_device *scrub_dev, u64 start, u64 end)
a2de733c78fa7a Arne Jansen 2011-03-08 3590 {
a2de733c78fa7a Arne Jansen 2011-03-08 3591 struct btrfs_dev_extent *dev_extent = NULL;
a2de733c78fa7a Arne Jansen 2011-03-08 3592 struct btrfs_path *path;
0b246afa62b0cf Jeff Mahoney 2016-06-22 3593 struct btrfs_fs_info *fs_info = sctx->fs_info;
0b246afa62b0cf Jeff Mahoney 2016-06-22 3594 struct btrfs_root *root = fs_info->dev_root;
a2de733c78fa7a Arne Jansen 2011-03-08 3595 u64 length;
a2de733c78fa7a Arne Jansen 2011-03-08 3596 u64 chunk_offset;
55e3a601c81cdc Zhaolei 2015-08-05 3597 int ret = 0;
76a8efa171bf6c Zhaolei 2015-11-17 3598 int ro_set;
a2de733c78fa7a Arne Jansen 2011-03-08 3599 int slot;
a2de733c78fa7a Arne Jansen 2011-03-08 3600 struct extent_buffer *l;
a2de733c78fa7a Arne Jansen 2011-03-08 3601 struct btrfs_key key;
a2de733c78fa7a Arne Jansen 2011-03-08 3602 struct btrfs_key found_key;
32da5386d9a4fd David Sterba 2019-10-29 3603 struct btrfs_block_group *cache;
ff023aac31198e Stefan Behrens 2012-11-06 3604 struct btrfs_dev_replace *dev_replace = &fs_info->dev_replace;
a2de733c78fa7a Arne Jansen 2011-03-08 3605
a2de733c78fa7a Arne Jansen 2011-03-08 3606 path = btrfs_alloc_path();
a2de733c78fa7a Arne Jansen 2011-03-08 3607 if (!path)
a2de733c78fa7a Arne Jansen 2011-03-08 3608 return -ENOMEM;
a2de733c78fa7a Arne Jansen 2011-03-08 3609
e4058b54d1e442 David Sterba 2015-11-27 3610 path->reada = READA_FORWARD;
a2de733c78fa7a Arne Jansen 2011-03-08 3611 path->search_commit_root = 1;
a2de733c78fa7a Arne Jansen 2011-03-08 3612 path->skip_locking = 1;
a2de733c78fa7a Arne Jansen 2011-03-08 3613
a36cf8b8933e4a Stefan Behrens 2012-11-02 3614 key.objectid = scrub_dev->devid;
a2de733c78fa7a Arne Jansen 2011-03-08 3615 key.offset = 0ull;
a2de733c78fa7a Arne Jansen 2011-03-08 3616 key.type = BTRFS_DEV_EXTENT_KEY;
a2de733c78fa7a Arne Jansen 2011-03-08 3617
a2de733c78fa7a Arne Jansen 2011-03-08 3618 while (1) {
a2de733c78fa7a Arne Jansen 2011-03-08 3619 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
a2de733c78fa7a Arne Jansen 2011-03-08 3620 if (ret < 0)
8c51032f978bac Arne Jansen 2011-06-03 3621 break;
8c51032f978bac Arne Jansen 2011-06-03 3622 if (ret > 0) {
8c51032f978bac Arne Jansen 2011-06-03 3623 if (path->slots[0] >=
8c51032f978bac Arne Jansen 2011-06-03 3624 btrfs_header_nritems(path->nodes[0])) {
8c51032f978bac Arne Jansen 2011-06-03 3625 ret = btrfs_next_leaf(root, path);
55e3a601c81cdc Zhaolei 2015-08-05 3626 if (ret < 0)
55e3a601c81cdc Zhaolei 2015-08-05 3627 break;
55e3a601c81cdc Zhaolei 2015-08-05 3628 if (ret > 0) {
55e3a601c81cdc Zhaolei 2015-08-05 3629 ret = 0;
8c51032f978bac Arne Jansen 2011-06-03 3630 break;
8c51032f978bac Arne Jansen 2011-06-03 3631 }
55e3a601c81cdc Zhaolei 2015-08-05 3632 } else {
55e3a601c81cdc Zhaolei 2015-08-05 3633 ret = 0;
55e3a601c81cdc Zhaolei 2015-08-05 3634 }
8c51032f978bac Arne Jansen 2011-06-03 3635 }
a2de733c78fa7a Arne Jansen 2011-03-08 3636
a2de733c78fa7a Arne Jansen 2011-03-08 3637 l = path->nodes[0];
a2de733c78fa7a Arne Jansen 2011-03-08 3638 slot = path->slots[0];
a2de733c78fa7a Arne Jansen 2011-03-08 3639
a2de733c78fa7a Arne Jansen 2011-03-08 3640 btrfs_item_key_to_cpu(l, &found_key, slot);
a2de733c78fa7a Arne Jansen 2011-03-08 3641
a36cf8b8933e4a Stefan Behrens 2012-11-02 3642 if (found_key.objectid != scrub_dev->devid)
a2de733c78fa7a Arne Jansen 2011-03-08 3643 break;
a2de733c78fa7a Arne Jansen 2011-03-08 3644
962a298f35110e David Sterba 2014-06-04 3645 if (found_key.type != BTRFS_DEV_EXTENT_KEY)
a2de733c78fa7a Arne Jansen 2011-03-08 3646 break;
a2de733c78fa7a Arne Jansen 2011-03-08 3647
a2de733c78fa7a Arne Jansen 2011-03-08 3648 if (found_key.offset >= end)
a2de733c78fa7a Arne Jansen 2011-03-08 3649 break;
a2de733c78fa7a Arne Jansen 2011-03-08 3650
a2de733c78fa7a Arne Jansen 2011-03-08 3651 if (found_key.offset < key.offset)
a2de733c78fa7a Arne Jansen 2011-03-08 3652 break;
a2de733c78fa7a Arne Jansen 2011-03-08 3653
a2de733c78fa7a Arne Jansen 2011-03-08 3654 dev_extent = btrfs_item_ptr(l, slot, struct btrfs_dev_extent);
a2de733c78fa7a Arne Jansen 2011-03-08 3655 length = btrfs_dev_extent_length(l, dev_extent);
a2de733c78fa7a Arne Jansen 2011-03-08 3656
ced96edc48ba45 Qu Wenruo 2014-06-19 3657 if (found_key.offset + length <= start)
ced96edc48ba45 Qu Wenruo 2014-06-19 3658 goto skip;
a2de733c78fa7a Arne Jansen 2011-03-08 3659
a2de733c78fa7a Arne Jansen 2011-03-08 3660 chunk_offset = btrfs_dev_extent_chunk_offset(l, dev_extent);
a2de733c78fa7a Arne Jansen 2011-03-08 3661
a2de733c78fa7a Arne Jansen 2011-03-08 3662 /*
a2de733c78fa7a Arne Jansen 2011-03-08 3663 * get a reference on the corresponding block group to prevent
a2de733c78fa7a Arne Jansen 2011-03-08 3664 * the chunk from going away while we scrub it
a2de733c78fa7a Arne Jansen 2011-03-08 3665 */
a2de733c78fa7a Arne Jansen 2011-03-08 3666 cache = btrfs_lookup_block_group(fs_info, chunk_offset);
ced96edc48ba45 Qu Wenruo 2014-06-19 3667
ced96edc48ba45 Qu Wenruo 2014-06-19 3668 /* some chunks are removed but not committed to disk yet,
ced96edc48ba45 Qu Wenruo 2014-06-19 3669 * continue scrubbing */
ced96edc48ba45 Qu Wenruo 2014-06-19 3670 if (!cache)
ced96edc48ba45 Qu Wenruo 2014-06-19 3671 goto skip;
ced96edc48ba45 Qu Wenruo 2014-06-19 3672
78ce9fc269af6e Naohiro Aota 2021-02-04 3673 if (sctx->is_dev_replace && btrfs_is_zoned(fs_info)) {
78ce9fc269af6e Naohiro Aota 2021-02-04 3674 spin_lock(&cache->lock);
78ce9fc269af6e Naohiro Aota 2021-02-04 3675 if (!cache->to_copy) {
78ce9fc269af6e Naohiro Aota 2021-02-04 3676 spin_unlock(&cache->lock);
31f44555b4f734 Filipe Manana 2021-04-14 3677 btrfs_put_block_group(cache);
31f44555b4f734 Filipe Manana 2021-04-14 3678 goto skip;
78ce9fc269af6e Naohiro Aota 2021-02-04 3679 }
78ce9fc269af6e Naohiro Aota 2021-02-04 3680 spin_unlock(&cache->lock);
78ce9fc269af6e Naohiro Aota 2021-02-04 3681 }
78ce9fc269af6e Naohiro Aota 2021-02-04 3682
2473d24f2b77da Filipe Manana 2020-05-08 3683 /*
2473d24f2b77da Filipe Manana 2020-05-08 3684 * Make sure that while we are scrubbing the corresponding block
2473d24f2b77da Filipe Manana 2020-05-08 3685 * group doesn't get its logical address and its device extents
2473d24f2b77da Filipe Manana 2020-05-08 3686 * reused for another block group, which can possibly be of a
2473d24f2b77da Filipe Manana 2020-05-08 3687 * different type and different profile. We do this to prevent
2473d24f2b77da Filipe Manana 2020-05-08 3688 * false error detections and crashes due to bogus attempts to
2473d24f2b77da Filipe Manana 2020-05-08 3689 * repair extents.
2473d24f2b77da Filipe Manana 2020-05-08 3690 */
2473d24f2b77da Filipe Manana 2020-05-08 3691 spin_lock(&cache->lock);
2473d24f2b77da Filipe Manana 2020-05-08 3692 if (cache->removed) {
2473d24f2b77da Filipe Manana 2020-05-08 3693 spin_unlock(&cache->lock);
2473d24f2b77da Filipe Manana 2020-05-08 3694 btrfs_put_block_group(cache);
2473d24f2b77da Filipe Manana 2020-05-08 3695 goto skip;
2473d24f2b77da Filipe Manana 2020-05-08 3696 }
6b7304af62d02d Filipe Manana 2020-05-08 3697 btrfs_freeze_block_group(cache);
2473d24f2b77da Filipe Manana 2020-05-08 3698 spin_unlock(&cache->lock);
2473d24f2b77da Filipe Manana 2020-05-08 3699
55e3a601c81cdc Zhaolei 2015-08-05 3700 /*
55e3a601c81cdc Zhaolei 2015-08-05 3701 * we need call btrfs_inc_block_group_ro() with scrubs_paused,
55e3a601c81cdc Zhaolei 2015-08-05 3702 * to avoid deadlock caused by:
55e3a601c81cdc Zhaolei 2015-08-05 3703 * btrfs_inc_block_group_ro()
55e3a601c81cdc Zhaolei 2015-08-05 3704 * -> btrfs_wait_for_commit()
55e3a601c81cdc Zhaolei 2015-08-05 3705 * -> btrfs_commit_transaction()
55e3a601c81cdc Zhaolei 2015-08-05 3706 * -> btrfs_scrub_pause()
55e3a601c81cdc Zhaolei 2015-08-05 3707 */
55e3a601c81cdc Zhaolei 2015-08-05 3708 scrub_pause_on(fs_info);
b12de52896c0e8 Qu Wenruo 2019-11-15 3709
b12de52896c0e8 Qu Wenruo 2019-11-15 3710 /*
b12de52896c0e8 Qu Wenruo 2019-11-15 3711 * Don't do chunk preallocation for scrub.
b12de52896c0e8 Qu Wenruo 2019-11-15 3712 *
b12de52896c0e8 Qu Wenruo 2019-11-15 3713 * This is especially important for SYSTEM bgs, or we can hit
b12de52896c0e8 Qu Wenruo 2019-11-15 3714 * -EFBIG from btrfs_finish_chunk_alloc() like:
b12de52896c0e8 Qu Wenruo 2019-11-15 3715 * 1. The only SYSTEM bg is marked RO.
b12de52896c0e8 Qu Wenruo 2019-11-15 3716 * Since SYSTEM bg is small, that's pretty common.
b12de52896c0e8 Qu Wenruo 2019-11-15 3717 * 2. New SYSTEM bg will be allocated
b12de52896c0e8 Qu Wenruo 2019-11-15 3718 * Due to regular version will allocate new chunk.
b12de52896c0e8 Qu Wenruo 2019-11-15 3719 * 3. New SYSTEM bg is empty and will get cleaned up
b12de52896c0e8 Qu Wenruo 2019-11-15 3720 * Before cleanup really happens, it's marked RO again.
b12de52896c0e8 Qu Wenruo 2019-11-15 3721 * 4. Empty SYSTEM bg get scrubbed
b12de52896c0e8 Qu Wenruo 2019-11-15 3722 * We go back to 2.
b12de52896c0e8 Qu Wenruo 2019-11-15 3723 *
b12de52896c0e8 Qu Wenruo 2019-11-15 3724 * This can easily boost the amount of SYSTEM chunks if cleaner
b12de52896c0e8 Qu Wenruo 2019-11-15 3725 * thread can't be triggered fast enough, and use up all space
b12de52896c0e8 Qu Wenruo 2019-11-15 3726 * of btrfs_super_block::sys_chunk_array
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3727 *
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3728 * While for dev replace, we need to try our best to mark block
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3729 * group RO, to prevent race between:
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3730 * - Write duplication
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3731 * Contains latest data
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3732 * - Scrub copy
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3733 * Contains data from commit tree
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3734 *
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3735 * If target block group is not marked RO, nocow writes can
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3736 * be overwritten by scrub copy, causing data corruption.
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3737 * So for dev-replace, it's not allowed to continue if a block
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3738 * group is not RO.
b12de52896c0e8 Qu Wenruo 2019-11-15 3739 */
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3740 ret = btrfs_inc_block_group_ro(cache, sctx->is_dev_replace);
de17addce7a20d Naohiro Aota 2021-02-04 3741 if (!ret && sctx->is_dev_replace) {
de17addce7a20d Naohiro Aota 2021-02-04 3742 ret = finish_extent_writes_for_zoned(root, cache);
de17addce7a20d Naohiro Aota 2021-02-04 3743 if (ret) {
de17addce7a20d Naohiro Aota 2021-02-04 3744 btrfs_dec_block_group_ro(cache);
de17addce7a20d Naohiro Aota 2021-02-04 3745 scrub_pause_off(fs_info);
de17addce7a20d Naohiro Aota 2021-02-04 3746 btrfs_put_block_group(cache);
de17addce7a20d Naohiro Aota 2021-02-04 3747 break;
de17addce7a20d Naohiro Aota 2021-02-04 3748 }
de17addce7a20d Naohiro Aota 2021-02-04 3749 }
de17addce7a20d Naohiro Aota 2021-02-04 3750
76a8efa171bf6c Zhaolei 2015-11-17 3751 if (ret == 0) {
76a8efa171bf6c Zhaolei 2015-11-17 3752 ro_set = 1;
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3753 } else if (ret == -ENOSPC && !sctx->is_dev_replace) {
76a8efa171bf6c Zhaolei 2015-11-17 3754 /*
76a8efa171bf6c Zhaolei 2015-11-17 3755 * btrfs_inc_block_group_ro return -ENOSPC when it
76a8efa171bf6c Zhaolei 2015-11-17 3756 * failed in creating new chunk for metadata.
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3757 * It is not a problem for scrub, because
76a8efa171bf6c Zhaolei 2015-11-17 3758 * metadata are always cowed, and our scrub paused
76a8efa171bf6c Zhaolei 2015-11-17 3759 * commit_transactions.
76a8efa171bf6c Zhaolei 2015-11-17 3760 */
76a8efa171bf6c Zhaolei 2015-11-17 3761 ro_set = 0;
195a49eaf655eb Filipe Manana 2021-02-05 3762 } else if (ret == -ETXTBSY) {
195a49eaf655eb Filipe Manana 2021-02-05 3763 btrfs_warn(fs_info,
195a49eaf655eb Filipe Manana 2021-02-05 3764 "skipping scrub of block group %llu due to active swapfile",
195a49eaf655eb Filipe Manana 2021-02-05 3765 cache->start);
195a49eaf655eb Filipe Manana 2021-02-05 3766 scrub_pause_off(fs_info);
195a49eaf655eb Filipe Manana 2021-02-05 3767 ret = 0;
195a49eaf655eb Filipe Manana 2021-02-05 3768 goto skip_unfreeze;
76a8efa171bf6c Zhaolei 2015-11-17 3769 } else {
5d163e0e68ce74 Jeff Mahoney 2016-09-20 3770 btrfs_warn(fs_info,
913e153572218c David Sterba 2017-07-13 3771 "failed setting block group ro: %d", ret);
6b7304af62d02d Filipe Manana 2020-05-08 3772 btrfs_unfreeze_block_group(cache);
55e3a601c81cdc Zhaolei 2015-08-05 3773 btrfs_put_block_group(cache);
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3774 scrub_pause_off(fs_info);
55e3a601c81cdc Zhaolei 2015-08-05 3775 break;
55e3a601c81cdc Zhaolei 2015-08-05 3776 }
55e3a601c81cdc Zhaolei 2015-08-05 3777
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3778 /*
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3779 * Now the target block is marked RO, wait for nocow writes to
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3780 * finish before dev-replace.
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3781 * COW is fine, as COW never overwrites extents in commit tree.
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3782 */
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3783 if (sctx->is_dev_replace) {
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3784 btrfs_wait_nocow_writers(cache);
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3785 btrfs_wait_ordered_roots(fs_info, U64_MAX, cache->start,
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3786 cache->length);
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3787 }
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3788
1bbb97b8ce7ddf Qu Wenruo 2020-01-24 3789 scrub_pause_off(fs_info);
3ec17a67cc340b Dan Carpenter 2019-10-31 3790 down_write(&dev_replace->rwsem);
ff023aac31198e Stefan Behrens 2012-11-06 3791 dev_replace->cursor_right = found_key.offset + length;
ff023aac31198e Stefan Behrens 2012-11-06 3792 dev_replace->cursor_left = found_key.offset;
ff023aac31198e Stefan Behrens 2012-11-06 3793 dev_replace->item_needs_writeback = 1;
cb5583dd52fab4 David Sterba 2018-09-07 3794 up_write(&dev_replace->rwsem);
cb5583dd52fab4 David Sterba 2018-09-07 3795
8c204c9657c32e Zhao Lei 2015-08-19 3796 ret = scrub_chunk(sctx, scrub_dev, chunk_offset, length,
32934280967d00 Omar Sandoval 2018-08-14 3797 found_key.offset, cache);
ff023aac31198e Stefan Behrens 2012-11-06 3798
ff023aac31198e Stefan Behrens 2012-11-06 3799 /*
ff023aac31198e Stefan Behrens 2012-11-06 3800 * flush, submit all pending read and write bios, afterwards
ff023aac31198e Stefan Behrens 2012-11-06 3801 * wait for them.
ff023aac31198e Stefan Behrens 2012-11-06 3802 * Note that in the dev replace case, a read request causes
ff023aac31198e Stefan Behrens 2012-11-06 3803 * write requests that are submitted in the read completion
ff023aac31198e Stefan Behrens 2012-11-06 3804 * worker. Therefore in the current situation, it is required
ff023aac31198e Stefan Behrens 2012-11-06 3805 * that all write requests are flushed, so that all read and
ff023aac31198e Stefan Behrens 2012-11-06 3806 * write requests are really completed when bios_in_flight
ff023aac31198e Stefan Behrens 2012-11-06 3807 * changes to 0.
ff023aac31198e Stefan Behrens 2012-11-06 3808 */
2073c4c2e51a93 David Sterba 2017-03-31 3809 sctx->flush_all_writes = true;
ff023aac31198e Stefan Behrens 2012-11-06 3810 scrub_submit(sctx);
3fb99303c64e31 David Sterba 2017-05-16 3811 mutex_lock(&sctx->wr_lock);
ff023aac31198e Stefan Behrens 2012-11-06 3812 scrub_wr_submit(sctx);
3fb99303c64e31 David Sterba 2017-05-16 3813 mutex_unlock(&sctx->wr_lock);
ff023aac31198e Stefan Behrens 2012-11-06 3814
ff023aac31198e Stefan Behrens 2012-11-06 3815 wait_event(sctx->list_wait,
ff023aac31198e Stefan Behrens 2012-11-06 3816 atomic_read(&sctx->bios_in_flight) == 0);
b708ce969af3ce Zhaolei 2015-08-05 3817
b708ce969af3ce Zhaolei 2015-08-05 3818 scrub_pause_on(fs_info);
12cf93728dfba2 Wang Shilong 2014-02-19 3819
12cf93728dfba2 Wang Shilong 2014-02-19 3820 /*
12cf93728dfba2 Wang Shilong 2014-02-19 3821 * must be called before we decrease @scrub_paused.
12cf93728dfba2 Wang Shilong 2014-02-19 3822 * make sure we don't block transaction commit while
12cf93728dfba2 Wang Shilong 2014-02-19 3823 * we are waiting pending workers finished.
12cf93728dfba2 Wang Shilong 2014-02-19 3824 */
ff023aac31198e Stefan Behrens 2012-11-06 3825 wait_event(sctx->list_wait,
ff023aac31198e Stefan Behrens 2012-11-06 3826 atomic_read(&sctx->workers_pending) == 0);
2073c4c2e51a93 David Sterba 2017-03-31 3827 sctx->flush_all_writes = false;
12cf93728dfba2 Wang Shilong 2014-02-19 3828
b708ce969af3ce Zhaolei 2015-08-05 3829 scrub_pause_off(fs_info);
ff023aac31198e Stefan Behrens 2012-11-06 3830
78ce9fc269af6e Naohiro Aota 2021-02-04 3831 if (sctx->is_dev_replace &&
78ce9fc269af6e Naohiro Aota 2021-02-04 3832 !btrfs_finish_block_group_to_copy(dev_replace->srcdev,
78ce9fc269af6e Naohiro Aota 2021-02-04 3833 cache, found_key.offset))
78ce9fc269af6e Naohiro Aota 2021-02-04 3834 ro_set = 0;
78ce9fc269af6e Naohiro Aota 2021-02-04 3835
78ce9fc269af6e Naohiro Aota 2021-02-04 @3836 done:
3ec17a67cc340b Dan Carpenter 2019-10-31 3837 down_write(&dev_replace->rwsem);
1a1a8b732c7e95 Filipe Manana 2016-05-14 3838 dev_replace->cursor_left = dev_replace->cursor_right;
1a1a8b732c7e95 Filipe Manana 2016-05-14 3839 dev_replace->item_needs_writeback = 1;
3ec17a67cc340b Dan Carpenter 2019-10-31 3840 up_write(&dev_replace->rwsem);
1a1a8b732c7e95 Filipe Manana 2016-05-14 3841
76a8efa171bf6c Zhaolei 2015-11-17 3842 if (ro_set)
2ff7e61e0d30ff Jeff Mahoney 2016-06-22 3843 btrfs_dec_block_group_ro(cache);
ff023aac31198e Stefan Behrens 2012-11-06 3844
758f2dfcf8a249 Filipe Manana 2015-11-19 3845 /*
758f2dfcf8a249 Filipe Manana 2015-11-19 3846 * We might have prevented the cleaner kthread from deleting
758f2dfcf8a249 Filipe Manana 2015-11-19 3847 * this block group if it was already unused because we raced
758f2dfcf8a249 Filipe Manana 2015-11-19 3848 * and set it to RO mode first. So add it back to the unused
758f2dfcf8a249 Filipe Manana 2015-11-19 3849 * list, otherwise it might not ever be deleted unless a manual
758f2dfcf8a249 Filipe Manana 2015-11-19 3850 * balance is triggered or it becomes used and unused again.
758f2dfcf8a249 Filipe Manana 2015-11-19 3851 */
758f2dfcf8a249 Filipe Manana 2015-11-19 3852 spin_lock(&cache->lock);
758f2dfcf8a249 Filipe Manana 2015-11-19 3853 if (!cache->removed && !cache->ro && cache->reserved == 0 &&
bf38be65f3703d David Sterba 2019-10-23 3854 cache->used == 0) {
758f2dfcf8a249 Filipe Manana 2015-11-19 3855 spin_unlock(&cache->lock);
6e80d4f8c422d3 Dennis Zhou 2019-12-13 3856 if (btrfs_test_opt(fs_info, DISCARD_ASYNC))
6e80d4f8c422d3 Dennis Zhou 2019-12-13 3857 btrfs_discard_queue_work(&fs_info->discard_ctl,
6e80d4f8c422d3 Dennis Zhou 2019-12-13 3858 cache);
6e80d4f8c422d3 Dennis Zhou 2019-12-13 3859 else
031f24da2c8a7b Qu Wenruo 2018-05-22 3860 btrfs_mark_bg_unused(cache);
758f2dfcf8a249 Filipe Manana 2015-11-19 3861 } else {
758f2dfcf8a249 Filipe Manana 2015-11-19 3862 spin_unlock(&cache->lock);
758f2dfcf8a249 Filipe Manana 2015-11-19 3863 }
195a49eaf655eb Filipe Manana 2021-02-05 3864 skip_unfreeze:
6b7304af62d02d Filipe Manana 2020-05-08 3865 btrfs_unfreeze_block_group(cache);
a2de733c78fa7a Arne Jansen 2011-03-08 3866 btrfs_put_block_group(cache);
a2de733c78fa7a Arne Jansen 2011-03-08 3867 if (ret)
a2de733c78fa7a Arne Jansen 2011-03-08 3868 break;
32934280967d00 Omar Sandoval 2018-08-14 3869 if (sctx->is_dev_replace &&
af1be4f851db4f Stefan Behrens 2012-11-27 3870 atomic64_read(&dev_replace->num_write_errors) > 0) {
ff023aac31198e Stefan Behrens 2012-11-06 3871 ret = -EIO;
ff023aac31198e Stefan Behrens 2012-11-06 3872 break;
ff023aac31198e Stefan Behrens 2012-11-06 3873 }
ff023aac31198e Stefan Behrens 2012-11-06 3874 if (sctx->stat.malloc_errors > 0) {
ff023aac31198e Stefan Behrens 2012-11-06 3875 ret = -ENOMEM;
ff023aac31198e Stefan Behrens 2012-11-06 3876 break;
ff023aac31198e Stefan Behrens 2012-11-06 3877 }
ced96edc48ba45 Qu Wenruo 2014-06-19 3878 skip:
a2de733c78fa7a Arne Jansen 2011-03-08 3879 key.offset = found_key.offset + length;
712673339a0d08 Chris Mason 2011-05-23 3880 btrfs_release_path(path);
a2de733c78fa7a Arne Jansen 2011-03-08 3881 }
a2de733c78fa7a Arne Jansen 2011-03-08 3882
a2de733c78fa7a Arne Jansen 2011-03-08 3883 btrfs_free_path(path);
8c51032f978bac Arne Jansen 2011-06-03 3884
55e3a601c81cdc Zhaolei 2015-08-05 3885 return ret;
a2de733c78fa7a Arne Jansen 2011-03-08 3886 }
a2de733c78fa7a Arne Jansen 2011-03-08 3887
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 17e49caad1f9..e0d54ed9acee 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c @@ -3674,8 +3674,8 @@ int scrub_enumerate_chunks(struct scrub_ctx *sctx, spin_lock(&cache->lock); if (!cache->to_copy) { spin_unlock(&cache->lock); - ro_set = 0; - goto done; + btrfs_put_block_group(cache); + goto skip; } spin_unlock(&cache->lock); }