Skip to content

Commit 112e041

Browse files
Jaegeuk KimHashcode
authored andcommitted
f2fs: remove costly bit operations for f2fs_find_entry
It turns out that a bit operation like find_next_bit is not always fast enough for f2fs_find_entry. Instead, it is pretty much simple and fast to traverse each dentries. Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
1 parent 6326e56 commit 112e041

File tree

1 file changed

+17
-15
lines changed

1 file changed

+17
-15
lines changed

fs/f2fs/dir.c

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -93,37 +93,39 @@ static struct f2fs_dir_entry *find_in_block(struct page *dentry_page,
9393
f2fs_hash_t namehash, struct page **res_page)
9494
{
9595
struct f2fs_dir_entry *de;
96-
unsigned long bit_pos, end_pos, next_pos;
96+
unsigned long bit_pos = 0;
9797
struct f2fs_dentry_block *dentry_blk = kmap(dentry_page);
98-
int slots;
98+
int max_len = 0;
9999

100-
bit_pos = find_next_bit_le(&dentry_blk->dentry_bitmap,
101-
NR_DENTRY_IN_BLOCK, 0);
102100
while (bit_pos < NR_DENTRY_IN_BLOCK) {
103101
de = &dentry_blk->dentry[bit_pos];
104-
slots = GET_DENTRY_SLOTS(le16_to_cpu(de->name_len));
105-
102+
if (!test_bit_le(bit_pos, &dentry_blk->dentry_bitmap)) {
103+
if (bit_pos == 0)
104+
max_len = 1;
105+
else if (!test_bit_le(bit_pos - 1, &dentry_blk->dentry_bitmap))
106+
max_len++;
107+
bit_pos++;
108+
continue;
109+
}
106110
if (early_match_name(name, namelen, namehash, de)) {
107111
if (!memcmp(dentry_blk->filename[bit_pos],
108112
name, namelen)) {
109113
*res_page = dentry_page;
110114
goto found;
111115
}
112116
}
113-
next_pos = bit_pos + slots;
114-
bit_pos = find_next_bit_le(&dentry_blk->dentry_bitmap,
115-
NR_DENTRY_IN_BLOCK, next_pos);
116-
if (bit_pos >= NR_DENTRY_IN_BLOCK)
117-
end_pos = NR_DENTRY_IN_BLOCK;
118-
else
119-
end_pos = bit_pos;
120-
if (*max_slots < end_pos - next_pos)
121-
*max_slots = end_pos - next_pos;
117+
if (max_len > *max_slots) {
118+
*max_slots = max_len;
119+
max_len = 0;
120+
}
121+
bit_pos += GET_DENTRY_SLOTS(le16_to_cpu(de->name_len));
122122
}
123123

124124
de = NULL;
125125
kunmap(dentry_page);
126126
found:
127+
if (max_len > *max_slots)
128+
*max_slots = max_len;
127129
return de;
128130
}
129131

0 commit comments

Comments
 (0)