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) {
