Commit f49a26e7 authored by Mikulas Patocka's avatar Mikulas Patocka Committed by Linus Torvalds

hpfs: update ctime and mtime on directory modification

Update ctime and mtime when a directory is modified. (though OS/2 doesn't
update them anyway)
Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
Cc: stable@kernel.org	# v3.3+
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent a64eefaa
...@@ -8,6 +8,17 @@ ...@@ -8,6 +8,17 @@
#include <linux/sched.h> #include <linux/sched.h>
#include "hpfs_fn.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) static int hpfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
{ {
const unsigned char *name = dentry->d_name.name; const unsigned char *name = dentry->d_name.name;
...@@ -99,6 +110,7 @@ static int hpfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) ...@@ -99,6 +110,7 @@ static int hpfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
result->i_mode = mode | S_IFDIR; result->i_mode = mode | S_IFDIR;
hpfs_write_inode_nolock(result); hpfs_write_inode_nolock(result);
} }
hpfs_update_directory_times(dir);
d_instantiate(dentry, result); d_instantiate(dentry, result);
hpfs_unlock(dir->i_sb); hpfs_unlock(dir->i_sb);
return 0; return 0;
...@@ -187,6 +199,7 @@ static int hpfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, b ...@@ -187,6 +199,7 @@ static int hpfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, b
result->i_mode = mode | S_IFREG; result->i_mode = mode | S_IFREG;
hpfs_write_inode_nolock(result); hpfs_write_inode_nolock(result);
} }
hpfs_update_directory_times(dir);
d_instantiate(dentry, result); d_instantiate(dentry, result);
hpfs_unlock(dir->i_sb); hpfs_unlock(dir->i_sb);
return 0; return 0;
...@@ -262,6 +275,7 @@ static int hpfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, de ...@@ -262,6 +275,7 @@ static int hpfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, de
insert_inode_hash(result); insert_inode_hash(result);
hpfs_write_inode_nolock(result); hpfs_write_inode_nolock(result);
hpfs_update_directory_times(dir);
d_instantiate(dentry, result); d_instantiate(dentry, result);
brelse(bh); brelse(bh);
hpfs_unlock(dir->i_sb); hpfs_unlock(dir->i_sb);
...@@ -340,6 +354,7 @@ static int hpfs_symlink(struct inode *dir, struct dentry *dentry, const char *sy ...@@ -340,6 +354,7 @@ static int hpfs_symlink(struct inode *dir, struct dentry *dentry, const char *sy
insert_inode_hash(result); insert_inode_hash(result);
hpfs_write_inode_nolock(result); hpfs_write_inode_nolock(result);
hpfs_update_directory_times(dir);
d_instantiate(dentry, result); d_instantiate(dentry, result);
hpfs_unlock(dir->i_sb); hpfs_unlock(dir->i_sb);
return 0; return 0;
...@@ -423,6 +438,8 @@ static int hpfs_unlink(struct inode *dir, struct dentry *dentry) ...@@ -423,6 +438,8 @@ static int hpfs_unlink(struct inode *dir, struct dentry *dentry)
out1: out1:
hpfs_brelse4(&qbh); hpfs_brelse4(&qbh);
out: out:
if (!err)
hpfs_update_directory_times(dir);
hpfs_unlock(dir->i_sb); hpfs_unlock(dir->i_sb);
return err; return err;
} }
...@@ -477,6 +494,8 @@ static int hpfs_rmdir(struct inode *dir, struct dentry *dentry) ...@@ -477,6 +494,8 @@ static int hpfs_rmdir(struct inode *dir, struct dentry *dentry)
out1: out1:
hpfs_brelse4(&qbh); hpfs_brelse4(&qbh);
out: out:
if (!err)
hpfs_update_directory_times(dir);
hpfs_unlock(dir->i_sb); hpfs_unlock(dir->i_sb);
return err; return err;
} }
...@@ -595,7 +614,7 @@ static int hpfs_rename(struct inode *old_dir, struct dentry *old_dentry, ...@@ -595,7 +614,7 @@ static int hpfs_rename(struct inode *old_dir, struct dentry *old_dentry,
goto end1; goto end1;
} }
end: end:
hpfs_i(i)->i_parent_dir = new_dir->i_ino; hpfs_i(i)->i_parent_dir = new_dir->i_ino;
if (S_ISDIR(i->i_mode)) { if (S_ISDIR(i->i_mode)) {
inc_nlink(new_dir); inc_nlink(new_dir);
...@@ -610,6 +629,10 @@ static int hpfs_rename(struct inode *old_dir, struct dentry *old_dentry, ...@@ -610,6 +629,10 @@ static int hpfs_rename(struct inode *old_dir, struct dentry *old_dentry,
brelse(bh); brelse(bh);
} }
end1: end1:
if (!err) {
hpfs_update_directory_times(old_dir);
hpfs_update_directory_times(new_dir);
}
hpfs_unlock(i->i_sb); hpfs_unlock(i->i_sb);
return err; return err;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment