diff options
author | Amir Goldstein <amir73il@gmail.com> | 2019-06-05 08:04:49 -0700 |
---|---|---|
committer | Darrick J. Wong <darrick.wong@oracle.com> | 2019-06-09 10:06:19 -0700 |
commit | e38f7f53c35213b1cbce70eee5de7ced17f40d4a (patch) | |
tree | 16dc10d9c6ad567b4626798612688c586e86e71d /fs/inode.c | |
parent | 96e6e8f4a68df2d94800311163faa67124df24e5 (diff) | |
download | linux-stable-e38f7f53c35213b1cbce70eee5de7ced17f40d4a.tar.gz linux-stable-e38f7f53c35213b1cbce70eee5de7ced17f40d4a.tar.bz2 linux-stable-e38f7f53c35213b1cbce70eee5de7ced17f40d4a.zip |
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>
Diffstat (limited to 'fs/inode.c')
-rw-r--r-- | fs/inode.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/fs/inode.c b/fs/inode.c index df6542ec3b88..4348cfb14562 100644 --- a/fs/inode.c +++ b/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)) |