* [PATCHSET] xfsprogs: bug fixes for 6.12
@ 2024-11-18 23:07 Darrick J. Wong
2024-11-18 23:07 ` [PATCH 1/2] xfs_repair: fix crasher in pf_queuing_worker Darrick J. Wong
2024-11-18 23:07 ` [PATCH 2/2] xfs_repair: synthesize incore inode tree records when required Darrick J. Wong
0 siblings, 2 replies; 6+ messages in thread
From: Darrick J. Wong @ 2024-11-18 23:07 UTC (permalink / raw)
To: djwong, aalbersh; +Cc: linux-xfs, linux-xfs
Hi all,
Bug fixes for 6.12.
If you're going to start using this code, I strongly recommend pulling
from my git trees, which are linked below.
This has been running on the djcloud for months with no problems. Enjoy!
Comments and questions are, as always, welcome.
--D
kernel git tree:
https://git.kernel.org/cgit/linux/kernel/git/djwong/xfs-linux.git/log/?h=xfs-6.12-fixes
xfsprogs git tree:
https://git.kernel.org/cgit/linux/kernel/git/djwong/xfsprogs-dev.git/log/?h=xfs-6.12-fixes
---
Commits in this patchset:
* xfs_repair: fix crasher in pf_queuing_worker
* xfs_repair: synthesize incore inode tree records when required
---
repair/dino_chunks.c | 28 ++++++++++++++++++++++++++++
repair/prefetch.c | 2 ++
2 files changed, 30 insertions(+)
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/2] xfs_repair: fix crasher in pf_queuing_worker
2024-11-18 23:07 [PATCHSET] xfsprogs: bug fixes for 6.12 Darrick J. Wong
@ 2024-11-18 23:07 ` Darrick J. Wong
2024-11-19 6:08 ` Christoph Hellwig
2024-11-18 23:07 ` [PATCH 2/2] xfs_repair: synthesize incore inode tree records when required Darrick J. Wong
1 sibling, 1 reply; 6+ messages in thread
From: Darrick J. Wong @ 2024-11-18 23:07 UTC (permalink / raw)
To: djwong, aalbersh; +Cc: linux-xfs, linux-xfs
From: Darrick J. Wong <djwong@kernel.org>
Don't walk off the end of the inode records when we're skipping inodes
for prefetching. The skip loop doesn't make sense to me -- why we
ignore the first N inodes but don't care what number they are makes
little sense to me. But let's fix xfs/155 to crash less, eh?
Cc: <linux-xfs@vger.kernel.org> # v2.10.0
Fixes: 2556c98bd9e6b2 ("Perform true sequential bulk read prefetching in xfs_repair Merge of master-melb:xfs-cmds:29147a by kenmcd.")
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
---
repair/prefetch.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/repair/prefetch.c b/repair/prefetch.c
index 998797e3696bac..0772ecef9d73eb 100644
--- a/repair/prefetch.c
+++ b/repair/prefetch.c
@@ -764,6 +764,8 @@ pf_queuing_worker(
irec = next_ino_rec(irec);
num_inos += XFS_INODES_PER_CHUNK;
}
+ if (!irec)
+ break;
if (args->dirs_only && cur_irec->ino_isa_dir == 0)
continue;
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/2] xfs_repair: synthesize incore inode tree records when required
2024-11-18 23:07 [PATCHSET] xfsprogs: bug fixes for 6.12 Darrick J. Wong
2024-11-18 23:07 ` [PATCH 1/2] xfs_repair: fix crasher in pf_queuing_worker Darrick J. Wong
@ 2024-11-18 23:07 ` Darrick J. Wong
2024-11-19 6:09 ` Christoph Hellwig
1 sibling, 1 reply; 6+ messages in thread
From: Darrick J. Wong @ 2024-11-18 23:07 UTC (permalink / raw)
To: djwong, aalbersh; +Cc: linux-xfs
From: Darrick J. Wong <djwong@kernel.org>
On a filesystem with 64k fsblock size, xfs/093 fails with the following:
Phase 3 - for each AG...
- scan and clear agi unlinked lists...
found inodes not in the inode allocation tree
found inodes not in the inode allocation tree
- process known inodes and perform inode discovery...
- agno = 0
xfs_repair: dino_chunks.c:1166: process_aginodes: Assertion `num_inos == igeo->ialloc_inos' failed.
./common/xfs: line 392: 361225 Aborted (core dumped) $XFS_REPAIR_PROG $SCRATCH_OPTIONS $* $SCRATCH_DEV
In this situation, the inode size is 512b, which means that two inobt
records map to a single fs block. However, the inobt walk didn't find
the second record, so it didn't create a second incore ino_tree_node_t
object. The assertion trips, and we fail to repair the filesystem.
To fix this, synthesize incore inode records when we know that they must
exist. Mark the inodes as in use so that they will not be purged from
parent directories or moved to lost+found if the directory tree is also
compromised.
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
---
repair/dino_chunks.c | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/repair/dino_chunks.c b/repair/dino_chunks.c
index 1953613345190d..86e29dd9ae05eb 100644
--- a/repair/dino_chunks.c
+++ b/repair/dino_chunks.c
@@ -1050,6 +1050,8 @@ process_aginodes(
first_ino_rec = ino_rec = findfirst_inode_rec(agno);
while (ino_rec != NULL) {
+ xfs_agino_t synth_agino;
+
/*
* paranoia - step through inode records until we step
* through a full allocation of inodes. this could
@@ -1068,6 +1070,32 @@ process_aginodes(
num_inos += XFS_INODES_PER_CHUNK;
}
+ /*
+ * We didn't find all the inobt records for this block, so the
+ * incore tree is missing a few records. This implies that the
+ * inobt is heavily damaged, so synthesize the incore records.
+ * Mark all the inodes in use to minimize data loss.
+ */
+ for (synth_agino = first_ino_rec->ino_startnum + num_inos;
+ num_inos < igeo->ialloc_inos;
+ synth_agino += XFS_INODES_PER_CHUNK,
+ num_inos += XFS_INODES_PER_CHUNK) {
+ int i;
+
+ ino_rec = find_inode_rec(mp, agno, synth_agino);
+ if (ino_rec)
+ continue;
+
+ ino_rec = set_inode_free_alloc(mp, agno, synth_agino);
+ do_warn(
+ _("found inobt record for inode %" PRIu64 " but not inode %" PRIu64 ", pretending that we did\n"),
+ XFS_AGINO_TO_INO(mp, agno,
+ first_ino_rec->ino_startnum),
+ XFS_AGINO_TO_INO(mp, agno,
+ synth_agino));
+ for (i = 0; i < XFS_INODES_PER_CHUNK; i++)
+ set_inode_used(ino_rec, i);
+ }
ASSERT(num_inos == igeo->ialloc_inos);
if (pf_args) {
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] xfs_repair: fix crasher in pf_queuing_worker
2024-11-18 23:07 ` [PATCH 1/2] xfs_repair: fix crasher in pf_queuing_worker Darrick J. Wong
@ 2024-11-19 6:08 ` Christoph Hellwig
0 siblings, 0 replies; 6+ messages in thread
From: Christoph Hellwig @ 2024-11-19 6:08 UTC (permalink / raw)
To: Darrick J. Wong; +Cc: aalbersh, linux-xfs
Looks good:
Reviewed-by: Christoph Hellwig <hch@lst.de>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 2/2] xfs_repair: synthesize incore inode tree records when required
2024-11-18 23:07 ` [PATCH 2/2] xfs_repair: synthesize incore inode tree records when required Darrick J. Wong
@ 2024-11-19 6:09 ` Christoph Hellwig
0 siblings, 0 replies; 6+ messages in thread
From: Christoph Hellwig @ 2024-11-19 6:09 UTC (permalink / raw)
To: Darrick J. Wong; +Cc: aalbersh, linux-xfs
Looks good:
Reviewed-by: Christoph Hellwig <hch@lst.de>
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 2/2] xfs_repair: synthesize incore inode tree records when required
2024-11-21 0:08 [PATCHSET 2/2] xfs: bug fixes for 6.12 Darrick J. Wong
@ 2024-11-21 0:09 ` Darrick J. Wong
0 siblings, 0 replies; 6+ messages in thread
From: Darrick J. Wong @ 2024-11-21 0:09 UTC (permalink / raw)
To: aalbersh, djwong; +Cc: hch, linux-xfs
From: Darrick J. Wong <djwong@kernel.org>
On a filesystem with 64k fsblock size, xfs/093 fails with the following:
Phase 3 - for each AG...
- scan and clear agi unlinked lists...
found inodes not in the inode allocation tree
found inodes not in the inode allocation tree
- process known inodes and perform inode discovery...
- agno = 0
xfs_repair: dino_chunks.c:1166: process_aginodes: Assertion `num_inos == igeo->ialloc_inos' failed.
./common/xfs: line 392: 361225 Aborted (core dumped) $XFS_REPAIR_PROG $SCRATCH_OPTIONS $* $SCRATCH_DEV
In this situation, the inode size is 512b, which means that two inobt
records map to a single fs block. However, the inobt walk didn't find
the second record, so it didn't create a second incore ino_tree_node_t
object. The assertion trips, and we fail to repair the filesystem.
To fix this, synthesize incore inode records when we know that they must
exist. Mark the inodes as in use so that they will not be purged from
parent directories or moved to lost+found if the directory tree is also
compromised.
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
---
repair/dino_chunks.c | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/repair/dino_chunks.c b/repair/dino_chunks.c
index 1953613345190d..86e29dd9ae05eb 100644
--- a/repair/dino_chunks.c
+++ b/repair/dino_chunks.c
@@ -1050,6 +1050,8 @@ process_aginodes(
first_ino_rec = ino_rec = findfirst_inode_rec(agno);
while (ino_rec != NULL) {
+ xfs_agino_t synth_agino;
+
/*
* paranoia - step through inode records until we step
* through a full allocation of inodes. this could
@@ -1068,6 +1070,32 @@ process_aginodes(
num_inos += XFS_INODES_PER_CHUNK;
}
+ /*
+ * We didn't find all the inobt records for this block, so the
+ * incore tree is missing a few records. This implies that the
+ * inobt is heavily damaged, so synthesize the incore records.
+ * Mark all the inodes in use to minimize data loss.
+ */
+ for (synth_agino = first_ino_rec->ino_startnum + num_inos;
+ num_inos < igeo->ialloc_inos;
+ synth_agino += XFS_INODES_PER_CHUNK,
+ num_inos += XFS_INODES_PER_CHUNK) {
+ int i;
+
+ ino_rec = find_inode_rec(mp, agno, synth_agino);
+ if (ino_rec)
+ continue;
+
+ ino_rec = set_inode_free_alloc(mp, agno, synth_agino);
+ do_warn(
+ _("found inobt record for inode %" PRIu64 " but not inode %" PRIu64 ", pretending that we did\n"),
+ XFS_AGINO_TO_INO(mp, agno,
+ first_ino_rec->ino_startnum),
+ XFS_AGINO_TO_INO(mp, agno,
+ synth_agino));
+ for (i = 0; i < XFS_INODES_PER_CHUNK; i++)
+ set_inode_used(ino_rec, i);
+ }
ASSERT(num_inos == igeo->ialloc_inos);
if (pf_args) {
^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2024-11-21 0:09 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-18 23:07 [PATCHSET] xfsprogs: bug fixes for 6.12 Darrick J. Wong
2024-11-18 23:07 ` [PATCH 1/2] xfs_repair: fix crasher in pf_queuing_worker Darrick J. Wong
2024-11-19 6:08 ` Christoph Hellwig
2024-11-18 23:07 ` [PATCH 2/2] xfs_repair: synthesize incore inode tree records when required Darrick J. Wong
2024-11-19 6:09 ` Christoph Hellwig
-- strict thread matches above, loose matches on Subject: below --
2024-11-21 0:08 [PATCHSET 2/2] xfs: bug fixes for 6.12 Darrick J. Wong
2024-11-21 0:09 ` [PATCH 2/2] xfs_repair: synthesize incore inode tree records when required Darrick J. Wong
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox