Messages in this thread | | | Date | Wed, 6 Nov 2002 16:40:27 -0500 | From | "Theodore Ts'o" <> | Subject | Re: [PATCH] Fix bug in ext3 htree rename: doesn't delete old name, leaves ino with bad nlink |
| |
On Wed, Nov 06, 2002 at 12:25:00AM -0800, chrisl@vmware.com wrote: > This should fix the ext3 htree rename problem. Please try it again.
I've looked over the patch, and I've got some comments....
> handle = ext3_journal_start(old_dir, 2 * EXT3_DATA_TRANS_BLOCKS + > - EXT3_INDEX_EXTRA_TRANS_BLOCKS + 2); > + EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3);
There's no need to increase the number of blocks that might need to be dirtied; if ext3_delete_entry() can't find the missing entry, it won't dirty the block, so the number of blocks that might need to modified remains constant.
> - 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 can be moved during ext3_add_entry. > + */ > + 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); > + } else { > + ext3_warning(old_dir->i_sb, "ext3_rename", > + "Deleting old file not found (%lu), %d", > + old_dir->i_ino, old_dir->i_nlink); > + } > > + }
Simply retrying the ext3_delete_entry() isn't sufficient, since another ext3_add_entry() could move the directory entry again while you're reading in the blocks as part of ext3_find_entry(). OK, that would be pretty rare, since enough other directory adds would have to fill up enough that another split could happen, but *is* possible. (Surely our scheduler isn't that unfair....)
Probably a better thing to do is use a while loop, and retry as long (a) ext3_delete_entry fails, and (b) old_dir->i_version has changed. In practice this will probably never happen, but I'll feel better with that change.
Anyway, I plan to make these two changes to your patch, and then submit it to Linus.
- Ted - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |