f2fs: avoid to set wrong pino of inode when rename dir
When we rename a dir to new name which is not exist previous, we will set pino of parent inode with ino of child inode in f2fs_set_link. It destroy consistency of pino, it should be fixed. Thanks for previous work of Shu Tan. Signed-off-by: Shu Tan <shu.tan@samsung.com> Signed-off-by: Chao Yu <chao2.yu@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
This commit is contained in:
Родитель
4f4124d0b9
Коммит
deead09009
|
@ -259,9 +259,6 @@ void f2fs_set_link(struct inode *dir, struct f2fs_dir_entry *de,
|
||||||
dir->i_mtime = dir->i_ctime = CURRENT_TIME;
|
dir->i_mtime = dir->i_ctime = CURRENT_TIME;
|
||||||
mark_inode_dirty(dir);
|
mark_inode_dirty(dir);
|
||||||
|
|
||||||
/* update parent inode number before releasing dentry page */
|
|
||||||
F2FS_I(inode)->i_pino = dir->i_ino;
|
|
||||||
|
|
||||||
f2fs_put_page(page, 1);
|
f2fs_put_page(page, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -424,6 +424,7 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||||
}
|
}
|
||||||
|
|
||||||
f2fs_set_link(new_dir, new_entry, new_page, old_inode);
|
f2fs_set_link(new_dir, new_entry, new_page, old_inode);
|
||||||
|
F2FS_I(old_inode)->i_pino = new_dir->i_ino;
|
||||||
|
|
||||||
new_inode->i_ctime = CURRENT_TIME;
|
new_inode->i_ctime = CURRENT_TIME;
|
||||||
if (old_dir_entry)
|
if (old_dir_entry)
|
||||||
|
@ -457,6 +458,7 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||||
if (old_dir != new_dir) {
|
if (old_dir != new_dir) {
|
||||||
f2fs_set_link(old_inode, old_dir_entry,
|
f2fs_set_link(old_inode, old_dir_entry,
|
||||||
old_dir_page, new_dir);
|
old_dir_page, new_dir);
|
||||||
|
F2FS_I(old_inode)->i_pino = new_dir->i_ino;
|
||||||
} else {
|
} else {
|
||||||
kunmap(old_dir_page);
|
kunmap(old_dir_page);
|
||||||
f2fs_put_page(old_dir_page, 0);
|
f2fs_put_page(old_dir_page, 0);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче