From: Andrew Morton <akpm@zip.com.au>
To: Miles Lane <miles@megapathdsl.net>
Cc: LKML <linux-kernel@vger.kernel.org>
Subject: Re: Automatically mount or remount EXT3 partitions with EXT2 when alaptop is powered by a battery?
Date: Tue, 25 Jun 2002 10:03:47 -0700 [thread overview]
Message-ID: <3D18A273.284F8EDD@zip.com.au> (raw)
In-Reply-To: 1024948946.30229.19.camel@turbulence.megapathdsl.net
Miles Lane wrote:
>
> Hi,
>
> Is there any possibility we could:
>
> 1) Add support to the boot/mounting process
> so that, if a machine is being powered by
> battery, EXT3 partitions are mounted with
> EXT2, instead?
>
> 2) While the machine is running, notice when the
> power source switches between AC and battery
> or vice versa and remount partitions EXT3
> partitions to use EXT2 whenever a battery is
> being used?
>
umm, why?
If it's because of the disk-spins-up-too-much problem then
that can be addressed by allowing the commit interval to be
set to larger values.
--- 2.4.19-pre10/fs/jbd/journal.c~ext3-commit-interval Fri Jun 7 22:56:37 2002
+++ 2.4.19-pre10-akpm/fs/jbd/journal.c Sat Jun 8 00:30:32 2002
@@ -34,6 +34,7 @@
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/slab.h>
+#include <linux/sysctl.h>
#include <asm/uaccess.h>
#include <linux/proc_fs.h>
@@ -85,6 +86,8 @@ EXPORT_SYMBOL(journal_force_commit);
static int journal_convert_superblock_v1(journal_t *, journal_superblock_t *);
+int jbd_commit_interval = 5; /* /proc/sys/fs/jbd_commit_interval */
+
/*
* journal_datalist_lock is used to protect data buffers:
*
@@ -223,8 +226,8 @@ int kjournald(void *arg)
journal->j_task = current;
wake_up(&journal->j_wait_done_commit);
- printk(KERN_INFO "kjournald starting. Commit interval %ld seconds\n",
- journal->j_commit_interval / HZ);
+ printk(KERN_INFO "kjournald starting. Commit interval %d seconds\n",
+ jbd_commit_interval);
list_add(&journal->j_all_journals, &all_journals);
/* And now, wait forever for commit wakeup events. */
@@ -708,8 +711,6 @@ static journal_t * journal_init_common (
init_MUTEX(&journal->j_checkpoint_sem);
init_MUTEX(&journal->j_sem);
- journal->j_commit_interval = (HZ * 5);
-
/* The journal is marked for error until we succeed with recovery! */
journal->j_flags = JFS_ABORT;
@@ -1775,59 +1776,41 @@ int journal_enable_debug;
EXPORT_SYMBOL(journal_enable_debug);
#endif
-#if defined(CONFIG_JBD_DEBUG) && defined(CONFIG_PROC_FS)
-
-static struct proc_dir_entry *proc_jbd_debug;
-
-int read_jbd_debug(char *page, char **start, off_t off,
- int count, int *eof, void *data)
-{
- int ret;
-
- ret = sprintf(page + off, "%d\n", journal_enable_debug);
- *eof = 1;
- return ret;
-}
+static ctl_table jbd_table[] = {
+ { 1, "jbd-commit-interval", &jbd_commit_interval,
+ sizeof(jbd_commit_interval), 0644, NULL,
+ &proc_dointvec, NULL, },
+#ifdef CONFIG_JBD_DEBUG
+ { 2, "jbd-debug", &journal_enable_debug,
+ sizeof(journal_enable_debug), 0644, NULL,
+ &proc_dointvec, NULL, },
+#endif
+ { 0, },
+};
-int write_jbd_debug(struct file *file, const char *buffer,
- unsigned long count, void *data)
-{
- char buf[32];
+static ctl_table jbd_root[] = {
+ { FS_JBD, "jbd", NULL, 0, 0755, jbd_table, },
+ { 0, },
+};
- if (count > ARRAY_SIZE(buf) - 1)
- count = ARRAY_SIZE(buf) - 1;
- if (copy_from_user(buf, buffer, count))
- return -EFAULT;
- buf[ARRAY_SIZE(buf) - 1] = '\0';
- journal_enable_debug = simple_strtoul(buf, NULL, 10);
- return count;
-}
+static ctl_table fs_root[] = {
+ { CTL_FS, "fs", NULL, 0, 0755, jbd_root, },
+ { 0, },
+};
-#define JBD_PROC_NAME "sys/fs/jbd-debug"
+static struct ctl_table_header *sysctl_header;
-static void __init create_jbd_proc_entry(void)
+static void __init create_jbd_sysctls(void)
{
- proc_jbd_debug = create_proc_entry(JBD_PROC_NAME, 0644, NULL);
- if (proc_jbd_debug) {
- /* Why is this so hard? */
- proc_jbd_debug->read_proc = read_jbd_debug;
- proc_jbd_debug->write_proc = write_jbd_debug;
- }
+ sysctl_header = register_sysctl_table(fs_root, 0);
}
-static void __exit remove_jbd_proc_entry(void)
+static void __exit remove_jbd_sysctls(void)
{
- if (proc_jbd_debug)
- remove_proc_entry(JBD_PROC_NAME, NULL);
+ if (sysctl_header)
+ unregister_sysctl_table(sysctl_header);
}
-#else
-
-#define create_jbd_proc_entry() do {} while (0)
-#define remove_jbd_proc_entry() do {} while (0)
-
-#endif
-
/*
* Module startup and shutdown
*/
@@ -1856,7 +1839,7 @@ static int __init journal_init(void)
ret = journal_init_caches();
if (ret != 0)
journal_destroy_caches();
- create_jbd_proc_entry();
+ create_jbd_sysctls();
return ret;
}
@@ -1867,7 +1850,7 @@ static void __exit journal_exit(void)
if (n)
printk(KERN_EMERG "JBD: leaked %d journal_heads!\n", n);
#endif
- remove_jbd_proc_entry();
+ remove_jbd_sysctls();
journal_destroy_caches();
}
--- 2.4.19-pre10/fs/jbd/transaction.c~ext3-commit-interval Fri Jun 7 22:56:37 2002
+++ 2.4.19-pre10-akpm/fs/jbd/transaction.c Fri Jun 7 22:56:37 2002
@@ -56,7 +56,7 @@ static transaction_t * get_transaction (
transaction->t_journal = journal;
transaction->t_state = T_RUNNING;
transaction->t_tid = journal->j_transaction_sequence++;
- transaction->t_expires = jiffies + journal->j_commit_interval;
+ transaction->t_expires = jiffies + jbd_commit_interval * HZ;
/* Set up the commit timer for the new transaction. */
J_ASSERT (!journal->j_commit_timer_active);
--- 2.4.19-pre10/include/linux/ext3_fs_sb.h~ext3-commit-interval Fri Jun 7 22:56:37 2002
+++ 2.4.19-pre10-akpm/include/linux/ext3_fs_sb.h Fri Jun 7 22:57:32 2002
@@ -67,7 +67,6 @@ struct ext3_sb_info {
struct inode * s_journal_inode;
struct journal_s * s_journal;
struct list_head s_orphan;
- unsigned long s_commit_interval;
struct block_device *journal_bdev;
#ifdef CONFIG_JBD_DEBUG
struct timer_list turn_ro_timer; /* For turning read-only (crash simulation) */
--- 2.4.19-pre10/include/linux/jbd.h~ext3-commit-interval Fri Jun 7 22:56:37 2002
+++ 2.4.19-pre10-akpm/include/linux/jbd.h Fri Jun 7 22:58:07 2002
@@ -522,10 +522,6 @@ struct journal_s
* compound commit transaction */
int j_max_transaction_buffers;
- /* What is the maximum transaction lifetime before we begin a
- * commit? */
- unsigned long j_commit_interval;
-
/* The timer used to wakeup the commit thread: */
struct timer_list * j_commit_timer;
int j_commit_timer_active;
@@ -864,6 +860,8 @@ static inline int buffer_jbd_data(struct
#endif /* CONFIG_JBD || CONFIG_JBD_MODULE || !__KERNEL__ */
+extern int jbd_commit_interval;
+
/*
* Compatibility no-ops which allow the kernel to compile without CONFIG_JBD
* go here.
--- 2.4.19-pre10/include/linux/sysctl.h~ext3-commit-interval Sat Jun 8 00:03:48 2002
+++ 2.4.19-pre10-akpm/include/linux/sysctl.h Sat Jun 8 00:04:22 2002
@@ -546,6 +546,7 @@ enum
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_JBD, /* JBD subdir */
};
/* CTL_DEBUG names: */
--- 2.4.19-pre10/Documentation/sysctl/fs.txt~ext3-commit-interval Sat Jun 8 00:30:58 2002
+++ 2.4.19-pre10-akpm/Documentation/sysctl/fs.txt Sat Jun 8 00:39:50 2002
@@ -27,6 +27,7 @@ Currently, these files are in /proc/sys/
- overflowgid
- super-max
- super-nr
+- jbd/
Documentation for the files in /proc/sys/fs/binfmt_misc is
in Documentation/binfmt_misc.txt.
@@ -138,3 +139,40 @@ thus the maximum number of mounted files
can have. You only need to increase super-max if you need to
mount more filesystems than the current value in super-max
allows you to.
+
+==============================================================
+
+jbd/jbd-commit-interval:
+
+Defines, in seconds, the largest period of time for which the
+Journalled Block Device driver (JBD) will allow dirty data to remain in
+memory. JBD is used by the ext3 filesystem.
+
+The default value is five seconds. Increasing this value will provide
+"longer" transactions, and may be used to avoid repetitive spinup of
+disk drives.
+
+Note that `kupdate' activity will also cause a JBD commit, so it is
+necessary to also increase the bdflush `interval' parameter. This is
+the fifth field in /proc/sys/vm/bdflush.
+
+It should be noted that increasing the value of `jbd-commit-interval'
+will increase the potential for data loss in the event of a system
+crash. ext3 recovery will only restore the filesystem state to that
+which pertained at the time of the last commit. So setting this to
+five minutes means that you can lose up to five minute's worth of data.
+
+==============================================================
+
+jbd/jbd-debug:
+
+If the kernel was compiled for JBD debugging then this sysctl will
+cause status information to be generated by the JBD driver. The
+default value is zero (no debugging). Larger values cause ore
+information to be emitted into the system logs.
+
+Note that system logging messages can themselves generate disk activity
+which will trigger more JBD debug messages. So this option can cause a
+rapid growth in logfile usage if it is used while a kernel logging
+daemon is in operation.
+
-
next prev parent reply other threads:[~2002-06-25 17:05 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-06-24 20:02 Automatically mount or remount EXT3 partitions with EXT2 when a laptop is powered by a battery? Miles Lane
2002-06-24 20:23 ` Andreas Dilger
2002-06-24 20:27 ` Richard B. Johnson
2002-06-25 17:03 ` Andrew Morton [this message]
2002-06-25 17:24 ` Automatically mount or remount EXT3 partitions with EXT2 when alaptop " Miles Lane
2002-06-25 19:35 ` Andrew Morton
2002-07-03 3:02 ` Pavel Machek
2002-06-26 0:13 ` Stephen Tweedie
2002-06-26 18:39 ` Andrew Morton
2002-07-02 13:23 ` Stephen C. Tweedie
2002-07-03 3:04 ` Pavel Machek
2002-06-28 21:59 ` Daniel Kobras
2002-07-02 12:13 ` Stephen C. Tweedie
2002-07-03 3:04 ` Pavel Machek
2002-07-04 20:30 ` Stephen Tweedie
2002-07-04 22:05 ` Daniel Kobras
2002-07-05 7:59 ` Stephen Tweedie
2002-07-06 0:58 ` Pavel Machek
2002-07-23 11:14 ` Stephen C. Tweedie
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3D18A273.284F8EDD@zip.com.au \
--to=akpm@zip.com.au \
--cc=linux-kernel@vger.kernel.org \
--cc=miles@megapathdsl.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.