Skip to content

Commit

Permalink
vfs: introduce file_modified() helper
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
amir73il authored and djwong committed Jun 9, 2019
1 parent 96e6e8f commit e38f7f5
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 18 deletions.
20 changes: 20 additions & 0 deletions fs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down
21 changes: 3 additions & 18 deletions fs/read_write.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
2 changes: 2 additions & 0 deletions include/linux/fs.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down

0 comments on commit e38f7f5

Please sign in to comment.