diff options
Diffstat (limited to 'fs/ocfs2/super.c')
-rw-r--r-- | fs/ocfs2/super.c | 95 |
1 files changed, 48 insertions, 47 deletions
diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index 14f47d2bfe02..26069917a9f5 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c | |||
@@ -100,6 +100,8 @@ struct mount_options | |||
100 | static int ocfs2_parse_options(struct super_block *sb, char *options, | 100 | static int ocfs2_parse_options(struct super_block *sb, char *options, |
101 | struct mount_options *mopt, | 101 | struct mount_options *mopt, |
102 | int is_remount); | 102 | int is_remount); |
103 | static int ocfs2_check_set_options(struct super_block *sb, | ||
104 | struct mount_options *options); | ||
103 | static int ocfs2_show_options(struct seq_file *s, struct vfsmount *mnt); | 105 | static int ocfs2_show_options(struct seq_file *s, struct vfsmount *mnt); |
104 | static void ocfs2_put_super(struct super_block *sb); | 106 | static void ocfs2_put_super(struct super_block *sb); |
105 | static int ocfs2_mount_volume(struct super_block *sb); | 107 | static int ocfs2_mount_volume(struct super_block *sb); |
@@ -600,7 +602,8 @@ static int ocfs2_remount(struct super_block *sb, int *flags, char *data) | |||
600 | 602 | ||
601 | lock_kernel(); | 603 | lock_kernel(); |
602 | 604 | ||
603 | if (!ocfs2_parse_options(sb, data, &parsed_options, 1)) { | 605 | if (!ocfs2_parse_options(sb, data, &parsed_options, 1) || |
606 | !ocfs2_check_set_options(sb, &parsed_options)) { | ||
604 | ret = -EINVAL; | 607 | ret = -EINVAL; |
605 | goto out; | 608 | goto out; |
606 | } | 609 | } |
@@ -691,8 +694,6 @@ unlock_osb: | |||
691 | if (!ret) { | 694 | if (!ret) { |
692 | /* Only save off the new mount options in case of a successful | 695 | /* Only save off the new mount options in case of a successful |
693 | * remount. */ | 696 | * remount. */ |
694 | if (!(osb->s_feature_incompat & OCFS2_FEATURE_INCOMPAT_XATTR)) | ||
695 | parsed_options.mount_opt &= ~OCFS2_MOUNT_POSIX_ACL; | ||
696 | osb->s_mount_opt = parsed_options.mount_opt; | 697 | osb->s_mount_opt = parsed_options.mount_opt; |
697 | osb->s_atime_quantum = parsed_options.atime_quantum; | 698 | osb->s_atime_quantum = parsed_options.atime_quantum; |
698 | osb->preferred_slot = parsed_options.slot; | 699 | osb->preferred_slot = parsed_options.slot; |
@@ -701,6 +702,10 @@ unlock_osb: | |||
701 | 702 | ||
702 | if (!ocfs2_is_hard_readonly(osb)) | 703 | if (!ocfs2_is_hard_readonly(osb)) |
703 | ocfs2_set_journal_params(osb); | 704 | ocfs2_set_journal_params(osb); |
705 | |||
706 | sb->s_flags = (sb->s_flags & ~MS_POSIXACL) | | ||
707 | ((osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL) ? | ||
708 | MS_POSIXACL : 0); | ||
704 | } | 709 | } |
705 | out: | 710 | out: |
706 | unlock_kernel(); | 711 | unlock_kernel(); |
@@ -1011,31 +1016,16 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) | |||
1011 | brelse(bh); | 1016 | brelse(bh); |
1012 | bh = NULL; | 1017 | bh = NULL; |
1013 | 1018 | ||
1014 | if (!(osb->s_feature_incompat & OCFS2_FEATURE_INCOMPAT_XATTR)) | 1019 | if (!ocfs2_check_set_options(sb, &parsed_options)) { |
1015 | parsed_options.mount_opt &= ~OCFS2_MOUNT_POSIX_ACL; | 1020 | status = -EINVAL; |
1016 | 1021 | goto read_super_error; | |
1022 | } | ||
1017 | osb->s_mount_opt = parsed_options.mount_opt; | 1023 | osb->s_mount_opt = parsed_options.mount_opt; |
1018 | osb->s_atime_quantum = parsed_options.atime_quantum; | 1024 | osb->s_atime_quantum = parsed_options.atime_quantum; |
1019 | osb->preferred_slot = parsed_options.slot; | 1025 | osb->preferred_slot = parsed_options.slot; |
1020 | osb->osb_commit_interval = parsed_options.commit_interval; | 1026 | osb->osb_commit_interval = parsed_options.commit_interval; |
1021 | osb->local_alloc_default_bits = ocfs2_megabytes_to_clusters(sb, parsed_options.localalloc_opt); | 1027 | osb->local_alloc_default_bits = ocfs2_megabytes_to_clusters(sb, parsed_options.localalloc_opt); |
1022 | osb->local_alloc_bits = osb->local_alloc_default_bits; | 1028 | osb->local_alloc_bits = osb->local_alloc_default_bits; |
1023 | if (osb->s_mount_opt & OCFS2_MOUNT_USRQUOTA && | ||
1024 | !OCFS2_HAS_RO_COMPAT_FEATURE(sb, | ||
1025 | OCFS2_FEATURE_RO_COMPAT_USRQUOTA)) { | ||
1026 | status = -EINVAL; | ||
1027 | mlog(ML_ERROR, "User quotas were requested, but this " | ||
1028 | "filesystem does not have the feature enabled.\n"); | ||
1029 | goto read_super_error; | ||
1030 | } | ||
1031 | if (osb->s_mount_opt & OCFS2_MOUNT_GRPQUOTA && | ||
1032 | !OCFS2_HAS_RO_COMPAT_FEATURE(sb, | ||
1033 | OCFS2_FEATURE_RO_COMPAT_GRPQUOTA)) { | ||
1034 | status = -EINVAL; | ||
1035 | mlog(ML_ERROR, "Group quotas were requested, but this " | ||
1036 | "filesystem does not have the feature enabled.\n"); | ||
1037 | goto read_super_error; | ||
1038 | } | ||
1039 | 1029 | ||
1040 | status = ocfs2_verify_userspace_stack(osb, &parsed_options); | 1030 | status = ocfs2_verify_userspace_stack(osb, &parsed_options); |
1041 | if (status) | 1031 | if (status) |
@@ -1245,6 +1235,40 @@ static struct file_system_type ocfs2_fs_type = { | |||
1245 | .next = NULL | 1235 | .next = NULL |
1246 | }; | 1236 | }; |
1247 | 1237 | ||
1238 | static int ocfs2_check_set_options(struct super_block *sb, | ||
1239 | struct mount_options *options) | ||
1240 | { | ||
1241 | if (options->mount_opt & OCFS2_MOUNT_USRQUOTA && | ||
1242 | !OCFS2_HAS_RO_COMPAT_FEATURE(sb, | ||
1243 | OCFS2_FEATURE_RO_COMPAT_USRQUOTA)) { | ||
1244 | mlog(ML_ERROR, "User quotas were requested, but this " | ||
1245 | "filesystem does not have the feature enabled.\n"); | ||
1246 | return 0; | ||
1247 | } | ||
1248 | if (options->mount_opt & OCFS2_MOUNT_GRPQUOTA && | ||
1249 | !OCFS2_HAS_RO_COMPAT_FEATURE(sb, | ||
1250 | OCFS2_FEATURE_RO_COMPAT_GRPQUOTA)) { | ||
1251 | mlog(ML_ERROR, "Group quotas were requested, but this " | ||
1252 | "filesystem does not have the feature enabled.\n"); | ||
1253 | return 0; | ||
1254 | } | ||
1255 | if (options->mount_opt & OCFS2_MOUNT_POSIX_ACL && | ||
1256 | !OCFS2_HAS_INCOMPAT_FEATURE(sb, OCFS2_FEATURE_INCOMPAT_XATTR)) { | ||
1257 | mlog(ML_ERROR, "ACL support requested but extended attributes " | ||
1258 | "feature is not enabled\n"); | ||
1259 | return 0; | ||
1260 | } | ||
1261 | /* No ACL setting specified? Use XATTR feature... */ | ||
1262 | if (!(options->mount_opt & (OCFS2_MOUNT_POSIX_ACL | | ||
1263 | OCFS2_MOUNT_NO_POSIX_ACL))) { | ||
1264 | if (OCFS2_HAS_INCOMPAT_FEATURE(sb, OCFS2_FEATURE_INCOMPAT_XATTR)) | ||
1265 | options->mount_opt |= OCFS2_MOUNT_POSIX_ACL; | ||
1266 | else | ||
1267 | options->mount_opt |= OCFS2_MOUNT_NO_POSIX_ACL; | ||
1268 | } | ||
1269 | return 1; | ||
1270 | } | ||
1271 | |||
1248 | static int ocfs2_parse_options(struct super_block *sb, | 1272 | static int ocfs2_parse_options(struct super_block *sb, |
1249 | char *options, | 1273 | char *options, |
1250 | struct mount_options *mopt, | 1274 | struct mount_options *mopt, |
@@ -1392,40 +1416,19 @@ static int ocfs2_parse_options(struct super_block *sb, | |||
1392 | mopt->mount_opt |= OCFS2_MOUNT_INODE64; | 1416 | mopt->mount_opt |= OCFS2_MOUNT_INODE64; |
1393 | break; | 1417 | break; |
1394 | case Opt_usrquota: | 1418 | case Opt_usrquota: |
1395 | /* We check only on remount, otherwise features | ||
1396 | * aren't yet initialized. */ | ||
1397 | if (is_remount && !OCFS2_HAS_RO_COMPAT_FEATURE(sb, | ||
1398 | OCFS2_FEATURE_RO_COMPAT_USRQUOTA)) { | ||
1399 | mlog(ML_ERROR, "User quota requested but " | ||
1400 | "filesystem feature is not set\n"); | ||
1401 | status = 0; | ||
1402 | goto bail; | ||
1403 | } | ||
1404 | mopt->mount_opt |= OCFS2_MOUNT_USRQUOTA; | 1419 | mopt->mount_opt |= OCFS2_MOUNT_USRQUOTA; |
1405 | break; | 1420 | break; |
1406 | case Opt_grpquota: | 1421 | case Opt_grpquota: |
1407 | if (is_remount && !OCFS2_HAS_RO_COMPAT_FEATURE(sb, | ||
1408 | OCFS2_FEATURE_RO_COMPAT_GRPQUOTA)) { | ||
1409 | mlog(ML_ERROR, "Group quota requested but " | ||
1410 | "filesystem feature is not set\n"); | ||
1411 | status = 0; | ||
1412 | goto bail; | ||
1413 | } | ||
1414 | mopt->mount_opt |= OCFS2_MOUNT_GRPQUOTA; | 1422 | mopt->mount_opt |= OCFS2_MOUNT_GRPQUOTA; |
1415 | break; | 1423 | break; |
1416 | #ifdef CONFIG_OCFS2_FS_POSIX_ACL | ||
1417 | case Opt_acl: | 1424 | case Opt_acl: |
1418 | mopt->mount_opt |= OCFS2_MOUNT_POSIX_ACL; | 1425 | mopt->mount_opt |= OCFS2_MOUNT_POSIX_ACL; |
1426 | mopt->mount_opt &= ~OCFS2_MOUNT_NO_POSIX_ACL; | ||
1419 | break; | 1427 | break; |
1420 | case Opt_noacl: | 1428 | case Opt_noacl: |
1429 | mopt->mount_opt |= OCFS2_MOUNT_NO_POSIX_ACL; | ||
1421 | mopt->mount_opt &= ~OCFS2_MOUNT_POSIX_ACL; | 1430 | mopt->mount_opt &= ~OCFS2_MOUNT_POSIX_ACL; |
1422 | break; | 1431 | break; |
1423 | #else | ||
1424 | case Opt_acl: | ||
1425 | case Opt_noacl: | ||
1426 | printk(KERN_INFO "ocfs2 (no)acl options not supported\n"); | ||
1427 | break; | ||
1428 | #endif | ||
1429 | default: | 1432 | default: |
1430 | mlog(ML_ERROR, | 1433 | mlog(ML_ERROR, |
1431 | "Unrecognized mount option \"%s\" " | 1434 | "Unrecognized mount option \"%s\" " |
@@ -1502,12 +1505,10 @@ static int ocfs2_show_options(struct seq_file *s, struct vfsmount *mnt) | |||
1502 | if (opts & OCFS2_MOUNT_INODE64) | 1505 | if (opts & OCFS2_MOUNT_INODE64) |
1503 | seq_printf(s, ",inode64"); | 1506 | seq_printf(s, ",inode64"); |
1504 | 1507 | ||
1505 | #ifdef CONFIG_OCFS2_FS_POSIX_ACL | ||
1506 | if (opts & OCFS2_MOUNT_POSIX_ACL) | 1508 | if (opts & OCFS2_MOUNT_POSIX_ACL) |
1507 | seq_printf(s, ",acl"); | 1509 | seq_printf(s, ",acl"); |
1508 | else | 1510 | else |
1509 | seq_printf(s, ",noacl"); | 1511 | seq_printf(s, ",noacl"); |
1510 | #endif | ||
1511 | 1512 | ||
1512 | return 0; | 1513 | return 0; |
1513 | } | 1514 | } |