Browse Source

ocfs2: Support commit= mount option

Mostly taken from ext3. This allows the user to set the jbd commit interval,
in seconds. The default of 5 seconds stays the same, but now users can
easily increase the commit interval. Typically, this would be increased in
order to benefit performance at the expense of data-safety.

Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
Mark Fasheh 17 years ago
parent
commit
d147b3d630
4 changed files with 41 additions and 2 deletions
  1. 11 0
      Documentation/filesystems/ocfs2.txt
  2. 6 2
      fs/ocfs2/journal.c
  3. 1 0
      fs/ocfs2/ocfs2.h
  4. 23 0
      fs/ocfs2/super.c

+ 11 - 0
Documentation/filesystems/ocfs2.txt

@@ -61,3 +61,14 @@ data=writeback		Data ordering is not preserved, data may be written
 preferred_slot=0(*)	During mount, try to use this filesystem slot first. If
 preferred_slot=0(*)	During mount, try to use this filesystem slot first. If
 			it is in use by another node, the first empty one found
 			it is in use by another node, the first empty one found
 			will be chosen. Invalid values will be ignored.
 			will be chosen. Invalid values will be ignored.
+commit=nrsec	(*)	Ocfs2 can be told to sync all its data and metadata
+			every 'nrsec' seconds. The default value is 5 seconds.
+			This means that if you lose your power, you will lose
+			as much as the latest 5 seconds of work (your
+			filesystem will not be damaged though, thanks to the
+			journaling).  This default value (or any low value)
+			will hurt performance, but it's good for data-safety.
+			Setting it to 0 will have the same effect as leaving
+			it at the default (5 seconds).
+			Setting it to very large values will improve
+			performance.

+ 6 - 2
fs/ocfs2/journal.c

@@ -313,14 +313,18 @@ int ocfs2_journal_dirty_data(handle_t *handle,
 	return err;
 	return err;
 }
 }
 
 
