From patchwork Tue May 18 04:53:07 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Scott Lovenberg X-Patchwork-Id: 100321 Received: from lists.samba.org (fn.samba.org [216.83.154.106]) by demeter.kernel.org (8.14.3/8.14.3) with ESMTP id o4I4rNP5028503 for ; Tue, 18 May 2010 04:53:58 GMT Received: from fn.samba.org (localhost [127.0.0.1]) by lists.samba.org (Postfix) with ESMTP id 1121EAD223; Mon, 17 May 2010 22:53:26 -0600 (MDT) X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on fn.samba.org X-Spam-Level: X-Spam-Status: No, score=-3.2 required=3.8 tests=AWL, BAYES_00, NO_MORE_FUNN, SPF_PASS autolearn=no version=3.2.5 X-Original-To: linux-cifs-client@lists.samba.org Delivered-To: linux-cifs-client@lists.samba.org Received: from mail-qy0-f200.google.com (mail-qy0-f200.google.com [209.85.221.200]) by lists.samba.org (Postfix) with ESMTP id CFE04AD098 for ; Mon, 17 May 2010 22:53:18 -0600 (MDT) Received: by mail-qy0-f200.google.com with SMTP id 38so6258601qyk.17 for ; Mon, 17 May 2010 21:53:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:from:to:cc:subject:date :message-id:x-mailer:in-reply-to:references:content-type :content-transfer-encoding; bh=yI/S8aVGWQG2+MG0u0SvmBiY3Ktvzges2J6djSmp80w=; b=s9axwa4X7l61OAukJ8rNtECMKSfruz1bqMw39++NYyyqy6mBJRk631dj6PzE2PWSQV bxAHK+/ZaE9TvrWz6aC+U90IPXOnj5+nFEWQczjxDEt1X2QZ921yP5Lazc4gQPT9qggy uDS/abScfhfQmVTSaDDV1zYrrvzgKyqZBkujk= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references :content-type:content-transfer-encoding; b=TKV/KYHe9midrMgJHN4lX9HD8Ti4FEPuX9oQR/6Q+DzdrffFmcxO96kaOq+7eDc21J AWrvkp8JT7bMZN+1mViPowXKUlKnsEmpg9YNAw3ygwFpwEVNABfdKhtkAFbaK2DI8lug d32XkLl57wVc+boRUpDSF6am6tQr2v5BADh/M= Received: by 10.224.35.196 with SMTP id q4mr3412226qad.348.1274158396049; Mon, 17 May 2010 21:53:16 -0700 (PDT) Received: from localhost.localdomain (24.115.161.116.res-cmts.flt.ptd.net [24.115.161.116]) by mx.google.com with ESMTPS id 7sm11662718qwf.56.2010.05.17.21.53.14 (version=TLSv1/SSLv3 cipher=RC4-MD5); Mon, 17 May 2010 21:53:15 -0700 (PDT) From: Scott Lovenberg To: linux-cifs-client@lists.samba.org Date: Tue, 18 May 2010 00:53:07 -0400 Message-Id: <1274158387-26599-3-git-send-email-scott.lovenberg@gmail.com> X-Mailer: git-send-email 1.6.2.5 In-Reply-To: <1274158387-26599-2-git-send-email-scott.lovenberg@gmail.com> References: <1274158387-26599-1-git-send-email-scott.lovenberg@gmail.com> <1274158387-26599-2-git-send-email-scott.lovenberg@gmail.com> Cc: jlayton@samba.org Subject: [linux-cifs-client] [PATCH 2/2] connect.c: use defined constants for options X-BeenThere: linux-cifs-client@lists.samba.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: The Linux CIFS VFS client List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: linux-cifs-client-bounces@lists.samba.org Errors-To: linux-cifs-client-bounces@lists.samba.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Tue, 18 May 2010 04:53:59 +0000 (UTC) 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) {