[PATCH 2/2] connect.c: use defined constants for options
Scott Lovenberg <[email protected]> Tue, 18 May 2010 00:53:07 -0400
| Newsgroups | gmane.linux.file-systems.cifs |
|---|---|
| Message-ID | <[email protected]> |
When parsing mount options, option constants are used to make code more readable. Signed-off-by: Scott Lovenberg <[email protected]> --- fs/cifs/connect.c | 290 ++++++++++++++++++++++++++++++++-------------------- 1 files changed, 178 insertions(+), 112 deletions(-) diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 83d5cd8..a7f0b6f 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c @@ -1126,12 +1126,14 @@ cifs_parse_mount_options(char *options, const char *devname, if ((value = strchr(data, '=')) != NULL) *value++ = '\0'; - /* Have to parse this before we parse for "user" */ - if (strnicmp(data, "user_xattr", 10) == 0) { + switch (cifs_parse_mount_token(data)) { + case USERXATTR: vol->no_xattr = 0; - } else if (strnicmp(data, "nouser_xattr", 12) == 0) { + break; + case NO_USERXATTR: vol->no_xattr = 1; - } else if (strnicmp(data, "user", 4) == 0) { + break; + case USER: if (!value) { printk(KERN_WARNING "CIFS: invalid or missing username\n"); @@ -1146,7 +1148,8 @@ cifs_parse_mount_options(char *options, const char *devname, printk(KERN_WARNING "CIFS: username too long\n"); return 1; } - } else if (strnicmp(data, "pass", 4) == 0) { + break; + case PASS: if (!value) { vol->password = NULL; continue; @@ -1227,8 +1230,10 @@ cifs_parse_mount_options(char *options, const char *devname, } strcpy(vol->password, value); } - } else if (!strnicmp(data, "ip", 2) || - !strnicmp(data, "addr", 4)) { + break; + /* IP || ADDR */ + case IP: + case ADDR: if (!value || !*value) { vol->UNCip = NULL; } else if (strnlen(value, INET6_ADDRSTRLEN) < @@ -1239,7 +1244,8 @@ cifs_parse_mount_options(char *options, const char *devname, "too long\n"); return 1; } - } else if (strnicmp(data, "sec", 3) == 0) { + break; + case SEC: if (!value || !*value) { cERROR(1, "no security value specified"); continue; @@ -1284,9 +1290,11 @@ cifs_parse_mount_options(char *options, const char *devname, cERROR(1, "bad security option: %s", value); return 1; } - } else if ((strnicmp(data, "unc", 3) == 0) - || (strnicmp(data, "target", 6) == 0) - || (strnicmp(data, "path", 4) == 0)) { + break; + /* UNC || TARGET || PATH */ + case UNC: + case TARGET: + case PATH: if (!value || !*value) { printk(KERN_WARNING "CIFS: invalid path to " "network resource\n"); @@ -1310,8 +1318,11 @@ cifs_parse_mount_options(char *options, const char *devname, printk(KERN_WARNING "CIFS: UNC name too long\n"); return 1; } - } else if ((strnicmp(data, "domain", 3) == 0) - || (strnicmp(data, "workgroup", 5) == 0)) { + break; + + /* DOMAIN || WORKGROUP */ + case DOMAIN: + case WORKGROUP: if (!value || !*value) { printk(KERN_WARNING "CIFS: invalid domain name\n"); return 1; /* needs_arg; */ @@ -1326,7 +1337,8 @@ cifs_parse_mount_options(char *options, const char *devname, "long\n"); return 1; } - } else if (strnicmp(data, "prefixpath", 10) == 0) { + break; + case PREFIXPATH: if (!value || !*value) { printk(KERN_WARNING "CIFS: invalid path prefix\n"); @@ -1348,7 +1360,8 @@ cifs_parse_mount_options(char *options, const char *devname, printk(KERN_WARNING "CIFS: prefix too long\n"); return 1; } - } else if (strnicmp(data, "iocharset", 9) == 0) { + break; + case IOCHARSET: if (!value || !*value) { printk(KERN_WARNING "CIFS: invalid iocharset " "specified\n"); @@ -1365,58 +1378,72 @@ cifs_parse_mount_options(char *options, const char *devname, "too long.\n"); return 1; } - } else if (!strnicmp(data, "uid", 3) && value && *value) { - vol->linux_uid = simple_strtoul(value, &value, 0); - uid_specified = true; - } else if (!strnicmp(data, "forceuid", 8)) { + break; + case UID: + if (value && *value) { + vol->linux_uid = + simple_strtoul(value, &value, 0); + uid_specified = true; + } + break; + case FORCE_UID: override_uid = 1; - } else if (!strnicmp(data, "noforceuid", 10)) { + break; + case NO_FORCE_UID: override_uid = 0; - } else if (!strnicmp(data, "gid", 3) && value && *value) { - vol->linux_gid = simple_strtoul(value, &value, 0); - gid_specified = true; - } else if (!strnicmp(data, "forcegid", 8)) { - override_gid = 1; - } else if (!strnicmp(data, "noforcegid", 10)) { - override_gid = 0; - } else if (strnicmp(data, "file_mode", 4) == 0) { + break; + case GID: if (value && *value) { - vol->file_mode = + vol->linux_gid = simple_strtoul(value, &value, 0); + gid_specified = true; } - } else if (strnicmp(data, "dir_mode", 4) == 0) { + break; + case FORCE_GID: + override_gid = 1; + break; + case NO_FORCE_GID: + override_gid = 0; + break; + case FILEMODE: if (value && *value) { - vol->dir_mode = + vol->file_mode = simple_strtoul(value, &value, 0); } - } else if (strnicmp(data, "dirmode", 4) == 0) { + break; + case DIRMODE: if (value && *value) { vol->dir_mode = simple_strtoul(value, &value, 0); } - } else if (strnicmp(data, "port", 4) == 0) { + break; + case PORT: if (value && *value) { vol->port = simple_strtoul(value, &value, 0); } - } else if (strnicmp(data, "rsize", 5) == 0) { + break; + case RSIZE: if (value && *value) { vol->rsize = simple_strtoul(value, &value, 0); } - } else if (strnicmp(data, "wsize", 5) == 0) { + break; + case WSIZE: if (value && *value) { vol->wsize = simple_strtoul(value, &value, 0); } - } else if (strnicmp(data, "sockopt", 5) == 0) { + break; + case SOCKOPT: if (!value || !*value) { cERROR(1, "no socket option specified"); continue; } else if (strnicmp(value, "TCP_NODELAY", 11) == 0) { vol->sockopt_tcp_nodelay = 1; } - } else if (strnicmp(data, "netbiosname", 4) == 0) { + break; + case NETBIOSNAME: if (!value || !*value || (*value == ' ')) { cFYI(1, "invalid (empty) netbiosname"); } else { @@ -1439,7 +1466,8 @@ cifs_parse_mount_options(char *options, const char *devname, printk(KERN_WARNING "CIFS: netbiosname" " longer than 15 truncated.\n"); } - } else if (strnicmp(data, "servern", 7) == 0) { + break; + case SERVERNAME: /* servernetbiosname specified override *SMBSERVER */ if (!value || !*value || (*value == ' ')) { cFYI(1, "empty server netbiosname specified"); @@ -1466,75 +1494,76 @@ cifs_parse_mount_options(char *options, const char *devname, printk(KERN_WARNING "CIFS: server net" "biosname longer than 15 truncated.\n"); } - } else if (strnicmp(data, "credentials", 4) == 0) { - /* ignore */ - } else if (strnicmp(data, "version", 3) == 0) { - /* ignore */ - } else if (strnicmp(data, "guest", 5) == 0) { - /* ignore */ - } else if (strnicmp(data, "rw", 2) == 0) { - /* ignore */ - } else if (strnicmp(data, "ro", 2) == 0) { - /* ignore */ - } else if (strnicmp(data, "noblocksend", 11) == 0) { + break; + case NO_BLOCKSEND: vol->noblocksnd = 1; - } else if (strnicmp(data, "noautotune", 10) == 0) { + break; + case NO_AUTOTUNE: vol->noautotune = 1; - } else if ((strnicmp(data, "suid", 4) == 0) || - (strnicmp(data, "nosuid", 6) == 0) || - (strnicmp(data, "exec", 4) == 0) || - (strnicmp(data, "noexec", 6) == 0) || - (strnicmp(data, "nodev", 5) == 0) || - (strnicmp(data, "noauto", 6) == 0) || - (strnicmp(data, "dev", 3) == 0)) { - /* The mount tool or mount.cifs helper (if present) - uses these opts to set flags, and the flags are read - by the kernel vfs layer before we get here (ie - before read super) so there is no point trying to - parse these options again and set anything and it - is ok to just ignore them */ - continue; - } else if (strnicmp(data, "hard", 4) == 0) { + break; + /* HARD || NO_SOFT */ + case HARD: + case NO_SOFT: vol->retry = 1; - } else if (strnicmp(data, "soft", 4) == 0) { + break; + /* SOFT || NO_HARD */ + case SOFT: + case NO_HARD: vol->retry = 0; - } else if (strnicmp(data, "perm", 4) == 0) { + break; + case PERM: vol->noperm = 0; - } else if (strnicmp(data, "noperm", 6) == 0) { + break; + case NO_PERM: vol->noperm = 1; - } else if (strnicmp(data, "mapchars", 8) == 0) { + break; + case MAPCHARS: vol->remap = 1; - } else if (strnicmp(data, "nomapchars", 10) == 0) { + break; + case NO_MAPCHARS: vol->remap = 0; - } else if (strnicmp(data, "sfu", 3) == 0) { + break; + case SFU: vol->sfu_emul = 1; - } else if (strnicmp(data, "nosfu", 5) == 0) { + break; + case NO_SFU: vol->sfu_emul = 0; - } else if (strnicmp(data, "nodfs", 5) == 0) { + break; + case NO_DFS: vol->nodfs = 1; - } else if (strnicmp(data, "posixpaths", 10) == 0) { + break; + case POSIXPATHS: vol->posix_paths = 1; - } else if (strnicmp(data, "noposixpaths", 12) == 0) { + break; + case NO_POSIXPATHS: vol->posix_paths = 0; - } else if (strnicmp(data, "nounix", 6) == 0) { + break; + case NO_UNIX: vol->no_linux_ext = 1; - } else if (strnicmp(data, "nolinux", 7) == 0) { + break; + case NO_LINUX: vol->no_linux_ext = 1; - } else if ((strnicmp(data, "nocase", 6) == 0) || - (strnicmp(data, "ignorecase", 10) == 0)) { + break; + /* IGNORECASE || NO_CASE */ + case IGNORECASE: + case NO_CASE: vol->nocase = 1; - } else if (strnicmp(data, "brl", 3) == 0) { + break; + case BRL: vol->nobrl = 0; - } else if ((strnicmp(data, "nobrl", 5) == 0) || - (strnicmp(data, "nolock", 6) == 0)) { - vol->nobrl = 1; + break; + /* NO_BRL || NO_LOCK */ + case NO_BRL: + case NO_LOCK: + vol->nobrl = 1; /* turn off mandatory locking in mode if remote locking is turned off since the local vfs will do advisory */ if (vol->file_mode == (S_IALLUGO & ~(S_ISUID | S_IXGRP))) vol->file_mode = S_IALLUGO; - } else if (strnicmp(data, "forcemandatorylock", 9) == 0) { + break; + case FORCE_MANDATORYLOCK: /* will take the shorter form "forcemand" as well */ /* This mount option will force use of mandatory (DOS/Windows style) byte range locks, instead of @@ -1545,61 +1574,98 @@ cifs_parse_mount_options(char *options, const char *devname, would be used (mandatory locks is all that those those servers support) */ vol->mand_lock = 1; - } else if (strnicmp(data, "setuids", 7) == 0) { + break; + case SETUIDS: vol->setuids = 1; - } else if (strnicmp(data, "nosetuids", 9) == 0) { + break; + case NO_SETUIDS: vol->setuids = 0; - } else if (strnicmp(data, "dynperm", 7) == 0) { + break; + case DYNPERM: vol->dynperm = true; - } else if (strnicmp(data, "nodynperm", 9) == 0) { + break; + case NO_DYNPERM: vol->dynperm = false; - } else if (strnicmp(data, "nohard", 6) == 0) { - vol->retry = 0; - } else if (strnicmp(data, "nosoft", 6) == 0) { - vol->retry = 1; - } else if (strnicmp(data, "nointr", 6) == 0) { - vol->intr = 0; - } else if (strnicmp(data, "intr", 4) == 0) { + break; + case INTR: vol->intr = 1; - } else if (strnicmp(data, "nostrictsync", 12) == 0) { - vol->nostrictsync = 1; - } else if (strnicmp(data, "strictsync", 10) == 0) { + break; + case NO_INTR: + vol->intr = 0; + break; + case STRICTSYNC: vol->nostrictsync = 0; - } else if (strnicmp(data, "serverino", 7) == 0) { + case NO_STRICTSYNC: + vol->nostrictsync = 1; + break; + case SERVERINO: vol->server_ino = 1; - } else if (strnicmp(data, "noserverino", 9) == 0) { + break; + case NO_SERVERINO: vol->server_ino = 0; - } else if (strnicmp(data, "cifsacl", 7) == 0) { + break; + case CIFSACL: vol->cifs_acl = 1; - } else if (strnicmp(data, "nocifsacl", 9) == 0) { + break; + case NO_CIFSACL: vol->cifs_acl = 0; - } else if (strnicmp(data, "acl", 3) == 0) { + break; + case ACL: vol->no_psx_acl = 0; - } else if (strnicmp(data, "noacl", 5) == 0) { + break; + case NO_ACL: vol->no_psx_acl = 1; + break; #ifdef CONFIG_CIFS_EXPERIMENTAL - } else if (strnicmp(data, "locallease", 6) == 0) { + case LOCALLEASE: vol->local_lease = 1; + break; #endif - } else if (strnicmp(data, "sign", 4) == 0) { + case SIGN: vol->secFlg |= CIFSSEC_MUST_SIGN; - } else if (strnicmp(data, "seal", 4) == 0) { + break; + case SEAL: /* we do not do the following in secFlags because seal is a per tree connection (mount) not a per socket or per-smb connection option in the protocol */ /* vol->secFlg |= CIFSSEC_MUST_SEAL; */ vol->seal = 1; - } else if (strnicmp(data, "direct", 6) == 0) { - vol->direct_io = 1; - } else if (strnicmp(data, "forcedirectio", 13) == 0) { + break; + /* DIRECT || FORCE_DIRECT */ + case DIRECT: + case FORCE_DIRECT: vol->direct_io = 1; - } else if (strnicmp(data, "noac", 4) == 0) { + break; + case NO_AC: printk(KERN_WARNING "CIFS: Mount option noac not " "supported. Instead set " "/proc/fs/cifs/LookupCacheEnabled to 0\n"); - } else + break; + case CIFS_TOKEN_ERROR: printk(KERN_WARNING "CIFS: Unknown mount option %s\n", data); + break; + + /* ignore these */ + case CREDENTIALS: + case VERSION: + case GUEST: + case RW: + case RO: + /* The mount tool or mount.cifs helper (if present) uses these + opts to set flags, and the flags are read by the kernel vfs + layer before we get here (ie before read super) so there is + no point trying to parse these options again and set + anything and it is ok to just ignore them */ + case SUID: + case NO_SUID: + case EXEC: + case NO_EXEC: + case DEV: + case NO_DEV: + case NO_AUTO: + continue; + } } if (vol->UNC == NULL) { if (devname == NULL) { -- 1.6.2.5