|
@@ -100,6 +100,8 @@ struct mount_options
|
|
|
static int ocfs2_parse_options(struct super_block *sb, char *options,
|
|
|
struct mount_options *mopt,
|
|
|
int is_remount);
|
|
|
+static int ocfs2_check_set_options(struct super_block *sb,
|
|
|
+ struct mount_options *options);
|
|
|
static int ocfs2_show_options(struct seq_file *s, struct vfsmount *mnt);
|
|
|
static void ocfs2_put_super(struct super_block *sb);
|
|
|
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)
|
|
|
|
|
|
lock_kernel();
|
|
|
|
|
|
- if (!ocfs2_parse_options(sb, data, &parsed_options, 1)) {
|
|
|
+ if (!ocfs2_parse_options(sb, data, &parsed_options, 1) ||
|
|
|
+ !ocfs2_check_set_options(sb, &parsed_options)) {
|
|
|
ret = -EINVAL;
|
|
|
goto out;
|
|
|
}
|
|
@@ -691,8 +694,6 @@ unlock_osb:
|
|
|
if (!ret) {
|
|
|
/* Only save off the new mount options in case of a successful
|
|
|
* remount. */
|
|
|
- if (!(osb->s_feature_incompat & OCFS2_FEATURE_INCOMPAT_XATTR))
|
|
|
- parsed_options.mount_opt &= ~OCFS2_MOUNT_POSIX_ACL;
|
|
|
osb->s_mount_opt = parsed_options.mount_opt;
|
|
|
osb->s_atime_quantum = parsed_options.atime_quantum;
|
|
|
osb->preferred_slot = parsed_options.slot;
|
|
@@ -701,6 +702,10 @@ unlock_osb:
|
|
|
|
|
|
if (!ocfs2_is_hard_readonly(osb))
|
|
|
ocfs2_set_journal_params(osb);
|
|
|
+
|
|
|
+ sb->s_flags = (sb->s_flags & ~MS_POSIXACL) |
|
|
|
+ ((osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL) ?
|
|
|
+ MS_POSIXACL : 0);
|
|
|
}
|
|
|
out:
|
|
|
unlock_kernel();
|
|
@@ -1011,31 +1016,16 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent)
|
|
|
brelse(bh);
|
|
|
bh = NULL;
|
|
|
|
|
|
- if (!(osb->s_feature_incompat & OCFS2_FEATURE_INCOMPAT_XATTR))
|
|
|
- parsed_options.mount_opt &= ~OCFS2_MOUNT_POSIX_ACL;
|
|
|
-
|
|
|
+ if (!ocfs2_check_set_options(sb, &parsed_options)) {
|
|
|
+ status = -EINVAL;
|
|
|
+ goto read_super_error;
|
|
|
+ }
|
|
|
osb->s_mount_opt = parsed_options.mount_opt;
|
|
|
osb->s_atime_quantum = parsed_options.atime_quantum;
|
|
|
osb->preferred_slot = parsed_options.slot;
|
|
|
osb->osb_commit_interval = parsed_options.commit_interval;
|
|
|
osb->local_alloc_default_bits = ocfs2_megabytes_to_clusters(sb, parsed_options.localalloc_opt);
|
|
|
osb->local_alloc_bits = osb->local_alloc_default_bits;
|
|
|
- if (osb->s_mount_opt & OCFS2_MOUNT_USRQUOTA &&
|
|
|
- !OCFS2_HAS_RO_COMPAT_FEATURE(sb,
|
|
|
- OCFS2_FEATURE_RO_COMPAT_USRQUOTA)) {
|
|
|
- status = -EINVAL;
|
|
|
- mlog(ML_ERROR, "User quotas were requested, but this "
|
|
|
- "filesystem does not have the feature enabled.\n");
|
|
|
- goto read_super_error;
|
|
|
- }
|
|
|
- if (osb->s_mount_opt & OCFS2_MOUNT_GRPQUOTA &&
|
|
|
- !OCFS2_HAS_RO_COMPAT_FEATURE(sb,
|
|
|
- OCFS2_FEATURE_RO_COMPAT_GRPQUOTA)) {
|
|
|
- status = -EINVAL;
|
|
|
- mlog(ML_ERROR, "Group quotas were requested, but this "
|
|
|
- "filesystem does not have the feature enabled.\n");
|
|
|
- goto read_super_error;
|
|
|
- }
|
|
|
|
|
|
status = ocfs2_verify_userspace_stack(osb, &parsed_options);
|
|
|
if (status)
|
|
@@ -1245,6 +1235,40 @@ static struct file_system_type ocfs2_fs_type = {
|
|
|
.next = NULL
|
|
|
};
|
|
|
|
|
|
+static int ocfs2_check_set_options(struct super_block *sb,
|
|
|
+ struct mount_options *options)
|
|
|
+{
|
|
|
+ if (options->mount_opt & OCFS2_MOUNT_USRQUOTA &&
|
|
|
+ !OCFS2_HAS_RO_COMPAT_FEATURE(sb,
|
|
|
+ OCFS2_FEATURE_RO_COMPAT_USRQUOTA)) {
|
|
|
+ mlog(ML_ERROR, "User quotas were requested, but this "
|
|
|
+ "filesystem does not have the feature enabled.\n");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ if (options->mount_opt & OCFS2_MOUNT_GRPQUOTA &&
|
|
|
+ !OCFS2_HAS_RO_COMPAT_FEATURE(sb,
|
|
|
+ OCFS2_FEATURE_RO_COMPAT_GRPQUOTA)) {
|
|
|
+ mlog(ML_ERROR, "Group quotas were requested, but this "
|
|
|
+ "filesystem does not have the feature enabled.\n");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ if (options->mount_opt & OCFS2_MOUNT_POSIX_ACL &&
|
|
|
+ !OCFS2_HAS_INCOMPAT_FEATURE(sb, OCFS2_FEATURE_INCOMPAT_XATTR)) {
|
|
|
+ mlog(ML_ERROR, "ACL support requested but extended attributes "
|
|
|
+ "feature is not enabled\n");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ /* No ACL setting specified? Use XATTR feature... */
|
|
|
+ if (!(options->mount_opt & (OCFS2_MOUNT_POSIX_ACL |
|
|
|
+ OCFS2_MOUNT_NO_POSIX_ACL))) {
|
|
|
+ if (OCFS2_HAS_INCOMPAT_FEATURE(sb, OCFS2_FEATURE_INCOMPAT_XATTR))
|
|
|
+ options->mount_opt |= OCFS2_MOUNT_POSIX_ACL;
|
|
|
+ else
|
|
|
+ options->mount_opt |= OCFS2_MOUNT_NO_POSIX_ACL;
|
|
|
+ }
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
static int ocfs2_parse_options(struct super_block *sb,
|
|
|
char *options,
|
|
|
struct mount_options *mopt,
|
|
@@ -1392,40 +1416,19 @@ static int ocfs2_parse_options(struct super_block *sb,
|
|
|
mopt->mount_opt |= OCFS2_MOUNT_INODE64;
|
|
|
break;
|
|
|
case Opt_usrquota:
|
|
|
- /* We check only on remount, otherwise features
|
|
|
- * aren't yet initialized. */
|
|
|
- if (is_remount && !OCFS2_HAS_RO_COMPAT_FEATURE(sb,
|
|
|
- OCFS2_FEATURE_RO_COMPAT_USRQUOTA)) {
|
|
|
- mlog(ML_ERROR, "User quota requested but "
|
|
|
- "filesystem feature is not set\n");
|
|
|
- status = 0;
|
|
|
- goto bail;
|
|
|
- }
|
|
|
mopt->mount_opt |= OCFS2_MOUNT_USRQUOTA;
|
|
|
break;
|
|
|
case Opt_grpquota:
|
|
|
- if (is_remount && !OCFS2_HAS_RO_COMPAT_FEATURE(sb,
|
|
|
- OCFS2_FEATURE_RO_COMPAT_GRPQUOTA)) {
|
|
|
- mlog(ML_ERROR, "Group quota requested but "
|
|
|
- "filesystem feature is not set\n");
|
|
|
- status = 0;
|
|
|
- goto bail;
|
|
|
- }
|
|
|
mopt->mount_opt |= OCFS2_MOUNT_GRPQUOTA;
|
|
|
break;
|
|
|
-#ifdef CONFIG_OCFS2_FS_POSIX_ACL
|
|
|
case Opt_acl:
|
|
|
mopt->mount_opt |= OCFS2_MOUNT_POSIX_ACL;
|
|
|
+ mopt->mount_opt &= ~OCFS2_MOUNT_NO_POSIX_ACL;
|
|
|
break;
|
|
|
case Opt_noacl:
|
|
|
+ mopt->mount_opt |= OCFS2_MOUNT_NO_POSIX_ACL;
|
|
|
mopt->mount_opt &= ~OCFS2_MOUNT_POSIX_ACL;
|
|
|
break;
|
|
|
-#else
|
|
|
- case Opt_acl:
|
|
|
- case Opt_noacl:
|
|
|
- printk(KERN_INFO "ocfs2 (no)acl options not supported\n");
|
|
|
- break;
|
|
|
-#endif
|
|
|
default:
|
|
|
mlog(ML_ERROR,
|
|
|
"Unrecognized mount option \"%s\" "
|
|
@@ -1502,12 +1505,10 @@ static int ocfs2_show_options(struct seq_file *s, struct vfsmount *mnt)
|
|
|
if (opts & OCFS2_MOUNT_INODE64)
|
|
|
seq_printf(s, ",inode64");
|
|
|
|
|
|
-#ifdef CONFIG_OCFS2_FS_POSIX_ACL
|
|
|
if (opts & OCFS2_MOUNT_POSIX_ACL)
|
|
|
seq_printf(s, ",acl");
|
|
|
else
|
|
|
seq_printf(s, ",noacl");
|
|
|
-#endif
|
|
|
|
|
|
return 0;
|
|
|
}
|