Commit 25271d8c authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs-2.6

* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs-2.6:
  ext2: Fix link count corruption under heavy link+rename load
parents ebff7c92 e8a80c6f
...@@ -344,7 +344,6 @@ static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry, ...@@ -344,7 +344,6 @@ static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry,
new_de = ext2_find_entry (new_dir, &new_dentry->d_name, &new_page); new_de = ext2_find_entry (new_dir, &new_dentry->d_name, &new_page);
if (!new_de) if (!new_de)
goto out_dir; goto out_dir;
inode_inc_link_count(old_inode);
ext2_set_link(new_dir, new_de, new_page, old_inode, 1); ext2_set_link(new_dir, new_de, new_page, old_inode, 1);
new_inode->i_ctime = CURRENT_TIME_SEC; new_inode->i_ctime = CURRENT_TIME_SEC;
if (dir_de) if (dir_de)
...@@ -356,12 +355,9 @@ static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry, ...@@ -356,12 +355,9 @@ static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry,
if (new_dir->i_nlink >= EXT2_LINK_MAX) if (new_dir->i_nlink >= EXT2_LINK_MAX)
goto out_dir; goto out_dir;
} }
inode_inc_link_count(old_inode);
err = ext2_add_link(new_dentry, old_inode); err = ext2_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);
} }
...@@ -369,12 +365,11 @@ static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry, ...@@ -369,12 +365,11 @@ static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry,
/* /*
* Like most other Unix systems, set the ctime for inodes on a * Like most other Unix systems, set the ctime for inodes on a
* rename. * rename.
* inode_dec_link_count() will mark the inode dirty.
*/ */
old_inode->i_ctime = CURRENT_TIME_SEC; old_inode->i_ctime = CURRENT_TIME_SEC;
mark_inode_dirty(old_inode);
ext2_delete_entry (old_de, old_page); ext2_delete_entry (old_de, old_page);
inode_dec_link_count(old_inode);
if (dir_de) { if (dir_de) {
if (old_dir != new_dir) if (old_dir != new_dir)
......
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