-#define OCFS2_DEFAULT_COMMIT_INTERVAL 	(HZ * 5)
+#define OCFS2_DEFAULT_COMMIT_INTERVAL 	(HZ * JBD_DEFAULT_MAX_COMMIT_AGE)
 
 
 void ocfs2_set_journal_params(struct ocfs2_super *osb)
 void ocfs2_set_journal_params(struct ocfs2_super *osb)
 {
 {
 	journal_t *journal = osb->journal->j_journal;
 	journal_t *journal = osb->journal->j_journal;
+	unsigned long commit_interval = OCFS2_DEFAULT_COMMIT_INTERVAL;
+
+	if (osb->osb_commit_interval)
+		commit_interval = osb->osb_commit_interval;
 
 
 	spin_lock(&journal->j_state_lock);
 	spin_lock(&journal->j_state_lock);
-	journal->j_commit_interval = OCFS2_DEFAULT_COMMIT_INTERVAL;
+	journal->j_commit_interval = commit_interval;
 	if (osb->s_mount_opt & OCFS2_MOUNT_BARRIER)
 	if (osb->s_mount_opt & OCFS2_MOUNT_BARRIER)
 		journal->j_flags |= JFS_BARRIER;
 		journal->j_flags |= JFS_BARRIER;
 	else
 	else

+ 1 - 0
fs/ocfs2/ocfs2.h

@@ -229,6 +229,7 @@ struct ocfs2_super
 	wait_queue_head_t checkpoint_event;
 	wait_queue_head_t checkpoint_event;
 	atomic_t needs_checkpoint;
 	atomic_t needs_checkpoint;
 	struct ocfs2_journal *journal;
 	struct ocfs2_journal *journal;
+	unsigned long osb_commit_interval;
 
 
 	enum ocfs2_local_alloc_state local_alloc_state;
 	enum ocfs2_local_alloc_state local_alloc_state;
 	struct buffer_head *local_alloc_bh;
 	struct buffer_head *local_alloc_bh;

+ 23 - 0
fs/ocfs2/super.c

@@ -83,6 +83,7 @@ MODULE_LICENSE("GPL");
 
 
 struct mount_options
 struct mount_options
 {
 {
+	unsigned long	commit_interval;
 	unsigned long	mount_opt;
 	unsigned long	mount_opt;
 	unsigned int	atime_quantum;
 	unsigned int	atime_quantum;
 	signed short	slot;
 	signed short	slot;
@@ -149,6 +150,7 @@ enum {
 	Opt_data_writeback,
 	Opt_data_writeback,
 	Opt_atime_quantum,
 	Opt_atime_quantum,
 	Opt_slot,
 	Opt_slot,
+	Opt_commit,
 	Opt_err,
 	Opt_err,
 };
 };
 
 
@@ -164,6 +166,7 @@ static match_table_t tokens = {
 	{Opt_data_writeback, "data=writeback"},
 	{Opt_data_writeback, "data=writeback"},
 	{Opt_atime_quantum, "atime_quantum=%u"},
 	{Opt_atime_quantum, "atime_quantum=%u"},
 	{Opt_slot, "preferred_slot=%u"},
 	{Opt_slot, "preferred_slot=%u"},
+	{Opt_commit, "commit=%u"},
 	{Opt_err, NULL}
 	{Opt_err, NULL}
 };
 };
 
 
@@ -442,6 +445,8 @@ unlock_osb:
 		osb->s_mount_opt = parsed_options.mount_opt;
 		osb->s_mount_opt = parsed_options.mount_opt;
 		osb->s_atime_quantum = parsed_options.atime_quantum;
 		osb->s_atime_quantum = parsed_options.atime_quantum;
 		osb->preferred_slot = parsed_options.slot;
 		osb->preferred_slot = parsed_options.slot;
+		if (parsed_options.commit_interval)
+			osb->osb_commit_interval = parsed_options.commit_interval;
 
 
 		if (!ocfs2_is_hard_readonly(osb))
 		if (!ocfs2_is_hard_readonly(osb))
 			ocfs2_set_journal_params(osb);
 			ocfs2_set_journal_params(osb);
@@ -596,6 +601,7 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent)
 	osb->s_mount_opt = parsed_options.mount_opt;
 	osb->s_mount_opt = parsed_options.mount_opt;
 	osb->s_atime_quantum = parsed_options.atime_quantum;
 	osb->s_atime_quantum = parsed_options.atime_quantum;
 	osb->preferred_slot = parsed_options.slot;
 	osb->preferred_slot = parsed_options.slot;
+	osb->osb_commit_interval = parsed_options.commit_interval;
 
 
 	sb->s_magic = OCFS2_SUPER_MAGIC;
 	sb->s_magic = OCFS2_SUPER_MAGIC;
 
 
@@ -746,6 +752,7 @@ static int ocfs2_parse_options(struct super_block *sb,
 	mlog_entry("remount: %d, options: \"%s\"\n", is_remount,
 	mlog_entry("remount: %d, options: \"%s\"\n", is_remount,
 		   options ? options : "(none)");
 		   options ? options : "(none)");
 
 
+	mopt->commit_interval = 0;
 	mopt->mount_opt = 0;
 	mopt->mount_opt = 0;
 	mopt->atime_quantum = OCFS2_DEFAULT_ATIME_QUANTUM;
 	mopt->atime_quantum = OCFS2_DEFAULT_ATIME_QUANTUM;
 	mopt->slot = OCFS2_INVALID_SLOT;
 	mopt->slot = OCFS2_INVALID_SLOT;
@@ -815,6 +822,18 @@ static int ocfs2_parse_options(struct super_block *sb,
 			if (option)
 			if (option)
 				mopt->slot = (s16)option;
 				mopt->slot = (s16)option;
 			break;
 			break;
+		case Opt_commit:
+			option = 0;
+			if (match_int(&args[0], &option)) {
+				status = 0;
+				goto bail;
+			}
+			if (option < 0)
+				return 0;
+			if (option == 0)
+				option = JBD_DEFAULT_MAX_COMMIT_AGE;
+			mopt->commit_interval = HZ * option;
+			break;
 		default:
 		default:
 			mlog(ML_ERROR,
 			mlog(ML_ERROR,
 			     "Unrecognized mount option \"%s\" "
 			     "Unrecognized mount option \"%s\" "
@@ -863,6 +882,10 @@ static int ocfs2_show_options(struct seq_file *s, struct vfsmount *mnt)
 	if (osb->s_atime_quantum != OCFS2_DEFAULT_ATIME_QUANTUM)
 	if (osb->s_atime_quantum != OCFS2_DEFAULT_ATIME_QUANTUM)
 		seq_printf(s, ",atime_quantum=%u", osb->s_atime_quantum);
 		seq_printf(s, ",atime_quantum=%u", osb->s_atime_quantum);
 
 
+	if (osb->osb_commit_interval)
+		seq_printf(s, ",commit=%u",
+			   (unsigned) (osb->osb_commit_interval / HZ));
+
 	return 0;
 	return 0;
 }
 }