This is like file_update_time, except that it acts on a struct inode * instead of a struct file *. Signed-off-by: Andy Lutomirski <luto@xxxxxxxxxxxxxx> --- fs/inode.c | 64 +++++++++++++++++++++++++++++++++++++++++------------- include/linux/fs.h | 1 + 2 files changed, 50 insertions(+), 15 deletions(-) diff --git a/fs/inode.c b/fs/inode.c index d6dfb09..2bbcb19 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -1637,6 +1637,34 @@ int file_remove_suid(struct file *file) } EXPORT_SYMBOL(file_remove_suid); +/* + * This does the work that's common to file_update_time and + * inode_update_time. + */ +static int prepare_update_cmtime(struct inode *inode, struct timespec *now) +{ + int sync_it; + + /* First try to exhaust all avenues to not sync */ + if (IS_NOCMTIME(inode)) + return 0; + + *now = current_fs_time(inode->i_sb); + if (!timespec_equal(&inode->i_mtime, now)) + sync_it = S_MTIME; + + if (!timespec_equal(&inode->i_ctime, now)) + sync_it |= S_CTIME; + + if (IS_I_VERSION(inode)) + sync_it |= S_VERSION; + + if (!sync_it) + return 0; + + return sync_it; +} + /** * file_update_time - update mtime and ctime time * @file: file accessed @@ -1654,23 +1682,9 @@ int file_update_time(struct file *file) { struct inode *inode = file_inode(file); struct timespec now; - int sync_it = 0; + int sync_it = prepare_update_cmtime(inode, &now); int ret; - /* First try to exhaust all avenues to not sync */ - if (IS_NOCMTIME(inode)) - return 0; - - now = current_fs_time(inode->i_sb); - if (!timespec_equal(&inode->i_mtime, &now)) - sync_it = S_MTIME; - - if (!timespec_equal(&inode->i_ctime, &now)) - sync_it |= S_CTIME; - - if (IS_I_VERSION(inode)) - sync_it |= S_VERSION; - if (!sync_it) return 0; @@ -1685,6 +1699,26 @@ int file_update_time(struct file *file) } EXPORT_SYMBOL(file_update_time); +/** + * inode_update_time_writable - update mtime and ctime time + * @inode: inode accessed + * + * This is like file_update_time, but it assumes the mnt is + * writable and not frozen and takes an inode parameter instead. + */ + +int inode_update_time_writable(struct inode *inode) +{ + struct timespec now; + int sync_it = prepare_update_cmtime(inode, &now); + + if (!sync_it) + return 0; + + return update_time(inode, &now, sync_it); +} +EXPORT_SYMBOL(inode_update_time_writable); + int inode_needs_sync(struct inode *inode) { if (IS_SYNC(inode)) diff --git a/include/linux/fs.h b/include/linux/fs.h index 9818747..86cf0a4 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2590,6 +2590,7 @@ extern int inode_newsize_ok(const struct inode *, loff_t offset); extern void setattr_copy(struct inode *inode, const struct iattr *attr); extern int file_update_time(struct file *file); +extern int inode_update_time_writable(struct inode *inode); extern int generic_show_options(struct seq_file *m, struct dentry *root); extern void save_mount_options(struct super_block *sb, char *options); -- 1.8.3.1 -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html