]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - fs/gfs2/ops_fstype.c
Merge branch 'work.vboxsf' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[linux.git] / fs / gfs2 / ops_fstype.c
index e8b7b0ce84049a810f2ecc1ef7b4dddffcf8cd4e..a1a8ef7ed3fde76ce1bea1a5e88a5726a96ca839 100644 (file)
@@ -298,6 +298,8 @@ static int gfs2_read_sb(struct gfs2_sbd *sdp, int silent)
                          sizeof(struct gfs2_dinode)) / sizeof(u64);
        sdp->sd_inptrs = (sdp->sd_sb.sb_bsize -
                          sizeof(struct gfs2_meta_header)) / sizeof(u64);
+       sdp->sd_ldptrs = (sdp->sd_sb.sb_bsize -
+                         sizeof(struct gfs2_log_descriptor)) / sizeof(u64);
        sdp->sd_jbsize = sdp->sd_sb.sb_bsize - sizeof(struct gfs2_meta_header);
        sdp->sd_hash_bsize = sdp->sd_sb.sb_bsize / 2;
        sdp->sd_hash_bsize_shift = sdp->sd_sb.sb_bsize_shift - 1;
@@ -1250,6 +1252,7 @@ enum gfs2_param {
        Opt_upgrade,
        Opt_acl,
        Opt_quota,
+       Opt_quota_flag,
        Opt_suiddir,
        Opt_data,
        Opt_meta,
@@ -1264,17 +1267,11 @@ enum gfs2_param {
        Opt_loccookie,
 };
 
-enum opt_quota {
-       Opt_quota_unset = 0,
-       Opt_quota_off,
-       Opt_quota_account,
-       Opt_quota_on,
-};
-
-static const unsigned int opt_quota_values[] = {
-       [Opt_quota_off]     = GFS2_QUOTA_OFF,
-       [Opt_quota_account] = GFS2_QUOTA_ACCOUNT,
-       [Opt_quota_on]      = GFS2_QUOTA_ON,
+static const struct constant_table gfs2_param_quota[] = {
+       {"off",        GFS2_QUOTA_OFF},
+       {"account",    GFS2_QUOTA_ACCOUNT},
+       {"on",         GFS2_QUOTA_ON},
+       {}
 };
 
 enum opt_data {
@@ -1282,12 +1279,24 @@ enum opt_data {
        Opt_data_ordered   = GFS2_DATA_ORDERED,
 };
 
+static const struct constant_table gfs2_param_data[] = {
+       {"writeback",  Opt_data_writeback },
+       {"ordered",    Opt_data_ordered },
+       {}
+};
+
 enum opt_errors {
        Opt_errors_withdraw = GFS2_ERRORS_WITHDRAW,
        Opt_errors_panic    = GFS2_ERRORS_PANIC,
 };
 
-static const struct fs_parameter_spec gfs2_param_specs[] = {
+static const struct constant_table gfs2_param_errors[] = {
+       {"withdraw",   Opt_errors_withdraw },
+       {"panic",      Opt_errors_panic },
+       {}
+};
+
+static const struct fs_parameter_spec gfs2_fs_parameters[] = {
        fsparam_string ("lockproto",          Opt_lockproto),
        fsparam_string ("locktable",          Opt_locktable),
        fsparam_string ("hostdata",           Opt_hostdata),
@@ -1300,11 +1309,11 @@ static const struct fs_parameter_spec gfs2_param_specs[] = {
        fsparam_flag   ("upgrade",            Opt_upgrade),
        fsparam_flag_no("acl",                Opt_acl),
        fsparam_flag_no("suiddir",            Opt_suiddir),
-       fsparam_enum   ("data",               Opt_data),
+       fsparam_enum   ("data",               Opt_data, gfs2_param_data),
        fsparam_flag   ("meta",               Opt_meta),
        fsparam_flag_no("discard",            Opt_discard),
        fsparam_s32    ("commit",             Opt_commit),
-       fsparam_enum   ("errors",             Opt_errors),
+       fsparam_enum   ("errors",             Opt_errors, gfs2_param_errors),
        fsparam_s32    ("statfs_quantum",     Opt_statfs_quantum),
        fsparam_s32    ("statfs_percent",     Opt_statfs_percent),
        fsparam_s32    ("quota_quantum",      Opt_quota_quantum),
@@ -1312,27 +1321,11 @@ static const struct fs_parameter_spec gfs2_param_specs[] = {
        fsparam_flag_no("rgrplvb",            Opt_rgrplvb),
        fsparam_flag_no("loccookie",          Opt_loccookie),
        /* quota can be a flag or an enum so it gets special treatment */
-       __fsparam(fs_param_is_enum, "quota", Opt_quota, fs_param_neg_with_no|fs_param_v_optional),
-       {}
-};
-
-static const struct fs_parameter_enum gfs2_param_enums[] = {
-       { Opt_quota,    "off",        Opt_quota_off },
-       { Opt_quota,    "account",    Opt_quota_account },
-       { Opt_quota,    "on",         Opt_quota_on },
-       { Opt_data,     "writeback",  Opt_data_writeback },
-       { Opt_data,     "ordered",    Opt_data_ordered },
-       { Opt_errors,   "withdraw",   Opt_errors_withdraw },
-       { Opt_errors,   "panic",      Opt_errors_panic },
+       fsparam_flag_no("quota",              Opt_quota_flag),
+       fsparam_enum("quota",                 Opt_quota, gfs2_param_quota),
        {}
 };
 
-static const struct fs_parameter_description gfs2_fs_parameters = {
-       .name = "gfs2",
-       .specs = gfs2_param_specs,
-       .enums = gfs2_param_enums,
-};
-
 /* Parse a single mount parameter */
 static int gfs2_parse_param(struct fs_context *fc, struct fs_parameter *param)
 {
@@ -1340,7 +1333,7 @@ static int gfs2_parse_param(struct fs_context *fc, struct fs_parameter *param)
        struct fs_parse_result result;
        int o;
 
-       o = fs_parse(fc, &gfs2_fs_parameters, param, &result);
+       o = fs_parse(fc, gfs2_fs_parameters, param, &result);
        if (o < 0)
                return o;
 
@@ -1368,7 +1361,7 @@ static int gfs2_parse_param(struct fs_context *fc, struct fs_parameter *param)
                break;
        case Opt_debug:
                if (result.boolean && args->ar_errors == GFS2_ERRORS_PANIC)
-                       return invalf(fc, "gfs2: -o debug and -o errors=panic are mutually exclusive");
+                       return invalfc(fc, "-o debug and -o errors=panic are mutually exclusive");
                args->ar_debug = result.boolean;
                break;
        case Opt_upgrade:
@@ -1377,17 +1370,11 @@ static int gfs2_parse_param(struct fs_context *fc, struct fs_parameter *param)
        case Opt_acl:
                args->ar_posix_acl = result.boolean;
                break;
+       case Opt_quota_flag:
+               args->ar_quota = result.negated ? GFS2_QUOTA_OFF : GFS2_QUOTA_ON;
+               break;
        case Opt_quota:
-               /* The quota option can be a flag or an enum. A non-zero int_32
-                  result means that we have an enum index. Otherwise we have
-                  to rely on the 'negated' flag to tell us whether 'quota' or
-                  'noquota' was specified. */
-               if (result.negated)
-                       args->ar_quota = GFS2_QUOTA_OFF;
-               else if (result.int_32 > 0)
-                       args->ar_quota = opt_quota_values[result.int_32];
-               else
-                       args->ar_quota = GFS2_QUOTA_ON;
+               args->ar_quota = result.int_32;
                break;
        case Opt_suiddir:
                args->ar_suiddir = result.boolean;
@@ -1404,27 +1391,27 @@ static int gfs2_parse_param(struct fs_context *fc, struct fs_parameter *param)
                break;
        case Opt_commit:
                if (result.int_32 <= 0)
-                       return invalf(fc, "gfs2: commit mount option requires a positive numeric argument");
+                       return invalfc(fc, "commit mount option requires a positive numeric argument");
                args->ar_commit = result.int_32;
                break;
        case Opt_statfs_quantum:
                if (result.int_32 < 0)
-                       return invalf(fc, "gfs2: statfs_quantum mount option requires a non-negative numeric argument");
+                       return invalfc(fc, "statfs_quantum mount option requires a non-negative numeric argument");
                args->ar_statfs_quantum = result.int_32;
                break;
        case Opt_quota_quantum:
                if (result.int_32 <= 0)
-                       return invalf(fc, "gfs2: quota_quantum mount option requires a positive numeric argument");
+                       return invalfc(fc, "quota_quantum mount option requires a positive numeric argument");
                args->ar_quota_quantum = result.int_32;
                break;
        case Opt_statfs_percent:
                if (result.int_32 < 0 || result.int_32 > 100)
-                       return invalf(fc, "gfs2: statfs_percent mount option requires a numeric argument between 0 and 100");
+                       return invalfc(fc, "statfs_percent mount option requires a numeric argument between 0 and 100");
                args->ar_statfs_percent = result.int_32;
                break;
        case Opt_errors:
                if (args->ar_debug && result.uint_32 == GFS2_ERRORS_PANIC)
-                       return invalf(fc, "gfs2: -o debug and -o errors=panic are mutually exclusive");
+                       return invalfc(fc, "-o debug and -o errors=panic are mutually exclusive");
                args->ar_errors = result.uint_32;
                break;
        case Opt_barrier:
@@ -1437,7 +1424,7 @@ static int gfs2_parse_param(struct fs_context *fc, struct fs_parameter *param)
                args->ar_loccookie = result.boolean;
                break;
        default:
-               return invalf(fc, "gfs2: invalid mount option: %s", param->key);
+               return invalfc(fc, "invalid mount option: %s", param->key);
        }
        return 0;
 }
@@ -1463,27 +1450,27 @@ static int gfs2_reconfigure(struct fs_context *fc)
        spin_unlock(&gt->gt_spin);
 
        if (strcmp(newargs->ar_lockproto, oldargs->ar_lockproto)) {
-               errorf(fc, "gfs2: reconfiguration of locking protocol not allowed");
+               errorfc(fc, "reconfiguration of locking protocol not allowed");
                return -EINVAL;
        }
        if (strcmp(newargs->ar_locktable, oldargs->ar_locktable)) {
-               errorf(fc, "gfs2: reconfiguration of lock table not allowed");
+               errorfc(fc, "reconfiguration of lock table not allowed");
                return -EINVAL;
        }
        if (strcmp(newargs->ar_hostdata, oldargs->ar_hostdata)) {
-               errorf(fc, "gfs2: reconfiguration of host data not allowed");
+               errorfc(fc, "reconfiguration of host data not allowed");
                return -EINVAL;
        }
        if (newargs->ar_spectator != oldargs->ar_spectator) {
-               errorf(fc, "gfs2: reconfiguration of spectator mode not allowed");
+               errorfc(fc, "reconfiguration of spectator mode not allowed");
                return -EINVAL;
        }
        if (newargs->ar_localflocks != oldargs->ar_localflocks) {
-               errorf(fc, "gfs2: reconfiguration of localflocks not allowed");
+               errorfc(fc, "reconfiguration of localflocks not allowed");
                return -EINVAL;
        }
        if (newargs->ar_meta != oldargs->ar_meta) {
-               errorf(fc, "gfs2: switching between gfs2 and gfs2meta not allowed");
+               errorfc(fc, "switching between gfs2 and gfs2meta not allowed");
                return -EINVAL;
        }
        if (oldargs->ar_spectator)
@@ -1493,11 +1480,11 @@ static int gfs2_reconfigure(struct fs_context *fc)
                if (fc->sb_flags & SB_RDONLY) {
                        error = gfs2_make_fs_ro(sdp);
                        if (error)
-                               errorf(fc, "gfs2: unable to remount read-only");
+                               errorfc(fc, "unable to remount read-only");
                } else {
                        error = gfs2_make_fs_rw(sdp);
                        if (error)
-                               errorf(fc, "gfs2: unable to remount read-write");
+                               errorfc(fc, "unable to remount read-write");
                }
        }
        sdp->sd_args = *newargs;
@@ -1642,7 +1629,7 @@ struct file_system_type gfs2_fs_type = {
        .name = "gfs2",
        .fs_flags = FS_REQUIRES_DEV,
        .init_fs_context = gfs2_init_fs_context,
-       .parameters = &gfs2_fs_parameters,
+       .parameters = gfs2_fs_parameters,
        .kill_sb = gfs2_kill_sb,
        .owner = THIS_MODULE,
 };