Patchwork [1/2] connect.c: define mount options enum and parsing function

login
register
mail settings
Submitter Scott Lovenberg
Date May 18, 2010, 4:53 a.m.
Message ID <1274158387-26599-2-git-send-email-scott.lovenberg@gmail.com>
Download mbox | patch
Permalink /patch/52829/
State New
Headers show

Comments

Scott Lovenberg - May 18, 2010, 4:53 a.m.
Mount options have been defined as an enum.
A token parsing function has been added to translate from text to the defined constants.

Signed-off-by: Scott Lovenberg <scott.lovenberg@gmail.com>
---
 fs/cifs/connect.c |  266 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 266 insertions(+), 0 deletions(-)
Jeff Layton - May 18, 2010, 10:17 a.m.
On Tue, 18 May 2010 00:53:06 -0400
Scott Lovenberg <scott.lovenberg@gmail.com> wrote:

> Mount options have been defined as an enum.
> A token parsing function has been added to translate from text to the defined constants.
> 
> Signed-off-by: Scott Lovenberg <scott.lovenberg@gmail.com>
> ---
>  fs/cifs/connect.c |  266 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 266 insertions(+), 0 deletions(-)
> 
> diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
> index 2208f06..83d5cd8 100644
> --- a/fs/cifs/connect.c
> +++ b/fs/cifs/connect.c
> @@ -52,6 +52,94 @@
>  #define CIFS_PORT 445
>  #define RFC1001_PORT 139
>  
> +/* mounting option values */
> +enum CIFS_MOUNT_TOKEN {
> +	CIFS_TOKEN_ERROR    =   -1,
> +	USERXATTR           =   1,
> +	NO_USERXATTR        =   2,
> +	USER                =   3,
> +	PASS                =   4,
> +	IP                  =   5,
> +	ADDR                =   6,
> +	SEC                 =   7,
> +	UNC                 =   8,
> +	TARGET              =   9,
> +	PATH                =  10,
> +	DOMAIN              =  11,
> +	WORKGROUP           =  12,
> +	PREFIXPATH          =  13,
> +	IOCHARSET           =  14,
> +	UID                 =  15,
> +	FORCE_UID           =  16,
> +	NO_FORCE_UID        =  17,
> +	GID                 =  18,
> +	FORCE_GID           =  19,
> +	NO_FORCE_GID        =  20,
> +	FILEMODE            =  21,
> +	DIRMODE             =  22,
> +	PORT                =  23,
> +	RSIZE               =  24,
> +	WSIZE               =  25,
> +	SOCKOPT             =  26,
> +	NETBIOSNAME         =  27,
> +	SERVERNAME          =  28,
> +	CREDENTIALS         =  29,
> +	VERSION             =  30,
> +	GUEST               =  31,
> +	RW                  =  32,
> +	RO                  =  33,
> +	NO_BLOCKSEND        =  34,
> +	NO_AUTOTUNE         =  35,
> +	NO_AUTO             =  36,
> +	SUID                =  37,
> +	NO_SUID             =  38,
> +	EXEC                =  39,
> +	NO_EXEC             =  40,
> +	DEV                 =  41,
> +	NO_DEV              =  42,
> +	HARD                =  43,
> +	NO_HARD             =  44,
> +	SOFT                =  45,
> +	NO_SOFT             =  46,
> +	PERM                =  47,
> +	NO_PERM             =  48,
> +	MAPCHARS            =  49,
> +	NO_MAPCHARS         =  50,
> +	SFU                 =  51,
> +	NO_SFU              =  52,
> +	NO_DFS              =  53,
> +	POSIXPATHS          =  54,
> +	NO_POSIXPATHS       =  55,
> +	NO_UNIX             =  56,
> +	NO_LINUX            =  57,
> +	NO_CASE             =  58,
> +	IGNORECASE          =  59,
> +	BRL                 =  60,
> +	NO_BRL              =  61,
> +	NO_LOCK             =  62,
> +	FORCE_MANDATORYLOCK =  63,
> +	SETUIDS             =  64,
> +	NO_SETUIDS          =  65,
> +	DYNPERM             =  66,
> +	NO_DYNPERM          =  67,
> +	INTR                =  68,
> +	NO_INTR             =  69,
> +	STRICTSYNC          =  70,
> +	NO_STRICTSYNC       =  71,
> +	SERVERINO           =  72,
> +	NO_SERVERINO        =  73,
> +	ACL                 =  74,
> +	NO_ACL              =  75,
> +	CIFSACL             =  76,
> +	NO_CIFSACL          =  77,
> +	LOCALLEASE          =  78,
> +	SIGN                =  79,
> +	SEAL                =  80,
> +	DIRECT              =  81,
> +	FORCE_DIRECT        =  82,
> +	NO_AC               =  83
> +};
> +

