[PATCH v4 4/9] nfsd: ensure we use ctime_peek to grab the inode->i_ctime

From: Jeff Layton
Date: Thu May 18 2023 - 07:48:31 EST


If getattr fails, then nfsd can end up scraping the time values directly
out of the inode for pre and post-op attrs. This may or may not be the
right thing to do, but for now make it at least use ctime_peek in this
situation to ensure that the QUERIED flag is masked.

Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx>
---
fs/nfsd/nfsfh.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/fs/nfsd/nfsfh.c b/fs/nfsd/nfsfh.c
index ccd8485fee04..f053cf20dd8a 100644
--- a/fs/nfsd/nfsfh.c
+++ b/fs/nfsd/nfsfh.c
@@ -624,9 +624,14 @@ void fh_fill_pre_attrs(struct svc_fh *fhp)
inode = d_inode(fhp->fh_dentry);
err = fh_getattr(fhp, &stat);
if (err) {
- /* Grab the times from inode anyway */
+ /*
+ * Grab the times from inode anyway.
+ *
+ * FIXME: is this the right thing to do? Or should we just
+ * not send pre and post-op attrs in this case?
+ */
stat.mtime = inode->i_mtime;
- stat.ctime = inode->i_ctime;
+ stat.ctime = ctime_peek(inode);
stat.size = inode->i_size;
if (v4 && IS_I_VERSION(inode)) {
stat.change_cookie = inode_query_iversion(inode);
@@ -662,7 +667,7 @@ void fh_fill_post_attrs(struct svc_fh *fhp)
err = fh_getattr(fhp, &fhp->fh_post_attr);
if (err) {
fhp->fh_post_saved = false;
- fhp->fh_post_attr.ctime = inode->i_ctime;
+ fhp->fh_post_attr.ctime = ctime_peek(inode);
if (v4 && IS_I_VERSION(inode)) {
fhp->fh_post_attr.change_cookie = inode_query_iversion(inode);
fhp->fh_post_attr.result_mask |= STATX_CHANGE_COOKIE;
--
2.40.1