| From f49a26e7718dd30b49e3541e3e25aecf5e7294e2 Mon Sep 17 00:00:00 2001 |
| From: Mikulas Patocka <mikulas@twibright.com> |
| Date: Wed, 2 Sep 2015 22:51:53 +0200 |
| Subject: hpfs: update ctime and mtime on directory modification |
| |
| commit f49a26e7718dd30b49e3541e3e25aecf5e7294e2 upstream. |
| |
| Update ctime and mtime when a directory is modified. (though OS/2 doesn't |
| update them anyway) |
| |
| Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Zefan Li <lizefan@huawei.com> |
| --- |
| fs/hpfs/namei.c | 25 ++++++++++++++++++++++++- |
| 1 file changed, 24 insertions(+), 1 deletion(-) |
| |
| --- a/fs/hpfs/namei.c |
| +++ b/fs/hpfs/namei.c |
| @@ -8,6 +8,17 @@ |
| #include <linux/sched.h> |
| #include "hpfs_fn.h" |
| |
| +static void hpfs_update_directory_times(struct inode *dir) |
| +{ |
| + time_t t = get_seconds(); |
| + if (t == dir->i_mtime.tv_sec && |
| + t == dir->i_ctime.tv_sec) |
| + return; |
| + dir->i_mtime.tv_sec = dir->i_ctime.tv_sec = t; |
| + dir->i_mtime.tv_nsec = dir->i_ctime.tv_nsec = 0; |
| + hpfs_write_inode_nolock(dir); |
| +} |
| + |
| static int hpfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) |
| { |
| const unsigned char *name = dentry->d_name.name; |
| @@ -99,6 +110,7 @@ static int hpfs_mkdir(struct inode *dir, |
| result->i_mode = mode | S_IFDIR; |
| hpfs_write_inode_nolock(result); |
| } |
| + hpfs_update_directory_times(dir); |
| d_instantiate(dentry, result); |
| hpfs_unlock(dir->i_sb); |
| return 0; |
| @@ -187,6 +199,7 @@ static int hpfs_create(struct inode *dir |
| result->i_mode = mode | S_IFREG; |
| hpfs_write_inode_nolock(result); |
| } |
| + hpfs_update_directory_times(dir); |
| d_instantiate(dentry, result); |
| hpfs_unlock(dir->i_sb); |
| return 0; |
| @@ -262,6 +275,7 @@ static int hpfs_mknod(struct inode *dir, |
| insert_inode_hash(result); |
| |
| hpfs_write_inode_nolock(result); |
| + hpfs_update_directory_times(dir); |
| d_instantiate(dentry, result); |
| brelse(bh); |
| hpfs_unlock(dir->i_sb); |
| @@ -340,6 +354,7 @@ static int hpfs_symlink(struct inode *di |
| insert_inode_hash(result); |
| |
| hpfs_write_inode_nolock(result); |
| + hpfs_update_directory_times(dir); |
| d_instantiate(dentry, result); |
| hpfs_unlock(dir->i_sb); |
| return 0; |
| @@ -423,6 +438,8 @@ again: |
| out1: |
| hpfs_brelse4(&qbh); |
| out: |
| + if (!err) |
| + hpfs_update_directory_times(dir); |
| hpfs_unlock(dir->i_sb); |
| return err; |
| } |
| @@ -477,6 +494,8 @@ static int hpfs_rmdir(struct inode *dir, |
| out1: |
| hpfs_brelse4(&qbh); |
| out: |
| + if (!err) |
| + hpfs_update_directory_times(dir); |
| hpfs_unlock(dir->i_sb); |
| return err; |
| } |
| @@ -595,7 +614,7 @@ static int hpfs_rename(struct inode *old |
| goto end1; |
| } |
| |
| - end: |
| +end: |
| hpfs_i(i)->i_parent_dir = new_dir->i_ino; |
| if (S_ISDIR(i->i_mode)) { |
| inc_nlink(new_dir); |
| @@ -610,6 +629,10 @@ static int hpfs_rename(struct inode *old |
| brelse(bh); |
| } |
| end1: |
| + if (!err) { |
| + hpfs_update_directory_times(old_dir); |
| + hpfs_update_directory_times(new_dir); |
| + } |
| hpfs_unlock(i->i_sb); |
| return err; |
| } |