From: Jeff Layton <jlayton@kernel.org>
To: Alexander Viro <viro@zeniv.linux.org.uk>,
Christian Brauner <brauner@kernel.org>, Jan Kara <jack@suse.cz>,
Steven Rostedt <rostedt@goodmis.org>,
Masami Hiramatsu <mhiramat@kernel.org>,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
Chuck Lever <chuck.lever@oracle.com>,
NeilBrown <neil@brown.name>,
Olga Kornievskaia <okorniev@redhat.com>,
Dai Ngo <Dai.Ngo@oracle.com>, Tom Talpey <tom@talpey.com>
Cc: Trond Myklebust <trondmy@hammerspace.com>,
Anna Schumaker <anna@kernel.org>,
linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-trace-kernel@vger.kernel.org, linux-nfs@vger.kernel.org,
Jeff Layton <jlayton@kernel.org>
Subject: [PATCH v2 7/7] vfs: remove inode_set_ctime_deleg()
Date: Sat, 26 Jul 2025 10:32:01 -0400 [thread overview]
Message-ID: <20250726-nfsd-testing-v2-7-f45923db2fbb@kernel.org> (raw)
In-Reply-To: <20250726-nfsd-testing-v2-0-f45923db2fbb@kernel.org>
Now that nfsd is vetting the timestamps internally, there is no need for
this function. If ATTR_DELEG is set, then skip the multigrain update and
set what was requested.
Signed-off-by: Jeff Layton <jlayton@kernel.org>
---
fs/attr.c | 19 +++-----------
fs/inode.c | 73 ------------------------------------------------------
include/linux/fs.h | 2 --
3 files changed, 4 insertions(+), 90 deletions(-)
diff --git a/fs/attr.c b/fs/attr.c
index f0dabd2985989d283a931536a5fc53eda366b373..e75f06b760015640bafd596457cd14c746c7e272 100644
--- a/fs/attr.c
+++ b/fs/attr.c
@@ -287,14 +287,7 @@ static void setattr_copy_mgtime(struct inode *inode, const struct iattr *attr)
struct timespec64 now;
if (ia_valid & ATTR_CTIME) {
- /*
- * In the case of an update for a write delegation, we must respect
- * the value in ia_ctime and not use the current time.
- */
- if (ia_valid & ATTR_DELEG)
- now = inode_set_ctime_deleg(inode, attr->ia_ctime);
- else
- now = inode_set_ctime_current(inode);
+ now = inode_set_ctime_current(inode);
} else {
/* If ATTR_CTIME isn't set, then ATTR_MTIME shouldn't be either. */
WARN_ON_ONCE(ia_valid & ATTR_MTIME);
@@ -352,19 +345,15 @@ void setattr_copy(struct mnt_idmap *idmap, struct inode *inode,
inode->i_mode = mode;
}
- if (is_mgtime(inode))
+ if (!(ia_valid & ATTR_DELEG) && is_mgtime(inode))
return setattr_copy_mgtime(inode, attr);
if (ia_valid & ATTR_ATIME)
inode_set_atime_to_ts(inode, attr->ia_atime);
if (ia_valid & ATTR_MTIME)
inode_set_mtime_to_ts(inode, attr->ia_mtime);
- if (ia_valid & ATTR_CTIME) {
- if (ia_valid & ATTR_DELEG)
- inode_set_ctime_deleg(inode, attr->ia_ctime);
- else
- inode_set_ctime_to_ts(inode, attr->ia_ctime);
- }
+ if (ia_valid & ATTR_CTIME)
+ inode_set_ctime_to_ts(inode, attr->ia_ctime);
}
EXPORT_SYMBOL(setattr_copy);
diff --git a/fs/inode.c b/fs/inode.c
index 99318b157a9a13b3dd8dad0f5f90951f08ef64de..f45054fe48b8a0339e60fd2aa17daaad5a7957e7 100644
--- a/fs/inode.c
+++ b/fs/inode.c
@@ -2783,79 +2783,6 @@ struct timespec64 inode_set_ctime_current(struct inode *inode)
}
EXPORT_SYMBOL(inode_set_ctime_current);
-/**
- * inode_set_ctime_deleg - try to update the ctime on a delegated inode
- * @inode: inode to update
- * @update: timespec64 to set the ctime
- *
- * Attempt to atomically update the ctime on behalf of a delegation holder.
- *
- * The nfs server can call back the holder of a delegation to get updated
- * inode attributes, including the mtime. When updating the mtime, update
- * the ctime to a value at least equal to that.
- *
- * This can race with concurrent updates to the inode, in which
- * case the update is skipped.
- *
- * Note that this works even when multigrain timestamps are not enabled,
- * so it is used in either case.
- */
-struct timespec64 inode_set_ctime_deleg(struct inode *inode, struct timespec64 update)
-{
- struct timespec64 now, cur_ts;
- u32 cur, old;
-
- /* pairs with try_cmpxchg below */
- cur = smp_load_acquire(&inode->i_ctime_nsec);
- cur_ts.tv_nsec = cur & ~I_CTIME_QUERIED;
- cur_ts.tv_sec = inode->i_ctime_sec;
-
- /* If the update is older than the existing value, skip it. */
- if (timespec64_compare(&update, &cur_ts) <= 0)
- return cur_ts;
-
- ktime_get_coarse_real_ts64_mg(&now);
-
- /* Clamp the update to "now" if it's in the future */
- if (timespec64_compare(&update, &now) > 0)
- update = now;
-
- update = timestamp_truncate(update, inode);
-
- /* No need to update if the values are already the same */
- if (timespec64_equal(&update, &cur_ts))
- return cur_ts;
-
- /*
- * Try to swap the nsec value into place. If it fails, that means
- * it raced with an update due to a write or similar activity. That
- * stamp takes precedence, so just skip the update.
- */
-retry:
- old = cur;
- if (try_cmpxchg(&inode->i_ctime_nsec, &cur, update.tv_nsec)) {
- inode->i_ctime_sec = update.tv_sec;
- mgtime_counter_inc(mg_ctime_swaps);
- return update;
- }
-
- /*
- * Was the change due to another task marking the old ctime QUERIED?
- *
- * If so, then retry the swap. This can only happen once since
- * the only way to clear I_CTIME_QUERIED is to stamp the inode
- * with a new ctime.
- */
- if (!(old & I_CTIME_QUERIED) && (cur == (old | I_CTIME_QUERIED)))
- goto retry;
-
- /* Otherwise, it was a new timestamp. */
- cur_ts.tv_sec = inode->i_ctime_sec;
- cur_ts.tv_nsec = cur & ~I_CTIME_QUERIED;
- return cur_ts;
-}
-EXPORT_SYMBOL(inode_set_ctime_deleg);
-
/**
* in_group_or_capable - check whether caller is CAP_FSETID privileged
* @idmap: idmap of the mount @inode was found from
diff --git a/include/linux/fs.h b/include/linux/fs.h
index f18f45e88545c39716b917b1378fb7248367b41d..08f2d813dd40b5dd4fe07d9636e94252915d6235 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1657,8 +1657,6 @@ static inline bool fsuidgid_has_mapping(struct super_block *sb,
struct timespec64 current_time(struct inode *inode);
struct timespec64 inode_set_ctime_current(struct inode *inode);
-struct timespec64 inode_set_ctime_deleg(struct inode *inode,
- struct timespec64 update);
static inline time64_t inode_get_atime_sec(const struct inode *inode)
{
--
2.50.1
prev parent reply other threads:[~2025-07-26 14:32 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-26 14:31 [PATCH v2 0/7] nfsd/vfs: fix handling of delegated timestamp updates Jeff Layton
2025-07-26 14:31 ` [PATCH v2 1/7] vfs: add ATTR_CTIME_SET flag Jeff Layton
2025-07-26 14:31 ` [PATCH v2 2/7] nfsd: ignore ATTR_DELEG when checking ia_valid before notify_change() Jeff Layton
2025-07-26 14:31 ` [PATCH v2 3/7] nfsd: use ATTR_CTIME_SET for delegated ctime updates Jeff Layton
2025-07-26 18:48 ` Chuck Lever
2025-07-26 19:03 ` Jeff Layton
2025-07-26 19:57 ` Chuck Lever
2025-07-26 22:25 ` Jeff Layton
2025-07-26 14:31 ` [PATCH v2 4/7] nfsd: track original timestamps in nfs4_delegation Jeff Layton
2025-07-26 14:31 ` [PATCH v2 5/7] nfsd: fix SETATTR updates for delegated timestamps Jeff Layton
2025-07-26 14:32 ` [PATCH v2 6/7] nfsd: fix timestamp updates in CB_GETATTR Jeff Layton
2025-07-26 14:32 ` Jeff Layton [this message]
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=20250726-nfsd-testing-v2-7-f45923db2fbb@kernel.org \
--to=jlayton@kernel.org \
--cc=Dai.Ngo@oracle.com \
--cc=anna@kernel.org \
--cc=brauner@kernel.org \
--cc=chuck.lever@oracle.com \
--cc=jack@suse.cz \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=mhiramat@kernel.org \
--cc=neil@brown.name \
--cc=okorniev@redhat.com \
--cc=rostedt@goodmis.org \
--cc=tom@talpey.com \
--cc=trondmy@hammerspace.com \
--cc=viro@zeniv.linux.org.uk \
/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.