nilfs2: add norecovery mount option
This adds "norecovery" mount option which disables temporal write access to read-only mounts 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 will be helpful when user wants to prevent any write access to the device. Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp> Cc: Eric Sandeen <sandeen@redhat.com>
This commit is contained in:
parent
a057d2c011
commit
0234576d04
@ -70,6 +70,10 @@ order=strict Apply strict in-order semantics that preserves sequence
|
|||||||
blocks. That means, it is guaranteed that no
|
blocks. That means, it is guaranteed that no
|
||||||
overtaking of events occurs in the recovered file
|
overtaking of events occurs in the recovered file
|
||||||
system after a crash.
|
system after a crash.
|
||||||
|
norecovery Disable recovery of the filesystem on mount.
|
||||||
|
This disables every write access on the device for
|
||||||
|
read-only mounts or snapshots. This option will fail
|
||||||
|
for r/w mounts on an unclean volume.
|
||||||
|
|
||||||
NILFS2 usage
|
NILFS2 usage
|
||||||
============
|
============
|
||||||
|
@ -479,6 +479,8 @@ static int nilfs_show_options(struct seq_file *seq, struct vfsmount *vfs)
|
|||||||
seq_printf(seq, ",errors=panic");
|
seq_printf(seq, ",errors=panic");
|
||||||
if (nilfs_test_opt(sbi, STRICT_ORDER))
|
if (nilfs_test_opt(sbi, STRICT_ORDER))
|
||||||
seq_printf(seq, ",order=strict");
|
seq_printf(seq, ",order=strict");
|
||||||
|
if (nilfs_test_opt(sbi, NORECOVERY))
|
||||||
|
seq_printf(seq, ",norecovery");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -547,7 +549,7 @@ static const struct export_operations nilfs_export_ops = {
|
|||||||
|
|
||||||
enum {
|
enum {
|
||||||
Opt_err_cont, Opt_err_panic, Opt_err_ro,
|
Opt_err_cont, Opt_err_panic, Opt_err_ro,
|
||||||
Opt_nobarrier, Opt_snapshot, Opt_order,
|
Opt_nobarrier, Opt_snapshot, Opt_order, Opt_norecovery,
|
||||||
Opt_err,
|
Opt_err,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -558,6 +560,7 @@ static match_table_t tokens = {
|
|||||||
{Opt_nobarrier, "nobarrier"},
|
{Opt_nobarrier, "nobarrier"},
|
||||||
{Opt_snapshot, "cp=%u"},
|
{Opt_snapshot, "cp=%u"},
|
||||||
{Opt_order, "order=%s"},
|
{Opt_order, "order=%s"},
|
||||||
|
{Opt_norecovery, "norecovery"},
|
||||||
{Opt_err, NULL}
|
{Opt_err, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -608,6 +611,9 @@ static int parse_options(char *options, struct super_block *sb)
|
|||||||
sbi->s_snapshot_cno = option;
|
sbi->s_snapshot_cno = option;
|
||||||
nilfs_set_opt(sbi, SNAPSHOT);
|
nilfs_set_opt(sbi, SNAPSHOT);
|
||||||
break;
|
break;
|
||||||
|
case Opt_norecovery:
|
||||||
|
nilfs_set_opt(sbi, NORECOVERY);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
printk(KERN_ERR
|
printk(KERN_ERR
|
||||||
"NILFS: Unrecognized mount option \"%s\"\n", p);
|
"NILFS: Unrecognized mount option \"%s\"\n", p);
|
||||||
@ -863,6 +869,14 @@ static int nilfs_remount(struct super_block *sb, int *flags, char *data)
|
|||||||
goto restore_opts;
|
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))
|
if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
|
||||||
goto out;
|
goto out;
|
||||||
if (*flags & MS_RDONLY) {
|
if (*flags & MS_RDONLY) {
|
||||||
|
@ -264,8 +264,14 @@ int load_nilfs(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi)
|
|||||||
int valid_fs = nilfs_valid_fs(nilfs);
|
int valid_fs = nilfs_valid_fs(nilfs);
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (nilfs_loaded(nilfs))
|
if (nilfs_loaded(nilfs)) {
|
||||||
|
if (valid_fs ||
|
||||||
|
((s_flags & MS_RDONLY) && nilfs_test_opt(sbi, NORECOVERY)))
|
||||||
return 0;
|
return 0;
|
||||||
|
printk(KERN_ERR "NILFS: the filesystem is in an incomplete "
|
||||||
|
"recovery state.\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (!valid_fs) {
|
if (!valid_fs) {
|
||||||
printk(KERN_WARNING "NILFS warning: mounting unchecked fs\n");
|
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;
|
goto skip_recovery;
|
||||||
|
|
||||||
if (s_flags & MS_RDONLY) {
|
if (s_flags & MS_RDONLY) {
|
||||||
|
if (nilfs_test_opt(sbi, NORECOVERY)) {
|
||||||
|
printk(KERN_INFO "NILFS: norecovery option specified. "
|
||||||
|
"skipping roll-forward recovery\n");
|
||||||
|
goto skip_recovery;
|
||||||
|
}
|
||||||
if (really_read_only) {
|
if (really_read_only) {
|
||||||
printk(KERN_ERR "NILFS: write access "
|
printk(KERN_ERR "NILFS: write access "
|
||||||
"unavailable, cannot proceed.\n");
|
"unavailable, cannot proceed.\n");
|
||||||
@ -302,6 +313,11 @@ int load_nilfs(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi)
|
|||||||
goto failed_unload;
|
goto failed_unload;
|
||||||
}
|
}
|
||||||
sbi->s_super->s_flags &= ~MS_RDONLY;
|
sbi->s_super->s_flags &= ~MS_RDONLY;
|
||||||
|
} else if (nilfs_test_opt(sbi, NORECOVERY)) {
|
||||||
|
printk(KERN_ERR "NILFS: recovery cancelled because norecovery "
|
||||||
|
"option was specified for a read/write mount\n");
|
||||||
|
err = -EINVAL;
|
||||||
|
goto failed_unload;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = nilfs_recover_logical_segments(nilfs, sbi, &ri);
|
err = nilfs_recover_logical_segments(nilfs, sbi, &ri);
|
||||||
|
@ -151,6 +151,8 @@ struct nilfs_super_root {
|
|||||||
#define NILFS_MOUNT_BARRIER 0x1000 /* Use block barriers */
|
#define NILFS_MOUNT_BARRIER 0x1000 /* Use block barriers */
|
||||||
#define NILFS_MOUNT_STRICT_ORDER 0x2000 /* Apply strict in-order
|
#define NILFS_MOUNT_STRICT_ORDER 0x2000 /* Apply strict in-order
|
||||||
semantics also for data */
|
semantics also for data */
|
||||||
|
#define NILFS_MOUNT_NORECOVERY 0x4000 /* Disable write access during
|
||||||
|
mount-time recovery */
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user