Merge branch 'foreign/qu/norecovery-v7' into for-chris-4.6
This commit is contained in:
commit
23c1a966f2
|
@ -168,10 +168,23 @@ Options with (*) are default options and will not show in the mount options.
|
|||
notreelog
|
||||
Enable/disable the tree logging used for fsync and O_SYNC writes.
|
||||
|
||||
recovery
|
||||
Enable autorecovery attempts if a bad tree root is found at mount time.
|
||||
Currently this scans a list of several previous tree roots and tries to
|
||||
nologreplay
|
||||
Disable the log tree replay at mount time to prevent filesystem
|
||||
from getting modified.
|
||||
Must be used with 'ro' mount option.
|
||||
A filesystem mounted with this option cannot transition to a
|
||||
read-write mount via remount,rw - the filesystem must be unmounted
|
||||
and mounted back again if read-write access is desired.
|
||||
|
||||
usebackuproot
|
||||
Enable attempts to use backup tree roots if a bad tree root is found at
|
||||
mount time.
|
||||
Currently this scans a list of 4 previous tree roots and tries to
|
||||
use the first readable.
|
||||
And since the mount option doesn't affect any behavior after mount,
|
||||
it won't be shown in mount info.
|
||||
Prior to 4.6, this was done by 'recovery' option that has been
|
||||
deprecated, but will work.
|
||||
|
||||
rescan_uuid_tree
|
||||
Force check and rebuild procedure of the UUID tree. This should not
|
||||
|
|
|
@ -2274,7 +2274,7 @@ struct btrfs_ioctl_defrag_range_args {
|
|||
#define BTRFS_MOUNT_ENOSPC_DEBUG (1 << 15)
|
||||
#define BTRFS_MOUNT_AUTO_DEFRAG (1 << 16)
|
||||
#define BTRFS_MOUNT_INODE_MAP_CACHE (1 << 17)
|
||||
#define BTRFS_MOUNT_RECOVERY (1 << 18)
|
||||
#define BTRFS_MOUNT_USEBACKUPROOT (1 << 18)
|
||||
#define BTRFS_MOUNT_SKIP_BALANCE (1 << 19)
|
||||
#define BTRFS_MOUNT_CHECK_INTEGRITY (1 << 20)
|
||||
#define BTRFS_MOUNT_CHECK_INTEGRITY_INCLUDING_EXTENT_DATA (1 << 21)
|
||||
|
@ -2283,6 +2283,7 @@ struct btrfs_ioctl_defrag_range_args {
|
|||
#define BTRFS_MOUNT_FRAGMENT_DATA (1 << 24)
|
||||
#define BTRFS_MOUNT_FRAGMENT_METADATA (1 << 25)
|
||||
#define BTRFS_MOUNT_FREE_SPACE_TREE (1 << 26)
|
||||
#define BTRFS_MOUNT_NOLOGREPLAY (1 << 27)
|
||||
|
||||
#define BTRFS_DEFAULT_COMMIT_INTERVAL (30)
|
||||
#define BTRFS_DEFAULT_MAX_INLINE (8192)
|
||||
|
@ -4187,7 +4188,8 @@ void btrfs_sysfs_remove_mounted(struct btrfs_fs_info *fs_info);
|
|||
ssize_t btrfs_listxattr(struct dentry *dentry, char *buffer, size_t size);
|
||||
|
||||
/* super.c */
|
||||
int btrfs_parse_options(struct btrfs_root *root, char *options);
|
||||
int btrfs_parse_options(struct btrfs_root *root, char *options,
|
||||
unsigned long new_flags);
|
||||
int btrfs_sync_fs(struct super_block *sb, int wait);
|
||||
|
||||
#ifdef CONFIG_PRINTK
|
||||
|
|
|
@ -2751,7 +2751,7 @@ int open_ctree(struct super_block *sb,
|
|||
*/
|
||||
fs_info->compress_type = BTRFS_COMPRESS_ZLIB;
|
||||
|
||||
ret = btrfs_parse_options(tree_root, options);
|
||||
ret = btrfs_parse_options(tree_root, options, sb->s_flags);
|
||||
if (ret) {
|
||||
err = ret;
|
||||
goto fail_alloc;
|
||||
|
@ -3030,8 +3030,9 @@ retry_root_backup:
|
|||
if (ret)
|
||||
goto fail_trans_kthread;
|
||||
|
||||
/* do not make disk changes in broken FS */
|
||||
if (btrfs_super_log_root(disk_super) != 0) {
|
||||
/* do not make disk changes in broken FS or nologreplay is given */
|
||||
if (btrfs_super_log_root(disk_super) != 0 &&
|
||||
!btrfs_test_opt(tree_root, NOLOGREPLAY)) {
|
||||
ret = btrfs_replay_log(fs_info, fs_devices);
|
||||
if (ret) {
|
||||
err = ret;
|
||||
|
@ -3147,6 +3148,12 @@ retry_root_backup:
|
|||
|
||||
fs_info->open = 1;
|
||||
|
||||
/*
|
||||
* backuproot only affect mount behavior, and if open_ctree succeeded,
|
||||
* no need to keep the flag
|
||||
*/
|
||||
btrfs_clear_opt(fs_info->mount_opt, USEBACKUPROOT);
|
||||
|
||||
return 0;
|
||||
|
||||
fail_qgroup:
|
||||
|
@ -3201,7 +3208,7 @@ fail:
|
|||
return err;
|
||||
|
||||
recovery_tree_root:
|
||||
if (!btrfs_test_opt(tree_root, RECOVERY))
|
||||
if (!btrfs_test_opt(tree_root, USEBACKUPROOT))
|
||||
goto fail_tree_roots;
|
||||
|
||||
free_root_pointers(fs_info, 0);
|
||||
|
|
|
@ -303,7 +303,8 @@ enum {
|
|||
Opt_check_integrity_print_mask, Opt_fatal_errors, Opt_rescan_uuid_tree,
|
||||
Opt_commit_interval, Opt_barrier, Opt_nodefrag, Opt_nodiscard,
|
||||
Opt_noenospc_debug, Opt_noflushoncommit, Opt_acl, Opt_datacow,
|
||||
Opt_datasum, Opt_treelog, Opt_noinode_cache,
|
||||
Opt_datasum, Opt_treelog, Opt_noinode_cache, Opt_usebackuproot,
|
||||
Opt_nologreplay, Opt_norecovery,
|
||||
#ifdef CONFIG_BTRFS_DEBUG
|
||||
Opt_fragment_data, Opt_fragment_metadata, Opt_fragment_all,
|
||||
#endif
|
||||
|
@ -335,6 +336,8 @@ static const match_table_t tokens = {
|
|||
{Opt_noacl, "noacl"},
|
||||
{Opt_notreelog, "notreelog"},
|
||||
{Opt_treelog, "treelog"},
|
||||
{Opt_nologreplay, "nologreplay"},
|
||||
{Opt_norecovery, "norecovery"},
|
||||
{Opt_flushoncommit, "flushoncommit"},
|
||||
{Opt_noflushoncommit, "noflushoncommit"},
|
||||
{Opt_ratio, "metadata_ratio=%d"},
|
||||
|
@ -352,7 +355,8 @@ static const match_table_t tokens = {
|
|||
{Opt_inode_cache, "inode_cache"},
|
||||
{Opt_noinode_cache, "noinode_cache"},
|
||||
{Opt_no_space_cache, "nospace_cache"},
|
||||
{Opt_recovery, "recovery"},
|
||||
{Opt_recovery, "recovery"}, /* deprecated */
|
||||
{Opt_usebackuproot, "usebackuproot"},
|
||||
{Opt_skip_balance, "skip_balance"},
|
||||
{Opt_check_integrity, "check_int"},
|
||||
{Opt_check_integrity_including_extent_data, "check_int_data"},
|
||||
|
@ -373,7 +377,8 @@ static const match_table_t tokens = {
|
|||
* reading in a new superblock is parsed here.
|
||||
* XXX JDM: This needs to be cleaned up for remount.
|
||||
*/
|
||||
int btrfs_parse_options(struct btrfs_root *root, char *options)
|
||||
int btrfs_parse_options(struct btrfs_root *root, char *options,
|
||||
unsigned long new_flags)
|
||||
{
|
||||
struct btrfs_fs_info *info = root->fs_info;
|
||||
substring_t args[MAX_OPT_ARGS];
|
||||
|
@ -393,8 +398,12 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
|
|||
else if (cache_gen)
|
||||
btrfs_set_opt(info->mount_opt, SPACE_CACHE);
|
||||
|
||||
/*
|
||||
* Even the options are empty, we still need to do extra check
|
||||
* against new flags
|
||||
*/
|
||||
if (!options)
|
||||
goto out;
|
||||
goto check;
|
||||
|
||||
/*
|
||||
* strsep changes the string, duplicate it because parse_options
|
||||
|
@ -606,6 +615,11 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
|
|||
btrfs_clear_and_info(root, NOTREELOG,
|
||||
"enabling tree log");
|
||||
break;
|
||||
case Opt_norecovery:
|
||||
case Opt_nologreplay:
|
||||
btrfs_set_and_info(root, NOLOGREPLAY,
|
||||
"disabling log replay at mount time");
|
||||
break;
|
||||
case Opt_flushoncommit:
|
||||
btrfs_set_and_info(root, FLUSHONCOMMIT,
|
||||
"turning on flush-on-commit");
|
||||
|
@ -696,8 +710,12 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
|
|||
"disabling auto defrag");
|
||||
break;
|
||||
case Opt_recovery:
|
||||
btrfs_info(root->fs_info, "enabling auto recovery");
|
||||
btrfs_set_opt(info->mount_opt, RECOVERY);
|
||||
btrfs_warn(root->fs_info,
|
||||
"'recovery' is deprecated, use 'usebackuproot' instead");
|
||||
case Opt_usebackuproot:
|
||||
btrfs_info(root->fs_info,
|
||||
"trying to use backup root at mount time");
|
||||
btrfs_set_opt(info->mount_opt, USEBACKUPROOT);
|
||||
break;
|
||||
case Opt_skip_balance:
|
||||
btrfs_set_opt(info->mount_opt, SKIP_BALANCE);
|
||||
|
@ -792,6 +810,15 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
|
|||
break;
|
||||
}
|
||||
}
|
||||
check:
|
||||
/*
|
||||
* Extra check for current option against current flag
|
||||
*/
|
||||
if (btrfs_test_opt(root, NOLOGREPLAY) && !(new_flags & MS_RDONLY)) {
|
||||
btrfs_err(root->fs_info,
|
||||
"nologreplay must be used with ro mount option");
|
||||
ret = -EINVAL;
|
||||
}
|
||||
out:
|
||||
if (btrfs_fs_compat_ro(root->fs_info, FREE_SPACE_TREE) &&
|
||||
!btrfs_test_opt(root, FREE_SPACE_TREE) &&
|
||||
|
@ -1202,6 +1229,8 @@ static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry)
|
|||
seq_puts(seq, ",ssd");
|
||||
if (btrfs_test_opt(root, NOTREELOG))
|
||||
seq_puts(seq, ",notreelog");
|
||||
if (btrfs_test_opt(root, NOLOGREPLAY))
|
||||
seq_puts(seq, ",nologreplay");
|
||||
if (btrfs_test_opt(root, FLUSHONCOMMIT))
|
||||
seq_puts(seq, ",flushoncommit");
|
||||
if (btrfs_test_opt(root, DISCARD))
|
||||
|
@ -1228,8 +1257,6 @@ static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry)
|
|||
seq_puts(seq, ",inode_cache");
|
||||
if (btrfs_test_opt(root, SKIP_BALANCE))
|
||||
seq_puts(seq, ",skip_balance");
|
||||
if (btrfs_test_opt(root, RECOVERY))
|
||||
seq_puts(seq, ",recovery");
|
||||
#ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY
|
||||
if (btrfs_test_opt(root, CHECK_INTEGRITY_INCLUDING_EXTENT_DATA))
|
||||
seq_puts(seq, ",check_int_data");
|
||||
|
@ -1685,7 +1712,7 @@ static int btrfs_remount(struct super_block *sb, int *flags, char *data)
|
|||
}
|
||||
}
|
||||
|
||||
ret = btrfs_parse_options(root, data);
|
||||
ret = btrfs_parse_options(root, data, *flags);
|
||||
if (ret) {
|
||||
ret = -EINVAL;
|
||||
goto restore;
|
||||
|
|
Loading…
Reference in a new issue