|
@@ -1005,6 +1005,16 @@ errout:
|
|
|
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' */
|