mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/
synced 2026-04-17 22:23:45 -04:00
Merge tag 'vfs-7.0-rc1.nonblocking_timestamps' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
Pull vfs timestamp updates from Christian Brauner:
"This contains the changes to support non-blocking timestamp updates.
Since commit 66fa3cedf1 ("fs: Add async write file modification
handling") file_update_time_flags() unconditionally returns -EAGAIN
when any timestamp needs updating and IOCB_NOWAIT is set. This makes
non-blocking direct writes impossible on file systems with granular
enough timestamps, which in practice means all of them.
This reworks the timestamp update path to propagate IOCB_NOWAIT
through ->update_time so that file systems which can update timestamps
without blocking are no longer penalized.
With that groundwork in place, the core change passes IOCB_NOWAIT into
->update_time and returns -EAGAIN only when the file system indicates
it would block.
XFS implements non-blocking timestamp updates by using the new
->sync_lazytime and open-coding generic_update_time without the
S_NOWAIT check, since the lazytime path through the generic helpers
can never block in XFS"
* tag 'vfs-7.0-rc1.nonblocking_timestamps' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs:
xfs: enable non-blocking timestamp updates
xfs: implement ->sync_lazytime
fs: refactor file_update_time_flags
fs: add support for non-blocking timestamp updates
fs: add a ->sync_lazytime method
fs: factor out a sync_lazytime helper
fs: refactor ->update_time handling
fat: cleanup the flags for fat_truncate_time
nfs: split nfs_update_timestamps
fs: allow error returns from generic_update_time
fs: remove inode_update_time
This commit is contained in:
@@ -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.
|
||||
*/
|
||||
@@ -1985,6 +1992,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 *);
|
||||
@@ -2012,7 +2024,9 @@ 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);
|
||||
void (*sync_lazytime)(struct inode *inode);
|
||||
int (*atomic_open)(struct inode *, struct dentry *,
|
||||
struct file *, unsigned open_flag,
|
||||
umode_t create_mode);
|
||||
@@ -2239,16 +2253,8 @@ 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 *);
|
||||
int inode_update_time(struct inode *inode, int flags);
|
||||
|
||||
static inline void file_accessed(struct file *file)
|
||||
{
|
||||
@@ -2401,8 +2407,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 *, int);
|
||||
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