Linux NILFS development
 help / color / mirror / Atom feed
From: Eric Sandeen <sandeen-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
To: NILFS Users mailing list <users-JrjvKiOkagjYtjvyW6yDsg@public.gmane.org>
Cc: jan.de.kruyf-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org,
	Ryusuke Konishi
	<konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
Subject: Re: [PATCH 4/4] nilfs2: add norepair mount option
Date: Thu, 19 Nov 2009 11:36:28 -0600	[thread overview]
Message-ID: <4B05821C.4030901@redhat.com> (raw)
In-Reply-To: <1258650553-10743-5-git-send-email-konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>

Ryusuke Konishi wrote:
> This adds norepair mount option that allows users to avoid temporal
> write access to a read-only mount or snapshots during mount/recovery.
> Without this option, write access will be even performed for those
> types of mounts; the temporal write access is needed to mount root
> file system read-only after an unclean shutdown.
> 
> This option is useful for users to avoid any write access on the
> device.

For what it's worth, ext3 & ext4 just added a "norecovery" option as
an alias to "noload" which skips journal replay; xfs already has
"norecovery" - so if you wish to be consistent with ext3/ext4/xfs,
"norecovery" may be a good choice for the option?

Thanks,
-Eric

> Signed-off-by: Ryusuke Konishi <konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
> ---
>  Documentation/filesystems/nilfs2.txt |    4 ++++
>  fs/nilfs2/super.c                    |   14 +++++++++++++-
>  fs/nilfs2/the_nilfs.c                |   20 ++++++++++++++++++--
>  include/linux/nilfs2_fs.h            |    2 ++
>  4 files changed, 37 insertions(+), 3 deletions(-)
> 
> diff --git a/Documentation/filesystems/nilfs2.txt b/Documentation/filesystems/nilfs2.txt
> index cbd8779..77b2c25 100644
> --- a/Documentation/filesystems/nilfs2.txt
> +++ b/Documentation/filesystems/nilfs2.txt
> @@ -70,6 +70,10 @@ order=strict		Apply strict in-order semantics that preserves sequence
>  			blocks.  That means, it is guaranteed that no
>  			overtaking of events occurs in the recovered file
>  			system after a crash.
> +norepair		Disable repair action of filesystem on mount.
> +			This disables every write access on the device for
> +			read-only mount or snapshots.  This option will fail
> +			for r/w mounts on an unclean volume.
>  
>  NILFS2 usage
>  ============
> diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c
> index 990ead4..d516316 100644
> --- a/fs/nilfs2/super.c
> +++ b/fs/nilfs2/super.c
> @@ -547,7 +547,7 @@ static const struct export_operations nilfs_export_ops = {
>  
>  enum {
>  	Opt_err_cont, Opt_err_panic, Opt_err_ro,
> -	Opt_nobarrier, Opt_snapshot, Opt_order,
> +	Opt_nobarrier, Opt_snapshot, Opt_order, Opt_norepair,
>  	Opt_err,
>  };
>  
> @@ -558,6 +558,7 @@ static match_table_t tokens = {
>  	{Opt_nobarrier, "nobarrier"},
>  	{Opt_snapshot, "cp=%u"},
>  	{Opt_order, "order=%s"},
> +	{Opt_norepair, "norepair"},
>  	{Opt_err, NULL}
>  };
>  
> @@ -608,6 +609,9 @@ static int parse_options(char *options, struct super_block *sb)
>  			sbi->s_snapshot_cno = option;
>  			nilfs_set_opt(sbi, SNAPSHOT);
>  			break;
> +		case Opt_norepair:
> +			nilfs_set_opt(sbi, NOREPAIR);
> +			break;
>  		default:
>  			printk(KERN_ERR
>  			       "NILFS: Unrecognized mount option \"%s\"\n", p);
> @@ -863,6 +867,14 @@ static int nilfs_remount(struct super_block *sb, int *flags, char *data)
>  		goto restore_opts;
>  	}
>  
> +	if (!nilfs_valid_fs(nilfs)) {
> +		printk(KERN_WARNING "NILFS (device %s): couldn't "
> +		       "remount because the filesystem is in an "
> +		       "incomplete recovery state.\n", sb->s_id);
> +		err = -EINVAL;
> +		goto restore_opts;
> +	}
> +
>  	if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
>  		goto out;
>  	if (*flags & MS_RDONLY) {
> diff --git a/fs/nilfs2/the_nilfs.c b/fs/nilfs2/the_nilfs.c
> index 890a8d3..352fed9 100644
> --- a/fs/nilfs2/the_nilfs.c
> +++ b/fs/nilfs2/the_nilfs.c
> @@ -264,8 +264,14 @@ int load_nilfs(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi)
>  	int valid_fs = nilfs_valid_fs(nilfs);
>  	int err;
>  
> -	if (nilfs_loaded(nilfs))
> -		return 0;
> +	if (nilfs_loaded(nilfs)) {
> +		if (valid_fs ||
> +		    ((s_flags & MS_RDONLY) && nilfs_test_opt(sbi, NOREPAIR)))
> +			return 0;
> +		printk(KERN_ERR "NILFS: the filesystem is in an incomplete "
> +		       "recovery state.\n");
> +		return -EINVAL;
> +	}
>  
>  	if (!valid_fs) {
>  		printk(KERN_WARNING "NILFS warning: mounting unchecked fs\n");
> @@ -295,6 +301,11 @@ int load_nilfs(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi)
>  		goto skip_recovery;
>  
>  	if (s_flags & MS_RDONLY) {
> +		if (nilfs_test_opt(sbi, NOREPAIR)) {
> +			printk(KERN_INFO "NILFS: norepair option specified. "
> +			       "skipping roll-forward recovery\n");
> +			goto skip_recovery;
> +		}
>  		if (really_read_only) {
>  			printk(KERN_ERR "NILFS: write access "
>  			       "unavailable, cannot proceed.\n");
> @@ -302,6 +313,11 @@ int load_nilfs(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi)
>  			goto failed_unload;
>  		}
>  		sbi->s_super->s_flags &= ~MS_RDONLY;
> +	} else if (nilfs_test_opt(sbi, NOREPAIR)) {
> +		printk(KERN_ERR "NILFS: recovery cancelled because norepair "
> +		       "option was specified for a read/write mount\n");
> +		err = -EINVAL;
> +		goto failed_unload;
>  	}
>  
>  	err = nilfs_recover_logical_segments(nilfs, sbi, &ri);
> diff --git a/include/linux/nilfs2_fs.h b/include/linux/nilfs2_fs.h
> index 72289d2..8376fcb 100644
> --- a/include/linux/nilfs2_fs.h
> +++ b/include/linux/nilfs2_fs.h
> @@ -151,6 +151,8 @@ struct nilfs_super_root {
>  #define NILFS_MOUNT_BARRIER		0x1000  /* Use block barriers */
>  #define NILFS_MOUNT_STRICT_ORDER	0x2000  /* Apply strict in-order
>  						   semantics also for data */
> +#define NILFS_MOUNT_NOREPAIR		0x4000  /* Disable write access during
> +						   mount-time recovery */
>  
>  
>  /**

  parent reply	other threads:[~2009-11-19 17:36 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-11-19 17:09 [PATCH 0/4] nilfs2 mount/recovery updates for 2.6.33 Ryusuke Konishi
     [not found] ` <1258650553-10743-1-git-send-email-konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
2009-11-19 17:09   ` [PATCH 1/4] nilfs2: apply readahead for recovery on mount Ryusuke Konishi
2009-11-19 17:09   ` [PATCH 2/4] nilfs2: move recovery completion into load_nilfs function Ryusuke Konishi
2009-11-19 17:09   ` [PATCH 3/4] nilfs2: add helper to get if volume is in a valid state Ryusuke Konishi
2009-11-19 17:09   ` [PATCH 4/4] nilfs2: add norepair mount option Ryusuke Konishi
     [not found]     ` <1258650553-10743-5-git-send-email-konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
2009-11-19 17:36       ` Eric Sandeen [this message]
     [not found]         ` <4B05821C.4030901-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2009-11-19 18:10           ` Ryusuke Konishi
     [not found]             ` <20091120.031015.04647165.ryusuke-sG5X7nlA6pw@public.gmane.org>
2009-11-19 19:10               ` Ryusuke Konishi

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=4B05821C.4030901@redhat.com \
    --to=sandeen-h+wxahxf7alqt0dzr+alfa@public.gmane.org \
    --cc=jan.de.kruyf-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    --cc=konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org \
    --cc=users-JrjvKiOkagjYtjvyW6yDsg@public.gmane.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox