public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Allow changing of journaling commit interval
@ 2002-07-24 23:46 Cort Dougan
  0 siblings, 0 replies; only message in thread
From: Cort Dougan @ 2002-07-24 23:46 UTC (permalink / raw)
  To: sct, linux-kernel

This patch addeds a sysctl entry for changing the journal commit interval
for ext3.

It's extracted from the -tmcitk (too many chefs in the kitchen) and the
-jrua (Joe random useless acronym) trees.

Stephen, can you take a look at this and tell me if the locking is sane and
safe for ext3?  I looked it over for some time and ran it in several
configurations without error but I'd consider the locking about as safe as
a Rusty Russell patch swinging a chainsaw until you gave it a look.

diff -Nru a/fs/jbd/journal.c b/fs/jbd/journal.c
--- a/fs/jbd/journal.c	Wed Jul 24 17:38:08 2002
+++ b/fs/jbd/journal.c	Wed Jul 24 17:38:08 2002
@@ -36,6 +36,7 @@
 #include <linux/slab.h>
 #include <asm/uaccess.h>
 #include <linux/proc_fs.h>
+#include <linux/sysctl.h>
 
 EXPORT_SYMBOL(journal_start);
 EXPORT_SYMBOL(journal_try_start);
@@ -195,6 +196,66 @@
 
 journal_t *current_journal;		// AKPM: debug
 
+/* sysctl variable for changing the commit interval on all journals */
+int journal_commit_interval = 5;
+
+#ifdef CONFIG_SYSCTL
+/*
+ * Change the value of journal_commit_interval and then change the
+ * corresponding value in every journal.  This function also resets
+ * the commit timers for the journal.
+ *  -- Cort <cort@fsmlabs.com>
+ */
+int journal_dointvec(ctl_table *table, int write, struct file *filp,
+		     void *buffer, size_t *lenp)
+{
+	int i;
+	struct list_head *list;
+
+	/* do the normal parsing to get an int */
+	if ( (i = proc_dointvec(table,write,filp,buffer,lenp)) )
+		return i;
+
+	/* we have the new value, change it in all journals */
+	list_for_each(list, &all_journals)
+	{
+		unsigned long new_expires;
+		
+		journal_t *journal =
+			list_entry(list, journal_t, j_all_journals);
+
+		lock_journal(journal);
+		
+		/* compute the new expire time */
+		new_expires = (journal->j_commit_timer->expires -
+			       journal->j_commit_interval) +
+			(journal_commit_interval*HZ);
+			
+		/* set the new interval */
+		journal->j_commit_interval =
+			journal_commit_interval*HZ;
+
+		/* set the new expire for the transaction */
+		if ( journal->j_running_transaction )
+			journal->j_running_transaction->t_expires =
+				new_expires;
+		
+		/* Adjust each timer for the new interval taking
+		 * into account how long it has already been since
+		 * the last commit.  We don't modify timers that
+		 * are not already active since they get set and
+		 * activated elsewhere when they're needed.
+		 */
+		if ( journal->j_commit_timer_active )
+			mod_timer( journal->j_commit_timer, new_expires );
+
+		unlock_journal(journal);
+	}
+	
+	return 0;
+}
+#endif /* CONFIG_SYSCTL */
+
 int kjournald(void *arg)
 {
 	journal_t *journal = (journal_t *) arg;
@@ -688,7 +749,7 @@
 	init_MUTEX(&journal->j_checkpoint_sem);
 	init_MUTEX(&journal->j_sem);
 
-	journal->j_commit_interval = (HZ * 5);
+	journal->j_commit_interval = journal_commit_interval*HZ;
 
 	/* The journal is marked for error until we succeed with recovery! */
 	journal->j_flags = JFS_ABORT;
diff -Nru a/include/linux/sysctl.h b/include/linux/sysctl.h
--- a/include/linux/sysctl.h	Wed Jul 24 17:38:08 2002
+++ b/include/linux/sysctl.h	Wed Jul 24 17:38:08 2002
@@ -543,6 +543,7 @@
 	FS_LEASES=13,	/* int: leases enabled */
 	FS_DIR_NOTIFY=14,	/* int: directory notification enabled */
 	FS_LEASE_TIME=15,	/* int: maximum time to wait for a lease break */
+	FS_JOURNAL_TIMEOUT=16,	/* int: time between journal commits */
 };
 
 /* CTL_DEBUG names: */
diff -Nru a/kernel/sysctl.c b/kernel/sysctl.c
--- a/kernel/sysctl.c	Wed Jul 24 17:38:07 2002
+++ b/kernel/sysctl.c	Wed Jul 24 17:38:07 2002
@@ -91,6 +91,12 @@
 		  void *buffer, size_t *lenp);
 #endif
 
+#ifdef CONFIG_EXT3_FS
+extern int journal_commit_interval;
+int journal_dointvec(ctl_table *, int, struct file *, void *, size_t *);
+#endif /* CONFIG_EXT3_FS */
+
+
 #ifdef CONFIG_BSD_PROCESS_ACCT
 extern int acct_parm[];
 #endif
@@ -306,6 +312,10 @@
 	 sizeof(int), 0644, NULL, &proc_dointvec},
 	{FS_LEASE_TIME, "lease-break-time", &lease_break_time, sizeof(int),
 	 0644, NULL, &proc_dointvec},
+#ifdef CONFIG_EXT3_FS
+	{FS_JOURNAL_TIMEOUT, "journal-commit-interval",
+	 &journal_commit_interval, sizeof(int), 0644, NULL, &journal_dointvec},
+#endif /* CONFIG_EXT3_FS */
 	{0}
 };
 

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2002-07-24 23:49 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-07-24 23:46 [PATCH] Allow changing of journaling commit interval Cort Dougan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox