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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.