2007-07-01 07:37:55

by Mingming Cao

[permalink] [raw]
Subject: [EXT4 set 4][PATCH 5/5] i_version: noversion mount option to disable inode version updates

Add a "noversion" mount option to disable inode version updates.

Signed-off-by: Andreas Dilger <[email protected]>
Signed-off-by: Kalpak Shah <[email protected]>

Index: linux-2.6.21/fs/ext4/super.c
===================================================================
--- linux-2.6.21.orig/fs/ext4/super.c
+++ linux-2.6.21/fs/ext4/super.c
@@ -725,7 +725,7 @@ enum {
Opt_usrjquota, Opt_grpjquota, Opt_offusrjquota, Opt_offgrpjquota,
Opt_jqfmt_vfsold, Opt_jqfmt_vfsv0, Opt_quota, Opt_noquota,
Opt_ignore, Opt_barrier, Opt_err, Opt_resize, Opt_usrquota,
- Opt_grpquota, Opt_extents, Opt_noextents,
+ Opt_grpquota, Opt_extents, Opt_noextents, Opt_noversion,
};

static match_table_t tokens = {
@@ -777,6 +777,7 @@ static match_table_t tokens = {
{Opt_barrier, "barrier=%u"},
{Opt_extents, "extents"},
{Opt_noextents, "noextents"},
+ {Opt_noversion, "noversion"},
{Opt_err, NULL},
{Opt_resize, "resize"},
};
@@ -1115,6 +1116,9 @@ clear_qf_name:
case Opt_noextents:
clear_opt (sbi->s_mount_opt, EXTENTS);
break;
+ case Opt_noversion:
+ set_opt(sbi->s_mount_opt, NOVERSION);
+ break;
default:
printk (KERN_ERR
"EXT4-fs: Unrecognized mount option \"%s\" "
Index: linux-2.6.21/include/linux/ext4_fs.h
===================================================================
--- linux-2.6.21.orig/include/linux/ext4_fs.h
+++ linux-2.6.21/include/linux/ext4_fs.h
@@ -473,6 +473,7 @@ do { \
#define EXT4_MOUNT_USRQUOTA 0x100000 /* "old" user quota */
#define EXT4_MOUNT_GRPQUOTA 0x200000 /* "old" group quota */
#define EXT4_MOUNT_EXTENTS 0x400000 /* Extents support */
+#define EXT4_MOUNT_NOVERSION 0x800000 /* No inode version updates */

/* Compatibility, for having both ext2_fs.h and ext4_fs.h included at once */
#ifndef _LINUX_EXT2_FS_H
Index: linux-2.6.21/fs/ext4/inode.c
===================================================================
--- linux-2.6.21.orig/fs/ext4/inode.c
+++ linux-2.6.21/fs/ext4/inode.c
@@ -3082,7 +3082,9 @@ int ext4_mark_iloc_dirty(handle_t *handl
{
int err = 0;

- inode->i_version++;
+ if (!test_opt(inode->i_sb, NOVERSION))
+ inode->i_version++;
+
/* the do_update_inode consumes one bh->b_count */
get_bh(iloc->bh);


2007-07-10 23:31:44

by Andrew Morton

[permalink] [raw]
Subject: Re: [EXT4 set 4][PATCH 5/5] i_version: noversion mount option to disable inode version updates

On Sun, 01 Jul 2007 03:37:53 -0400
Mingming Cao <[email protected]> wrote:

> Add a "noversion" mount option to disable inode version updates.

Why is this option being offered to our users? To reduce disk traffic,
like noatime?

If so, what are the implications of this? What would the user lose?

> Index: linux-2.6.21/fs/ext4/super.c
> ===================================================================
> --- linux-2.6.21.orig/fs/ext4/super.c
> +++ linux-2.6.21/fs/ext4/super.c
> @@ -725,7 +725,7 @@ enum {
> Opt_usrjquota, Opt_grpjquota, Opt_offusrjquota, Opt_offgrpjquota,
> Opt_jqfmt_vfsold, Opt_jqfmt_vfsv0, Opt_quota, Opt_noquota,
> Opt_ignore, Opt_barrier, Opt_err, Opt_resize, Opt_usrquota,
> - Opt_grpquota, Opt_extents, Opt_noextents,
> + Opt_grpquota, Opt_extents, Opt_noextents, Opt_noversion,
> };
>
> static match_table_t tokens = {
> @@ -777,6 +777,7 @@ static match_table_t tokens = {
> {Opt_barrier, "barrier=%u"},
> {Opt_extents, "extents"},
> {Opt_noextents, "noextents"},
> + {Opt_noversion, "noversion"},
> {Opt_err, NULL},
> {Opt_resize, "resize"},
> };
> @@ -1115,6 +1116,9 @@ clear_qf_name:
> case Opt_noextents:
> clear_opt (sbi->s_mount_opt, EXTENTS);
> break;
> + case Opt_noversion:
> + set_opt(sbi->s_mount_opt, NOVERSION);
> + break;
> default:
> printk (KERN_ERR
> "EXT4-fs: Unrecognized mount option \"%s\" "
> Index: linux-2.6.21/include/linux/ext4_fs.h
> ===================================================================
> --- linux-2.6.21.orig/include/linux/ext4_fs.h
> +++ linux-2.6.21/include/linux/ext4_fs.h
> @@ -473,6 +473,7 @@ do { \
> #define EXT4_MOUNT_USRQUOTA 0x100000 /* "old" user quota */
> #define EXT4_MOUNT_GRPQUOTA 0x200000 /* "old" group quota */
> #define EXT4_MOUNT_EXTENTS 0x400000 /* Extents support */
> +#define EXT4_MOUNT_NOVERSION 0x800000 /* No inode version updates */
>
> /* Compatibility, for having both ext2_fs.h and ext4_fs.h included at once */
> #ifndef _LINUX_EXT2_FS_H
> Index: linux-2.6.21/fs/ext4/inode.c
> ===================================================================
> --- linux-2.6.21.orig/fs/ext4/inode.c
> +++ linux-2.6.21/fs/ext4/inode.c
> @@ -3082,7 +3082,9 @@ int ext4_mark_iloc_dirty(handle_t *handl
> {
> int err = 0;
>
> - inode->i_version++;
> + if (!test_opt(inode->i_sb, NOVERSION))
> + inode->i_version++;
> +
> /* the do_update_inode consumes one bh->b_count */
> get_bh(iloc->bh);

An update to Documentation/filesystems/ext4.txt would be an appropriate
way in which to address the above questions.


2007-07-11 11:57:19

by Andreas Dilger

[permalink] [raw]
Subject: Re: [EXT4 set 4][PATCH 5/5] i_version: noversion mount option to disable inode version updates

On Jul 10, 2007 16:31 -0700, Andrew Morton wrote:
> On Sun, 01 Jul 2007 03:37:53 -0400
> Mingming Cao <[email protected]> wrote:
> > Add a "noversion" mount option to disable inode version updates.
>
> Why is this option being offered to our users? To reduce disk traffic,
> like noatime?
>
> If so, what are the implications of this? What would the user lose?

Ah, this is the patch to disable i_version updates for Lustre. I don't
think any normal user would use this mount option, so I don't know if
there is a need to document it. There are no performance implications,
unless we end up changing the mtime granularity JUST to update i_version,
in which case we can avoid some overhead if not exporting with NFSv4.

If we want to go in the direction of forcing extra inode updates just
for this, then we might even consider making i_version updates on disk
default to OFF unless NFSv4 has exported the filesystem at least once,
and then it should set a persistent flag in the superblock indicating
that i_version updates are needed.

Cheers, Andreas
--
Andreas Dilger
Principal Software Engineer
Cluster File Systems, Inc.

2007-07-11 12:03:46

by Christoph Hellwig

[permalink] [raw]
Subject: Re: [EXT4 set 4][PATCH 5/5] i_version: noversion mount option to disable inode version updates

On Wed, Jul 11, 2007 at 05:57:17AM -0600, Andreas Dilger wrote:
> Ah, this is the patch to disable i_version updates for Lustre. I don't
> think any normal user would use this mount option, so I don't know if
> there is a need to document it.

This is a reason to not merge it at all. If the only user of this is
the out of tree lustre code there is no need to put this in. I should
rather stay in clusterfs' patchkit.


2007-07-11 15:48:48

by Theodore Ts'o

[permalink] [raw]
Subject: Re: [EXT4 set 4][PATCH 5/5] i_version: noversion mount option to disable inode version updates

On Tue, Jul 10, 2007 at 04:31:44PM -0700, Andrew Morton wrote:
> On Sun, 01 Jul 2007 03:37:53 -0400
> Mingming Cao <[email protected]> wrote:
>
> > Add a "noversion" mount option to disable inode version updates.
>
> Why is this option being offered to our users? To reduce disk traffic,
> like noatime?
>
> If so, what are the implications of this? What would the user lose?

This has been removed in the latest patch set; it's needed only for
Lustre, because they set the version field themselves. Lustre needs
the inode version to be globally monotonically increasing, so it can
order updates between two different files, so it does this itself.
NFSv4 only uses i_version to detect changes, and so there's no need to
use a global atomic counter for i_version. So the thinking was that
there was no point doing the global atomic counter if it was not necessary.

Since "noversion" is Lustre specific, we've dropped that from the list
of patches that we'll push, and so the inode version will only have
local per-inode significance, and not have any global ordering
properties.

We have not actually benchmarked whether or not doing the global
ordering actually *matters* in terms of being actually noticeable. If
it isn't noticeable, I wouldn't mind changing things so that we always
make i_version globally significant (without a mount option), and make
life a bit easier for the Lustre folks. Or if someone other
distributed filesystem requests a globally significant i_version. But
we can cross that bridge when we get to it....

- Ted