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