|
From: Jan-Benedict G. <jb...@us...> - 2004-09-22 06:24:41
|
Update of /cvsroot/linux-vax/kernel-2.5/fs/ods2 In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5296 Modified Files: Makefile super.c util.c Removed Files: tparse.c tparse.h Log Message: - Use Linux-2.6.x style option parsing infrastructure. Index: Makefile =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.5/fs/ods2/Makefile,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- Makefile 19 Sep 2004 19:51:15 -0000 1.2 +++ Makefile 22 Sep 2004 06:24:30 -0000 1.3 @@ -4,7 +4,7 @@ obj-$(CONFIG_ODS2_FS) += ods2.o -ods2-objs := super.o inode.o file.o dir.o util.o tparse.o +ods2-objs := super.o inode.o file.o dir.o util.o # Intentionally misspelled, only for local compile testing lcean: Index: util.c =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.5/fs/ods2/util.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- util.c 20 Sep 2004 20:27:17 -0000 1.6 +++ util.c 22 Sep 2004 06:24:30 -0000 1.7 @@ -18,10 +18,7 @@ #include <linux/init.h> #include <linux/blkdev.h> #include <linux/buffer_head.h> - #include "ods2.h" -#include "tparse.h" - u64 div64 (u64 a, u32 b0) { @@ -203,120 +200,6 @@ return 0; } -int -save_raw (struct argblk *argblk) -{ - struct super_block *sb = (struct super_block *) argblk->arg; - struct ods2sb *ods2p = ODS2_SB (sb); - - ods2p->flags.v_raw = 1; - return 1; -} - - -int -save_lowercase (struct argblk *argblk) -{ - struct super_block *sb = (struct super_block *) argblk->arg; - struct ods2sb *ods2p = ODS2_SB (sb); - - ods2p->flags.v_lowercase = 1; - return 1; -} - - -int -save_dollar (struct argblk *argblk) -{ - struct super_block *sb = (struct super_block *) argblk->arg; - struct ods2sb *ods2p = ODS2_SB (sb); - - ods2p->dollar = argblk->token[0]; - return 1; -} - - -int -save_semicolon (struct argblk *argblk) -{ - struct super_block *sb = (struct super_block *) argblk->arg; - struct ods2sb *ods2p = ODS2_SB (sb); - - ods2p->semicolon = argblk->token[0]; - return 1; -} - - -int -save_version (struct argblk *argblk) -{ - struct super_block *sb = (struct super_block *) argblk->arg; - struct ods2sb *ods2p = ODS2_SB (sb); - - ods2p->flags.v_version = argblk->mask; - return 1; -} - - -struct tparse tpa1[]; -struct tparse tpa10[]; -struct tparse tpa11[]; -struct tparse tpa20[]; -struct tparse tpa21[]; -struct tparse tpa30[]; -struct tparse tpa31[]; - -struct tparse tpa1[] = { - { "dollar", tpa10, NULL, 0, NULL, 0 }, - { "version", tpa20, NULL, 0, NULL, 0 }, - { "semicolon", tpa30, NULL, 0, NULL, 0 }, - { "lowercase", tpa1, save_lowercase, 0, NULL, 0 }, - { "raw", tpa1, save_raw, 0, NULL, 0 }, - { TPA_EOS, TPA_EXIT, NULL, 0, NULL, 0 }, - TPA_END, -}; - -struct tparse tpa10[] = { - { "=", tpa11, NULL, 0, NULL, 0 }, - TPA_END, -}; - -struct tparse tpa11[] = { - { TPA_ANY, tpa1, save_dollar, 0, NULL, 0 }, - TPA_END, -}; - -struct tparse tpa20[] = { - { "=", tpa21, NULL, 0, NULL, 0 }, - TPA_END, -}; - -struct tparse tpa21[] = { - { "all", tpa1, save_version, SB_M_VERSALL, NULL, 0 }, - { "highest", tpa1, save_version, SB_M_VERSHIGH, NULL, 0 }, - { "none", tpa1, save_version, SB_M_VERSNONE, NULL, 0 }, - TPA_END, -}; - -struct tparse tpa30[] = { - { "=", tpa31, NULL, 0, NULL, 0 }, - TPA_END, -}; - -struct tparse tpa31[] = { - { TPA_ANY, tpa1, save_semicolon, 0, NULL, 0 }, - TPA_END, -}; - - -int -parse_options (struct super_block *sb, char *options) { - struct argblk argblk; - - argblk.str = options; - argblk.arg = (unsigned long) sb; - return tparse (&argblk, tpa1); -} /* * Ok, I give up :-) for some reason unknown to me the addition of 2 seconds --- tparse.c DELETED --- Index: super.c =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.5/fs/ods2/super.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- super.c 20 Sep 2004 20:47:53 -0000 1.9 +++ super.c 22 Sep 2004 06:24:30 -0000 1.10 @@ -20,6 +20,7 @@ #include <linux/init.h> #include <linux/blkdev.h> #include <linux/statfs.h> +#include <linux/parser.h> #include "ods2.h" @@ -168,15 +169,119 @@ return 0; } + +/* + * Parse options that can be supplied (mount -o xxxxxxx) + */ +enum { + Opt_ods2_dollar, + Opt_ods2_semicolon, + Opt_ods2_version_all, + Opt_ods2_version_highest, + Opt_ods2_version_none, + Opt_ods2_lowercase, + Opt_ods2_raw, + Opt_ods2_err, +}; +static match_table_t ods2_tokens = { + { .token = Opt_ods2_dollar, .pattern = "dollar=%s", }, + { .token = Opt_ods2_semicolon, .pattern = "semicolon=%s", }, + { .token = Opt_ods2_version_all, .pattern = "version=all", }, + { .token = Opt_ods2_version_highest, .pattern = "version=highest", }, + { .token = Opt_ods2_version_none, .pattern = "version=none", }, + { .token = Opt_ods2_lowercase, .pattern = "lowercase", }, + { .token = Opt_ods2_raw, .pattern = "raw", }, + { .token = Opt_ods2_err, .pattern = NULL, }, +}; + +static int +ods2_set_defaults_and_user_options (struct super_block *sb, char *options) +{ + struct ods2sb *ods2sb = ODS2_SB (sb); + substring_t args[MAX_OPT_ARGS]; + int token; + char *p; + char *string_opt; + + /* + * Set default values first, ... + */ + ods2sb->flags.v_raw = 0; + ods2sb->flags.v_lowercase = 0; + ods2sb->flags.v_version = SB_M_VERSALL; + ods2sb->dollar = '_'; + ods2sb->semicolon = '.'; + + /* + * ...then try to parse user-supplied options + */ + if (!options) + return 0; + + while ((p = strsep(&options, ",")) != NULL) { + if (!*p) + continue; + + token = match_token (p, ods2_tokens, args); + switch (token) { + case Opt_ods2_dollar: + string_opt = match_strdup (&args[0]); + if (!string_opt) + return -ENOMEM; + ods2sb->dollar = string_opt[0]; + kfree (string_opt); + break; + + case Opt_ods2_semicolon: + string_opt = match_strdup (&args[0]); + if (!string_opt) + return -ENOMEM; + ods2sb->semicolon = string_opt[0]; + kfree (string_opt); + break; + + case Opt_ods2_version_all: + ods2sb->flags.v_version = SB_M_VERSALL; + break; + + case Opt_ods2_version_highest: + ods2sb->flags.v_version = SB_M_VERSHIGH; + break; + + case Opt_ods2_version_none: + ods2sb->flags.v_version = SB_M_VERSNONE; + break; + + case Opt_ods2_lowercase: + ods2sb->flags.v_lowercase = 1; + break; + + case Opt_ods2_raw: + ods2sb->flags.v_raw = 1; + break; + + case Opt_ods2_err: + default: + printk (KERN_ERR "Unrecognized ODS-2 option or " + "missing value \"%s\"\n", p); + return -EINVAL; + } + } + + return 0; +} + + /* * This is the routine that is invoked when an ODS2 file system * is mounted. */ static int -ods2_fill_super(struct super_block *sb, void *data, int silent) +ods2_fill_super (struct super_block *sb, void *data, int silent) { struct buffer_head *bh; struct ods2sb *ods2p; + int ret; /* This should be something like (from ext2): * @@ -220,7 +325,13 @@ ods2p = ODS2_SB (sb); memcpy(&ods2p->hm2, GETBLKP(sb, 1, bh->b_data), sizeof (struct hm2def)); brelse(bh); - + + ret = ods2_set_defaults_and_user_options (sb, data); + if (ret) { + kfree (ODS2_SB (sb)); + return ret; + } + for (p = (u16 *)&(ods2p->hm2) ; p < (u16 *)&(ods2p->hm2.hm2_w_checksum1) ; chksum1 += *p++); for (p = (u16 *)&(ods2p->hm2) ; p < (u16 *)&(ods2p->hm2.hm2_w_checksum2) ; chksum2 += *p++); @@ -239,17 +350,6 @@ ods2p->hm2.hm2_w_resfiles >= 5 && chksum1 == ods2p->hm2.hm2_w_checksum1 && chksum2 == ods2p->hm2.hm2_w_checksum2) { - /* - * Set default values first, then parse - * user-supplied option string - */ - ods2p->flags.v_raw = 0; - ods2p->flags.v_lowercase = 0; - ods2p->flags.v_version = SB_M_VERSALL; - ods2p->dollar = '_'; - ods2p->semicolon = '.'; - if (data) - parse_options(sb, data); sb->s_op = &ods2_sops; --- tparse.h DELETED --- |