Message ID | 1274158387-26599-2-git-send-email-scott.lovenberg@gmail.com |
---|---|
State | New |
Headers | show |
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.
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.
> > >> 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.
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)
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(-)