[lustre-devel] [PATCH 21/24] lustre: llite: revalidate dentry if LOOKUP lock fetched
James Simmons
jsimmons at infradead.org
Thu Jan 13 17:38:00 PST 2022
From: Lai Siyao <lai.siyao at whamcloud.com>
Once ll_inode_revalidate() fetches LOOKUP lock, it should revalidate
dentry, so subsequent lookup can find it in dcache.
It should also update lli_dir_depth.
WC-bug-id: https://jira.whamcloud.com/browse/LU-15200
Lustre-commit: 92fadf9cc1d06b21b ("LU-15200 llite: revalidate dentry if LOOKUP lock fetched")
Signed-off-by: Lai Siyao <lai.siyao at whamcloud.com>
Reviewed-on: https://review.whamcloud.com/45599
Reviewed-by: Yang Sheng <ys at whamcloud.com>
Reviewed-by: Andreas Dilger <adilger at whamcloud.com>
Reviewed-by: Oleg Drokin <green at whamcloud.com>
Signed-off-by: James Simmons <jsimmons at infradead.org>
---
fs/lustre/llite/dcache.c | 19 +++++++++++++++++--
fs/lustre/llite/file.c | 2 +-
fs/lustre/llite/llite_internal.h | 2 +-
3 files changed, 19 insertions(+), 4 deletions(-)
diff --git a/fs/lustre/llite/dcache.c b/fs/lustre/llite/dcache.c
index a074a2c..d9fb0cd 100644
--- a/fs/lustre/llite/dcache.c
+++ b/fs/lustre/llite/dcache.c
@@ -200,15 +200,30 @@ void ll_prune_aliases(struct inode *inode)
int ll_revalidate_it_finish(struct ptlrpc_request *request,
struct lookup_intent *it,
- struct inode *inode)
+ struct dentry *de)
{
+ struct inode *inode = d_inode(de);
+ u64 bits = 0;
+ int rc;
+
if (!request)
return 0;
if (it_disposition(it, DISP_LOOKUP_NEG))
return -ENOENT;
- return ll_prep_inode(&inode, &request->rq_pill, NULL, it);
+ rc = ll_prep_inode(&inode, &request->rq_pill, NULL, it);
+ if (rc)
+ return rc;
+
+ ll_set_lock_data(ll_i2sbi(inode)->ll_md_exp, inode, it,
+ &bits);
+ if (bits & MDS_INODELOCK_LOOKUP) {
+ ll_update_dir_depth(de->d_parent->d_inode, inode);
+ d_lustre_revalidate(de);
+ }
+
+ return rc;
}
void ll_lookup_finish_locks(struct lookup_intent *it, struct inode *inode)
diff --git a/fs/lustre/llite/file.c b/fs/lustre/llite/file.c
index dec0109..d9b1457 100644
--- a/fs/lustre/llite/file.c
+++ b/fs/lustre/llite/file.c
@@ -5033,7 +5033,7 @@ static int ll_inode_revalidate(struct dentry *dentry, enum ldlm_intent_flags op)
goto out;
}
- rc = ll_revalidate_it_finish(req, &oit, inode);
+ rc = ll_revalidate_it_finish(req, &oit, dentry);
if (rc != 0) {
ll_intent_release(&oit);
goto out;
diff --git a/fs/lustre/llite/llite_internal.h b/fs/lustre/llite/llite_internal.h
index 8c7361a..dd338f2 100644
--- a/fs/lustre/llite/llite_internal.h
+++ b/fs/lustre/llite/llite_internal.h
@@ -1177,7 +1177,7 @@ int ll_dir_getstripe(struct inode *inode, void **plmm, int *plmm_size,
void ll_prune_aliases(struct inode *inode);
void ll_lookup_finish_locks(struct lookup_intent *it, struct inode *inode);
int ll_revalidate_it_finish(struct ptlrpc_request *request,
- struct lookup_intent *it, struct inode *inode);
+ struct lookup_intent *it, struct dentry *de);
/* llite/llite_lib.c */
extern const struct super_operations lustre_super_operations;
--
1.8.3.1
More information about the lustre-devel
mailing list