From: "Darrick J. Wong" <djwong@kernel.org>
To: djwong@kernel.org
Cc: hch@infradead.org, linux-xfs@vger.kernel.org, hch@lst.de
Subject: [PATCH 4/4] xfs: invalidate dentries for a file before moving it to the orphanage
Date: Wed, 17 Apr 2024 16:15:10 -0700 [thread overview]
Message-ID: <171339556030.2000000.7320068975384720564.stgit@frogsfrogsfrogs> (raw)
In-Reply-To: <171339555949.2000000.17126642990842191341.stgit@frogsfrogsfrogs>
From: Darrick J. Wong <djwong@kernel.org>
Invalidate the cached dentries that point to the file that we're moving
to lost+found before we actually move it.
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
---
fs/xfs/scrub/orphanage.c | 47 ++++++++++++++++++++--------------------------
fs/xfs/scrub/trace.h | 2 --
2 files changed, 20 insertions(+), 29 deletions(-)
diff --git a/fs/xfs/scrub/orphanage.c b/fs/xfs/scrub/orphanage.c
index 2b142e6de8f3f..7148d8362db83 100644
--- a/fs/xfs/scrub/orphanage.c
+++ b/fs/xfs/scrub/orphanage.c
@@ -434,16 +434,17 @@ xrep_adoption_check_dcache(
{
struct qstr qname = QSTR_INIT(adopt->xname->name,
adopt->xname->len);
+ struct xfs_scrub *sc = adopt->sc;
struct dentry *d_orphanage, *d_child;
int error = 0;
- d_orphanage = d_find_alias(VFS_I(adopt->sc->orphanage));
+ d_orphanage = d_find_alias(VFS_I(sc->orphanage));
if (!d_orphanage)
return 0;
d_child = d_hash_and_lookup(d_orphanage, &qname);
if (d_child) {
- trace_xrep_adoption_check_child(adopt->sc->mp, d_child);
+ trace_xrep_adoption_check_child(sc->mp, d_child);
if (d_is_positive(d_child)) {
ASSERT(d_is_negative(d_child));
@@ -454,33 +455,15 @@ xrep_adoption_check_dcache(
}
dput(d_orphanage);
- if (error)
- return error;
-
- /*
- * Do we need to update d_parent of the dentry for the file being
- * repaired? There shouldn't be a hashed dentry with a parent since
- * the file had nonzero nlink but wasn't connected to any parent dir.
- */
- d_child = d_find_alias(VFS_I(adopt->sc->ip));
- if (!d_child)
- return 0;
-
- trace_xrep_adoption_check_alias(adopt->sc->mp, d_child);
-
- if (d_child->d_parent && !d_unhashed(d_child)) {
- ASSERT(d_child->d_parent == NULL || d_unhashed(d_child));
- error = -EFSCORRUPTED;
- }
-
- dput(d_child);
return error;
}
/*
- * Remove all negative dentries from the dcache. There should not be any
- * positive entries, since we've maintained our lock on the orphanage
- * directory.
+ * Invalidate all dentries for the name that was added to the orphanage
+ * directory, and all dentries pointing to the child inode that was moved.
+ *
+ * There should not be any positive entries for the name, since we've
+ * maintained our lock on the orphanage directory.
*/
static void
xrep_adoption_zap_dcache(
@@ -488,15 +471,17 @@ xrep_adoption_zap_dcache(
{
struct qstr qname = QSTR_INIT(adopt->xname->name,
adopt->xname->len);
+ struct xfs_scrub *sc = adopt->sc;
struct dentry *d_orphanage, *d_child;
- d_orphanage = d_find_alias(VFS_I(adopt->sc->orphanage));
+ /* Invalidate all dentries for the adoption name */
+ d_orphanage = d_find_alias(VFS_I(sc->orphanage));
if (!d_orphanage)
return;
d_child = d_hash_and_lookup(d_orphanage, &qname);
while (d_child != NULL) {
- trace_xrep_adoption_invalidate_child(adopt->sc->mp, d_child);
+ trace_xrep_adoption_invalidate_child(sc->mp, d_child);
ASSERT(d_is_negative(d_child));
d_invalidate(d_child);
@@ -505,6 +490,14 @@ xrep_adoption_zap_dcache(
}
dput(d_orphanage);
+
+ /* Invalidate all the dentries pointing down to this file. */
+ while ((d_child = d_find_alias(VFS_I(sc->ip))) != NULL) {
+ trace_xrep_adoption_invalidate_child(sc->mp, d_child);
+
+ d_invalidate(d_child);
+ dput(d_child);
+ }
}
/*
diff --git a/fs/xfs/scrub/trace.h b/fs/xfs/scrub/trace.h
index 4b945007ca6ca..e27daa51cab64 100644
--- a/fs/xfs/scrub/trace.h
+++ b/fs/xfs/scrub/trace.h
@@ -3265,8 +3265,6 @@ DEFINE_EVENT(xrep_dentry_class, name, \
TP_PROTO(struct xfs_mount *mp, const struct dentry *dentry), \
TP_ARGS(mp, dentry))
DEFINE_REPAIR_DENTRY_EVENT(xrep_adoption_check_child);
-DEFINE_REPAIR_DENTRY_EVENT(xrep_adoption_check_alias);
-DEFINE_REPAIR_DENTRY_EVENT(xrep_adoption_check_dentry);
DEFINE_REPAIR_DENTRY_EVENT(xrep_adoption_invalidate_child);
DEFINE_REPAIR_DENTRY_EVENT(xrep_dirtree_delete_child);
next prev parent reply other threads:[~2024-04-17 23:15 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-17 23:10 [PATCHBOMB v13.3] xfs: tweaks and fixes to online repair, part 2 Darrick J. Wong
2024-04-17 23:13 ` [PATCHSET v13.3 1/2] xfs: reduce iget overhead in scrub Darrick J. Wong
2024-04-17 23:13 ` [PATCH 1/2] xfs: use dontcache for grabbing inodes during scrub Darrick J. Wong
2024-04-18 4:22 ` Christoph Hellwig
2024-04-17 23:14 ` [PATCH 2/2] xfs: only iget the file once when doing vectored scrub-by-handle Darrick J. Wong
2024-04-18 4:22 ` Christoph Hellwig
2024-04-17 23:13 ` [PATCHSET v13.3 2/2] xfs: minor fixes to online repair Darrick J. Wong
2024-04-17 23:14 ` [PATCH 1/4] xfs: drop the scrub file's iolock when transaction allocation fails Darrick J. Wong
2024-04-18 4:23 ` Christoph Hellwig
2024-04-17 23:14 ` [PATCH 2/4] xfs: fix iunlock calls in xrep_adoption_trans_alloc Darrick J. Wong
2024-04-18 4:23 ` Christoph Hellwig
2024-04-17 23:14 ` [PATCH 3/4] xfs: exchange-range for repairs is no longer dynamic Darrick J. Wong
2024-04-18 4:24 ` Christoph Hellwig
2024-04-17 23:15 ` Darrick J. Wong [this message]
2024-04-18 4:25 ` [PATCH 4/4] xfs: invalidate dentries for a file before moving it to the orphanage Christoph Hellwig
-- strict thread matches above, loose matches on Subject: below --
2024-04-24 3:07 [PATCHSET v13.4 9/9] xfs: minor fixes to online repair Darrick J. Wong
2024-04-24 3:29 ` [PATCH 4/4] xfs: invalidate dentries for a file before moving it to the orphanage Darrick J. Wong
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=171339556030.2000000.7320068975384720564.stgit@frogsfrogsfrogs \
--to=djwong@kernel.org \
--cc=hch@infradead.org \
--cc=hch@lst.de \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).