ext2/3 bugfix 4/6: Fix ext3 htree rename bug
PATCH 1/1 ext2/3 bugfix 4/6: Fix ext3 htree rename bug
Fix ext3 htree rename bug.
This fixes an ext3 htree bug pointed out by Christopher Li; if adding the new name to the directory causes a split, this can cause the directory entry containing the old name to move to another block, and then the removal of the old name will fail.
namei.c | 21 ++++++++++++++++++++-
1 files changed, 20 insertions(+), 1 deletion(-)
fs/ext3/namei.c +20 -1
@@ -2243,7 +2243,26 @@/* * ok, that's it */ -ext3_delete_entry (handle, old_dir, old_de, old_bh); + retval =ext3_delete_entry (handle, old_dir, old_de, old_bh); +if (retval == -ENOENT ) { +/* +* old_de could have moved out from under us. +*/ +struct buffer_head *old_bh2; +struct ext3_dir_entry_2 *old_de2; + + old_bh2 =ext3_find_entry (old_dentry, &old_de2); +if (old_bh2) { + retval =ext3_delete_entry (handle, old_dir, + old_de2, old_bh2); +brelse (old_bh2); + } + } +if (retval) { +ext3_warning (old_dir->i_sb,"ext3_rename" , +"Deleting old file (%lu), %d, error=%d" , + old_dir->i_ino, old_dir->i_nlink, retval); + }if (new_inode) { new_inode->i_nlink--;