^^^^
There's really no need to assign every value on an enum. You should
also probably prefix these with the semi-standard "Opt_" so that they
aren't confused with other values. This should also be static, I think.

>  extern void SMBNTencrypt(unsigned char *passwd, unsigned char *c8,
>  			 unsigned char *p24);
>  
> @@ -797,6 +885,184 @@ extract_hostname(const char *unc)
>  	return dst;
>  }
>  
> +/* returns the CIFS_MOUNT_TOKEN value that represents 'option' */
> +static int cifs_parse_mount_token(const char *option)
> +{
> +	if (option == NULL)
> +		return CIFS_TOKEN_ERROR;
> +
> +	if (strnicmp(option, "user_xattr", 10) == 0)
> +		return USERXATTR;
> +	if (strnicmp(option, "nouser_xattr", 12) == 0)
> +		return NO_USERXATTR;
> +	if (strnicmp(option, "user", 4) == 0)
> +		return USER;
> +	if (strnicmp(option, "pass", 4) == 0)
> +		return PASS;
> +	if (strnicmp(option, "ip", 2) == 0)
> +		return IP;
> +	if (strnicmp(option, "addr", 4) == 0)
> +		return ADDR;
> +	if (strnicmp(option, "sec", 3) == 0)
> +		return SEC;
> +	if (strnicmp(option, "unc", 3) == 0)
> +		return UNC;
> +	if (strnicmp(option, "target", 6) == 0)
> +		return TARGET;
> +	if (strnicmp(option, "path", 4) == 0)
> +		return PATH;
> +	if (strnicmp(option, "domain", 3) == 0)
> +		return DOMAIN;
> +	if (strnicmp(option, "workgroup", 5) == 0)
> +		return WORKGROUP;
> +	if (strnicmp(option, "prefixpath", 10) == 0)
> +		return PREFIXPATH;
> +	if (strnicmp(option, "iocharset", 9) == 0)
> +		return IOCHARSET;
> +	if (strnicmp(option, "uid", 3) == 0)
> +		return UID;
> +	if (strnicmp(option, "forceuid", 8) == 0)
> +		return FORCE_UID;
> +	if (strnicmp(option, "noforceuid", 10) == 0)
> +		return NO_FORCE_UID;
> +	if (strnicmp(option, "gid", 3) == 0)
> +		return GID;
> +	if (strnicmp(option, "forcegid", 8) == 0)
> +		return FORCE_GID;
> +	if (strnicmp(option, "noforcegid", 10) == 0)
> +		return NO_FORCE_GID;
> +	if (strnicmp(option, "file_mode", 4) == 0)
> +		return FILEMODE;
> +	/* dir_mode || dirmode */
> +	if (strnicmp(option, "dir", 3) == 0)
> +		return DIRMODE;
> +	if (strnicmp(option, "port", 4) == 0)
> +		return PORT;
> +	if (strnicmp(option, "rsize", 5) == 0)
> +		return RSIZE;
> +	if (strnicmp(option, "wsize", 5) == 0)
> +		return WSIZE;
> +	if (strnicmp(option, "sockopt", 5) == 0)
> +		return SOCKOPT;
> +	if (strnicmp(option, "netbiosname", 4) == 0)
> +		return NETBIOSNAME;
> +	if (strnicmp(option, "servername", 7) == 0)
> +		return SERVERNAME;
> +	if (strnicmp(option, "credentials", 4) == 0)
> +		return CREDENTIALS;
> +	if (strnicmp(option, "version", 3) == 0)
> +		return VERSION;
> +	if (strnicmp(option, "guest", 5) == 0)
> +		return GUEST;
> +	if (strnicmp(option, "rw", 2) == 0)
> +		return RW;
> +	if (strnicmp(option, "ro", 2) == 0)
> +		return RO;
> +	if (strnicmp(option, "noblocksend", 11) == 0)
> +		return NO_BLOCKSEND;
> +	if (strnicmp(option, "noautotune", 10) == 0)
> +		return NO_AUTOTUNE;
> +	if (strnicmp(option, "suid", 4) == 0)
> +		return SUID;
> +	if (strnicmp(option, "nosuid", 6) == 0)
> +		return NO_SUID;
> +	if (strnicmp(option, "exec", 4) == 0)
> +		return EXEC;
> +	if (strnicmp(option, "noexec", 6) == 0)
> +		return NO_EXEC;
> +	if (strnicmp(option, "dev", 3) == 0)
> +		return DEV;
> +	if (strnicmp(option, "nodev", 5) == 0)
> +		return NO_DEV;
> +	if (strnicmp(option, "noauto", 6) == 0)
> +		return NO_AUTO;
> +	if (strnicmp(option, "hard", 4) == 0)
> +		return HARD;
> +	if (strnicmp(option, "nohard", 6) == 0)
> +		return NO_HARD;
> +	if (strnicmp(option, "soft", 4) == 0)
> +		return SOFT;
> +	if (strnicmp(option, "nosoft", 6) == 0)
> +		return NO_SOFT;
> +	if (strnicmp(option, "perm", 4) == 0)
> +		return PERM;
> +	if (strnicmp(option, "noperm", 6) == 0)
> +		return NO_PERM;
> +	if (strnicmp(option, "mapchars", 8) == 0)
> +		return MAPCHARS;
> +	if (strnicmp(option, "nomapchars", 10) == 0)
> +		return NO_MAPCHARS;
> +	if (strnicmp(option, "sfu", 3) == 0)
> +		return SFU;
> +	if (strnicmp(option, "nosfu", 5) == 0)
> +		return NO_SFU;
> +	if (strnicmp(option, "nodfs", 5) == 0)
> +		return NO_DFS;
> +	if (strnicmp(option, "posixpaths", 10) == 0)
> +		return POSIXPATHS;
> +	if (strnicmp(option, "noposixpaths", 12) == 0)
> +		return NO_POSIXPATHS;
> +	if (strnicmp(option, "nounix", 6) == 0)
> +		return NO_UNIX;
> +	if (strnicmp(option, "nolinux", 7) == 0)
> +		return NO_LINUX;
> +	if (strnicmp(option, "nocase", 6) == 0)
> +		return NO_CASE;
> +	if (strnicmp(option, "ignorecase", 10) == 0)
> +		return IGNORECASE;
> +	if (strnicmp(option, "brl", 3) == 0)
> +		return BRL;
> +	if (strnicmp(option, "nobrl", 5) == 0)
> +		return NO_BRL;
> +	if (strnicmp(option, "nolock", 6) == 0)
> +		return NO_LOCK;
> +	if (strnicmp(option, "forcemandatorylock", 9) == 0)
> +		return FORCE_MANDATORYLOCK;
> +	if (strnicmp(option, "setuids", 7) == 0)
> +		return SETUIDS;
> +	if (strnicmp(option, "nosetuids", 9) == 0)
> +		return NO_SETUIDS;
> +	if (strnicmp(option, "dynperm", 7) == 0)
> +		return DYNPERM;
> +	if (strnicmp(option, "nodynperm", 9) == 0)
> +		return NO_DYNPERM;
> +	if (strnicmp(option, "intr", 4) == 0)
> +		return INTR;
> +	if (strnicmp(option, "nointr", 6) == 0)
> +		return NO_INTR;
> +	if (strnicmp(option, "strictsync", 10) == 0)
> +		return STRICTSYNC;
> +	if (strnicmp(option, "nostrictsync", 12) == 0)
> +		return NO_STRICTSYNC;
> +	if (strnicmp(option, "serverino", 7) == 0)
> +		return SERVERINO;
> +	if (strnicmp(option, "noserverino", 9) == 0)
> +		return NO_SERVERINO;
> +	if (strnicmp(option, "cifsacl", 7) == 0)
> +		return CIFSACL;
> +	if (strnicmp(option, "nocifsacl", 9) == 0)
> +		return NO_CIFSACL;
> +	if (strnicmp(option, "acl", 3) == 0)
> +		return ACL;
> +	if (strnicmp(option, "noacl", 5) == 0)
> +		return NO_ACL;
> +	if (strnicmp(option, "locallease", 6) == 0)
> +		return LOCALLEASE;
> +	if (strnicmp(option, "sign", 4) == 0)
> +		return SIGN;
> +	if (strnicmp(option, "seal", 4) == 0)
> +		return SEAL;
> +	if (strnicmp(option, "direct", 6) == 0)
> +		return DIRECT;
> +	if (strnicmp(option, "forcedirectio", 13) == 0)
> +		return FORCE_DIRECT;
> +	if (strnicmp(option, "noac", 4) == 0)
> +		return NO_AC;
> +
> +	return CIFS_TOKEN_ERROR;
> +}
> +
> +
>  static int
>  cifs_parse_mount_options(char *options, const char *devname,
>  			 struct smb_vol *vol)

