mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/
synced 2026-04-17 22:23:45 -04:00
fs: refactor ->update_time handling
Pass the type of update (atime vs c/mtime plus version) as an enum instead of a set of flags that caused all kinds of confusion. Because inode_update_timestamps now can't return a modified version of those flags, return the I_DIRTY_* flags needed to persist the update, which is what the main caller in generic_update_time wants anyway, and which is suitable for the other callers that only want to know if an update happened. The whole update_time path keeps the flags argument, which will be used to support non-blocking updates soon even if it is unused, and (the slightly renamed) inode_update_time also gains the possibility to return a negative errno to support this. Signed-off-by: Christoph Hellwig <hch@lst.de> Link: https://patch.msgid.link/20260108141934.2052404-6-hch@lst.de Reviewed-by: Jan Kara <jack@suse.cz> Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
committed by
Christian Brauner
parent
1cbc822816
commit
761475268f
@@ -1717,6 +1717,13 @@ static inline struct timespec64 inode_set_ctime(struct inode *inode,
|
||||
|
||||
struct timespec64 simple_inode_init_ts(struct inode *inode);
|
||||
|
||||
static inline int inode_time_dirty_flag(struct inode *inode)
|
||||
{
|
||||
if (inode->i_sb->s_flags & SB_LAZYTIME)
|
||||
return I_DIRTY_TIME;
|
||||
return I_DIRTY_SYNC;
|
||||
}
|
||||
|
||||
/*
|
||||
* Snapshotting support.
|
||||
*/
|
||||
@@ -1983,6 +1990,11 @@ int wrap_directory_iterator(struct file *, struct dir_context *,
|
||||
static int shared_##x(struct file *file , struct dir_context *ctx) \
|
||||
{ return wrap_directory_iterator(file, ctx, x); }
|
||||
|
||||
enum fs_update_time {
|
||||
FS_UPD_ATIME,
|
||||
FS_UPD_CMTIME,
|
||||
};
|
||||
|
||||
struct inode_operations {
|
||||
struct dentry * (*lookup) (struct inode *,struct dentry *, unsigned int);
|
||||
const char * (*get_link) (struct dentry *, struct inode *, struct delayed_call *);
|
||||
@@ -2010,7 +2022,8 @@ struct inode_operations {
|
||||
ssize_t (*listxattr) (struct dentry *, char *, size_t);
|
||||
int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start,
|
||||
u64 len);
|
||||
int (*update_time)(struct inode *, int);
|
||||
int (*update_time)(struct inode *inode, enum fs_update_time type,
|
||||
unsigned int flags);
|
||||
int (*atomic_open)(struct inode *, struct dentry *,
|
||||
struct file *, unsigned open_flag,
|
||||
umode_t create_mode);
|
||||
@@ -2237,13 +2250,6 @@ static inline void inode_dec_link_count(struct inode *inode)
|
||||
mark_inode_dirty(inode);
|
||||
}
|
||||
|
||||
enum file_time_flags {
|
||||
S_ATIME = 1,
|
||||
S_MTIME = 2,
|
||||
S_CTIME = 4,
|
||||
S_VERSION = 8,
|
||||
};
|
||||
|
||||
extern bool atime_needs_update(const struct path *, struct inode *);
|
||||
extern void touch_atime(const struct path *);
|
||||
|
||||
@@ -2398,8 +2404,10 @@ static inline void super_set_sysfs_name_generic(struct super_block *sb, const ch
|
||||
extern void ihold(struct inode * inode);
|
||||
extern void iput(struct inode *);
|
||||
void iput_not_last(struct inode *);
|
||||
int inode_update_timestamps(struct inode *inode, int flags);
|
||||
int generic_update_time(struct inode *inode, int flags);
|
||||
int inode_update_time(struct inode *inode, enum fs_update_time type,
|
||||
unsigned int flags);
|
||||
int generic_update_time(struct inode *inode, enum fs_update_time type,
|
||||
unsigned int flags);
|
||||
|
||||
/* /sys/fs */
|
||||
extern struct kobject *fs_kobj;
|
||||
|
||||
Reference in New Issue
Block a user