All of lore.kernel.org
 help / color / mirror / Atom feed
From: Matthew Garrett <mjg@redhat.com>
To: Randy Dunlap <randy.dunlap@oracle.com>
Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org,
	mingo@redhat.com, val.henson@gmail.com, matthew@wil.cx
Subject: [PATCH v2 2/2] relatime: Allow making relatime the default behaviour
Date: Thu, 27 Nov 2008 15:03:41 +0000	[thread overview]
Message-ID: <20081127150341.GB20941@srcf.ucam.org> (raw)
In-Reply-To: <20081127150126.GA20941@srcf.ucam.org>

Add support for defaulting to relatime
    
Allow the kernel to enable relatime on all mounts by default. This can be
configured at build time or by a kernel parameter or sysctl. Also add a
MS_NORELATIME mount option to allow the default to be overridden for specific
mount points.

Signed-off-by: Matthew Garrett <mjg@redhat.com>

---

Incorporates Randy's suggestion to change default_relatime to 
relatime_default, along with a couple of typographical fixes

diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index e0f346d..1738be9 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -1847,6 +1847,14 @@ and is between 256 and 4096 characters. It is defined in the file
 			[KNL, SMP] Set scheduler's default relax_domain_level.
 			See Documentation/cpusets.txt.
 
+	relatime_default=
+			[FS] mount all filesystems with relative atime
+			updates by default.
+
+	relatime_interval=
+			[FS] relative atime update frequency, in seconds.
+			(default: 1 day: 86400 seconds)
+
 	reserve=	[KNL,BUGS] Force the kernel to ignore some iomem area
 
 	reservetop=	[X86-32]
diff --git a/fs/Kconfig b/fs/Kconfig
index 522469a..fcd3d48 100644
--- a/fs/Kconfig
+++ b/fs/Kconfig
@@ -1546,6 +1546,29 @@ config 9P_FS
 
 endif # NETWORK_FILESYSTEMS
 
+config DEFAULT_RELATIME
+	bool "Mount all filesystems with relatime by default"
+	default y
+	help
+	  If you say Y here, all your filesystems will be mounted
+	  with the "relatime" mount option. This eliminates many atime
+	  ('file last accessed' timestamp) updates (which otherwise
+	  is performed on every file access and generates a write
+	  IO to the inode) and thus speeds up IO. Atime is still updated,
+	  but only once per day.
+
+	  The mtime ('file last modified') and ctime ('file created')
+	  timestamp are unaffected by this change.
+
+	  Use the "norelatime" kernel boot option to turn off this
+	  feature.
+
+config DEFAULT_RELATIME_VAL
+	int
+	default "1" if DEFAULT_RELATIME
+	default "0"
+
+
 if BLOCK
 menu "Partition Types"
 
diff --git a/fs/inode.c b/fs/inode.c
index 348fa16..51e9ae1 100644
--- a/fs/inode.c
+++ b/fs/inode.c
@@ -1185,6 +1185,17 @@ EXPORT_SYMBOL(bmap);
 int relatime_interval __read_mostly = 24*60*60;
 
 /*
+ * Allow overriding the default relatime value on the kernel command line
+ */
+static int __init set_relatime_interval(char *str)
+{
+	get_option(&str, &relatime_interval);
+
+	return 1;
+}
+__setup("relatime_interval=", set_relatime_interval);
+
+/*
  * With relative atime, only update atime if the
  * previous atime is earlier than either the ctime or
  * mtime.
diff --git a/fs/namespace.c b/fs/namespace.c
index 65b3dc8..b7b72c2 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -1883,6 +1883,24 @@ int copy_mount_options(const void __user * data, unsigned long *where)
 }
 
 /*
+ * Allow users to disable (or enable) atime updates via a .config
+ * option or via the boot line, or via /proc/sys/fs/relatime_default:
+ */
+int relatime_default __read_mostly = CONFIG_DEFAULT_RELATIME_VAL;
+
+static int __init set_relatime_default(char *str)
+{
+	get_option(&str, &relatime_default);
+
+	printk(KERN_INFO "Mount all filesystems with "
+		"default relative atime updates: %s.\n",
+		relatime_default ? "enabled" : "disabled");
+
+	return 1;
+}
+__setup("relatime_default=", set_relatime_default);
+
+/*
  * Flags is a 32-bit value that allows up to 31 non-fs dependent flags to
  * be given to the mount() call (ie: read-only, no-dev, no-suid etc).
  *
@@ -1930,6 +1948,11 @@ long do_mount(char *dev_name, char *dir_name, char *type_page,
 		mnt_flags |= MNT_NODIRATIME;
 	if (flags & MS_RELATIME)
 		mnt_flags |= MNT_RELATIME;
+	else if (relatime_default &&
+		 !(flags & (MS_NOATIME | MS_NODIRATIME | MS_NORELATIME))) {
+		mnt_flags |= MNT_RELATIME;
+		flags |= MS_RELATIME;
+	}
 	if (flags & MS_RDONLY)
 		mnt_flags |= MNT_READONLY;
 
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 0dcdd94..0dfdce2 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -135,6 +135,7 @@ extern int dir_notify_enable;
 #define MS_RELATIME	(1<<21)	/* Update atime relative to mtime/ctime. */
 #define MS_KERNMOUNT	(1<<22) /* this is a kern_mount call */
 #define MS_I_VERSION	(1<<23) /* Update inode I_version field */
