From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: darrick.wong@oracle.com
Cc: linux-xfs@vger.kernel.org, david@fromorbit.com
Subject: [PATCH 06/22] xfs: add a repair helper to reset superblock counters
Date: Tue, 15 May 2018 15:34:16 -0700 [thread overview]
Message-ID: <152642365674.1556.6776151224606075985.stgit@magnolia> (raw)
In-Reply-To: <152642361893.1556.9335169821674946249.stgit@magnolia>
From: Darrick J. Wong <darrick.wong@oracle.com>
Add a helper function to reset the superblock inode and block counters.
The AG rebuilding functions will need these to adjust the counts if they
need to change as a part of recovering from corruption.
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
fs/xfs/scrub/repair.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++
fs/xfs/scrub/repair.h | 7 ++++
fs/xfs/scrub/scrub.c | 2 +
fs/xfs/scrub/scrub.h | 1 +
4 files changed, 89 insertions(+)
diff --git a/fs/xfs/scrub/repair.c b/fs/xfs/scrub/repair.c
index 06c84f76d7ff..1ca7e124e1a7 100644
--- a/fs/xfs/scrub/repair.c
+++ b/fs/xfs/scrub/repair.c
@@ -944,3 +944,82 @@ xfs_repair_find_ag_btree_roots(
return error;
}
+
+/* Reset the superblock counters from the AGF/AGI. */
+int
+xfs_repair_reset_counters(
+ struct xfs_mount *mp)
+{
+ struct xfs_buf *agi_bp;
+ struct xfs_buf *agf_bp;
+ struct xfs_agi *agi;
+ struct xfs_agf *agf;
+ xfs_agnumber_t agno;
+ xfs_ino_t icount = 0;
+ xfs_ino_t ifree = 0;
+ xfs_filblks_t fdblocks = 0;
+ int64_t delta_icount;
+ int64_t delta_ifree;
+ int64_t delta_fdblocks;
+ int error;
+
+ trace_xfs_repair_reset_counters(mp);
+
+ for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) {
+ /* Count all the inodes... */
+ error = xfs_ialloc_read_agi(mp, NULL, agno, &agi_bp);
+ if (error)
+ return error;
+ agi = XFS_BUF_TO_AGI(agi_bp);
+ icount += be32_to_cpu(agi->agi_count);
+ ifree += be32_to_cpu(agi->agi_freecount);
+ xfs_buf_relse(agi_bp);
+
+ /* Add up the free/freelist/bnobt/cntbt blocks... */
+ error = xfs_alloc_read_agf(mp, NULL, agno, 0, &agf_bp);
+ if (error)
+ return error;
+ if (!agf_bp)
+ return -ENOMEM;
+ agf = XFS_BUF_TO_AGF(agf_bp);
+ fdblocks += be32_to_cpu(agf->agf_freeblks);
+ fdblocks += be32_to_cpu(agf->agf_flcount);
+ fdblocks += be32_to_cpu(agf->agf_btreeblks);
+ xfs_buf_relse(agf_bp);
+ }
+
+ /*
+ * Reinitialize the counters. The on-disk and in-core counters differ
+ * by the number of inodes/blocks reserved by the admin, the per-AG
+ * reservation, and any transactions in progress, so we have to
+ * account for that. First we take the sb lock and update its
+ * counters...
+ */
+ spin_lock(&mp->m_sb_lock);
+ delta_icount = (int64_t)mp->m_sb.sb_icount - icount;
+ delta_ifree = (int64_t)mp->m_sb.sb_ifree - ifree;
+ delta_fdblocks = (int64_t)mp->m_sb.sb_fdblocks - fdblocks;
+ mp->m_sb.sb_icount = icount;
+ mp->m_sb.sb_ifree = ifree;
+ mp->m_sb.sb_fdblocks = fdblocks;
+ spin_unlock(&mp->m_sb_lock);
+
+ /* ...and then update the per-cpu counters. */
+ if (delta_icount) {
+ error = xfs_mod_icount(mp, delta_icount);
+ if (error)
+ return error;
+ }
+ if (delta_ifree) {
+ error = xfs_mod_ifree(mp, delta_ifree);
+ if (error)
+ return error;
+ }
+ if (delta_fdblocks) {
+ error = xfs_mod_fdblocks(mp, delta_fdblocks, false);
+ if (error)
+ return error;
+ }
+
+ return 0;
+}
diff --git a/fs/xfs/scrub/repair.h b/fs/xfs/scrub/repair.h
index 55441774e8e5..eea32a26f947 100644
--- a/fs/xfs/scrub/repair.h
+++ b/fs/xfs/scrub/repair.h
@@ -96,6 +96,7 @@ int xfs_repair_find_ag_btree_roots(struct xfs_scrub_context *sc,
struct xfs_buf *agf_bp,
struct xfs_repair_find_ag_btree *btree_info,
struct xfs_buf *agfl_bp);
+int xfs_repair_reset_counters(struct xfs_mount *mp);
/* Metadata repairers */
@@ -121,6 +122,12 @@ xfs_repair_calc_ag_resblks(
return 0;
}
+static inline int xfs_repair_reset_counters(struct xfs_mount *mp)
+{
+ ASSERT(0);
+ return -EIO;
+}
+
#define xfs_repair_probe xfs_repair_notsupported
#endif /* CONFIG_XFS_ONLINE_REPAIR */
diff --git a/fs/xfs/scrub/scrub.c b/fs/xfs/scrub/scrub.c
index c5999c28c20c..bf5e8dd66133 100644
--- a/fs/xfs/scrub/scrub.c
+++ b/fs/xfs/scrub/scrub.c
@@ -200,6 +200,8 @@ xfs_scrub_teardown(
kmem_free(sc->buf);
sc->buf = NULL;
}
+ if (sc->reset_counters && !error)
+ error = xfs_repair_reset_counters(sc->mp);
return error;
}
diff --git a/fs/xfs/scrub/scrub.h b/fs/xfs/scrub/scrub.h
index 2f89a84a0e10..1aaea393c2d1 100644
--- a/fs/xfs/scrub/scrub.h
+++ b/fs/xfs/scrub/scrub.h
@@ -77,6 +77,7 @@ struct xfs_scrub_context {
uint ilock_flags;
bool try_harder;
bool has_quotaofflock;
+ bool reset_counters;
/* State tracking for single-AG operations. */
struct xfs_scrub_ag sa;
next prev parent reply other threads:[~2018-05-15 22:34 UTC|newest]
Thread overview: 76+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-05-15 22:33 [PATCH v15.1 00/22] xfs-4.18: online repair support Darrick J. Wong
2018-05-15 22:33 ` [PATCH 01/22] xfs: add helpers to deal with transaction allocation and rolling Darrick J. Wong
2018-05-16 6:51 ` Dave Chinner
2018-05-16 16:46 ` Darrick J. Wong
2018-05-16 21:19 ` Dave Chinner
2018-05-16 16:48 ` Allison Henderson
2018-05-18 3:49 ` [PATCH v2 " Darrick J. Wong
2018-05-15 22:33 ` [PATCH 02/22] xfs: add helpers to allocate and initialize fresh btree roots Darrick J. Wong
2018-05-16 7:07 ` Dave Chinner
2018-05-16 17:15 ` Darrick J. Wong
2018-05-16 17:00 ` Allison Henderson
2018-05-15 22:33 ` [PATCH 03/22] xfs: add helpers to collect and sift btree block pointers during repair Darrick J. Wong
2018-05-16 7:56 ` Dave Chinner
2018-05-16 17:34 ` Allison Henderson
2018-05-16 18:06 ` Darrick J. Wong
2018-05-16 21:23 ` Dave Chinner
2018-05-16 21:33 ` Allison Henderson
2018-05-16 18:01 ` Darrick J. Wong
2018-05-16 21:32 ` Dave Chinner
2018-05-16 22:05 ` Darrick J. Wong
2018-05-17 0:41 ` Dave Chinner
2018-05-17 5:05 ` Darrick J. Wong
2018-05-18 3:51 ` [PATCH v2 " Darrick J. Wong
2018-05-29 3:10 ` Dave Chinner
2018-05-29 15:28 ` Darrick J. Wong
2018-05-15 22:34 ` [PATCH 04/22] xfs: add helpers to dispose of old btree blocks after a repair Darrick J. Wong
2018-05-16 8:32 ` Dave Chinner
2018-05-16 18:02 ` Allison Henderson
2018-05-16 19:34 ` Darrick J. Wong
2018-05-16 22:32 ` Dave Chinner
2018-05-16 23:18 ` Darrick J. Wong
2018-05-17 5:58 ` Darrick J. Wong
2018-05-18 3:53 ` [PATCH v2 " Darrick J. Wong
2018-05-29 3:14 ` Dave Chinner
2018-05-29 18:01 ` Darrick J. Wong
2018-05-15 22:34 ` [PATCH 05/22] xfs: recover AG btree roots from rmap data Darrick J. Wong
2018-05-16 8:51 ` Dave Chinner
2018-05-16 18:37 ` Darrick J. Wong
2018-05-16 19:18 ` Allison Henderson
2018-05-16 22:36 ` Dave Chinner
2018-05-17 5:53 ` Darrick J. Wong
2018-05-18 3:54 ` [PATCH v2 " Darrick J. Wong
2018-05-29 3:16 ` Dave Chinner
2018-05-15 22:34 ` Darrick J. Wong [this message]
2018-05-16 21:29 ` [PATCH 06/22] xfs: add a repair helper to reset superblock counters Allison Henderson
2018-05-18 3:56 ` Darrick J. Wong
2018-05-18 3:56 ` [PATCH v2 " Darrick J. Wong
2018-05-29 3:28 ` Dave Chinner
2018-05-29 22:07 ` Darrick J. Wong
2018-05-29 22:24 ` Dave Chinner
2018-05-29 22:43 ` Darrick J. Wong
2018-05-30 1:23 ` Dave Chinner
2018-05-30 3:22 ` Darrick J. Wong
2018-05-15 22:34 ` [PATCH 07/22] xfs: add helpers to attach quotas to inodes Darrick J. Wong
2018-05-16 22:21 ` Allison Henderson
2018-05-18 3:58 ` [PATCH v2 " Darrick J. Wong
2018-05-29 3:29 ` Dave Chinner
2018-05-15 22:34 ` [PATCH 08/22] xfs: repair superblocks Darrick J. Wong
2018-05-16 22:55 ` Allison Henderson
2018-05-29 3:42 ` Dave Chinner
2018-05-15 22:34 ` [PATCH 09/22] xfs: repair the AGF and AGFL Darrick J. Wong
2018-05-15 22:34 ` [PATCH 10/22] xfs: repair the AGI Darrick J. Wong
2018-05-15 22:34 ` [PATCH 11/22] xfs: repair free space btrees Darrick J. Wong
2018-05-15 22:34 ` [PATCH 12/22] xfs: repair inode btrees Darrick J. Wong
2018-05-15 22:35 ` [PATCH 13/22] xfs: repair the rmapbt Darrick J. Wong
2018-05-15 22:35 ` [PATCH 14/22] xfs: repair refcount btrees Darrick J. Wong
2018-05-15 22:35 ` [PATCH 15/22] xfs: repair inode records Darrick J. Wong
2018-05-15 22:35 ` [PATCH 16/22] xfs: zap broken inode forks Darrick J. Wong
2018-05-15 22:35 ` [PATCH 17/22] xfs: repair inode block maps Darrick J. Wong
2018-05-15 22:35 ` [PATCH 18/22] xfs: repair damaged symlinks Darrick J. Wong
2018-05-15 22:35 ` [PATCH 19/22] xfs: repair extended attributes Darrick J. Wong
2018-05-15 22:35 ` [PATCH 20/22] xfs: scrub should set preen if attr leaf has holes Darrick J. Wong
2018-05-15 22:35 ` [PATCH 21/22] xfs: repair quotas Darrick J. Wong
2018-05-15 22:36 ` [PATCH 22/22] xfs: implement live quotacheck as part of quota repair Darrick J. Wong
2018-05-18 3:47 ` [PATCH 0.5/22] xfs: grab the per-ag structure whenever relevant Darrick J. Wong
2018-05-30 6:44 ` Dave Chinner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=152642365674.1556.6776151224606075985.stgit@magnolia \
--to=darrick.wong@oracle.com \
--cc=david@fromorbit.com \
--cc=linux-xfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.