This looks like a step in the right direction, but I'll note that the
kernel already has a standard mount option parser. See match_token().
For an example of how it's used, you can look at the NFS code, starting
with nfs_parse_mount_options.

It would be best to move to that code if possible, though we may need
to be cognizant of the fact that some people may be using "unapproved"
abbreviations of some mount options and match_token only matches ones
that are literally specified.
Scott Lovenberg - May 19, 2010, 12:37 p.m.
On Tue, May 18, 2010 at 6:17 AM, Jeff Layton <jlayton@samba.org> wrote:

>
> There's really no need to assign every value on an enum. You should
> also probably prefix these with the semi-standard "Opt_" so that they
> aren't confused with other values. This should also be static, I think.
>
> Agreed on Opt prefix.  I only used the enum as it was the preferred way to
define related constants in the kernel coding style; TBH, I'd rather just
use #define'd constants.  If it's all the same, that's what I'll do.  It
means I won't have to fight with keeping the alignment in vim the same as
what gets emailed (those values were all aligned in the file and the patch
file). :)


> This looks like a step in the right direction, but I'll note that the
> kernel already has a standard mount option parser. See match_token().
> For an example of how it's used, you can look at the NFS code, starting
> with nfs_parse_mount_options.
>
> Aha!

It would be best to move to that code if possible
>
Agreed.
Scott Lovenberg - May 20, 2010, 11:52 a.m.
>
>
>> There's really no need to assign every value on an enum. You should
>> also probably prefix these with the semi-standard "Opt_" so that they
>> aren't confused with other values. This should also be static, I think.
>>
>> Agreed on Opt prefix.  I only used the enum as it was the preferred way to
> define related constants in the kernel coding style; TBH, I'd rather just
> use #define'd constants.  If it's all the same, that's what I'll do.  It
> means I won't have to fight with keeping the alignment in vim the same as
> what gets emailed (those values were all aligned in the file and the patch
> file). :)
>

