vfs: introduce file_modified() helper
authorAmir Goldstein <amir73il@gmail.com>
Wed, 5 Jun 2019 15:04:49 +0000 (08:04 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Sun, 9 Jun 2019 17:06:19 +0000 (10:06 -0700)
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>
fs/inode.c
fs/read_write.c
include/linux/fs.h

index df6542e..4348cfb 100644 (file)
@@ -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))
index b0fb117..cec7e7b 100644 (file)
@@ -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);
 
index e4d382c..79ffa29 100644 (file)
@@ -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);