Commit 4aee9bf7 authored by Hirofumi Ogawa's avatar Hirofumi Ogawa Committed by Linus Torvalds

[PATCH] merges parse_options() of fat and parse_options() of vfat (2/5)

This merges parse_options() of fat and parse_options() of vfat.
And this doesn't recognize the unknown options.
parent ac465e61
...@@ -201,38 +201,54 @@ void fat_put_super(struct super_block *sb) ...@@ -201,38 +201,54 @@ void fat_put_super(struct super_block *sb)
kfree(sbi); kfree(sbi);
} }
static int simple_getbool(char *s, int *setval)
{
if (s) {
if (!strcmp(s,"1") || !strcmp(s,"yes") || !strcmp(s,"true"))
*setval = 1;
else if (!strcmp(s,"0") || !strcmp(s,"no") || !strcmp(s,"false"))
*setval = 0;
else
return 0;
} else
*setval = 1;
return 1;
}
static int parse_options(char *options, int *debug, static int parse_options(char *options, int is_vfat, int *debug,
struct fat_mount_options *opts, struct fat_mount_options *opts,
char *cvf_format, char *cvf_options) char *cvf_format, char *cvf_options)
{ {
char *this_char,*value,save,*savep; char *this_char, *value, *p;
char *p; int ret = 1, val, len;
int ret = 1, len;
opts->isvfat = is_vfat;
opts->name_check = 'n';
opts->conversion = 'b';
opts->fs_uid = current->uid; opts->fs_uid = current->uid;
opts->fs_gid = current->gid; opts->fs_gid = current->gid;
opts->fs_umask = current->fs->umask; opts->fs_umask = current->fs->umask;
opts->quiet = opts->sys_immutable = opts->dotsOK = opts->showexec = 0;
opts->codepage = 0; opts->codepage = 0;
opts->nocase = 0;
opts->shortname = 0;
opts->utf8 = 0;
opts->iocharset = NULL; opts->iocharset = NULL;
if (is_vfat)
opts->shortname = VFAT_SFN_DISPLAY_LOWER|VFAT_SFN_CREATE_WIN95;
else
opts->shortname = 0;
opts->name_check = 'n';
opts->conversion = 'b';
opts->quiet = opts->showexec = opts->sys_immutable = opts->dotsOK = 0;
opts->utf8 = opts->unicode_xlate = opts->posixfs = 0;
opts->numtail = 1;
opts->nocase = 0;
*debug = 0; *debug = 0;
if (!options) if (!options)
goto out; goto out;
save = 0;
savep = NULL;
while ((this_char = strsep(&options,",")) != NULL) { while ((this_char = strsep(&options,",")) != NULL) {
if ((value = strchr(this_char,'=')) != NULL) { if (!*this_char)
save = *value; continue;
savep = value; if ((value = strchr(this_char,'=')) != NULL)
*value++ = 0; *value++ = 0;
}
if (!strcmp(this_char,"check") && value) { if (!strcmp(this_char,"check") && value) {
if (value[0] && !value[1] && strchr("rns",*value)) if (value[0] && !value[1] && strchr("rns",*value))
opts->name_check = *value; opts->name_check = *value;
...@@ -255,23 +271,18 @@ static int parse_options(char *options, int *debug, ...@@ -255,23 +271,18 @@ static int parse_options(char *options, int *debug,
opts->conversion = 'a'; opts->conversion = 'a';
else ret = 0; else ret = 0;
} }
else if (!strcmp(this_char,"dots")) {
opts->dotsOK = 1;
}
else if (!strcmp(this_char,"nocase")) { else if (!strcmp(this_char,"nocase")) {
opts->nocase = 1; if (!is_vfat)
} opts->nocase = 1;
else if (!strcmp(this_char,"nodots")) { else {
opts->dotsOK = 0; /* for backward compatible */
opts->shortname = VFAT_SFN_DISPLAY_WIN95
| VFAT_SFN_CREATE_WIN95;
}
} }
else if (!strcmp(this_char,"showexec")) { else if (!strcmp(this_char,"showexec")) {
opts->showexec = 1; opts->showexec = 1;
} }
else if (!strcmp(this_char,"dotsOK") && value) {
if (!strcmp(value,"yes")) opts->dotsOK = 1;
else if (!strcmp(value,"no")) opts->dotsOK = 0;
else ret = 0;
}
else if (!strcmp(this_char,"uid")) { else if (!strcmp(this_char,"uid")) {
if (!value || !*value) ret = 0; if (!value || !*value) ret = 0;
else { else {
...@@ -317,7 +328,32 @@ static int parse_options(char *options, int *debug, ...@@ -317,7 +328,32 @@ static int parse_options(char *options, int *debug,
opts->codepage = simple_strtoul(value,&value,0); opts->codepage = simple_strtoul(value,&value,0);
if (*value) ret = 0; if (*value) ret = 0;
} }
else if (!strcmp(this_char,"iocharset") && value) { else if (!strcmp(this_char,"cvf_format")) {
if (!value)
return 0;
strncpy(cvf_format,value,20);
}
else if (!strcmp(this_char,"cvf_options")) {
if (!value)
return 0;
strncpy(cvf_options,value,100);
}
/* msdos specific */
else if (!is_vfat && !strcmp(this_char,"dots")) {
opts->dotsOK = 1;
}
else if (!is_vfat && !strcmp(this_char,"nodots")) {
opts->dotsOK = 0;
}
else if (!is_vfat && !strcmp(this_char,"dotsOK") && value) {
if (!strcmp(value,"yes")) opts->dotsOK = 1;
else if (!strcmp(value,"no")) opts->dotsOK = 0;
else ret = 0;
}
/* vfat specific */
else if (is_vfat && !strcmp(this_char,"iocharset") && value) {
p = value; p = value;
while (*value && *value != ',') while (*value && *value != ',')
value++; value++;
...@@ -338,23 +374,54 @@ static int parse_options(char *options, int *debug, ...@@ -338,23 +374,54 @@ static int parse_options(char *options, int *debug,
ret = 0; ret = 0;
} }
} }
else if (!strcmp(this_char,"cvf_format")) { else if (is_vfat && !strcmp(this_char,"utf8")) {
if (!value) ret = simple_getbool(value, &val);
return 0; if (ret) opts->utf8 = val;
strncpy(cvf_format,value,20);
} }
else if (!strcmp(this_char,"cvf_options")) { else if (is_vfat && !strcmp(this_char,"uni_xlate")) {
if (!value) ret = simple_getbool(value, &val);
return 0; if (ret) opts->unicode_xlate = val;
strncpy(cvf_options,value,100); }
else if (is_vfat && !strcmp(this_char,"posix")) {
ret = simple_getbool(value, &val);
if (ret) opts->posixfs = val;
}
else if (is_vfat && !strcmp(this_char,"nonumtail")) {
ret = simple_getbool(value, &val);
if (ret) {
opts->numtail = !val;
}
}
else if (is_vfat && !strcmp(this_char, "shortname")) {
if (!strcmp(value, "lower"))
opts->shortname = VFAT_SFN_DISPLAY_LOWER
| VFAT_SFN_CREATE_WIN95;
else if (!strcmp(value, "win95"))
opts->shortname = VFAT_SFN_DISPLAY_WIN95
| VFAT_SFN_CREATE_WIN95;
else if (!strcmp(value, "winnt"))
opts->shortname = VFAT_SFN_DISPLAY_WINNT
| VFAT_SFN_CREATE_WINNT;
else if (!strcmp(value, "mixed"))
opts->shortname = VFAT_SFN_DISPLAY_WINNT
| VFAT_SFN_CREATE_WIN95;
else
ret = 0;
} else {
printk("FAT: Unrecognized mount option %s\n",
this_char);
ret = 0;
} }
if (options) *(options-1) = ',';
if (value) *savep = save;
if (ret == 0) if (ret == 0)
break; break;
} }
out: out:
if (opts->posixfs)
opts->name_check = 's';
if (opts->unicode_xlate)
opts->utf8 = 0;
return ret; return ret;
} }
...@@ -658,12 +725,11 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, ...@@ -658,12 +725,11 @@ int fat_fill_super(struct super_block *sb, void *data, int silent,
sb->s_magic = MSDOS_SUPER_MAGIC; sb->s_magic = MSDOS_SUPER_MAGIC;
sb->s_op = &fat_sops; sb->s_op = &fat_sops;
sb->s_export_op = &fat_export_ops; sb->s_export_op = &fat_export_ops;
sbi->options.isvfat = isvfat;
sbi->dir_ops = fs_dir_inode_ops; sbi->dir_ops = fs_dir_inode_ops;
sbi->cvf_format = &default_cvf; sbi->cvf_format = &default_cvf;
error = -EINVAL; error = -EINVAL;
if (!parse_options((char *)data, &debug, &sbi->options, if (!parse_options((char *)data, isvfat, &debug, &sbi->options,
cvf_format, cvf_options)) cvf_format, cvf_options))
goto out_fail; goto out_fail;
......
...@@ -80,93 +80,6 @@ static int vfat_revalidate(struct dentry *dentry, int flags) ...@@ -80,93 +80,6 @@ static int vfat_revalidate(struct dentry *dentry, int flags)
return 0; return 0;
} }
static int simple_getbool(char *s, int *setval)
{
if (s) {
if (!strcmp(s,"1") || !strcmp(s,"yes") || !strcmp(s,"true")) {
*setval = 1;
} else if (!strcmp(s,"0") || !strcmp(s,"no") || !strcmp(s,"false")) {
*setval = 0;
} else {
return 0;
}
} else {
*setval = 1;
}
return 1;
}
static int parse_options(char *options, struct fat_mount_options *opts)
{
char *this_char,*value,save,*savep;
int ret, val;
opts->unicode_xlate = opts->posixfs = 0;
opts->numtail = 1;
opts->utf8 = 0;
opts->shortname = VFAT_SFN_DISPLAY_LOWER | VFAT_SFN_CREATE_WIN95;
/* for backward compatible */
if (opts->nocase) {
opts->nocase = 0;
opts->shortname = VFAT_SFN_DISPLAY_WIN95
| VFAT_SFN_CREATE_WIN95;
}
if (!options) return 1;
save = 0;
savep = NULL;
ret = 1;
while ((this_char = strsep(&options,",")) != NULL) {
if ((value = strchr(this_char,'=')) != NULL) {
save = *value;
savep = value;
*value++ = 0;
}
if (!strcmp(this_char,"utf8")) {
ret = simple_getbool(value, &val);
if (ret) opts->utf8 = val;
} else if (!strcmp(this_char,"uni_xlate")) {
ret = simple_getbool(value, &val);
if (ret) opts->unicode_xlate = val;
} else if (!strcmp(this_char,"posix")) {
ret = simple_getbool(value, &val);
if (ret) opts->posixfs = val;
} else if (!strcmp(this_char,"nonumtail")) {
ret = simple_getbool(value, &val);
if (ret) {
opts->numtail = !val;
}
} else if (!strcmp(this_char, "shortname")) {
if (!strcmp(value, "lower"))
opts->shortname = VFAT_SFN_DISPLAY_LOWER
| VFAT_SFN_CREATE_WIN95;
else if (!strcmp(value, "win95"))
opts->shortname = VFAT_SFN_DISPLAY_WIN95
| VFAT_SFN_CREATE_WIN95;
else if (!strcmp(value, "winnt"))
opts->shortname = VFAT_SFN_DISPLAY_WINNT
| VFAT_SFN_CREATE_WINNT;
else if (!strcmp(value, "mixed"))
opts->shortname = VFAT_SFN_DISPLAY_WINNT
| VFAT_SFN_CREATE_WIN95;
else
ret = 0;
}
if (options)
*(options-1) = ',';
if (value) {
*savep = save;
}
if (ret == 0) {
return 0;
}
}
if (opts->unicode_xlate) {
opts->utf8 = 0;
}
return 1;
}
static inline unsigned char static inline unsigned char
vfat_tolower(struct nls_table *t, unsigned char c) vfat_tolower(struct nls_table *t, unsigned char c)
{ {
...@@ -1281,24 +1194,15 @@ struct inode_operations vfat_dir_inode_operations = { ...@@ -1281,24 +1194,15 @@ struct inode_operations vfat_dir_inode_operations = {
int vfat_fill_super(struct super_block *sb, void *data, int silent) int vfat_fill_super(struct super_block *sb, void *data, int silent)
{ {
int res; int res;
struct msdos_sb_info *sbi;
res = fat_fill_super(sb, data, silent, &vfat_dir_inode_operations, 1); res = fat_fill_super(sb, data, silent, &vfat_dir_inode_operations, 1);
if (res) if (res)
return res; return res;
sbi = MSDOS_SB(sb); if (MSDOS_SB(sb)->options.name_check != 's')
if (parse_options((char *) data, &(sbi->options))) {
sbi->options.dotsOK = 0;
if (sbi->options.posixfs) {
sbi->options.name_check = 's';
}
}
if (sbi->options.name_check != 's') {
sb->s_root->d_op = &vfat_dentry_ops[0]; sb->s_root->d_op = &vfat_dentry_ops[0];
} else { else
sb->s_root->d_op = &vfat_dentry_ops[2]; sb->s_root->d_op = &vfat_dentry_ops[2];
}
return 0; return 0;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment