mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-08-31 22:23:05 +00:00

Zoned file systems not only don't use the global frextents counter, but for them the in-memory percpu counter also includes reservations taken before even allocating delalloc extent records, so it will never match the per-zone used information. Disable all updates and verification of the sb counter for zoned file systems as it isn't useful for them. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
86 lines
2.5 KiB
C
86 lines
2.5 KiB
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
/*
|
|
* Copyright (c) 2018-2024 Oracle. All Rights Reserved.
|
|
* Author: Darrick J. Wong <djwong@kernel.org>
|
|
*/
|
|
#include "xfs.h"
|
|
#include "xfs_fs.h"
|
|
#include "xfs_shared.h"
|
|
#include "xfs_format.h"
|
|
#include "xfs_trans_resv.h"
|
|
#include "xfs_mount.h"
|
|
#include "xfs_defer.h"
|
|
#include "xfs_btree.h"
|
|
#include "xfs_bit.h"
|
|
#include "xfs_log_format.h"
|
|
#include "xfs_trans.h"
|
|
#include "xfs_sb.h"
|
|
#include "xfs_inode.h"
|
|
#include "xfs_alloc.h"
|
|
#include "xfs_ialloc.h"
|
|
#include "xfs_rmap.h"
|
|
#include "xfs_health.h"
|
|
#include "scrub/xfs_scrub.h"
|
|
#include "scrub/scrub.h"
|
|
#include "scrub/common.h"
|
|
#include "scrub/trace.h"
|
|
#include "scrub/repair.h"
|
|
#include "scrub/fscounters.h"
|
|
|
|
/*
|
|
* FS Summary Counters
|
|
* ===================
|
|
*
|
|
* We correct errors in the filesystem summary counters by setting them to the
|
|
* values computed during the obligatory scrub phase. However, we must be
|
|
* careful not to allow any other thread to change the counters while we're
|
|
* computing and setting new values. To achieve this, we freeze the
|
|
* filesystem for the whole operation if the REPAIR flag is set. The checking
|
|
* function is stricter when we've frozen the fs.
|
|
*/
|
|
|
|
/*
|
|
* Reset the superblock counters. Caller is responsible for freezing the
|
|
* filesystem during the calculation and reset phases.
|
|
*/
|
|
int
|
|
xrep_fscounters(
|
|
struct xfs_scrub *sc)
|
|
{
|
|
struct xfs_mount *mp = sc->mp;
|
|
struct xchk_fscounters *fsc = sc->buf;
|
|
|
|
/*
|
|
* Reinitialize the in-core counters from what we computed. We froze
|
|
* the filesystem, so there shouldn't be anyone else trying to modify
|
|
* these counters.
|
|
*/
|
|
if (!fsc->frozen) {
|
|
ASSERT(fsc->frozen);
|
|
return -EFSCORRUPTED;
|
|
}
|
|
|
|
trace_xrep_reset_counters(mp, fsc);
|
|
|
|
percpu_counter_set(&mp->m_icount, fsc->icount);
|
|
percpu_counter_set(&mp->m_ifree, fsc->ifree);
|
|
xfs_set_freecounter(mp, XC_FREE_BLOCKS, fsc->fdblocks);
|
|
|
|
/*
|
|
* Online repair is only supported on v5 file systems, which require
|
|
* lazy sb counters and thus no update of sb_fdblocks here. But
|
|
* sb_frextents only uses a lazy counter with rtgroups, and thus needs
|
|
* to be updated directly here otherwise. And for that we need to keep
|
|
* track of the delalloc reservations separately, as they are are
|
|
* subtracted from m_frextents, but not included in sb_frextents.
|
|
*/
|
|
if (!xfs_has_zoned(mp)) {
|
|
xfs_set_freecounter(mp, XC_FREE_RTEXTENTS,
|
|
fsc->frextents - fsc->frextents_delayed);
|
|
if (!xfs_has_rtgroups(mp))
|
|
mp->m_sb.sb_frextents = fsc->frextents;
|
|
}
|
|
|
|
return 0;
|
|
}
|