From 433091efbff0664b1f1e33dcc2592752785ed181 Mon Sep 17 00:00:00 2001 From: Tao Ma Date: Mon, 10 Dec 2012 14:05:59 -0500 Subject: [PATCH] --- yaml --- r: 344884 b: refs/heads/master c: 7335cd3b41b1e704608ca46159641ca9cb598121 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/fs/ext4/ext4.h | 7 +++++++ trunk/fs/ext4/namei.c | 26 +++++++++++++++++++------- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/[refs] b/[refs] index 124cc979eb54..b91e5162ca66 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 65d165d9366dbf783d0102177006d47c8859ba31 +refs/heads/master: 7335cd3b41b1e704608ca46159641ca9cb598121 diff --git a/trunk/fs/ext4/ext4.h b/trunk/fs/ext4/ext4.h index e3a74658c63c..a971b65bf5ca 100644 --- a/trunk/fs/ext4/ext4.h +++ b/trunk/fs/ext4/ext4.h @@ -2122,6 +2122,13 @@ extern int ext4_orphan_add(handle_t *, struct inode *); extern int ext4_orphan_del(handle_t *, struct inode *); extern int ext4_htree_fill_tree(struct file *dir_file, __u32 start_hash, __u32 start_minor_hash, __u32 *next_hash); +extern int search_dir(struct buffer_head *bh, + char *search_buf, + int buf_size, + struct inode *dir, + const struct qstr *d_name, + unsigned int offset, + struct ext4_dir_entry_2 **res_dir); /* resize.c */ extern int ext4_group_add(struct super_block *sb, diff --git a/trunk/fs/ext4/namei.c b/trunk/fs/ext4/namei.c index 3cde36bd8020..d50684b91496 100644 --- a/trunk/fs/ext4/namei.c +++ b/trunk/fs/ext4/namei.c @@ -1005,6 +1005,16 @@ int ext4_htree_fill_tree(struct file *dir_file, __u32 start_hash, return (err); } +static inline int search_dirblock(struct buffer_head *bh, + struct inode *dir, + const struct qstr *d_name, + unsigned int offset, + struct ext4_dir_entry_2 **res_dir) +{ + return search_dir(bh, bh->b_data, dir->i_sb->s_blocksize, dir, + d_name, offset, res_dir); +} + /* * Directory block splitting, compacting @@ -1098,11 +1108,13 @@ static inline int ext4_match (int len, const char * const name, /* * Returns 0 if not found, -1 on failure, and 1 on success */ -static inline int search_dirblock(struct buffer_head *bh, - struct inode *dir, - const struct qstr *d_name, - unsigned int offset, - struct ext4_dir_entry_2 ** res_dir) +int search_dir(struct buffer_head *bh, + char *search_buf, + int buf_size, + struct inode *dir, + const struct qstr *d_name, + unsigned int offset, + struct ext4_dir_entry_2 **res_dir) { struct ext4_dir_entry_2 * de; char * dlimit; @@ -1110,8 +1122,8 @@ static inline int search_dirblock(struct buffer_head *bh, const char *name = d_name->name; int namelen = d_name->len; - de = (struct ext4_dir_entry_2 *) bh->b_data; - dlimit = bh->b_data + dir->i_sb->s_blocksize; + de = (struct ext4_dir_entry_2 *)search_buf; + dlimit = search_buf + buf_size; while ((char *) de < dlimit) { /* this code is executed quadratically often */ /* do minimal checking `by hand' */