提交 6f88049c 编写于 作者: A Al Viro

minix: i_nlink races in rename()

Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
上级 37750cdd
...@@ -213,7 +213,6 @@ static int minix_rename(struct inode * old_dir, struct dentry *old_dentry, ...@@ -213,7 +213,6 @@ static int minix_rename(struct inode * old_dir, struct dentry *old_dentry,
new_de = minix_find_entry(new_dentry, &new_page); new_de = minix_find_entry(new_dentry, &new_page);
if (!new_de) if (!new_de)
goto out_dir; goto out_dir;
inode_inc_link_count(old_inode);
minix_set_link(new_de, new_page, old_inode); minix_set_link(new_de, new_page, old_inode);
new_inode->i_ctime = CURRENT_TIME_SEC; new_inode->i_ctime = CURRENT_TIME_SEC;
if (dir_de) if (dir_de)
...@@ -225,18 +224,15 @@ static int minix_rename(struct inode * old_dir, struct dentry *old_dentry, ...@@ -225,18 +224,15 @@ static int minix_rename(struct inode * old_dir, struct dentry *old_dentry,
if (new_dir->i_nlink >= info->s_link_max) if (new_dir->i_nlink >= info->s_link_max)
goto out_dir; goto out_dir;
} }
inode_inc_link_count(old_inode);
err = minix_add_link(new_dentry, old_inode); err = minix_add_link(new_dentry, old_inode);
if (err) { if (err)
inode_dec_link_count(old_inode);
goto out_dir; goto out_dir;
}
if (dir_de) if (dir_de)
inode_inc_link_count(new_dir); inode_inc_link_count(new_dir);
} }
minix_delete_entry(old_de, old_page); minix_delete_entry(old_de, old_page);
inode_dec_link_count(old_inode); mark_inode_dirty(old_inode);
if (dir_de) { if (dir_de) {
minix_set_link(dir_de, dir_page, new_dir); minix_set_link(dir_de, dir_page, new_dir);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册