Viewing: ext4-adjust-mmp-wait-time.patch
Index: linux-4.18.0-425.10.1.el8_7/fs/ext4/mmp.c
===================================================================
--- linux-4.18.0-425.10.1.el8_7.orig/fs/ext4/mmp.c
+++ linux-4.18.0-425.10.1.el8_7/fs/ext4/mmp.c
@@ -140,6 +140,7 @@ static int kmmpd(void *data)
unsigned long failed_writes = 0;
int mmp_update_interval = le16_to_cpu(es->s_mmp_update_interval);
unsigned mmp_check_interval;
+ unsigned new_check_interval;
unsigned long last_update_time;
unsigned long diff;
int retval = 0;
@@ -187,6 +188,8 @@ static int kmmpd(void *data)
}
diff = jiffies - last_update_time;
+ new_check_interval = EXT4_MMP_CHECK_MULT * diff / HZ;
+
if (diff < mmp_update_interval * HZ)
schedule_timeout_interruptible(mmp_update_interval *
HZ - diff);
@@ -226,12 +229,16 @@ static int kmmpd(void *data)
}
/*
- * Adjust the mmp_check_interval depending on how much time
- * it took for the MMP block to be written.
+ * Increase mmp_check_interval immediately if IO completion time
+ * is longer, but decay slowly to minimum if it is shorter.
*/
- mmp_check_interval = max(min(EXT4_MMP_CHECK_MULT * diff / HZ,
- EXT4_MMP_MAX_CHECK_INTERVAL),
- EXT4_MMP_MIN_CHECK_INTERVAL);
+ if (new_check_interval >= mmp_check_interval)
+ mmp_check_interval = min_t(unsigned, new_check_interval,
+ EXT4_MMP_MAX_CHECK_INTERVAL);
+ else
+ mmp_check_interval = (mmp_check_interval * 15 +
+ max_t(unsigned, new_check_interval,
+ EXT4_MMP_MIN_CHECK_INTERVAL)) / 16;
mmp->mmp_check_interval = cpu_to_le16(mmp_check_interval);
}
@@ -288,7 +295,7 @@ int ext4_multi_mount_protect(struct supe
struct mmp_struct *mmp = NULL;
u32 seq;
unsigned int mmp_check_interval = le16_to_cpu(es->s_mmp_update_interval);
- unsigned int wait_time = 0;
+ unsigned int wait_time = 2;
int retval;
if (mmp_block < le32_to_cpu(es->s_first_data_block) ||
@@ -323,7 +330,7 @@ int ext4_multi_mount_protect(struct supe
}
wait_time = min(mmp_check_interval * 2 + 1,
- mmp_check_interval + 60);
+ mmp_check_interval + 20);
/* Print MMP interval if more than 20 secs. */
if (wait_time > EXT4_MMP_MIN_CHECK_INTERVAL * 4)