Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
23c1a966
Commit
23c1a966
authored
Feb 26, 2016
by
David Sterba
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'foreign/qu/norecovery-v7' into for-chris-4.6
parents
67d605fe
fed8f166
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
67 additions
and
18 deletions
+67
-18
Documentation/filesystems/btrfs.txt
Documentation/filesystems/btrfs.txt
+16
-3
fs/btrfs/ctree.h
fs/btrfs/ctree.h
+4
-2
fs/btrfs/disk-io.c
fs/btrfs/disk-io.c
+11
-4
fs/btrfs/super.c
fs/btrfs/super.c
+36
-9
No files found.
Documentation/filesystems/btrfs.txt
View file @
23c1a966
...
...
@@ -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
...
...
fs/btrfs/ctree.h
View file @
23c1a966
...
...
@@ -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
...
...
fs/btrfs/disk-io.c
View file @
23c1a966
...
...
@@ -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 @@ int open_ctree(struct super_block *sb,
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 @@ int open_ctree(struct super_block *sb,
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 @@ int open_ctree(struct super_block *sb,
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
);
...
...
fs/btrfs/super.c
View file @
23c1a966
...
...
@@ -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
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment