diff options
author | Jan Kara <jack@suse.cz> | 2015-03-24 16:47:25 -0400 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2015-04-01 08:26:14 -0400 |
commit | 3adc12e9648291149a1e3f354d0ad158fc2571e7 (patch) | |
tree | fb31963ff3055f7093f6eb91528ca4f03705fd44 /fs/udf/namei.c | |
parent | 0fd2ba36b8e4c720e5fb5ee40171919c8207237e (diff) |
udf: Update ctime and mtime when directory is modified
We failed to update ctime & mtime of a directory when new entry was
created in it during rename, link, create, etc. Fix that.
Reported-by: Taesoo Kim <tsgatesv@gmail.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/udf/namei.c')
-rw-r--r-- | fs/udf/namei.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/fs/udf/namei.c b/fs/udf/namei.c index fbf3d90967ea..39661977c89c 100644 --- a/fs/udf/namei.c +++ b/fs/udf/namei.c | |||
@@ -568,8 +568,8 @@ static int udf_add_nondir(struct dentry *dentry, struct inode *inode) | |||
568 | *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = | 568 | *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = |
569 | cpu_to_le32(iinfo->i_unique & 0x00000000FFFFFFFFUL); | 569 | cpu_to_le32(iinfo->i_unique & 0x00000000FFFFFFFFUL); |
570 | udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); | 570 | udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); |
571 | if (UDF_I(dir)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) | 571 | dir->i_ctime = dir->i_mtime = current_fs_time(dir->i_sb); |
572 | mark_inode_dirty(dir); | 572 | mark_inode_dirty(dir); |
573 | if (fibh.sbh != fibh.ebh) | 573 | if (fibh.sbh != fibh.ebh) |
574 | brelse(fibh.ebh); | 574 | brelse(fibh.ebh); |
575 | brelse(fibh.sbh); | 575 | brelse(fibh.sbh); |
@@ -682,6 +682,7 @@ static int udf_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) | |||
682 | cfi.fileCharacteristics |= FID_FILE_CHAR_DIRECTORY; | 682 | cfi.fileCharacteristics |= FID_FILE_CHAR_DIRECTORY; |
683 | udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); | 683 | udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); |
684 | inc_nlink(dir); | 684 | inc_nlink(dir); |
685 | dir->i_ctime = dir->i_mtime = current_fs_time(dir->i_sb); | ||
685 | mark_inode_dirty(dir); | 686 | mark_inode_dirty(dir); |
686 | unlock_new_inode(inode); | 687 | unlock_new_inode(inode); |
687 | d_instantiate(dentry, inode); | 688 | d_instantiate(dentry, inode); |
@@ -1023,6 +1024,8 @@ static int udf_link(struct dentry *old_dentry, struct inode *dir, | |||
1023 | inc_nlink(inode); | 1024 | inc_nlink(inode); |
1024 | inode->i_ctime = current_fs_time(inode->i_sb); | 1025 | inode->i_ctime = current_fs_time(inode->i_sb); |
1025 | mark_inode_dirty(inode); | 1026 | mark_inode_dirty(inode); |
1027 | dir->i_ctime = dir->i_mtime = current_fs_time(dir->i_sb); | ||
1028 | mark_inode_dirty(dir); | ||
1026 | ihold(inode); | 1029 | ihold(inode); |
1027 | d_instantiate(dentry, inode); | 1030 | d_instantiate(dentry, inode); |
1028 | 1031 | ||
@@ -1126,7 +1129,9 @@ static int udf_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
1126 | inode_dec_link_count(new_inode); | 1129 | inode_dec_link_count(new_inode); |
1127 | } | 1130 | } |
1128 | old_dir->i_ctime = old_dir->i_mtime = current_fs_time(old_dir->i_sb); | 1131 | old_dir->i_ctime = old_dir->i_mtime = current_fs_time(old_dir->i_sb); |
1132 | new_dir->i_ctime = new_dir->i_mtime = current_fs_time(new_dir->i_sb); | ||
1129 | mark_inode_dirty(old_dir); | 1133 | mark_inode_dirty(old_dir); |
1134 | mark_inode_dirty(new_dir); | ||
1130 | 1135 | ||
1131 | if (dir_fi) { | 1136 | if (dir_fi) { |
1132 | dir_fi->icb.extLocation = cpu_to_lelb(UDF_I(new_dir)->i_location); | 1137 | dir_fi->icb.extLocation = cpu_to_lelb(UDF_I(new_dir)->i_location); |