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)