diff options
author | Eric Sandeen <sandeen@redhat.com> | 2010-04-30 12:09:34 -0400 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2010-05-21 13:30:41 -0400 |
commit | 0636c73ee7b129f77f577aaaefc8dde057be6d18 (patch) | |
tree | 6cf9dba3119f9ec6fa346572c8a5bd693828bf45 /fs/ext3/super.c | |
parent | dde9588853b1bde542eab247f8838c472806688f (diff) |
ext3: make barrier options consistent with ext4
ext4 was updated to accept barrier/nobarrier mount options
in addition to the older barrier=0/1. The barrier story
is complex enough, we should help people by making the options
the same at least, even if the defaults are different.
This patch allows the barrier/nobarrier mount options for ext3,
while keeping nobarrier the default.
It also unconditionally displays barrier status in show_options,
and prints a message at mount time if barriers are not enabled,
just as ext4 does.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/ext3/super.c')
-rw-r--r-- | fs/ext3/super.c | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 6b6e49de0916..0fc1293d0e96 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c | |||
@@ -653,8 +653,12 @@ static int ext3_show_options(struct seq_file *seq, struct vfsmount *vfs) | |||
653 | seq_printf(seq, ",commit=%u", | 653 | seq_printf(seq, ",commit=%u", |
654 | (unsigned) (sbi->s_commit_interval / HZ)); | 654 | (unsigned) (sbi->s_commit_interval / HZ)); |
655 | } | 655 | } |
656 | if (test_opt(sb, BARRIER)) | 656 | |
657 | seq_puts(seq, ",barrier=1"); | 657 | /* |
658 | * Always display barrier state so it's clear what the status is. | ||
659 | */ | ||
660 | seq_puts(seq, ",barrier="); | ||
661 | seq_puts(seq, test_opt(sb, BARRIER) ? "1" : "0"); | ||
658 | if (test_opt(sb, NOBH)) | 662 | if (test_opt(sb, NOBH)) |
659 | seq_puts(seq, ",nobh"); | 663 | seq_puts(seq, ",nobh"); |
660 | 664 | ||
@@ -810,8 +814,8 @@ enum { | |||
810 | Opt_data_err_abort, Opt_data_err_ignore, | 814 | Opt_data_err_abort, Opt_data_err_ignore, |
811 | Opt_usrjquota, Opt_grpjquota, Opt_offusrjquota, Opt_offgrpjquota, | 815 | Opt_usrjquota, Opt_grpjquota, Opt_offusrjquota, Opt_offgrpjquota, |
812 | Opt_jqfmt_vfsold, Opt_jqfmt_vfsv0, Opt_jqfmt_vfsv1, Opt_quota, | 816 | Opt_jqfmt_vfsold, Opt_jqfmt_vfsv0, Opt_jqfmt_vfsv1, Opt_quota, |
813 | Opt_noquota, Opt_ignore, Opt_barrier, Opt_err, Opt_resize, | 817 | Opt_noquota, Opt_ignore, Opt_barrier, Opt_nobarrier, Opt_err, |
814 | Opt_usrquota, Opt_grpquota | 818 | Opt_resize, Opt_usrquota, Opt_grpquota |
815 | }; | 819 | }; |
816 | 820 | ||
817 | static const match_table_t tokens = { | 821 | static const match_table_t tokens = { |
@@ -865,6 +869,8 @@ static const match_table_t tokens = { | |||
865 | {Opt_quota, "quota"}, | 869 | {Opt_quota, "quota"}, |
866 | {Opt_usrquota, "usrquota"}, | 870 | {Opt_usrquota, "usrquota"}, |
867 | {Opt_barrier, "barrier=%u"}, | 871 | {Opt_barrier, "barrier=%u"}, |
872 | {Opt_barrier, "barrier"}, | ||
873 | {Opt_nobarrier, "nobarrier"}, | ||
868 | {Opt_resize, "resize"}, | 874 | {Opt_resize, "resize"}, |
869 | {Opt_err, NULL}, | 875 | {Opt_err, NULL}, |
870 | }; | 876 | }; |
@@ -967,7 +973,11 @@ static int parse_options (char *options, struct super_block *sb, | |||
967 | int token; | 973 | int token; |
968 | if (!*p) | 974 | if (!*p) |
969 | continue; | 975 | continue; |
970 | 976 | /* | |
977 | * Initialize args struct so we know whether arg was | ||
978 | * found; some options take optional arguments. | ||
979 | */ | ||
980 | args[0].to = args[0].from = 0; | ||
971 | token = match_token(p, tokens, args); | 981 | token = match_token(p, tokens, args); |
972 | switch (token) { | 982 | switch (token) { |
973 | case Opt_bsd_df: | 983 | case Opt_bsd_df: |
@@ -1215,9 +1225,15 @@ set_qf_format: | |||
1215 | case Opt_abort: | 1225 | case Opt_abort: |
1216 | set_opt(sbi->s_mount_opt, ABORT); | 1226 | set_opt(sbi->s_mount_opt, ABORT); |
1217 | break; | 1227 | break; |
1228 | case Opt_nobarrier: | ||
1229 | clear_opt(sbi->s_mount_opt, BARRIER); | ||
1230 | break; | ||
1218 | case Opt_barrier: | 1231 | case Opt_barrier: |
1219 | if (match_int(&args[0], &option)) | 1232 | if (args[0].from) { |
1220 | return 0; | 1233 | if (match_int(&args[0], &option)) |
1234 | return 0; | ||
1235 | } else | ||
1236 | option = 1; /* No argument, default to 1 */ | ||
1221 | if (option) | 1237 | if (option) |
1222 | set_opt(sbi->s_mount_opt, BARRIER); | 1238 | set_opt(sbi->s_mount_opt, BARRIER); |
1223 | else | 1239 | else |
@@ -2276,6 +2292,9 @@ static int ext3_load_journal(struct super_block *sb, | |||
2276 | return -EINVAL; | 2292 | return -EINVAL; |
2277 | } | 2293 | } |
2278 | 2294 | ||
2295 | if (!(journal->j_flags & JFS_BARRIER)) | ||
2296 | printk(KERN_INFO "EXT3-fs: barriers not enabled\n"); | ||
2297 | |||
2279 | if (!really_read_only && test_opt(sb, UPDATE_JOURNAL)) { | 2298 | if (!really_read_only && test_opt(sb, UPDATE_JOURNAL)) { |
2280 | err = journal_update_format(journal); | 2299 | err = journal_update_format(journal); |
2281 | if (err) { | 2300 | if (err) { |