]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] tunable ext3 commit interval
authorAndrew Morton <akpm@zip.com.au>
Sat, 10 Aug 2002 09:44:42 +0000 (02:44 -0700)
committerLinus Torvalds <torvalds@home.transmeta.com>
Sat, 10 Aug 2002 09:44:42 +0000 (02:44 -0700)
The patch from Stephen Tweedie allows users to modify the journal
commit interval for the ext3 filesystem.

The commit interval is normally five seconds.  For portable computers
with spun-down drives it is advantageous to be able to increase the
commit interval.

There may also be advantages in decreasing the commit interval for
specialised applications such as heavily-loaded NFS servers which are
using synchronous exports.

The laptop users will also need to increase the pdflush periodic
writeback interval (/proc/sys/vm/dirty_writeback_centisecs), because
the `kupdate' activity also forces a commit.

To specify the commit interval, use

mount -o commit=30 /dev/hda1 /mnt/whatever

or
mount -o remount,commit=30 /dev/hda1

The commit interval is specified in units of seconds.

fs/ext3/super.c

index b8b59aebd39350f6b37ffb91e224079231ff7740..636d940940b74f5c6d492288f623a02abd7d47ae 100644 (file)
@@ -696,6 +696,11 @@ static int parse_options (char * options, unsigned long * sb_block,
                                *mount_options &= ~EXT3_MOUNT_DATA_FLAGS;
                                *mount_options |= data_opt;
                        }
+               } else if (!strcmp (this_char, "commit")) {
+                       unsigned long v;
+                       if (want_numeric(value, "commit", &v))
+                               return 0;
+                       sbi->s_commit_interval = (HZ * v);
                } else {
                        printk (KERN_ERR 
                                "EXT3-fs: Unrecognized mount option %s\n",
@@ -1260,6 +1265,22 @@ out_fail:
        return -EINVAL;
 }
 
+/*
+ * Setup any per-fs journal parameters now.  We'll do this both on
+ * initial mount, once the journal has been initialised but before we've
+ * done any recovery; and again on any subsequent remount. 
+ */
+static void ext3_init_journal_params(struct ext3_sb_info *sbi, 
+                                    journal_t *journal)
+{
+       if (sbi->s_commit_interval)
+               journal->j_commit_interval = sbi->s_commit_interval;
+       /* We could also set up an ext3-specific default for the commit
+        * interval here, but for now we'll just fall back to the jbd
+        * default. */
+}
+
+
 static journal_t *ext3_get_journal(struct super_block *sb, int journal_inum)
 {
        struct inode *journal_inode;
@@ -1294,7 +1315,7 @@ static journal_t *ext3_get_journal(struct super_block *sb, int journal_inum)
                printk(KERN_ERR "EXT3-fs: Could not load journal inode\n");
                iput(journal_inode);
        }
-       
+       ext3_init_journal_params(EXT3_SB(sb), journal);
        return journal;
 }
 
@@ -1371,6 +1392,7 @@ static journal_t *ext3_get_dev_journal(struct super_block *sb,
                goto out_journal;
        }
        EXT3_SB(sb)->journal_bdev = bdev;
+       ext3_init_journal_params(EXT3_SB(sb), journal);
        return journal;
 out_journal:
        journal_destroy(journal);
@@ -1667,6 +1689,8 @@ int ext3_remount (struct super_block * sb, int * flags, char * data)
 
        es = sbi->s_es;
 
+       ext3_init_journal_params(sbi, sbi->s_journal);
+       
        if ((*flags & MS_RDONLY) != (sb->s_flags & MS_RDONLY)) {
                if (sbi->s_mount_opt & EXT3_MOUNT_ABORT)
                        return -EROFS;