Commit 39fec688 authored by Shaoying Xu's avatar Shaoying Xu Committed by Theodore Ts'o

ext4: fix lazy initialization next schedule time computation in more granular unit

Ext4 file system has default lazy inode table initialization setup once
it is mounted. However, it has issue on computing the next schedule time
that makes the timeout same amount in jiffies but different real time in
secs if with various HZ values. Therefore, fix by measuring the current
time in a more granular unit nanoseconds and make the next schedule time
independent of the HZ value.

Fixes: bfff6873 ("ext4: add support for lazy inode table initialization")
Signed-off-by: default avatarShaoying Xu <shaoyi@amazon.com>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
Link: https://lore.kernel.org/r/20210902164412.9994-2-shaoyi@amazon.comSigned-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
parent 3eda41df
...@@ -3263,9 +3263,9 @@ static int ext4_run_li_request(struct ext4_li_request *elr) ...@@ -3263,9 +3263,9 @@ static int ext4_run_li_request(struct ext4_li_request *elr)
struct super_block *sb = elr->lr_super; struct super_block *sb = elr->lr_super;
ext4_group_t ngroups = EXT4_SB(sb)->s_groups_count; ext4_group_t ngroups = EXT4_SB(sb)->s_groups_count;
ext4_group_t group = elr->lr_next_group; ext4_group_t group = elr->lr_next_group;
unsigned long timeout = 0;
unsigned int prefetch_ios = 0; unsigned int prefetch_ios = 0;
int ret = 0; int ret = 0;
u64 start_time;
if (elr->lr_mode == EXT4_LI_MODE_PREFETCH_BBITMAP) { if (elr->lr_mode == EXT4_LI_MODE_PREFETCH_BBITMAP) {
elr->lr_next_group = ext4_mb_prefetch(sb, group, elr->lr_next_group = ext4_mb_prefetch(sb, group,
...@@ -3302,14 +3302,13 @@ static int ext4_run_li_request(struct ext4_li_request *elr) ...@@ -3302,14 +3302,13 @@ static int ext4_run_li_request(struct ext4_li_request *elr)
ret = 1; ret = 1;
if (!ret) { if (!ret) {
timeout = jiffies; start_time = ktime_get_real_ns();
ret = ext4_init_inode_table(sb, group, ret = ext4_init_inode_table(sb, group,
elr->lr_timeout ? 0 : 1); elr->lr_timeout ? 0 : 1);
trace_ext4_lazy_itable_init(sb, group); trace_ext4_lazy_itable_init(sb, group);
if (elr->lr_timeout == 0) { if (elr->lr_timeout == 0) {
timeout = (jiffies - timeout) * elr->lr_timeout = nsecs_to_jiffies((ktime_get_real_ns() - start_time) *
EXT4_SB(elr->lr_super)->s_li_wait_mult; EXT4_SB(elr->lr_super)->s_li_wait_mult);
elr->lr_timeout = timeout;
} }
elr->lr_next_sched = jiffies + elr->lr_timeout; elr->lr_next_sched = jiffies + elr->lr_timeout;
elr->lr_next_group = group + 1; elr->lr_next_group = group + 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment