Skip to content

Commit 39fec68

Browse files
shaoyingxutytso
authored andcommitted
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: bfff687 ("ext4: add support for lazy inode table initialization") Signed-off-by: Shaoying Xu <[email protected]> Cc: [email protected] Signed-off-by: Theodore Ts'o <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Theodore Ts'o <[email protected]>
1 parent 3eda41d commit 39fec68

File tree

1 file changed

+4
-5
lines changed

1 file changed

+4
-5
lines changed

fs/ext4/super.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3263,9 +3263,9 @@ static int ext4_run_li_request(struct ext4_li_request *elr)
32633263
struct super_block *sb = elr->lr_super;
32643264
ext4_group_t ngroups = EXT4_SB(sb)->s_groups_count;
32653265
ext4_group_t group = elr->lr_next_group;
3266-
unsigned long timeout = 0;
32673266
unsigned int prefetch_ios = 0;
32683267
int ret = 0;
3268+
u64 start_time;
32693269

32703270
if (elr->lr_mode == EXT4_LI_MODE_PREFETCH_BBITMAP) {
32713271
elr->lr_next_group = ext4_mb_prefetch(sb, group,
@@ -3302,14 +3302,13 @@ static int ext4_run_li_request(struct ext4_li_request *elr)
33023302
ret = 1;
33033303

33043304
if (!ret) {
3305-
timeout = jiffies;
3305+
start_time = ktime_get_real_ns();
33063306
ret = ext4_init_inode_table(sb, group,
33073307
elr->lr_timeout ? 0 : 1);
33083308
trace_ext4_lazy_itable_init(sb, group);
33093309
if (elr->lr_timeout == 0) {
3310-
timeout = (jiffies - timeout) *
3311-
EXT4_SB(elr->lr_super)->s_li_wait_mult;
3312-
elr->lr_timeout = timeout;
3310+
elr->lr_timeout = nsecs_to_jiffies((ktime_get_real_ns() - start_time) *
3311+
EXT4_SB(elr->lr_super)->s_li_wait_mult);
33133312
}
33143313
elr->lr_next_sched = jiffies + elr->lr_timeout;
33153314
elr->lr_next_group = group + 1;

0 commit comments

Comments
 (0)