diff options
author | Mark Fasheh <mfasheh@suse.com> | 2008-11-12 19:27:44 -0500 |
---|---|---|
committer | Mark Fasheh <mfasheh@suse.com> | 2009-04-03 14:39:15 -0400 |
commit | 9b7895efac906d66d19856194e1ba61f37e231a4 (patch) | |
tree | 1ee6d2630cf3617251638170dcaceef41ddda8ec /fs/ocfs2/inode.c | |
parent | 4a12ca3a00a244e1fd1e673d151ea38b71e11d55 (diff) |
ocfs2: Add a name indexed b-tree to directory inodes
This patch makes use of Ocfs2's flexible btree code to add an additional
tree to directory inodes. The new tree stores an array of small,
fixed-length records in each leaf block. Each record stores a hash value,
and pointer to a block in the traditional (unindexed) directory tree where a
dirent with the given name hash resides. Lookup exclusively uses this tree
to find dirents, thus providing us with constant time name lookups.
Some of the hashing code was copied from ext3. Unfortunately, it has lots of
unfixed checkpatch errors. I left that as-is so that tracking changes would
be easier.
Signed-off-by: Mark Fasheh <mfasheh@suse.com>
Acked-by: Joel Becker <joel.becker@oracle.com>
Diffstat (limited to 'fs/ocfs2/inode.c')
-rw-r--r-- | fs/ocfs2/inode.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c index 229e707bc050..d273c4a51a00 100644 --- a/fs/ocfs2/inode.c +++ b/fs/ocfs2/inode.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include "ocfs2.h" | 38 | #include "ocfs2.h" |
39 | 39 | ||
40 | #include "alloc.h" | 40 | #include "alloc.h" |
41 | #include "dir.h" | ||
41 | #include "blockcheck.h" | 42 | #include "blockcheck.h" |
42 | #include "dlmglue.h" | 43 | #include "dlmglue.h" |
43 | #include "extent_map.h" | 44 | #include "extent_map.h" |
@@ -606,7 +607,7 @@ static int ocfs2_remove_inode(struct inode *inode, | |||
606 | } | 607 | } |
607 | 608 | ||
608 | handle = ocfs2_start_trans(osb, OCFS2_DELETE_INODE_CREDITS + | 609 | handle = ocfs2_start_trans(osb, OCFS2_DELETE_INODE_CREDITS + |
609 | ocfs2_quota_trans_credits(inode->i_sb)); | 610 | ocfs2_quota_trans_credits(inode->i_sb)); |
610 | if (IS_ERR(handle)) { | 611 | if (IS_ERR(handle)) { |
611 | status = PTR_ERR(handle); | 612 | status = PTR_ERR(handle); |
612 | mlog_errno(status); | 613 | mlog_errno(status); |
@@ -740,6 +741,15 @@ static int ocfs2_wipe_inode(struct inode *inode, | |||
740 | goto bail_unlock_dir; | 741 | goto bail_unlock_dir; |
741 | } | 742 | } |
742 | 743 | ||
744 | /* Remove any dir index tree */ | ||
745 | if (S_ISDIR(inode->i_mode)) { | ||
746 | status = ocfs2_dx_dir_truncate(inode, di_bh); | ||
747 | if (status) { | ||
748 | mlog_errno(status); | ||
749 | goto bail_unlock_dir; | ||
750 | } | ||
751 | } | ||
752 | |||
743 | /*Free extended attribute resources associated with this inode.*/ | 753 | /*Free extended attribute resources associated with this inode.*/ |
744 | status = ocfs2_xattr_remove(inode, di_bh); | 754 | status = ocfs2_xattr_remove(inode, di_bh); |
745 | if (status < 0) { | 755 | if (status < 0) { |