+#define MS_NORELATIME	(1<<24)	/* Disable relatime even if the default */
 #define MS_ACTIVE	(1<<30)
 #define MS_NOUSER	(1<<31)
 
diff --git a/include/linux/mount.h b/include/linux/mount.h
index cab2a85..2595882 100644
--- a/include/linux/mount.h
+++ b/include/linux/mount.h
@@ -112,4 +112,7 @@ extern void mark_mounts_for_expiry(struct list_head *mounts);
 extern spinlock_t vfsmount_lock;
 extern dev_t name_to_dev_t(char *name);
 
+extern int relatime_default;
+extern int relatime_interval;
+
 #endif /* _LINUX_MOUNT_H */
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
index 9d048fa..b570827 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -29,6 +29,7 @@
 #include <linux/utsname.h>
 #include <linux/smp_lock.h>
 #include <linux/fs.h>
+#include <linux/mount.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
 #include <linux/kobject.h>
@@ -1334,6 +1335,22 @@ static struct ctl_table fs_table[] = {
 		.mode		= 0644,
 		.proc_handler	= &proc_dointvec,
 	},
+	{
+		.ctl_name	= CTL_UNNUMBERED,
+		.procname	= "relatime_default",
+		.data		= &relatime_default,
+		.maxlen		= sizeof(int),
+		.mode		= 0644,
+		.proc_handler	= &proc_dointvec,
+	},
+	{
+		.ctl_name	= CTL_UNNUMBERED,
+		.procname	= "relatime_interval",
+		.data		= &relatime_interval,
+		.maxlen		= sizeof(int),
+		.mode		= 0644,
+		.proc_handler	= &proc_dointvec,
+	},
 #if defined(CONFIG_BINFMT_MISC) || defined(CONFIG_BINFMT_MISC_MODULE)
 	{
 		.ctl_name	= CTL_UNNUMBERED,

-- 
Matthew Garrett | mjg59@srcf.ucam.org

  reply	other threads:[~2008-11-27 15:03 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-11-26 19:54 [PATCH 1/2] relatime: Make atime updates more useful Matthew Garrett
2008-11-26 19:58 ` [PATCH 2/2] relatime: Allow making relatime the default behaviour Matthew Garrett
2008-11-26 21:11   ` Matthew Wilcox
2008-11-26 22:39   ` Randy Dunlap
2008-11-27 15:01     ` [PATCH v2 1/2] relatime: Make relatime behaviour smarter Matthew Garrett
2008-11-27 15:03       ` Matthew Garrett [this message]
2008-11-27 15:07         ` [PATCH v2 2/2] relatime: Allow making relatime the default behaviour Ingo Molnar
2008-11-27 16:03         ` Karel Zak
2008-11-27 17:30           ` Pádraig Brady
2008-11-27 17:30             ` Pádraig Brady
2008-11-27 17:39             ` Matthew Garrett
2008-11-27 17:39               ` Matthew Garrett
2008-11-27 16:35         ` Alan Cox
2008-11-27 16:47           ` Matthew Garrett
2008-11-27 16:59             ` [PATCH v3] relatime: Make relatime smarter Matthew Garrett
2008-11-27 17:06               ` Christoph Hellwig
2008-11-27 17:58                 ` [PATCH v4] " Matthew Garrett
2008-11-27 22:08                   ` Andreas Dilger
2008-11-27 22:35                     ` Matthew Wilcox
2008-11-28 11:13                     ` Jamie Lokier
2008-11-28 13:41                     ` Matthew Garrett
2008-11-28 11:18                   ` Jamie Lokier
2008-11-28 13:40                     ` Matthew Wilcox
2008-11-28 13:47                       ` Matthew Garrett
2008-12-02 11:10                       ` Karel Zak
2008-12-02 16:46                         ` Matthew Wilcox
2008-11-27 19:15               ` [PATCH v3] " Alan Cox
2008-11-28 11:16                 ` Jamie Lokier
2008-11-28 13:45                   ` Matthew Garrett
2008-11-27 17:03         ` [PATCH v2 2/2] relatime: Allow making relatime the default behaviour Christoph Hellwig
2008-11-29  8:24           ` Andrew Morton
2008-11-29 13:03             ` Matthew Wilcox
2008-11-29 13:57               ` Jörn Engel
2008-11-29 13:57                 ` Jörn Engel
2008-11-29 18:56                 ` Jamie Lokier
2008-11-29 18:56                   ` Jamie Lokier
2008-11-29 19:02                   ` Matthew Garrett
2008-11-29 20:32                     ` Andrew Morton
2008-11-29 20:38                       ` Matthew Wilcox
2008-11-29 20:56                         ` Andrew Morton
2008-11-29 21:41                         ` Ingo Molnar
2008-11-29 20:55                       ` Arjan van de Ven
2008-11-29 21:03                         ` Matthew Garrett
2008-11-29 21:02                       ` Matthew Garrett
2008-11-27 15:06       ` [PATCH v2 1/2] relatime: Make relatime behaviour smarter Ingo Molnar
2008-11-29  8:29 ` [PATCH 1/2] relatime: Make atime updates more useful Andrew Morton
2008-12-02 17:19 ` [PATCH] relatime: Let relatime update atime at least once per day Matthew Garrett
2008-12-13  5:26   ` Valerie Aurora Henson

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=20081127150341.GB20941@srcf.ucam.org \
    --to=mjg@redhat.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=matthew@wil.cx \
    --cc=mingo@redhat.com \
    --cc=randy.dunlap@oracle.com \
    --cc=val.henson@gmail.com \
    /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.