Sorry, I just realized what you were saying about assigning in the enum.
 Disregard the comment above (this is why I should have a cup of coffee
before replying to email, not during).
Unfortunately GCC throws warnings if I make the enums static.


For an example of how it's used, you can look at the NFS code, starting
>> with nfs_parse_mount_options.
>>
>> Aha!
>
> It would be best to move to that code if possible
>>
> Agreed.
>


>
>
After looking at the NFS code, I scrapped what I had and rewrote to follow
the style/semantics of the NFS option parsing.  I think this patch will be
more in line with what you had in mind.
I left the value parsing as it was and used the match_token to get the
current token.  I'll follow up with another patch if you'd like me to
implement grabbing the value with the parser lib instead of what we've got
currently.

Patch

diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index 2208f06..83d5cd8 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -52,6 +52,94 @@ 
 #define CIFS_PORT 445
 #define RFC1001_PORT 139
 
+/* mounting option values */
+enum CIFS_MOUNT_TOKEN {
+	CIFS_TOKEN_ERROR    =   -1,
+	USERXATTR           =   1,
+	NO_USERXATTR        =   2,
+	USER                =   3,
+	PASS                =   4,
+	IP                  =   5,
+	ADDR                =   6,
+	SEC                 =   7,
+	UNC                 =   8,
+	TARGET              =   9,
+	PATH                =  10,
+	DOMAIN              =  11,
+	WORKGROUP           =  12,
+	PREFIXPATH          =  13,
+	IOCHARSET           =  14,
+	UID                 =  15,
+	FORCE_UID           =  16,
+	NO_FORCE_UID        =  17,
+	GID                 =  18,
+	FORCE_GID           =  19,
+	NO_FORCE_GID        =  20,
+	FILEMODE            =  21,
+	DIRMODE             =  22,
+	PORT                =  23,
+	RSIZE               =  24,
+	WSIZE               =  25,
+	SOCKOPT             =  26,
+	NETBIOSNAME         =  27,
+	SERVERNAME          =  28,
+	CREDENTIALS         =  29,
+	VERSION             =  30,
+	GUEST               =  31,
+	RW                  =  32,
+	RO                  =  33,
+	NO_BLOCKSEND        =  34,
+	NO_AUTOTUNE         =  35,
+	NO_AUTO             =  36,
+	SUID                =  37,
+	NO_SUID             =  38,
+	EXEC                =  39,
+	NO_EXEC             =  40,
+	DEV                 =  41,
+	NO_DEV              =  42,
+	HARD                =  43,
+	NO_HARD             =  44,
+	SOFT                =  45,
+	NO_SOFT             =  46,
+	PERM                =  47,
+	NO_PERM             =  48,
+	MAPCHARS            =  49,
+	NO_MAPCHARS         =  50,
+	SFU                 =  51,
+	NO_SFU              =  52,
+	NO_DFS              =  53,
+	POSIXPATHS          =  54,
+	NO_POSIXPATHS       =  55,
+	NO_UNIX             =  56,
+	NO_LINUX            =  57,
+	NO_CASE             =  58,
+	IGNORECASE          =  59,
+	BRL                 =  60,
+	NO_BRL              =  61,
+	NO_LOCK             =  62,
+	FORCE_MANDATORYLOCK =  63,
+	SETUIDS             =  64,
+	NO_SETUIDS          =  65,
+	DYNPERM             =  66,
+	NO_DYNPERM          =  67,
+	INTR                =  68,
+	NO_INTR             =  69,
+	STRICTSYNC          =  70,
+	NO_STRICTSYNC       =  71,
+	SERVERINO           =  72,
+	NO_SERVERINO        =  73,
+	ACL                 =  74,
+	NO_ACL              =  75,
+	CIFSACL             =  76,
+	NO_CIFSACL          =  77,
+	LOCALLEASE          =  78,
+	SIGN                =  79,
+	SEAL                =  80,
+	DIRECT              =  81,
+	FORCE_DIRECT        =  82,
+	NO_AC               =  83
+};
+
 extern void SMBNTencrypt(unsigned char *passwd, unsigned char *c8,
 			 unsigned char *p24);
 
