Re: [PATCH 01/14] fs: refactor file timestamp update logic
Jan Kara <[email protected]>
| Newsgroups | dev.linux.lists.gfs2,org.infradead.lists.linux-mtd,org.kernel.vger.io-uring,org.kernel.vger.linux-btrfs,org.kernel.vger.linux-kernel,org.kernel.vger.linux-nfs,org.kernel.vger.linux-unionfs,org.kernel.vger.linux-xfs |
|---|---|
| Message-ID | <muv2257pdsdqq3mfqay72rgxgiklnbmcj545tcq5tx3ap4hhue@rccqkibodbv3> |
On Fri 14-11-25 07:26:04, Christoph Hellwig wrote: > Currently the two high-level APIs use two helper functions to implement > almost all of the logic. Refactor the two helpers and the common logic > into a new file_update_time_flags routine that gets the iocb flags or > 0 in case of file_update_time passed so that the entire logic is > contained in a single function and can be easily understood and modified. > > Signed-off-by: Christoph Hellwig <[email protected]> Looks good. Feel free to add: Reviewed-by: Jan Kara <[email protected]> Honza > --- > fs/inode.c | 54 +++++++++++++++++------------------------------------- > 1 file changed, 17 insertions(+), 37 deletions(-) > > diff --git a/fs/inode.c b/fs/inode.c > index ec9339024ac3..4884ffa931e7 100644 > --- a/fs/inode.c > +++ b/fs/inode.c > @@ -2310,10 +2310,12 @@ struct timespec64 current_time(struct inode *inode) > } > EXPORT_SYMBOL(current_time); > > -static int inode_needs_update_time(struct inode *inode) > +static int file_update_time_flags(struct file *file, unsigned int flags) > { > + struct inode *inode = file_inode(file); > struct timespec64 now, ts; > - int sync_it = 0; > + int sync_mode = 0; > + int ret = 0; > > /* First try to exhaust all avenues to not sync */ > if (IS_NOCMTIME(inode)) > @@ -2323,29 +2325,23 @@ static int inode_needs_update_time(struct inode *inode) > > ts = inode_get_mtime(inode); > if (!timespec64_equal(&ts, &now)) > - sync_it |= S_MTIME; > - > + sync_mode |= S_MTIME; > ts = inode_get_ctime(inode); > if (!timespec64_equal(&ts, &now)) > - sync_it |= S_CTIME; > - > + sync_mode |= S_CTIME; > if (IS_I_VERSION(inode) && inode_iversion_need_inc(inode)) > - sync_it |= S_VERSION; > + sync_mode |= S_VERSION; > > - return sync_it; > -} > - > -static int __file_update_time(struct file *file, int sync_mode) > -{ > - int ret = 0; > - struct inode *inode = file_inode(file); > + if (!sync_mode) > + return 0; > > - /* try to update time settings */ > - if (!mnt_get_write_access_file(file)) { > - ret = inode_update_time(inode, sync_mode); > - mnt_put_write_access_file(file); > - } > + if (flags & IOCB_NOWAIT) > + return -EAGAIN; > > + if (mnt_get_write_access_file(file)) > + return 0; > + ret = inode_update_time(inode, sync_mode); > + mnt_put_write_access_file(file); > return ret; > } > > @@ -2365,14 +2361,7 @@ static int __file_update_time(struct file *file, int sync_mode) > */ > int file_update_time(struct file *file) > { > - int ret; > - struct inode *inode = file_inode(file); > - > - ret = inode_needs_update_time(inode); > - if (ret <= 0) > - return ret; > - > - return __file_update_time(file, ret); > + return file_update_time_flags(file, 0); > } > EXPORT_SYMBOL(file_update_time); > > @@ -2394,7 +2383,6 @@ EXPORT_SYMBOL(file_update_time); > static int file_modified_flags(struct file *file, int flags) > { > int ret; > - struct inode *inode = file_inode(file); > > /* > * Clear the security bits if the process is not being run by root. > @@ -2403,17 +2391,9 @@ static int file_modified_flags(struct file *file, int flags) > ret = file_remove_privs_flags(file, flags); > if (ret) > return ret; > - > if (unlikely(file->f_mode & FMODE_NOCMTIME)) > return 0; > - > - ret = inode_needs_update_time(inode); > - if (ret <= 0) > - return ret; > - if (flags & IOCB_NOWAIT) > - return -EAGAIN; > - > - return __file_update_time(file, ret); > + return file_update_time_flags(file, flags); > } > > /** > -- > 2.47.3 > -- Jan Kara <[email protected]> SUSE Labs, CR