mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-29 23:53:32 +00:00
f2fs: plug readahead IO in readdir()
Add a plug to merge readahead IO in readdir(), expecting it can reduce bio count before submitting to block layer. Signed-off-by: Chao Yu <yuchao0@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
parent
042be0f849
commit
e1293bdfa0
1 changed files with 16 additions and 6 deletions
|
@ -784,9 +784,15 @@ int f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d,
|
||||||
struct f2fs_dir_entry *de = NULL;
|
struct f2fs_dir_entry *de = NULL;
|
||||||
struct fscrypt_str de_name = FSTR_INIT(NULL, 0);
|
struct fscrypt_str de_name = FSTR_INIT(NULL, 0);
|
||||||
struct f2fs_sb_info *sbi = F2FS_I_SB(d->inode);
|
struct f2fs_sb_info *sbi = F2FS_I_SB(d->inode);
|
||||||
|
struct blk_plug plug;
|
||||||
|
bool readdir_ra = sbi->readdir_ra == 1;
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
bit_pos = ((unsigned long)ctx->pos % d->max);
|
bit_pos = ((unsigned long)ctx->pos % d->max);
|
||||||
|
|
||||||
|
if (readdir_ra)
|
||||||
|
blk_start_plug(&plug);
|
||||||
|
|
||||||
while (bit_pos < d->max) {
|
while (bit_pos < d->max) {
|
||||||
bit_pos = find_next_bit_le(d->bitmap, d->max, bit_pos);
|
bit_pos = find_next_bit_le(d->bitmap, d->max, bit_pos);
|
||||||
if (bit_pos >= d->max)
|
if (bit_pos >= d->max)
|
||||||
|
@ -806,29 +812,33 @@ int f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d,
|
||||||
|
|
||||||
if (f2fs_encrypted_inode(d->inode)) {
|
if (f2fs_encrypted_inode(d->inode)) {
|
||||||
int save_len = fstr->len;
|
int save_len = fstr->len;
|
||||||
int err;
|
|
||||||
|
|
||||||
err = fscrypt_fname_disk_to_usr(d->inode,
|
err = fscrypt_fname_disk_to_usr(d->inode,
|
||||||
(u32)de->hash_code, 0,
|
(u32)de->hash_code, 0,
|
||||||
&de_name, fstr);
|
&de_name, fstr);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
goto out;
|
||||||
|
|
||||||
de_name = *fstr;
|
de_name = *fstr;
|
||||||
fstr->len = save_len;
|
fstr->len = save_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!dir_emit(ctx, de_name.name, de_name.len,
|
if (!dir_emit(ctx, de_name.name, de_name.len,
|
||||||
le32_to_cpu(de->ino), d_type))
|
le32_to_cpu(de->ino), d_type)) {
|
||||||
return 1;
|
err = 1;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
if (sbi->readdir_ra == 1)
|
if (readdir_ra)
|
||||||
f2fs_ra_node_page(sbi, le32_to_cpu(de->ino));
|
f2fs_ra_node_page(sbi, le32_to_cpu(de->ino));
|
||||||
|
|
||||||
bit_pos += GET_DENTRY_SLOTS(le16_to_cpu(de->name_len));
|
bit_pos += GET_DENTRY_SLOTS(le16_to_cpu(de->name_len));
|
||||||
ctx->pos = start_pos + bit_pos;
|
ctx->pos = start_pos + bit_pos;
|
||||||
}
|
}
|
||||||
return 0;
|
out:
|
||||||
|
if (readdir_ra)
|
||||||
|
blk_finish_plug(&plug);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int f2fs_readdir(struct file *file, struct dir_context *ctx)
|
static int f2fs_readdir(struct file *file, struct dir_context *ctx)
|
||||||
|
|
Loading…
Reference in a new issue