@@ -797,6 +885,184 @@  extract_hostname(const char *unc)
 	return dst;
 }
 
+/* returns the CIFS_MOUNT_TOKEN value that represents 'option' */
+static int cifs_parse_mount_token(const char *option)
+{
+	if (option == NULL)
+		return CIFS_TOKEN_ERROR;
+
+	if (strnicmp(option, "user_xattr", 10) == 0)
+		return USERXATTR;
+	if (strnicmp(option, "nouser_xattr", 12) == 0)
+		return NO_USERXATTR;
+	if (strnicmp(option, "user", 4) == 0)
+		return USER;
+	if (strnicmp(option, "pass", 4) == 0)
+		return PASS;
+	if (strnicmp(option, "ip", 2) == 0)
+		return IP;
+	if (strnicmp(option, "addr", 4) == 0)
+		return ADDR;
+	if (strnicmp(option, "sec", 3) == 0)
+		return SEC;
+	if (strnicmp(option, "unc", 3) == 0)
+		return UNC;
+	if (strnicmp(option, "target", 6) == 0)
+		return TARGET;
+	if (strnicmp(option, "path", 4) == 0)
+		return PATH;
+	if (strnicmp(option, "domain", 3) == 0)
+		return DOMAIN;
+	if (strnicmp(option, "workgroup", 5) == 0)
+		return WORKGROUP;
+	if (strnicmp(option, "prefixpath", 10) == 0)
+		return PREFIXPATH;
+	if (strnicmp(option, "iocharset", 9) == 0)
+		return IOCHARSET;
+	if (strnicmp(option, "uid", 3) == 0)
+		return UID;
+	if (strnicmp(option, "forceuid", 8) == 0)
+		return FORCE_UID;
+	if (strnicmp(option, "noforceuid", 10) == 0)
+		return NO_FORCE_UID;
+	if (strnicmp(option, "gid", 3) == 0)
+		return GID;
+	if (strnicmp(option, "forcegid", 8) == 0)
+		return FORCE_GID;
+	if (strnicmp(option, "noforcegid", 10) == 0)
+		return NO_FORCE_GID;
+	if (strnicmp(option, "file_mode", 4) == 0)
+		return FILEMODE;
+	/* dir_mode || dirmode */
+	if (strnicmp(option, "dir", 3) == 0)
+		return DIRMODE;
+	if (strnicmp(option, "port", 4) == 0)
+		return PORT;
+	if (strnicmp(option, "rsize", 5) == 0)
+		return RSIZE;
+	if (strnicmp(option, "wsize", 5) == 0)
+		return WSIZE;
+	if (strnicmp(option, "sockopt", 5) == 0)
+		return SOCKOPT;
+	if (strnicmp(option, "netbiosname", 4) == 0)
+		return NETBIOSNAME;
+	if (strnicmp(option, "servername", 7) == 0)
+		return SERVERNAME;
+	if (strnicmp(option, "credentials", 4) == 0)
+		return CREDENTIALS;
+	if (strnicmp(option, "version", 3) == 0)
+		return VERSION;
+	if (strnicmp(option, "guest", 5) == 0)
+		return GUEST;
+	if (strnicmp(option, "rw", 2) == 0)
+		return RW;
+	if (strnicmp(option, "ro", 2) == 0)
+		return RO;
+	if (strnicmp(option, "noblocksend", 11) == 0)
+		return NO_BLOCKSEND;
+	if (strnicmp(option, "noautotune", 10) == 0)
+		return NO_AUTOTUNE;
+	if (strnicmp(option, "suid", 4) == 0)
+		return SUID;
+	if (strnicmp(option, "nosuid", 6) == 0)
+		return NO_SUID;
+	if (strnicmp(option, "exec", 4) == 0)
+		return EXEC;
+	if (strnicmp(option, "noexec", 6) == 0)
+		return NO_EXEC;
+	if (strnicmp(option, "dev", 3) == 0)
+		return DEV;
+	if (strnicmp(option, "nodev", 5) == 0)
+		return NO_DEV;
+	if (strnicmp(option, "noauto", 6) == 0)
+		return NO_AUTO;
+	if (strnicmp(option, "hard", 4) == 0)
+		return HARD;
+	if (strnicmp(option, "nohard", 6) == 0)
+		return NO_HARD;
+	if (strnicmp(option, "soft", 4) == 0)
+		return SOFT;
+	if (strnicmp(option, "nosoft", 6) == 0)
+		return NO_SOFT;
+	if (strnicmp(option, "perm", 4) == 0)
+		return PERM;
+	if (strnicmp(option, "noperm", 6) == 0)
+		return NO_PERM;
+	if (strnicmp(option, "mapchars", 8) == 0)
+		return MAPCHARS;
+	if (strnicmp(option, "nomapchars", 10) == 0)
+		return NO_MAPCHARS;
+	if (strnicmp(option, "sfu", 3) == 0)
+		return SFU;
+	if (strnicmp(option, "nosfu", 5) == 0)
+		return NO_SFU;
+	if (strnicmp(option, "nodfs", 5) == 0)
+		return NO_DFS;
+	if (strnicmp(option, "posixpaths", 10) == 0)
+		return POSIXPATHS;
+	if (strnicmp(option, "noposixpaths", 12) == 0)
+		return NO_POSIXPATHS;
+	if (strnicmp(option, "nounix", 6) == 0)
+		return NO_UNIX;
+	if (strnicmp(option, "nolinux", 7) == 0)
+		return NO_LINUX;
+	if (strnicmp(option, "nocase", 6) == 0)
+		return NO_CASE;
+	if (strnicmp(option, "ignorecase", 10) == 0)
+		return IGNORECASE;
+	if (strnicmp(option, "brl", 3) == 0)
+		return BRL;
+	if (strnicmp(option, "nobrl", 5) == 0)
+		return NO_BRL;
+	if (strnicmp(option, "nolock", 6) == 0)
+		return NO_LOCK;
+	if (strnicmp(option, "forcemandatorylock", 9) == 0)
+		return FORCE_MANDATORYLOCK;
+	if (strnicmp(option, "setuids", 7) == 0)
+		return SETUIDS;
+	if (strnicmp(option, "nosetuids", 9) == 0)
+		return NO_SETUIDS;
+	if (strnicmp(option, "dynperm", 7) == 0)
+		return DYNPERM;
+	if (strnicmp(option, "nodynperm", 9) == 0)
+		return NO_DYNPERM;
+	if (strnicmp(option, "intr", 4) == 0)
+		return INTR;
+	if (strnicmp(option, "nointr", 6) == 0)
+		return NO_INTR;
+	if (strnicmp(option, "strictsync", 10) == 0)
+		return STRICTSYNC;
+	if (strnicmp(option, "nostrictsync", 12) == 0)
+		return NO_STRICTSYNC;
+	if (strnicmp(option, "serverino", 7) == 0)
+		return SERVERINO;
+	if (strnicmp(option, "noserverino", 9) == 0)
+		return NO_SERVERINO;
+	if (strnicmp(option, "cifsacl", 7) == 0)
+		return CIFSACL;
+	if (strnicmp(option, "nocifsacl", 9) == 0)
+		return NO_CIFSACL;
+	if (strnicmp(option, "acl", 3) == 0)
+		return ACL;
+	if (strnicmp(option, "noacl", 5) == 0)
+		return NO_ACL;
+	if (strnicmp(option, "locallease", 6) == 0)
+		return LOCALLEASE;
+	if (strnicmp(option, "sign", 4) == 0)
+		return SIGN;
+	if (strnicmp(option, "seal", 4) == 0)
+		return SEAL;
+	if (strnicmp(option, "direct", 6) == 0)
+		return DIRECT;
+	if (strnicmp(option, "forcedirectio", 13) == 0)
+		return FORCE_DIRECT;
+	if (strnicmp(option, "noac", 4) == 0)
+		return NO_AC;
+
+	return CIFS_TOKEN_ERROR;
+}
+
+
 static int
 cifs_parse_mount_options(char *options, const char *devname,
 			 struct smb_vol *vol)