fs: add ctime accessors infrastructure
[ Upstream commit 9b6304c1d53745c300b86f202d0dcff395e2d2db ] struct timespec64 has unused bits in the tv_nsec field that can be used for other purposes. In future patches, we're going to change how the inode->i_ctime is accessed in certain inodes in order to make use of them. In order to do that safely though, we'll need to eradicate raw accesses of the inode->i_ctime field from the kernel. Add new accessor functions for the ctime that we use to replace them. Reviewed-by: Jan Kara <jack@suse.cz> Reviewed-by: Luis Chamberlain <mcgrof@kernel.org> Signed-off-by: Jeff Layton <jlayton@kernel.org> Reviewed-by: Damien Le Moal <dlemoal@kernel.org> Message-Id: <20230705185812.579118-2-jlayton@kernel.org> Signed-off-by: Christian Brauner <brauner@kernel.org> Stable-dep-of: 5923d6686a10 ("smb3: fix caching of ctime on setxattr") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
ba458f13eb
commit
8379b98f8a
2 changed files with 60 additions and 1 deletions
16
fs/inode.c
16
fs/inode.c
|
@ -2392,6 +2392,22 @@ int vfs_ioc_fssetxattr_check(struct inode *inode, const struct fsxattr *old_fa,
|
|||
}
|
||||
EXPORT_SYMBOL(vfs_ioc_fssetxattr_check);
|
||||
|
||||
/**
|
||||
* inode_set_ctime_current - set the ctime to current_time
|
||||
* @inode: inode
|
||||
*
|
||||
* Set the inode->i_ctime to the current value for the inode. Returns
|
||||
* the current value that was assigned to i_ctime.
|
||||
*/
|
||||
struct timespec64 inode_set_ctime_current(struct inode *inode)
|
||||
{
|
||||
struct timespec64 now = current_time(inode);
|
||||
|
||||
inode_set_ctime(inode, now.tv_sec, now.tv_nsec);
|
||||
return now;
|
||||
}
|
||||
EXPORT_SYMBOL(inode_set_ctime_current);
|
||||
|
||||
/**
|
||||
* in_group_or_capable - check whether caller is CAP_FSETID privileged
|
||||
* @inode: inode to check
|
||||
|
|
|
@ -1628,7 +1628,50 @@ static inline void i_gid_write(struct inode *inode, gid_t gid)
|
|||
inode->i_gid = make_kgid(inode->i_sb->s_user_ns, gid);
|
||||
}
|
||||
|
||||
extern struct timespec64 current_time(struct inode *inode);
|
||||
struct timespec64 current_time(struct inode *inode);
|
||||
struct timespec64 inode_set_ctime_current(struct inode *inode);
|
||||
|
||||
/**
|
||||
* inode_get_ctime - fetch the current ctime from the inode
|
||||
* @inode: inode from which to fetch ctime
|
||||
*
|
||||
* Grab the current ctime from the inode and return it.
|
||||
*/
|
||||
static inline struct timespec64 inode_get_ctime(const struct inode *inode)
|
||||
{
|
||||
return inode->i_ctime;
|
||||
}
|
||||
|
||||
/**
|
||||
* inode_set_ctime_to_ts - set the ctime in the inode
|
||||
* @inode: inode in which to set the ctime
|
||||
* @ts: value to set in the ctime field
|
||||
*
|
||||
* Set the ctime in @inode to @ts
|
||||
*/
|
||||
static inline struct timespec64 inode_set_ctime_to_ts(struct inode *inode,
|
||||
struct timespec64 ts)
|
||||
{
|
||||
inode->i_ctime = ts;
|
||||
return ts;
|
||||
}
|
||||
|
||||
/**
|
||||
* inode_set_ctime - set the ctime in the inode
|
||||
* @inode: inode in which to set the ctime
|
||||
* @sec: tv_sec value to set
|
||||
* @nsec: tv_nsec value to set
|
||||
*
|
||||
* Set the ctime in @inode to { @sec, @nsec }
|
||||
*/
|
||||
static inline struct timespec64 inode_set_ctime(struct inode *inode,
|
||||
time64_t sec, long nsec)
|
||||
{
|
||||
struct timespec64 ts = { .tv_sec = sec,
|
||||
.tv_nsec = nsec };
|
||||
|
||||
return inode_set_ctime_to_ts(inode, ts);
|
||||
}
|
||||
|
||||
/*
|
||||
* Snapshotting support.
|
||||
|
|
Loading…
Add table
Reference in a new issue