diff options
author | Joel Becker <joel.becker@oracle.com> | 2009-04-30 02:55:08 +0200 |
---|---|---|
committer | Joel Becker <joel.becker@oracle.com> | 2009-04-30 22:21:56 +0200 |
commit | dfa13f39b798fee68250abe1aed851395c8b51b5 (patch) | |
tree | 9a563954a2b7f34cb005a35152213d734f4763c9 /fs | |
parent | ocfs2/trivial: Remove unused variable in ocfs2_rename. (diff) | |
download | linux-dfa13f39b798fee68250abe1aed851395c8b51b5.tar.xz linux-dfa13f39b798fee68250abe1aed851395c8b51b5.zip |
ocfs2: Fix a missing credit when deleting from indexed directories.
The ocfs2 directory index updates two blocks when we remove an entry -
the dx root and the dx leaf. OCFS2_DELETE_INODE_CREDITS was only
accounting for the dx leaf. This shows up when ocfs2_delete_inode()
runs out of credits in jbd2_journal_dirty_metadata() at
"J_ASSERT_JH(jh, handle->h_buffer_credits > 0);".
The test that caught this was running dirop_file_racer from the
ocfs2-test suite with a 250-character filename PREFIX. Run on a 512B
blocksize, it forces the orphan dir index to grow large enough to
trigger.
Signed-off-by: Joel Becker <joel.becker@oracle.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/ocfs2/journal.h | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/fs/ocfs2/journal.h b/fs/ocfs2/journal.h index 619dd7f6c053..eb7b76331eb7 100644 --- a/fs/ocfs2/journal.h +++ b/fs/ocfs2/journal.h @@ -437,8 +437,9 @@ static inline int ocfs2_unlink_credits(struct super_block *sb) } /* dinode + orphan dir dinode + inode alloc dinode + orphan dir entry + - * inode alloc group descriptor + orphan dir index leaf */ -#define OCFS2_DELETE_INODE_CREDITS (3 * OCFS2_INODE_UPDATE_CREDITS + 3) + * inode alloc group descriptor + orphan dir index root + + * orphan dir index leaf */ +#define OCFS2_DELETE_INODE_CREDITS (3 * OCFS2_INODE_UPDATE_CREDITS + 4) /* dinode update, old dir dinode update, new dir dinode update, old * dir dir entry, new dir dir entry, dir entry update for renaming |