Skip to content

Commit 70d45cd

Browse files
author
Al Viro
committed
ufs: don't touch mtime/ctime of directory being moved
See "ext2: Do not update mtime of a moved directory" (and followup in "ext2: fix unbalanced kmap()/kunmap()") for background; this is UFS equivalent - the same problem exists here. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
1 parent a50e4a0 commit 70d45cd

File tree

3 files changed

+12
-5
lines changed

3 files changed

+12
-5
lines changed

fs/ufs/dir.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ ino_t ufs_inode_by_name(struct inode *dir, const struct qstr *qstr)
8787

8888
/* Releases the page */
8989
void ufs_set_link(struct inode *dir, struct ufs_dir_entry *de,
90-
struct page *page, struct inode *inode)
90+
struct page *page, struct inode *inode,
91+
bool update_times)
9192
{
9293
loff_t pos = page_offset(page) +
9394
(char *) de - (char *) page_address(page);
@@ -103,7 +104,8 @@ void ufs_set_link(struct inode *dir, struct ufs_dir_entry *de,
103104

104105
err = ufs_commit_chunk(page, pos, len);
105106
ufs_put_page(page);
106-
dir->i_mtime = dir->i_ctime = CURRENT_TIME_SEC;
107+
if (update_times)
108+
dir->i_mtime = dir->i_ctime = CURRENT_TIME_SEC;
107109
mark_inode_dirty(dir);
108110
}
109111

fs/ufs/namei.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ static int ufs_rename(struct inode *old_dir, struct dentry *old_dentry,
276276
new_de = ufs_find_entry(new_dir, &new_dentry->d_name, &new_page);
277277
if (!new_de)
278278
goto out_dir;
279-
ufs_set_link(new_dir, new_de, new_page, old_inode);
279+
ufs_set_link(new_dir, new_de, new_page, old_inode, 1);
280280
new_inode->i_ctime = CURRENT_TIME_SEC;
281281
if (dir_de)
282282
drop_nlink(new_inode);
@@ -299,7 +299,12 @@ static int ufs_rename(struct inode *old_dir, struct dentry *old_dentry,
299299
mark_inode_dirty(old_inode);
300300

301301
if (dir_de) {
302-
ufs_set_link(old_inode, dir_de, dir_page, new_dir);
302+
if (old_dir != new_dir)
303+
ufs_set_link(old_inode, dir_de, dir_page, new_dir, 0);
304+
else {
305+
kunmap(dir_page);
306+
page_cache_release(dir_page);
307+
}
303308
inode_dec_link_count(old_dir);
304309
}
305310
return 0;

fs/ufs/ufs.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ extern int ufs_delete_entry(struct inode *, struct ufs_dir_entry *, struct page
106106
extern int ufs_empty_dir (struct inode *);
107107
extern struct ufs_dir_entry *ufs_dotdot(struct inode *, struct page **);
108108
extern void ufs_set_link(struct inode *dir, struct ufs_dir_entry *de,
109-
struct page *page, struct inode *inode);
109+
struct page *page, struct inode *inode, bool update_times);
110110

111111
/* file.c */
112112
extern const struct inode_operations ufs_file_inode_operations;

0 commit comments

Comments
 (0)