vfs: introduce file_modified() helper
The combination of file_remove_privs() and file_update_mtime() is quite common in filesystem ->write_iter() methods. Modelled after the helper file_accessed(), introduce file_modified() and use it from generic_remap_file_range_prep(). Note that the order of calling file_remove_privs() before file_update_mtime() in the helper was matched to the more common order by filesystems and not the current order in generic_remap_file_range_prep(). Signed-off-by: Amir Goldstein <amir73il@gmail.com> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
		
							parent
							
								
									96e6e8f4a6
								
							
						
					
					
						commit
						e38f7f53c3
					
				
							
								
								
									
										20
									
								
								fs/inode.c
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								fs/inode.c
									
									
									
									
									
								
							| @ -1899,6 +1899,26 @@ int file_update_time(struct file *file) | ||||
| } | ||||
| EXPORT_SYMBOL(file_update_time); | ||||
| 
 | ||||
| /* Caller must hold the file's inode lock */ | ||||
| int file_modified(struct file *file) | ||||
| { | ||||
| 	int err; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Clear the security bits if the process is not being run by root. | ||||
| 	 * This keeps people from modifying setuid and setgid binaries. | ||||
| 	 */ | ||||
| 	err = file_remove_privs(file); | ||||
| 	if (err) | ||||
| 		return err; | ||||
| 
 | ||||
| 	if (unlikely(file->f_mode & FMODE_NOCMTIME)) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	return file_update_time(file); | ||||
| } | ||||
| EXPORT_SYMBOL(file_modified); | ||||
| 
 | ||||
| int inode_needs_sync(struct inode *inode) | ||||
| { | ||||
| 	if (IS_SYNC(inode)) | ||||
|  | ||||
| @ -1980,25 +1980,10 @@ int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in, | ||||
| 		return ret; | ||||
| 
 | ||||
| 	/* If can't alter the file contents, we're done. */ | ||||
| 	if (!(remap_flags & REMAP_FILE_DEDUP)) { | ||||
| 		/* Update the timestamps, since we can alter file contents. */ | ||||
| 		if (!(file_out->f_mode & FMODE_NOCMTIME)) { | ||||
| 			ret = file_update_time(file_out); | ||||
| 			if (ret) | ||||
| 				return ret; | ||||
| 		} | ||||
| 	if (!(remap_flags & REMAP_FILE_DEDUP)) | ||||
| 		ret = file_modified(file_out); | ||||
| 
 | ||||
| 		/*
 | ||||
| 		 * Clear the security bits if the process is not being run by | ||||
| 		 * root.  This keeps people from modifying setuid and setgid | ||||
| 		 * binaries. | ||||
| 		 */ | ||||
| 		ret = file_remove_privs(file_out); | ||||
| 		if (ret) | ||||
| 			return ret; | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| 	return ret; | ||||
| } | ||||
| EXPORT_SYMBOL(generic_remap_file_range_prep); | ||||
| 
 | ||||
|  | ||||
| @ -2177,6 +2177,8 @@ static inline void file_accessed(struct file *file) | ||||
| 		touch_atime(&file->f_path); | ||||
| } | ||||
| 
 | ||||
| extern int file_modified(struct file *file); | ||||
| 
 | ||||
| int sync_inode(struct inode *inode, struct writeback_control *wbc); | ||||
| int sync_inode_metadata(struct inode *inode, int wait); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user