Commit 50c2f753 authored by Steve French's avatar Steve French

[CIFS] whitespace/formatting fixes

This should be the last big batch of whitespace/formatting fixes.
checkpatch warnings for the cifs directory are down about 90% and
many of the remaining ones are harder to remove or make the code
harder to read.
Signed-off-by: default avatarSteve French <sfrench@us.ibm.com>
parent 7521a3c5
/* /*
* The ASB.1/BER parsing code is derived from ip_nat_snmp_basic.c which was in * The ASB.1/BER parsing code is derived from ip_nat_snmp_basic.c which was in
* turn derived from the gxsnmp package by Gregory McLean & Jochen Friedrich * turn derived from the gxsnmp package by Gregory McLean & Jochen Friedrich
* *
* Copyright (c) 2000 RP Internet (www.rpi.net.au). * Copyright (c) 2000 RP Internet (www.rpi.net.au).
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
...@@ -80,7 +80,7 @@ ...@@ -80,7 +80,7 @@
static unsigned long SPNEGO_OID[7] = { 1, 3, 6, 1, 5, 5, 2 }; static unsigned long SPNEGO_OID[7] = { 1, 3, 6, 1, 5, 5, 2 };
static unsigned long NTLMSSP_OID[10] = { 1, 3, 6, 1, 4, 1, 311, 2, 2, 10 }; static unsigned long NTLMSSP_OID[10] = { 1, 3, 6, 1, 4, 1, 311, 2, 2, 10 };
/* /*
* ASN.1 context. * ASN.1 context.
*/ */
struct asn1_ctx { struct asn1_ctx {
...@@ -190,7 +190,7 @@ asn1_header_decode(struct asn1_ctx *ctx, ...@@ -190,7 +190,7 @@ asn1_header_decode(struct asn1_ctx *ctx,
unsigned char **eoc, unsigned char **eoc,
unsigned int *cls, unsigned int *con, unsigned int *tag) unsigned int *cls, unsigned int *con, unsigned int *tag)
{ {
unsigned int def = 0; unsigned int def = 0;
unsigned int len = 0; unsigned int len = 0;
if (!asn1_id_decode(ctx, cls, con, tag)) if (!asn1_id_decode(ctx, cls, con, tag))
...@@ -331,7 +331,7 @@ static unsigned char asn1_ulong_decode(struct asn1_ctx *ctx, ...@@ -331,7 +331,7 @@ static unsigned char asn1_ulong_decode(struct asn1_ctx *ctx,
*integer |= ch; *integer |= ch;
} }
return 1; return 1;
} }
static unsigned char static unsigned char
asn1_octets_decode(struct asn1_ctx *ctx, asn1_octets_decode(struct asn1_ctx *ctx,
...@@ -376,7 +376,7 @@ asn1_subid_decode(struct asn1_ctx *ctx, unsigned long *subid) ...@@ -376,7 +376,7 @@ asn1_subid_decode(struct asn1_ctx *ctx, unsigned long *subid)
return 1; return 1;
} }
static int static int
asn1_oid_decode(struct asn1_ctx *ctx, asn1_oid_decode(struct asn1_ctx *ctx,
unsigned char *eoc, unsigned long **oid, unsigned int *len) unsigned char *eoc, unsigned long **oid, unsigned int *len)
{ {
...@@ -459,7 +459,7 @@ decode_negTokenInit(unsigned char *security_blob, int length, ...@@ -459,7 +459,7 @@ decode_negTokenInit(unsigned char *security_blob, int length,
unsigned int cls, con, tag, oidlen, rc; unsigned int cls, con, tag, oidlen, rc;
int use_ntlmssp = FALSE; int use_ntlmssp = FALSE;
*secType = NTLM; /* BB eventually make Kerberos or NLTMSSP the default */ *secType = NTLM; /* BB eventually make Kerberos or NLTMSSP the default*/
/* cifs_dump_mem(" Received SecBlob ", security_blob, length); */ /* cifs_dump_mem(" Received SecBlob ", security_blob, length); */
...@@ -498,7 +498,8 @@ decode_negTokenInit(unsigned char *security_blob, int length, ...@@ -498,7 +498,8 @@ decode_negTokenInit(unsigned char *security_blob, int length,
return 0; return 0;
} else if ((cls != ASN1_CTX) || (con != ASN1_CON) } else if ((cls != ASN1_CTX) || (con != ASN1_CON)
|| (tag != ASN1_EOC)) { || (tag != ASN1_EOC)) {
cFYI(1,("cls = %d con = %d tag = %d end = %p (%d) exit 0", cFYI(1,
("cls = %d con = %d tag = %d end = %p (%d) exit 0",
cls, con, tag, end, *end)); cls, con, tag, end, *end));
return 0; return 0;
} }
...@@ -508,7 +509,8 @@ decode_negTokenInit(unsigned char *security_blob, int length, ...@@ -508,7 +509,8 @@ decode_negTokenInit(unsigned char *security_blob, int length,
return 0; return 0;
} else if ((cls != ASN1_UNI) || (con != ASN1_CON) } else if ((cls != ASN1_UNI) || (con != ASN1_CON)
|| (tag != ASN1_SEQ)) { || (tag != ASN1_SEQ)) {
cFYI(1,("cls = %d con = %d tag = %d end = %p (%d) exit 1", cFYI(1,
("cls = %d con = %d tag = %d end = %p (%d) exit 1",
cls, con, tag, end, *end)); cls, con, tag, end, *end));
return 0; return 0;
} }
...@@ -540,32 +542,34 @@ decode_negTokenInit(unsigned char *security_blob, int length, ...@@ -540,32 +542,34 @@ decode_negTokenInit(unsigned char *security_blob, int length,
rc = asn1_header_decode(&ctx, &end, &cls, &con, &tag); rc = asn1_header_decode(&ctx, &end, &cls, &con, &tag);
if (!rc) { if (!rc) {
cFYI(1, cFYI(1,
("Error 1 decoding negTokenInit header exit 2")); ("Error decoding negTokenInit hdr exit2"));
return 0; return 0;
} }
if ((tag == ASN1_OJI) && (con == ASN1_PRI)) { if ((tag == ASN1_OJI) && (con == ASN1_PRI)) {
rc = asn1_oid_decode(&ctx, end, &oid, &oidlen); rc = asn1_oid_decode(&ctx, end, &oid, &oidlen);
if(rc) { if (rc) {
cFYI(1, cFYI(1,
("OID len = %d oid = 0x%lx 0x%lx 0x%lx 0x%lx", ("OID len = %d oid = 0x%lx 0x%lx "
oidlen, *oid, *(oid + 1), *(oid + 2), "0x%lx 0x%lx",
*(oid + 3))); oidlen, *oid, *(oid + 1),
rc = compare_oid(oid, oidlen, NTLMSSP_OID, *(oid + 2), *(oid + 3)));
NTLMSSP_OID_LEN); rc = compare_oid(oid, oidlen,
NTLMSSP_OID, NTLMSSP_OID_LEN);
kfree(oid); kfree(oid);
if (rc) if (rc)
use_ntlmssp = TRUE; use_ntlmssp = TRUE;
} }
} else { } else {
cFYI(1,("This should be an oid what is going on? ")); cFYI(1, ("Should be an oid what is going on?"));
} }
} }
if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) {
cFYI(1, cFYI(1,
("Error decoding last part of negTokenInit exit 3")); ("Error decoding last part negTokenInit exit3"));
return 0; return 0;
} else if ((cls != ASN1_CTX) || (con != ASN1_CON)) { /* tag = 3 indicating mechListMIC */ } else if ((cls != ASN1_CTX) || (con != ASN1_CON)) {
/* tag = 3 indicating mechListMIC */
cFYI(1, cFYI(1,
("Exit 4 cls = %d con = %d tag = %d end = %p (%d)", ("Exit 4 cls = %d con = %d tag = %d end = %p (%d)",
cls, con, tag, end, *end)); cls, con, tag, end, *end));
...@@ -573,7 +577,7 @@ decode_negTokenInit(unsigned char *security_blob, int length, ...@@ -573,7 +577,7 @@ decode_negTokenInit(unsigned char *security_blob, int length,
} }
if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) {
cFYI(1, cFYI(1,
("Error decoding last part of negTokenInit exit 5")); ("Error decoding last part negTokenInit exit5"));
return 0; return 0;
} else if ((cls != ASN1_UNI) || (con != ASN1_CON) } else if ((cls != ASN1_UNI) || (con != ASN1_CON)
|| (tag != ASN1_SEQ)) { || (tag != ASN1_SEQ)) {
...@@ -584,7 +588,7 @@ decode_negTokenInit(unsigned char *security_blob, int length, ...@@ -584,7 +588,7 @@ decode_negTokenInit(unsigned char *security_blob, int length,
if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) {
cFYI(1, cFYI(1,
("Error decoding last part of negTokenInit exit 7")); ("Error decoding last part negTokenInit exit 7"));
return 0; return 0;
} else if ((cls != ASN1_CTX) || (con != ASN1_CON)) { } else if ((cls != ASN1_CTX) || (con != ASN1_CON)) {
cFYI(1, cFYI(1,
...@@ -594,20 +598,21 @@ decode_negTokenInit(unsigned char *security_blob, int length, ...@@ -594,20 +598,21 @@ decode_negTokenInit(unsigned char *security_blob, int length,
} }
if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) {
cFYI(1, cFYI(1,
("Error decoding last part of negTokenInit exit 9")); ("Error decoding last part negTokenInit exit9"));
return 0; return 0;
} else if ((cls != ASN1_UNI) || (con != ASN1_PRI) } else if ((cls != ASN1_UNI) || (con != ASN1_PRI)
|| (tag != ASN1_GENSTR)) { || (tag != ASN1_GENSTR)) {
cFYI(1, cFYI(1,
("Exit 10 cls = %d con = %d tag = %d end = %p (%d)", ("Exit10 cls = %d con = %d tag = %d end = %p (%d)",
cls, con, tag, end, *end)); cls, con, tag, end, *end));
return 0; return 0;
} }
cFYI(1, ("Need to call asn1_octets_decode() function for this %s", ctx.pointer)); /* is this UTF-8 or ASCII? */ cFYI(1, ("Need to call asn1_octets_decode() function for %s",
ctx.pointer)); /* is this UTF-8 or ASCII? */
} }
/* if (use_kerberos) /* if (use_kerberos)
*secType = Kerberos *secType = Kerberos
else */ else */
if (use_ntlmssp) { if (use_ntlmssp) {
*secType = NTLMSSP; *secType = NTLMSSP;
......
...@@ -145,7 +145,6 @@ cifs_debug_data_read(char *buf, char **beginBuffer, off_t offset, ...@@ -145,7 +145,6 @@ cifs_debug_data_read(char *buf, char **beginBuffer, off_t offset,
(ses->serverNOS == NULL)) { (ses->serverNOS == NULL)) {
buf += sprintf(buf, "\nentry for %s not fully " buf += sprintf(buf, "\nentry for %s not fully "
"displayed\n\t", ses->serverName); "displayed\n\t", ses->serverName);
} else { } else {
length = length =
sprintf(buf, sprintf(buf,
......
...@@ -43,6 +43,6 @@ struct cifs_sb_info { ...@@ -43,6 +43,6 @@ struct cifs_sb_info {
mode_t mnt_dir_mode; mode_t mnt_dir_mode;
int mnt_cifs_flags; int mnt_cifs_flags;
int prepathlen; int prepathlen;
char * prepath; char *prepath;
}; };
#endif /* _CIFS_FS_SB_H */ #endif /* _CIFS_FS_SB_H */
...@@ -66,7 +66,7 @@ cifs_strtoUCS(__le16 * to, const char *from, int len, ...@@ -66,7 +66,7 @@ cifs_strtoUCS(__le16 * to, const char *from, int len,
{ {
int charlen; int charlen;
int i; int i;
wchar_t * wchar_to = (wchar_t *)to; /* needed to quiet sparse */ wchar_t *wchar_to = (wchar_t *)to; /* needed to quiet sparse */
for (i = 0; len && *from; i++, from += charlen, len -= charlen) { for (i = 0; len && *from; i++, from += charlen, len -= charlen) {
......
...@@ -70,7 +70,7 @@ int cifs_strtoUCS(__le16 *, const char *, int, const struct nls_table *); ...@@ -70,7 +70,7 @@ int cifs_strtoUCS(__le16 *, const char *, int, const struct nls_table *);
* Address of the first string * Address of the first string
*/ */
static inline wchar_t * static inline wchar_t *
UniStrcat(wchar_t * ucs1, const wchar_t * ucs2) UniStrcat(wchar_t *ucs1, const wchar_t *ucs2)
{ {
wchar_t *anchor = ucs1; /* save a pointer to start of ucs1 */ wchar_t *anchor = ucs1; /* save a pointer to start of ucs1 */
...@@ -88,7 +88,7 @@ UniStrcat(wchar_t * ucs1, const wchar_t * ucs2) ...@@ -88,7 +88,7 @@ UniStrcat(wchar_t * ucs1, const wchar_t * ucs2)
* or NULL if the character is not in the string * or NULL if the character is not in the string
*/ */
static inline wchar_t * static inline wchar_t *
UniStrchr(const wchar_t * ucs, wchar_t uc) UniStrchr(const wchar_t *ucs, wchar_t uc)
{ {
while ((*ucs != uc) && *ucs) while ((*ucs != uc) && *ucs)
ucs++; ucs++;
...@@ -107,7 +107,7 @@ UniStrchr(const wchar_t * ucs, wchar_t uc) ...@@ -107,7 +107,7 @@ UniStrchr(const wchar_t * ucs, wchar_t uc)
* > 0: First string is greater than second * > 0: First string is greater than second
*/ */
static inline int static inline int
UniStrcmp(const wchar_t * ucs1, const wchar_t * ucs2) UniStrcmp(const wchar_t *ucs1, const wchar_t *ucs2)
{ {
while ((*ucs1 == *ucs2) && *ucs1) { while ((*ucs1 == *ucs2) && *ucs1) {
ucs1++; ucs1++;
...@@ -120,7 +120,7 @@ UniStrcmp(const wchar_t * ucs1, const wchar_t * ucs2) ...@@ -120,7 +120,7 @@ UniStrcmp(const wchar_t * ucs1, const wchar_t * ucs2)
* UniStrcpy: Copy a string * UniStrcpy: Copy a string
*/ */
static inline wchar_t * static inline wchar_t *
UniStrcpy(wchar_t * ucs1, const wchar_t * ucs2) UniStrcpy(wchar_t *ucs1, const wchar_t *ucs2)
{ {
wchar_t *anchor = ucs1; /* save the start of result string */ wchar_t *anchor = ucs1; /* save the start of result string */
...@@ -132,7 +132,7 @@ UniStrcpy(wchar_t * ucs1, const wchar_t * ucs2) ...@@ -132,7 +132,7 @@ UniStrcpy(wchar_t * ucs1, const wchar_t * ucs2)
* UniStrlen: Return the length of a string (in 16 bit Unicode chars not bytes) * UniStrlen: Return the length of a string (in 16 bit Unicode chars not bytes)
*/ */
static inline size_t static inline size_t
UniStrlen(const wchar_t * ucs1) UniStrlen(const wchar_t *ucs1)
{ {
int i = 0; int i = 0;
...@@ -146,7 +146,7 @@ UniStrlen(const wchar_t * ucs1) ...@@ -146,7 +146,7 @@ UniStrlen(const wchar_t * ucs1)
* string (length limited) * string (length limited)
*/ */
static inline size_t static inline size_t
UniStrnlen(const wchar_t * ucs1, int maxlen) UniStrnlen(const wchar_t *ucs1, int maxlen)
{ {
int i = 0; int i = 0;
...@@ -162,7 +162,7 @@ UniStrnlen(const wchar_t * ucs1, int maxlen) ...@@ -162,7 +162,7 @@ UniStrnlen(const wchar_t * ucs1, int maxlen)
* UniStrncat: Concatenate length limited string * UniStrncat: Concatenate length limited string
*/ */
static inline wchar_t * static inline wchar_t *
UniStrncat(wchar_t * ucs1, const wchar_t * ucs2, size_t n) UniStrncat(wchar_t *ucs1, const wchar_t *ucs2, size_t n)
{ {
wchar_t *anchor = ucs1; /* save pointer to string 1 */ wchar_t *anchor = ucs1; /* save pointer to string 1 */
...@@ -180,7 +180,7 @@ UniStrncat(wchar_t * ucs1, const wchar_t * ucs2, size_t n) ...@@ -180,7 +180,7 @@ UniStrncat(wchar_t * ucs1, const wchar_t * ucs2, size_t n)
* UniStrncmp: Compare length limited string * UniStrncmp: Compare length limited string
*/ */
static inline int static inline int
UniStrncmp(const wchar_t * ucs1, const wchar_t * ucs2, size_t n) UniStrncmp(const wchar_t *ucs1, const wchar_t *ucs2, size_t n)
{ {
if (!n) if (!n)
return 0; /* Null strings are equal */ return 0; /* Null strings are equal */
...@@ -195,7 +195,7 @@ UniStrncmp(const wchar_t * ucs1, const wchar_t * ucs2, size_t n) ...@@ -195,7 +195,7 @@ UniStrncmp(const wchar_t * ucs1, const wchar_t * ucs2, size_t n)
* UniStrncmp_le: Compare length limited string - native to little-endian * UniStrncmp_le: Compare length limited string - native to little-endian
*/ */
static inline int static inline int
UniStrncmp_le(const wchar_t * ucs1, const wchar_t * ucs2, size_t n) UniStrncmp_le(const wchar_t *ucs1, const wchar_t *ucs2, size_t n)
{ {
if (!n) if (!n)
return 0; /* Null strings are equal */ return 0; /* Null strings are equal */
...@@ -210,7 +210,7 @@ UniStrncmp_le(const wchar_t * ucs1, const wchar_t * ucs2, size_t n) ...@@ -210,7 +210,7 @@ UniStrncmp_le(const wchar_t * ucs1, const wchar_t * ucs2, size_t n)
* UniStrncpy: Copy length limited string with pad * UniStrncpy: Copy length limited string with pad
*/ */
static inline wchar_t * static inline wchar_t *
UniStrncpy(wchar_t * ucs1, const wchar_t * ucs2, size_t n) UniStrncpy(wchar_t *ucs1, const wchar_t *ucs2, size_t n)
{ {
wchar_t *anchor = ucs1; wchar_t *anchor = ucs1;
...@@ -227,7 +227,7 @@ UniStrncpy(wchar_t * ucs1, const wchar_t * ucs2, size_t n) ...@@ -227,7 +227,7 @@ UniStrncpy(wchar_t * ucs1, const wchar_t * ucs2, size_t n)
* UniStrncpy_le: Copy length limited string with pad to little-endian * UniStrncpy_le: Copy length limited string with pad to little-endian
*/ */
static inline wchar_t * static inline wchar_t *
UniStrncpy_le(wchar_t * ucs1, const wchar_t * ucs2, size_t n) UniStrncpy_le(wchar_t *ucs1, const wchar_t *ucs2, size_t n)
{ {
wchar_t *anchor = ucs1; wchar_t *anchor = ucs1;
...@@ -248,7 +248,7 @@ UniStrncpy_le(wchar_t * ucs1, const wchar_t * ucs2, size_t n) ...@@ -248,7 +248,7 @@ UniStrncpy_le(wchar_t * ucs1, const wchar_t * ucs2, size_t n)
* NULL if no matching string is found * NULL if no matching string is found
*/ */
static inline wchar_t * static inline wchar_t *
UniStrstr(const wchar_t * ucs1, const wchar_t * ucs2) UniStrstr(const wchar_t *ucs1, const wchar_t *ucs2)
{ {
const wchar_t *anchor1 = ucs1; const wchar_t *anchor1 = ucs1;
const wchar_t *anchor2 = ucs2; const wchar_t *anchor2 = ucs2;
...@@ -298,7 +298,7 @@ UniToupper(register wchar_t uc) ...@@ -298,7 +298,7 @@ UniToupper(register wchar_t uc)
* UniStrupr: Upper case a unicode string * UniStrupr: Upper case a unicode string
*/ */
static inline wchar_t * static inline wchar_t *
UniStrupr(register wchar_t * upin) UniStrupr(register wchar_t *upin)
{ {
register wchar_t *up; register wchar_t *up;
...@@ -339,7 +339,7 @@ UniTolower(wchar_t uc) ...@@ -339,7 +339,7 @@ UniTolower(wchar_t uc)
* UniStrlwr: Lower case a unicode string * UniStrlwr: Lower case a unicode string
*/ */
static inline wchar_t * static inline wchar_t *
UniStrlwr(register wchar_t * upin) UniStrlwr(register wchar_t *upin)
{ {
register wchar_t *up; register wchar_t *up;
......
...@@ -5,14 +5,14 @@ ...@@ -5,14 +5,14 @@
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or * the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
* the GNU General Public License for more details. * the GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* *
* uniupr.h - Unicode compressed case ranges * uniupr.h - Unicode compressed case ranges
...@@ -53,7 +53,7 @@ signed char CifsUniUpperTable[512] = { ...@@ -53,7 +53,7 @@ signed char CifsUniUpperTable[512] = {
0, -1, 0, -1, 0, -1, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, /* 1a0-1af */ 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, /* 1a0-1af */
-1, 0, 0, 0, -1, 0, -1, 0, 0, -1, 0, 0, 0, -1, 0, 0, /* 1b0-1bf */ -1, 0, 0, 0, -1, 0, -1, 0, 0, -1, 0, 0, 0, -1, 0, 0, /* 1b0-1bf */
0, 0, 0, 0, 0, -1, -2, 0, -1, -2, 0, -1, -2, 0, -1, 0, /* 1c0-1cf */ 0, 0, 0, 0, 0, -1, -2, 0, -1, -2, 0, -1, -2, 0, -1, 0, /* 1c0-1cf */
-1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -79, 0, -1, /* 1d0-1df */ -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -79, 0, -1, /* 1d0-1df */
0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e0-1ef */ 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e0-1ef */
0, 0, -1, -2, 0, -1, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, /* 1f0-1ff */ 0, 0, -1, -2, 0, -1, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, /* 1f0-1ff */
}; };
......
...@@ -39,7 +39,7 @@ extern void mdfour(unsigned char *out, unsigned char *in, int n); ...@@ -39,7 +39,7 @@ extern void mdfour(unsigned char *out, unsigned char *in, int n);
extern void E_md4hash(const unsigned char *passwd, unsigned char *p16); extern void E_md4hash(const unsigned char *passwd, unsigned char *p16);
extern void SMBencrypt(unsigned char *passwd, unsigned char *c8, extern void SMBencrypt(unsigned char *passwd, unsigned char *c8,
unsigned char *p24); unsigned char *p24);
static int cifs_calculate_signature(const struct smb_hdr *cifs_pdu, static int cifs_calculate_signature(const struct smb_hdr *cifs_pdu,
const struct mac_key *key, char *signature) const struct mac_key *key, char *signature)
{ {
...@@ -69,10 +69,10 @@ int cifs_sign_smb(struct smb_hdr *cifs_pdu, struct TCP_Server_Info *server, ...@@ -69,10 +69,10 @@ int cifs_sign_smb(struct smb_hdr *cifs_pdu, struct TCP_Server_Info *server,
return rc; return rc;
spin_lock(&GlobalMid_Lock); spin_lock(&GlobalMid_Lock);
cifs_pdu->Signature.Sequence.SequenceNumber = cifs_pdu->Signature.Sequence.SequenceNumber =
cpu_to_le32(server->sequence_number); cpu_to_le32(server->sequence_number);
cifs_pdu->Signature.Sequence.Reserved = 0; cifs_pdu->Signature.Sequence.Reserved = 0;
*pexpected_response_sequence_number = server->sequence_number++; *pexpected_response_sequence_number = server->sequence_number++;
server->sequence_number++; server->sequence_number++;
spin_unlock(&GlobalMid_Lock); spin_unlock(&GlobalMid_Lock);
...@@ -98,9 +98,9 @@ static int cifs_calc_signature2(const struct kvec *iov, int n_vec, ...@@ -98,9 +98,9 @@ static int cifs_calc_signature2(const struct kvec *iov, int n_vec,
MD5Init(&context); MD5Init(&context);
MD5Update(&context, (char *)&key->data, key->len); MD5Update(&context, (char *)&key->data, key->len);
for (i=0;i<n_vec;i++) { for (i = 0; i < n_vec; i++) {
if (iov[i].iov_base == NULL) { if (iov[i].iov_base == NULL) {
cERROR(1 ,("null iovec entry")); cERROR(1, ("null iovec entry"));
return -EIO; return -EIO;
} else if (iov[i].iov_len == 0) } else if (iov[i].iov_len == 0)
break; /* bail out if we are sent nothing to sign */ break; /* bail out if we are sent nothing to sign */
...@@ -167,36 +167,38 @@ int cifs_verify_signature(struct smb_hdr *cifs_pdu, ...@@ -167,36 +167,38 @@ int cifs_verify_signature(struct smb_hdr *cifs_pdu,
return 0; return 0;
if (cifs_pdu->Command == SMB_COM_LOCKING_ANDX) { if (cifs_pdu->Command == SMB_COM_LOCKING_ANDX) {
struct smb_com_lock_req * pSMB = struct smb_com_lock_req *pSMB =
(struct smb_com_lock_req *)cifs_pdu; (struct smb_com_lock_req *)cifs_pdu;
if (pSMB->LockType & LOCKING_ANDX_OPLOCK_RELEASE) if (pSMB->LockType & LOCKING_ANDX_OPLOCK_RELEASE)
return 0; return 0;
} }
/* BB what if signatures are supposed to be on for session but server does not /* BB what if signatures are supposed to be on for session but
send one? BB */ server does not send one? BB */
/* Do not need to verify session setups with signature "BSRSPYL " */ /* Do not need to verify session setups with signature "BSRSPYL " */
if(memcmp(cifs_pdu->Signature.SecuritySignature,"BSRSPYL ",8)==0) if (memcmp(cifs_pdu->Signature.SecuritySignature, "BSRSPYL ", 8) == 0)
cFYI(1,("dummy signature received for smb command 0x%x",cifs_pdu->Command)); cFYI(1, ("dummy signature received for smb command 0x%x",
cifs_pdu->Command));
/* save off the origiginal signature so we can modify the smb and check /* save off the origiginal signature so we can modify the smb and check
its signature against what the server sent */ its signature against what the server sent */
memcpy(server_response_sig,cifs_pdu->Signature.SecuritySignature,8); memcpy(server_response_sig, cifs_pdu->Signature.SecuritySignature, 8);
cifs_pdu->Signature.Sequence.SequenceNumber = cpu_to_le32(expected_sequence_number); cifs_pdu->Signature.Sequence.SequenceNumber =
cpu_to_le32(expected_sequence_number);
cifs_pdu->Signature.Sequence.Reserved = 0; cifs_pdu->Signature.Sequence.Reserved = 0;
rc = cifs_calculate_signature(cifs_pdu, mac_key, rc = cifs_calculate_signature(cifs_pdu, mac_key,
what_we_think_sig_should_be); what_we_think_sig_should_be);
if(rc) if (rc)
return rc; return rc;
/* cifs_dump_mem("what we think it should be: ",
/* cifs_dump_mem("what we think it should be: ",what_we_think_sig_should_be,16); */ what_we_think_sig_should_be, 16); */
if(memcmp(server_response_sig, what_we_think_sig_should_be, 8)) if (memcmp(server_response_sig, what_we_think_sig_should_be, 8))
return -EACCES; return -EACCES;
else else
return 0; return 0;
...@@ -218,30 +220,30 @@ int cifs_calculate_mac_key(struct mac_key *key, const char *rn, ...@@ -218,30 +220,30 @@ int cifs_calculate_mac_key(struct mac_key *key, const char *rn,
return 0; return 0;
} }
int CalcNTLMv2_partial_mac_key(struct cifsSesInfo * ses, int CalcNTLMv2_partial_mac_key(struct cifsSesInfo *ses,
const struct nls_table * nls_info) const struct nls_table *nls_info)
{ {
char temp_hash[16]; char temp_hash[16];
struct HMACMD5Context ctx; struct HMACMD5Context ctx;
char * ucase_buf; char *ucase_buf;
__le16 * unicode_buf; __le16 *unicode_buf;
unsigned int i,user_name_len,dom_name_len; unsigned int i, user_name_len, dom_name_len;
if(ses == NULL) if (ses == NULL)
return -EINVAL; return -EINVAL;
E_md4hash(ses->password, temp_hash); E_md4hash(ses->password, temp_hash);
hmac_md5_init_limK_to_64(temp_hash, 16, &ctx); hmac_md5_init_limK_to_64(temp_hash, 16, &ctx);
user_name_len = strlen(ses->userName); user_name_len = strlen(ses->userName);
if(user_name_len > MAX_USERNAME_SIZE) if (user_name_len > MAX_USERNAME_SIZE)
return -EINVAL; return -EINVAL;
if(ses->domainName == NULL) if (ses->domainName == NULL)
return -EINVAL; /* BB should we use CIFS_LINUX_DOM */ return -EINVAL; /* BB should we use CIFS_LINUX_DOM */
dom_name_len = strlen(ses->domainName); dom_name_len = strlen(ses->domainName);
if (dom_name_len > MAX_USERNAME_SIZE) if (dom_name_len > MAX_USERNAME_SIZE)
return -EINVAL; return -EINVAL;
ucase_buf = kmalloc((MAX_USERNAME_SIZE+1), GFP_KERNEL); ucase_buf = kmalloc((MAX_USERNAME_SIZE+1), GFP_KERNEL);
if (ucase_buf == NULL) if (ucase_buf == NULL)
return -ENOMEM; return -ENOMEM;
...@@ -250,18 +252,20 @@ int CalcNTLMv2_partial_mac_key(struct cifsSesInfo * ses, ...@@ -250,18 +252,20 @@ int CalcNTLMv2_partial_mac_key(struct cifsSesInfo * ses,
kfree(ucase_buf); kfree(ucase_buf);
return -ENOMEM; return -ENOMEM;
} }
for (i = 0;i < user_name_len; i++) for (i = 0; i < user_name_len; i++)
ucase_buf[i] = nls_info->charset2upper[(int)ses->userName[i]]; ucase_buf[i] = nls_info->charset2upper[(int)ses->userName[i]];
ucase_buf[i] = 0; ucase_buf[i] = 0;
user_name_len = cifs_strtoUCS(unicode_buf, ucase_buf, MAX_USERNAME_SIZE*2, nls_info); user_name_len = cifs_strtoUCS(unicode_buf, ucase_buf,
MAX_USERNAME_SIZE*2, nls_info);
unicode_buf[user_name_len] = 0; unicode_buf[user_name_len] = 0;
user_name_len++; user_name_len++;
for (i = 0; i < dom_name_len; i++) for (i = 0; i < dom_name_len; i++)
ucase_buf[i] = nls_info->charset2upper[(int)ses->domainName[i]]; ucase_buf[i] = nls_info->charset2upper[(int)ses->domainName[i]];
ucase_buf[i] = 0; ucase_buf[i] = 0;
dom_name_len = cifs_strtoUCS(unicode_buf+user_name_len, ucase_buf, MAX_USERNAME_SIZE*2, nls_info); dom_name_len = cifs_strtoUCS(unicode_buf+user_name_len, ucase_buf,
MAX_USERNAME_SIZE*2, nls_info);
unicode_buf[user_name_len + dom_name_len] = 0; unicode_buf[user_name_len + dom_name_len] = 0;
hmac_md5_update((const unsigned char *) unicode_buf, hmac_md5_update((const unsigned char *) unicode_buf,
...@@ -274,21 +278,22 @@ int CalcNTLMv2_partial_mac_key(struct cifsSesInfo * ses, ...@@ -274,21 +278,22 @@ int CalcNTLMv2_partial_mac_key(struct cifsSesInfo * ses,
} }
#ifdef CONFIG_CIFS_WEAK_PW_HASH #ifdef CONFIG_CIFS_WEAK_PW_HASH
void calc_lanman_hash(struct cifsSesInfo * ses, char * lnm_session_key) void calc_lanman_hash(struct cifsSesInfo *ses, char *lnm_session_key)
{ {
int i; int i;
char password_with_pad[CIFS_ENCPWD_SIZE]; char password_with_pad[CIFS_ENCPWD_SIZE];
if(ses->server == NULL) if (ses->server == NULL)
return; return;
memset(password_with_pad, 0, CIFS_ENCPWD_SIZE); memset(password_with_pad, 0, CIFS_ENCPWD_SIZE);
if(ses->password) if (ses->password)
strncpy(password_with_pad, ses->password, CIFS_ENCPWD_SIZE); strncpy(password_with_pad, ses->password, CIFS_ENCPWD_SIZE);
if((ses->server->secMode & SECMODE_PW_ENCRYPT) == 0) if ((ses->server->secMode & SECMODE_PW_ENCRYPT) == 0)
if(extended_security & CIFSSEC_MAY_PLNTXT) { if (extended_security & CIFSSEC_MAY_PLNTXT) {
memcpy(lnm_session_key, password_with_pad, CIFS_ENCPWD_SIZE); memcpy(lnm_session_key, password_with_pad,
CIFS_ENCPWD_SIZE);
return; return;
} }
...@@ -303,7 +308,7 @@ void calc_lanman_hash(struct cifsSesInfo * ses, char * lnm_session_key) ...@@ -303,7 +308,7 @@ void calc_lanman_hash(struct cifsSesInfo * ses, char * lnm_session_key)
utf8 and other multibyte codepages each need their own strupper utf8 and other multibyte codepages each need their own strupper
function since a byte at a time will ont work. */ function since a byte at a time will ont work. */
for(i = 0; i < CIFS_ENCPWD_SIZE; i++) { for (i = 0; i < CIFS_ENCPWD_SIZE; i++) {
password_with_pad[i] = toupper(password_with_pad[i]); password_with_pad[i] = toupper(password_with_pad[i]);
} }
...@@ -313,19 +318,19 @@ void calc_lanman_hash(struct cifsSesInfo * ses, char * lnm_session_key) ...@@ -313,19 +318,19 @@ void calc_lanman_hash(struct cifsSesInfo * ses, char * lnm_session_key)
} }
#endif /* CIFS_WEAK_PW_HASH */ #endif /* CIFS_WEAK_PW_HASH */
static int calc_ntlmv2_hash(struct cifsSesInfo *ses, static int calc_ntlmv2_hash(struct cifsSesInfo *ses,
const struct nls_table * nls_cp) const struct nls_table *nls_cp)
{ {
int rc = 0; int rc = 0;
int len; int len;
char nt_hash[16]; char nt_hash[16];
struct HMACMD5Context * pctxt; struct HMACMD5Context *pctxt;
wchar_t * user; wchar_t *user;
wchar_t * domain; wchar_t *domain;
pctxt = kmalloc(sizeof(struct HMACMD5Context), GFP_KERNEL); pctxt = kmalloc(sizeof(struct HMACMD5Context), GFP_KERNEL);
if(pctxt == NULL) if (pctxt == NULL)
return -ENOMEM; return -ENOMEM;
/* calculate md4 hash of password */ /* calculate md4 hash of password */
...@@ -337,18 +342,18 @@ static int calc_ntlmv2_hash(struct cifsSesInfo *ses, ...@@ -337,18 +342,18 @@ static int calc_ntlmv2_hash(struct cifsSesInfo *ses,
/* convert ses->userName to unicode and uppercase */ /* convert ses->userName to unicode and uppercase */
len = strlen(ses->userName); len = strlen(ses->userName);
user = kmalloc(2 + (len * 2), GFP_KERNEL); user = kmalloc(2 + (len * 2), GFP_KERNEL);
if(user == NULL) if (user == NULL)
goto calc_exit_2; goto calc_exit_2;
len = cifs_strtoUCS(user, ses->userName, len, nls_cp); len = cifs_strtoUCS(user, ses->userName, len, nls_cp);
UniStrupr(user); UniStrupr(user);
hmac_md5_update((char *)user, 2*len, pctxt); hmac_md5_update((char *)user, 2*len, pctxt);
/* convert ses->domainName to unicode and uppercase */ /* convert ses->domainName to unicode and uppercase */
if(ses->domainName) { if (ses->domainName) {
len = strlen(ses->domainName); len = strlen(ses->domainName);
domain = kmalloc(2 + (len * 2), GFP_KERNEL); domain = kmalloc(2 + (len * 2), GFP_KERNEL);
if(domain == NULL) if (domain == NULL)
goto calc_exit_1; goto calc_exit_1;
len = cifs_strtoUCS(domain, ses->domainName, len, nls_cp); len = cifs_strtoUCS(domain, ses->domainName, len, nls_cp);
/* the following line was removed since it didn't work well /* the following line was removed since it didn't work well
...@@ -357,24 +362,24 @@ static int calc_ntlmv2_hash(struct cifsSesInfo *ses, ...@@ -357,24 +362,24 @@ static int calc_ntlmv2_hash(struct cifsSesInfo *ses,
/* UniStrupr(domain); */ /* UniStrupr(domain); */
hmac_md5_update((char *)domain, 2*len, pctxt); hmac_md5_update((char *)domain, 2*len, pctxt);
kfree(domain); kfree(domain);
} }
calc_exit_1: calc_exit_1:
kfree(user); kfree(user);
calc_exit_2: calc_exit_2:
/* BB FIXME what about bytes 24 through 40 of the signing key? /* BB FIXME what about bytes 24 through 40 of the signing key?
compare with the NTLM example */ compare with the NTLM example */
hmac_md5_final(ses->server->ntlmv2_hash, pctxt); hmac_md5_final(ses->server->ntlmv2_hash, pctxt);
return rc; return rc;
} }
void setup_ntlmv2_rsp(struct cifsSesInfo * ses, char * resp_buf, void setup_ntlmv2_rsp(struct cifsSesInfo *ses, char *resp_buf,
const struct nls_table * nls_cp) const struct nls_table *nls_cp)
{ {
int rc; int rc;
struct ntlmv2_resp * buf = (struct ntlmv2_resp *)resp_buf; struct ntlmv2_resp *buf = (struct ntlmv2_resp *)resp_buf;
struct HMACMD5Context context; struct HMACMD5Context context;
buf->blob_signature = cpu_to_le32(0x00000101); buf->blob_signature = cpu_to_le32(0x00000101);
...@@ -389,8 +394,8 @@ void setup_ntlmv2_rsp(struct cifsSesInfo * ses, char * resp_buf, ...@@ -389,8 +394,8 @@ void setup_ntlmv2_rsp(struct cifsSesInfo * ses, char * resp_buf,
/* calculate buf->ntlmv2_hash */ /* calculate buf->ntlmv2_hash */
rc = calc_ntlmv2_hash(ses, nls_cp); rc = calc_ntlmv2_hash(ses, nls_cp);
if(rc) if (rc)
cERROR(1,("could not get v2 hash rc %d",rc)); cERROR(1, ("could not get v2 hash rc %d", rc));
CalcNTLMv2_response(ses, resp_buf); CalcNTLMv2_response(ses, resp_buf);
/* now calculate the MAC key for NTLMv2 */ /* now calculate the MAC key for NTLMv2 */
...@@ -403,16 +408,17 @@ void setup_ntlmv2_rsp(struct cifsSesInfo * ses, char * resp_buf, ...@@ -403,16 +408,17 @@ void setup_ntlmv2_rsp(struct cifsSesInfo * ses, char * resp_buf,
ses->server->mac_signing_key.len = 16 + sizeof(struct ntlmv2_resp); ses->server->mac_signing_key.len = 16 + sizeof(struct ntlmv2_resp);
} }
void CalcNTLMv2_response(const struct cifsSesInfo * ses, char * v2_session_response) void CalcNTLMv2_response(const struct cifsSesInfo *ses,
char *v2_session_response)
{ {
struct HMACMD5Context context; struct HMACMD5Context context;
/* rest of v2 struct already generated */ /* rest of v2 struct already generated */
memcpy(v2_session_response + 8, ses->server->cryptKey,8); memcpy(v2_session_response + 8, ses->server->cryptKey, 8);
hmac_md5_init_limK_to_64(ses->server->ntlmv2_hash, 16, &context); hmac_md5_init_limK_to_64(ses->server->ntlmv2_hash, 16, &context);
hmac_md5_update(v2_session_response+8, hmac_md5_update(v2_session_response+8,
sizeof(struct ntlmv2_resp) - 8, &context); sizeof(struct ntlmv2_resp) - 8, &context);
hmac_md5_final(v2_session_response,&context); hmac_md5_final(v2_session_response, &context);
/* cifs_dump_mem("v2_sess_rsp: ", v2_session_response, 32); */ /* cifs_dump_mem("v2_sess_rsp: ", v2_session_response, 32); */
} }
...@@ -95,7 +95,7 @@ cifs_read_super(struct super_block *sb, void *data, ...@@ -95,7 +95,7 @@ cifs_read_super(struct super_block *sb, void *data,
struct inode *inode; struct inode *inode;
struct cifs_sb_info *cifs_sb; struct cifs_sb_info *cifs_sb;
int rc = 0; int rc = 0;
/* BB should we make this contingent on mount parm? */ /* BB should we make this contingent on mount parm? */
sb->s_flags |= MS_NODIRATIME | MS_NOATIME; sb->s_flags |= MS_NODIRATIME | MS_NOATIME;
sb->s_fs_info = kzalloc(sizeof(struct cifs_sb_info), GFP_KERNEL); sb->s_fs_info = kzalloc(sizeof(struct cifs_sb_info), GFP_KERNEL);
...@@ -135,7 +135,7 @@ cifs_read_super(struct super_block *sb, void *data, ...@@ -135,7 +135,7 @@ cifs_read_super(struct super_block *sb, void *data,
rc = -ENOMEM; rc = -ENOMEM;
goto out_no_root; goto out_no_root;
} }
#ifdef CONFIG_CIFS_EXPERIMENTAL #ifdef CONFIG_CIFS_EXPERIMENTAL
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) { if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
cFYI(1, ("export ops supported")); cFYI(1, ("export ops supported"));
...@@ -153,7 +153,7 @@ cifs_read_super(struct super_block *sb, void *data, ...@@ -153,7 +153,7 @@ cifs_read_super(struct super_block *sb, void *data,
out_mount_failed: out_mount_failed:
if (cifs_sb) { if (cifs_sb) {
if (cifs_sb->local_nls) if (cifs_sb->local_nls)
unload_nls(cifs_sb->local_nls); unload_nls(cifs_sb->local_nls);
kfree(cifs_sb); kfree(cifs_sb);
} }
return rc; return rc;
...@@ -230,7 +230,7 @@ cifs_statfs(struct dentry *dentry, struct kstatfs *buf) ...@@ -230,7 +230,7 @@ cifs_statfs(struct dentry *dentry, struct kstatfs *buf)
longer available? */ longer available? */
} }
static int cifs_permission(struct inode * inode, int mask, struct nameidata *nd) static int cifs_permission(struct inode *inode, int mask, struct nameidata *nd)
{ {
struct cifs_sb_info *cifs_sb; struct cifs_sb_info *cifs_sb;
...@@ -238,10 +238,10 @@ static int cifs_permission(struct inode * inode, int mask, struct nameidata *nd) ...@@ -238,10 +238,10 @@ static int cifs_permission(struct inode * inode, int mask, struct nameidata *nd)
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM) { if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM) {
return 0; return 0;
} else /* file mode might have been restricted at mount time } else /* file mode might have been restricted at mount time
on the client (above and beyond ACL on servers) for on the client (above and beyond ACL on servers) for
servers which do not support setting and viewing mode bits, servers which do not support setting and viewing mode bits,
so allowing client to check permissions is useful */ so allowing client to check permissions is useful */
return generic_permission(inode, mask, NULL); return generic_permission(inode, mask, NULL);
} }
...@@ -270,7 +270,7 @@ cifs_alloc_inode(struct super_block *sb) ...@@ -270,7 +270,7 @@ cifs_alloc_inode(struct super_block *sb)
cifs_inode->clientCanCacheRead = FALSE; cifs_inode->clientCanCacheRead = FALSE;
cifs_inode->clientCanCacheAll = FALSE; cifs_inode->clientCanCacheAll = FALSE;
cifs_inode->vfs_inode.i_blkbits = 14; /* 2**14 = CIFS_MAX_MSGSIZE */ cifs_inode->vfs_inode.i_blkbits = 14; /* 2**14 = CIFS_MAX_MSGSIZE */
/* Can not set i_flags here - they get immediately overwritten /* Can not set i_flags here - they get immediately overwritten
to zero by the VFS */ to zero by the VFS */
/* cifs_inode->vfs_inode.i_flags = S_NOATIME | S_NOCMTIME;*/ /* cifs_inode->vfs_inode.i_flags = S_NOATIME | S_NOCMTIME;*/
...@@ -317,21 +317,21 @@ cifs_show_options(struct seq_file *s, struct vfsmount *m) ...@@ -317,21 +317,21 @@ cifs_show_options(struct seq_file *s, struct vfsmount *m)
if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID) || if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID) ||
!(cifs_sb->tcon->ses->capabilities & CAP_UNIX)) !(cifs_sb->tcon->ses->capabilities & CAP_UNIX))
seq_printf(s, ",gid=%d", cifs_sb->mnt_gid); seq_printf(s, ",gid=%d", cifs_sb->mnt_gid);
seq_printf(s, ",rsize=%d",cifs_sb->rsize); seq_printf(s, ",rsize=%d", cifs_sb->rsize);
seq_printf(s, ",wsize=%d",cifs_sb->wsize); seq_printf(s, ",wsize=%d", cifs_sb->wsize);
} }
return 0; return 0;
} }
#ifdef CONFIG_CIFS_QUOTA #ifdef CONFIG_CIFS_QUOTA
int cifs_xquota_set(struct super_block * sb, int quota_type, qid_t qid, int cifs_xquota_set(struct super_block *sb, int quota_type, qid_t qid,
struct fs_disk_quota * pdquota) struct fs_disk_quota *pdquota)
{ {
int xid; int xid;
int rc = 0; int rc = 0;
struct cifs_sb_info *cifs_sb = CIFS_SB(sb); struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
struct cifsTconInfo *pTcon; struct cifsTconInfo *pTcon;
if (cifs_sb) if (cifs_sb)
pTcon = cifs_sb->tcon; pTcon = cifs_sb->tcon;
else else
...@@ -340,7 +340,7 @@ int cifs_xquota_set(struct super_block * sb, int quota_type, qid_t qid, ...@@ -340,7 +340,7 @@ int cifs_xquota_set(struct super_block * sb, int quota_type, qid_t qid,
xid = GetXid(); xid = GetXid();
if (pTcon) { if (pTcon) {
cFYI(1,("set type: 0x%x id: %d",quota_type,qid)); cFYI(1, ("set type: 0x%x id: %d", quota_type, qid));
} else { } else {
return -EIO; return -EIO;
} }
...@@ -349,8 +349,8 @@ int cifs_xquota_set(struct super_block * sb, int quota_type, qid_t qid, ...@@ -349,8 +349,8 @@ int cifs_xquota_set(struct super_block * sb, int quota_type, qid_t qid,
return rc; return rc;
} }
int cifs_xquota_get(struct super_block * sb, int quota_type, qid_t qid, int cifs_xquota_get(struct super_block *sb, int quota_type, qid_t qid,
struct fs_disk_quota * pdquota) struct fs_disk_quota *pdquota)
{ {
int xid; int xid;
int rc = 0; int rc = 0;
...@@ -364,7 +364,7 @@ int cifs_xquota_get(struct super_block * sb, int quota_type, qid_t qid, ...@@ -364,7 +364,7 @@ int cifs_xquota_get(struct super_block * sb, int quota_type, qid_t qid,
xid = GetXid(); xid = GetXid();
if (pTcon) { if (pTcon) {
cFYI(1,("set type: 0x%x id: %d",quota_type,qid)); cFYI(1, ("set type: 0x%x id: %d", quota_type, qid));
} else { } else {
rc = -EIO; rc = -EIO;
} }
...@@ -373,9 +373,9 @@ int cifs_xquota_get(struct super_block * sb, int quota_type, qid_t qid, ...@@ -373,9 +373,9 @@ int cifs_xquota_get(struct super_block * sb, int quota_type, qid_t qid,
return rc; return rc;
} }
int cifs_xstate_set(struct super_block * sb, unsigned int flags, int operation) int cifs_xstate_set(struct super_block *sb, unsigned int flags, int operation)
{ {
int xid; int xid;
int rc = 0; int rc = 0;
struct cifs_sb_info *cifs_sb = CIFS_SB(sb); struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
struct cifsTconInfo *pTcon; struct cifsTconInfo *pTcon;
...@@ -387,7 +387,7 @@ int cifs_xstate_set(struct super_block * sb, unsigned int flags, int operation) ...@@ -387,7 +387,7 @@ int cifs_xstate_set(struct super_block * sb, unsigned int flags, int operation)
xid = GetXid(); xid = GetXid();
if (pTcon) { if (pTcon) {
cFYI(1,("flags: 0x%x operation: 0x%x",flags,operation)); cFYI(1, ("flags: 0x%x operation: 0x%x", flags, operation));
} else { } else {
rc = -EIO; rc = -EIO;
} }
...@@ -396,7 +396,7 @@ int cifs_xstate_set(struct super_block * sb, unsigned int flags, int operation) ...@@ -396,7 +396,7 @@ int cifs_xstate_set(struct super_block * sb, unsigned int flags, int operation)
return rc; return rc;
} }
int cifs_xstate_get(struct super_block * sb, struct fs_quota_stat *qstats) int cifs_xstate_get(struct super_block *sb, struct fs_quota_stat *qstats)
{ {
int xid; int xid;
int rc = 0; int rc = 0;
...@@ -410,7 +410,7 @@ int cifs_xstate_get(struct super_block * sb, struct fs_quota_stat *qstats) ...@@ -410,7 +410,7 @@ int cifs_xstate_get(struct super_block * sb, struct fs_quota_stat *qstats)
} }
xid = GetXid(); xid = GetXid();
if (pTcon) { if (pTcon) {
cFYI(1,("pqstats %p",qstats)); cFYI(1, ("pqstats %p", qstats));
} else { } else {
rc = -EIO; rc = -EIO;
} }
...@@ -427,10 +427,10 @@ static struct quotactl_ops cifs_quotactl_ops = { ...@@ -427,10 +427,10 @@ static struct quotactl_ops cifs_quotactl_ops = {
}; };
#endif #endif
static void cifs_umount_begin(struct vfsmount * vfsmnt, int flags) static void cifs_umount_begin(struct vfsmount *vfsmnt, int flags)
{ {
struct cifs_sb_info *cifs_sb; struct cifs_sb_info *cifs_sb;
struct cifsTconInfo * tcon; struct cifsTconInfo *tcon;
if (!(flags & MNT_FORCE)) if (!(flags & MNT_FORCE))
return; return;
...@@ -448,9 +448,8 @@ static void cifs_umount_begin(struct vfsmount * vfsmnt, int flags) ...@@ -448,9 +448,8 @@ static void cifs_umount_begin(struct vfsmount * vfsmnt, int flags)
/* cancel_brl_requests(tcon); */ /* BB mark all brl mids as exiting */ /* cancel_brl_requests(tcon); */ /* BB mark all brl mids as exiting */
/* cancel_notify_requests(tcon); */ /* cancel_notify_requests(tcon); */
if (tcon->ses && tcon->ses->server) if (tcon->ses && tcon->ses->server) {
{ cFYI(1, ("wake up tasks now - umount begin not complete"));
cFYI(1,("wake up tasks now - umount begin not complete"));
wake_up_all(&tcon->ses->server->request_q); wake_up_all(&tcon->ses->server->request_q);
wake_up_all(&tcon->ses->server->response_q); wake_up_all(&tcon->ses->server->response_q);
msleep(1); /* yield */ msleep(1); /* yield */
...@@ -483,10 +482,11 @@ static const struct super_operations cifs_super_ops = { ...@@ -483,10 +482,11 @@ static const struct super_operations cifs_super_ops = {
.statfs = cifs_statfs, .statfs = cifs_statfs,
.alloc_inode = cifs_alloc_inode, .alloc_inode = cifs_alloc_inode,
.destroy_inode = cifs_destroy_inode, .destroy_inode = cifs_destroy_inode,
/* .drop_inode = generic_delete_inode, /* .drop_inode = generic_delete_inode,
.delete_inode = cifs_delete_inode, *//* Do not need the above two functions .delete_inode = cifs_delete_inode, */ /* Do not need above two
unless later we add lazy close of inodes or unless the kernel forgets to call functions unless later we add lazy close of inodes or unless the
us with the same number of releases (closes) as opens */ kernel forgets to call us with the same number of releases (closes)
as opens */
.show_options = cifs_show_options, .show_options = cifs_show_options,
.umount_begin = cifs_umount_begin, .umount_begin = cifs_umount_begin,
.remount_fs = cifs_remount, .remount_fs = cifs_remount,
...@@ -589,11 +589,11 @@ const struct inode_operations cifs_file_inode_ops = { ...@@ -589,11 +589,11 @@ const struct inode_operations cifs_file_inode_ops = {
.getxattr = cifs_getxattr, .getxattr = cifs_getxattr,
.listxattr = cifs_listxattr, .listxattr = cifs_listxattr,
.removexattr = cifs_removexattr, .removexattr = cifs_removexattr,
#endif #endif
}; };
const struct inode_operations cifs_symlink_inode_ops = { const struct inode_operations cifs_symlink_inode_ops = {
.readlink = generic_readlink, .readlink = generic_readlink,
.follow_link = cifs_follow_link, .follow_link = cifs_follow_link,
.put_link = cifs_put_link, .put_link = cifs_put_link,
.permission = cifs_permission, .permission = cifs_permission,
...@@ -605,7 +605,7 @@ const struct inode_operations cifs_symlink_inode_ops = { ...@@ -605,7 +605,7 @@ const struct inode_operations cifs_symlink_inode_ops = {
.getxattr = cifs_getxattr, .getxattr = cifs_getxattr,
.listxattr = cifs_listxattr, .listxattr = cifs_listxattr,
.removexattr = cifs_removexattr, .removexattr = cifs_removexattr,
#endif #endif
}; };
const struct file_operations cifs_file_ops = { const struct file_operations cifs_file_ops = {
...@@ -631,7 +631,7 @@ const struct file_operations cifs_file_ops = { ...@@ -631,7 +631,7 @@ const struct file_operations cifs_file_ops = {
}; };
const struct file_operations cifs_file_direct_ops = { const struct file_operations cifs_file_direct_ops = {
/* no mmap, no aio, no readv - /* no mmap, no aio, no readv -
BB reevaluate whether they can be done with directio, no cache */ BB reevaluate whether they can be done with directio, no cache */
.read = cifs_user_read, .read = cifs_user_read,
.write = cifs_user_write, .write = cifs_user_write,
...@@ -671,7 +671,7 @@ const struct file_operations cifs_file_nobrl_ops = { ...@@ -671,7 +671,7 @@ const struct file_operations cifs_file_nobrl_ops = {
}; };
const struct file_operations cifs_file_direct_nobrl_ops = { const struct file_operations cifs_file_direct_nobrl_ops = {
/* no mmap, no aio, no readv - /* no mmap, no aio, no readv -
BB reevaluate whether they can be done with directio, no cache */ BB reevaluate whether they can be done with directio, no cache */
.read = cifs_user_read, .read = cifs_user_read,
.write = cifs_user_write, .write = cifs_user_write,
...@@ -696,11 +696,11 @@ const struct file_operations cifs_dir_ops = { ...@@ -696,11 +696,11 @@ const struct file_operations cifs_dir_ops = {
#ifdef CONFIG_CIFS_EXPERIMENTAL #ifdef CONFIG_CIFS_EXPERIMENTAL
.dir_notify = cifs_dir_notify, .dir_notify = cifs_dir_notify,
#endif /* CONFIG_CIFS_EXPERIMENTAL */ #endif /* CONFIG_CIFS_EXPERIMENTAL */
.ioctl = cifs_ioctl, .ioctl = cifs_ioctl,
}; };
static void static void
cifs_init_once(void *inode, struct kmem_cache * cachep, unsigned long flags) cifs_init_once(void *inode, struct kmem_cache *cachep, unsigned long flags)
{ {
struct cifsInodeInfo *cifsi = inode; struct cifsInodeInfo *cifsi = inode;
...@@ -752,7 +752,7 @@ cifs_init_request_bufs(void) ...@@ -752,7 +752,7 @@ cifs_init_request_bufs(void)
cifs_min_rcv = 1; cifs_min_rcv = 1;
else if (cifs_min_rcv > 64) { else if (cifs_min_rcv > 64) {
cifs_min_rcv = 64; cifs_min_rcv = 64;
cERROR(1,("cifs_min_rcv set to maximum (64)")); cERROR(1, ("cifs_min_rcv set to maximum (64)"));
} }
cifs_req_poolp = mempool_create_slab_pool(cifs_min_rcv, cifs_req_poolp = mempool_create_slab_pool(cifs_min_rcv,
...@@ -765,7 +765,7 @@ cifs_init_request_bufs(void) ...@@ -765,7 +765,7 @@ cifs_init_request_bufs(void)
/* MAX_CIFS_SMALL_BUFFER_SIZE bytes is enough for most SMB responses and /* MAX_CIFS_SMALL_BUFFER_SIZE bytes is enough for most SMB responses and
almost all handle based requests (but not write response, nor is it almost all handle based requests (but not write response, nor is it
sufficient for path based requests). A smaller size would have sufficient for path based requests). A smaller size would have
been more efficient (compacting multiple slab items on one 4k page) been more efficient (compacting multiple slab items on one 4k page)
for the case in which debug was on, but this larger size allows for the case in which debug was on, but this larger size allows
more SMBs to use small buffer alloc and is still much more more SMBs to use small buffer alloc and is still much more
efficient to alloc 1 per page off the slab compared to 17K (5page) efficient to alloc 1 per page off the slab compared to 17K (5page)
...@@ -844,7 +844,7 @@ cifs_destroy_mids(void) ...@@ -844,7 +844,7 @@ cifs_destroy_mids(void)
kmem_cache_destroy(cifs_oplock_cachep); kmem_cache_destroy(cifs_oplock_cachep);
} }
static int cifs_oplock_thread(void * dummyarg) static int cifs_oplock_thread(void *dummyarg)
{ {
struct oplock_q_entry *oplock_item; struct oplock_q_entry *oplock_item;
struct cifsTconInfo *pTcon; struct cifsTconInfo *pTcon;
...@@ -855,7 +855,7 @@ static int cifs_oplock_thread(void * dummyarg) ...@@ -855,7 +855,7 @@ static int cifs_oplock_thread(void * dummyarg)
do { do {
if (try_to_freeze()) if (try_to_freeze())
continue; continue;
spin_lock(&GlobalMid_Lock); spin_lock(&GlobalMid_Lock);
if (list_empty(&GlobalOplock_Q)) { if (list_empty(&GlobalOplock_Q)) {
spin_unlock(&GlobalMid_Lock); spin_unlock(&GlobalMid_Lock);
...@@ -865,7 +865,7 @@ static int cifs_oplock_thread(void * dummyarg) ...@@ -865,7 +865,7 @@ static int cifs_oplock_thread(void * dummyarg)
oplock_item = list_entry(GlobalOplock_Q.next, oplock_item = list_entry(GlobalOplock_Q.next,
struct oplock_q_entry, qhead); struct oplock_q_entry, qhead);
if (oplock_item) { if (oplock_item) {
cFYI(1,("found oplock item to write out")); cFYI(1, ("found oplock item to write out"));
pTcon = oplock_item->tcon; pTcon = oplock_item->tcon;
inode = oplock_item->pinode; inode = oplock_item->pinode;
netfid = oplock_item->netfid; netfid = oplock_item->netfid;
...@@ -878,7 +878,8 @@ static int cifs_oplock_thread(void * dummyarg) ...@@ -878,7 +878,8 @@ static int cifs_oplock_thread(void * dummyarg)
/* mutex_lock(&inode->i_mutex);*/ /* mutex_lock(&inode->i_mutex);*/
if (S_ISREG(inode->i_mode)) { if (S_ISREG(inode->i_mode)) {
rc = filemap_fdatawrite(inode->i_mapping); rc = filemap_fdatawrite(inode->i_mapping);
if (CIFS_I(inode)->clientCanCacheRead == 0) { if (CIFS_I(inode)->clientCanCacheRead
== 0) {
filemap_fdatawait(inode->i_mapping); filemap_fdatawait(inode->i_mapping);
invalidate_remote_inode(inode); invalidate_remote_inode(inode);
} }
...@@ -913,7 +914,7 @@ static int cifs_oplock_thread(void * dummyarg) ...@@ -913,7 +914,7 @@ static int cifs_oplock_thread(void * dummyarg)
return 0; return 0;
} }
static int cifs_dnotify_thread(void * dummyarg) static int cifs_dnotify_thread(void *dummyarg)
{ {
struct list_head *tmp; struct list_head *tmp;
struct cifsSesInfo *ses; struct cifsSesInfo *ses;
......
...@@ -45,7 +45,7 @@ extern void cifs_read_inode(struct inode *); ...@@ -45,7 +45,7 @@ extern void cifs_read_inode(struct inode *);
extern const struct inode_operations cifs_dir_inode_ops; extern const struct inode_operations cifs_dir_inode_ops;
extern int cifs_create(struct inode *, struct dentry *, int, extern int cifs_create(struct inode *, struct dentry *, int,
struct nameidata *); struct nameidata *);
extern struct dentry * cifs_lookup(struct inode *, struct dentry *, extern struct dentry *cifs_lookup(struct inode *, struct dentry *,
struct nameidata *); struct nameidata *);
extern int cifs_unlink(struct inode *, struct dentry *); extern int cifs_unlink(struct inode *, struct dentry *);
extern int cifs_hardlink(struct dentry *, struct inode *, struct dentry *); extern int cifs_hardlink(struct dentry *, struct inode *, struct dentry *);
...@@ -70,9 +70,9 @@ extern int cifs_open(struct inode *inode, struct file *file); ...@@ -70,9 +70,9 @@ extern int cifs_open(struct inode *inode, struct file *file);
extern int cifs_close(struct inode *inode, struct file *file); extern int cifs_close(struct inode *inode, struct file *file);
extern int cifs_closedir(struct inode *inode, struct file *file); extern int cifs_closedir(struct inode *inode, struct file *file);
extern ssize_t cifs_user_read(struct file *file, char __user *read_data, extern ssize_t cifs_user_read(struct file *file, char __user *read_data,
size_t read_size, loff_t * poffset); size_t read_size, loff_t *poffset);
extern ssize_t cifs_user_write(struct file *file, const char __user *write_data, extern ssize_t cifs_user_write(struct file *file, const char __user *write_data,
size_t write_size, loff_t * poffset); size_t write_size, loff_t *poffset);
extern int cifs_lock(struct file *, int, struct file_lock *); extern int cifs_lock(struct file *, int, struct file_lock *);
extern int cifs_fsync(struct file *, struct dentry *, int); extern int cifs_fsync(struct file *, struct dentry *, int);
extern int cifs_flush(struct file *, fl_owner_t id); extern int cifs_flush(struct file *, fl_owner_t id);
......
...@@ -144,7 +144,7 @@ ...@@ -144,7 +144,7 @@
#define SMBOPEN_OAPPEND 0x0001 #define SMBOPEN_OAPPEND 0x0001
/* /*
* SMB flag definitions * SMB flag definitions
*/ */
#define SMBFLG_EXTD_LOCK 0x01 /* server supports lock-read write-unlock smb */ #define SMBFLG_EXTD_LOCK 0x01 /* server supports lock-read write-unlock smb */
#define SMBFLG_RCV_POSTED 0x02 /* obsolete */ #define SMBFLG_RCV_POSTED 0x02 /* obsolete */
...@@ -157,9 +157,9 @@ ...@@ -157,9 +157,9 @@
#define SMBFLG_RESPONSE 0x80 /* this PDU is a response from server */ #define SMBFLG_RESPONSE 0x80 /* this PDU is a response from server */
/* /*
* SMB flag2 definitions * SMB flag2 definitions
*/ */
#define SMBFLG2_KNOWS_LONG_NAMES cpu_to_le16(1) /* can send long (non-8.3) #define SMBFLG2_KNOWS_LONG_NAMES cpu_to_le16(1) /* can send long (non-8.3)
path names in response */ path names in response */
#define SMBFLG2_KNOWS_EAS cpu_to_le16(2) #define SMBFLG2_KNOWS_EAS cpu_to_le16(2)
#define SMBFLG2_SECURITY_SIGNATURE cpu_to_le16(4) #define SMBFLG2_SECURITY_SIGNATURE cpu_to_le16(4)
...@@ -260,7 +260,7 @@ ...@@ -260,7 +260,7 @@
#define ATTR_SPARSE 0x0200 #define ATTR_SPARSE 0x0200
#define ATTR_REPARSE 0x0400 #define ATTR_REPARSE 0x0400
#define ATTR_COMPRESSED 0x0800 #define ATTR_COMPRESSED 0x0800
#define ATTR_OFFLINE 0x1000 /* ie file not immediately available - #define ATTR_OFFLINE 0x1000 /* ie file not immediately available -
on offline storage */ on offline storage */
#define ATTR_NOT_CONTENT_INDEXED 0x2000 #define ATTR_NOT_CONTENT_INDEXED 0x2000
#define ATTR_ENCRYPTED 0x4000 #define ATTR_ENCRYPTED 0x4000
...@@ -300,7 +300,7 @@ ...@@ -300,7 +300,7 @@
#define CREATE_DELETE_ON_CLOSE 0x00001000 #define CREATE_DELETE_ON_CLOSE 0x00001000
#define CREATE_OPEN_BY_ID 0x00002000 #define CREATE_OPEN_BY_ID 0x00002000
#define OPEN_REPARSE_POINT 0x00200000 #define OPEN_REPARSE_POINT 0x00200000
#define CREATE_OPTIONS_MASK 0x007FFFFF #define CREATE_OPTIONS_MASK 0x007FFFFF
#define CREATE_OPTION_SPECIAL 0x20000000 /* system. NB not sent over wire */ #define CREATE_OPTION_SPECIAL 0x20000000 /* system. NB not sent over wire */
/* ImpersonationLevel flags */ /* ImpersonationLevel flags */
...@@ -366,17 +366,19 @@ struct smb_hdr { ...@@ -366,17 +366,19 @@ struct smb_hdr {
#define pByteArea(smb_var) ((unsigned char *)smb_var + sizeof(struct smb_hdr) + (2* smb_var->WordCount) + 2 ) #define pByteArea(smb_var) ((unsigned char *)smb_var + sizeof(struct smb_hdr) + (2* smb_var->WordCount) + 2 )
/* /*
* Computer Name Length * Computer Name Length (since Netbios name was length 16 with last byte 0x20)
* No longer as important, now that TCP names are more commonly used to
* resolve hosts.
*/ */
#define CNLEN 15 #define CNLEN 15
/* /*
* Share Name Length @S8A * Share Name Length (SNLEN)
* Note: This length is limited by the SMB used to get @S8A * Note: This length was limited by the SMB used to get
* the Share info. NetShareEnum only returns 13 @S8A * the Share info. NetShareEnum only returned 13
* chars, including the null termination. @S8A * chars, including the null termination.
* This was removed because it no longer is limiting.
*/ */
#define SNLEN 12 /*@S8A */
/* /*
* Comment Length * Comment Length
...@@ -394,8 +396,8 @@ struct smb_hdr { ...@@ -394,8 +396,8 @@ struct smb_hdr {
* *
* The Naming convention is the lower case version of the * The Naming convention is the lower case version of the
* smb command code name for the struct and this is typedef to the * smb command code name for the struct and this is typedef to the
* uppercase version of the same name with the prefix SMB_ removed * uppercase version of the same name with the prefix SMB_ removed
* for brevity. Although typedefs are not commonly used for * for brevity. Although typedefs are not commonly used for
* structure definitions in the Linux kernel, their use in the * structure definitions in the Linux kernel, their use in the
* CIFS standards document, which this code is based on, may * CIFS standards document, which this code is based on, may
* make this one of the cases where typedefs for structures make * make this one of the cases where typedefs for structures make
...@@ -403,7 +405,7 @@ struct smb_hdr { ...@@ -403,7 +405,7 @@ struct smb_hdr {
* Typedefs can always be removed later if they are too distracting * Typedefs can always be removed later if they are too distracting
* and they are only used for the CIFSs PDUs themselves, not * and they are only used for the CIFSs PDUs themselves, not
* internal cifs vfs structures * internal cifs vfs structures
* *
*/ */
typedef struct negotiate_req { typedef struct negotiate_req {
...@@ -511,7 +513,7 @@ typedef union smb_com_session_setup_andx { ...@@ -511,7 +513,7 @@ typedef union smb_com_session_setup_andx {
unsigned char SecurityBlob[1]; /* followed by */ unsigned char SecurityBlob[1]; /* followed by */
/* STRING NativeOS */ /* STRING NativeOS */
/* STRING NativeLanMan */ /* STRING NativeLanMan */
} __attribute__((packed)) req; /* NTLM request format (with } __attribute__((packed)) req; /* NTLM request format (with
extended security */ extended security */
struct { /* request format */ struct { /* request format */
...@@ -549,7 +551,7 @@ typedef union smb_com_session_setup_andx { ...@@ -549,7 +551,7 @@ typedef union smb_com_session_setup_andx {
/* unsigned char * NativeOS; */ /* unsigned char * NativeOS; */
/* unsigned char * NativeLanMan; */ /* unsigned char * NativeLanMan; */
/* unsigned char * PrimaryDomain; */ /* unsigned char * PrimaryDomain; */
} __attribute__((packed)) resp; /* NTLM response } __attribute__((packed)) resp; /* NTLM response
(with or without extended sec) */ (with or without extended sec) */
struct { /* request format */ struct { /* request format */
...@@ -618,7 +620,7 @@ struct ntlmv2_resp { ...@@ -618,7 +620,7 @@ struct ntlmv2_resp {
#define CAP_NT_SMBS 0x00000010 #define CAP_NT_SMBS 0x00000010
#define CAP_STATUS32 0x00000040 #define CAP_STATUS32 0x00000040
#define CAP_LEVEL_II_OPLOCKS 0x00000080 #define CAP_LEVEL_II_OPLOCKS 0x00000080
#define CAP_NT_FIND 0x00000200 /* reserved should be zero #define CAP_NT_FIND 0x00000200 /* reserved should be zero
(because NT_SMBs implies the same thing?) */ (because NT_SMBs implies the same thing?) */
#define CAP_BULK_TRANSFER 0x20000000 #define CAP_BULK_TRANSFER 0x20000000
#define CAP_EXTENDED_SECURITY 0x80000000 #define CAP_EXTENDED_SECURITY 0x80000000
...@@ -676,7 +678,7 @@ typedef struct smb_com_logoff_andx_rsp { ...@@ -676,7 +678,7 @@ typedef struct smb_com_logoff_andx_rsp {
__u16 ByteCount; __u16 ByteCount;
} __attribute__((packed)) LOGOFF_ANDX_RSP; } __attribute__((packed)) LOGOFF_ANDX_RSP;
typedef union smb_com_tree_disconnect { /* as an altetnative can use flag on typedef union smb_com_tree_disconnect { /* as an altetnative can use flag on
tree_connect PDU to effect disconnect */ tree_connect PDU to effect disconnect */
/* tdis is probably simplest SMB PDU */ /* tdis is probably simplest SMB PDU */
struct { struct {
...@@ -800,27 +802,28 @@ typedef struct smb_com_openx_rsp { ...@@ -800,27 +802,28 @@ typedef struct smb_com_openx_rsp {
__u32 FileId; __u32 FileId;
__u16 Reserved; __u16 Reserved;
__u16 ByteCount; __u16 ByteCount;
} __attribute__((packed)) OPENX_RSP; } __attribute__((packed)) OPENX_RSP;
/* For encoding of POSIX Open Request - see trans2 function 0x209 data struct */ /* For encoding of POSIX Open Request - see trans2 function 0x209 data struct */
/* Legacy write request for older servers */ /* Legacy write request for older servers */
typedef struct smb_com_writex_req { typedef struct smb_com_writex_req {
struct smb_hdr hdr; /* wct = 12 */ struct smb_hdr hdr; /* wct = 12 */
__u8 AndXCommand; __u8 AndXCommand;
__u8 AndXReserved; __u8 AndXReserved;
__le16 AndXOffset; __le16 AndXOffset;
__u16 Fid; __u16 Fid;
__le32 OffsetLow; __le32 OffsetLow;
__u32 Reserved; /* Timeout */ __u32 Reserved; /* Timeout */
__le16 WriteMode; /* 1 = write through */ __le16 WriteMode; /* 1 = write through */
__le16 Remaining; __le16 Remaining;
__le16 Reserved2; __le16 Reserved2;
__le16 DataLengthLow; __le16 DataLengthLow;
__le16 DataOffset; __le16 DataOffset;
__le16 ByteCount; __le16 ByteCount;
__u8 Pad; /* BB check for whether padded to DWORD boundary and optimum performance here */ __u8 Pad; /* BB check for whether padded to DWORD
char Data[0]; boundary and optimum performance here */
char Data[0];
} __attribute__((packed)) WRITEX_REQ; } __attribute__((packed)) WRITEX_REQ;
typedef struct smb_com_write_req { typedef struct smb_com_write_req {
...@@ -838,7 +841,8 @@ typedef struct smb_com_write_req { ...@@ -838,7 +841,8 @@ typedef struct smb_com_write_req {
__le16 DataOffset; __le16 DataOffset;
__le32 OffsetHigh; __le32 OffsetHigh;
__le16 ByteCount; __le16 ByteCount;
__u8 Pad; /* BB check for whether padded to DWORD boundary and optimum performance here */ __u8 Pad; /* BB check for whether padded to DWORD
boundary and optimum performance here */
char Data[0]; char Data[0];
} __attribute__((packed)) WRITE_REQ; } __attribute__((packed)) WRITE_REQ;
...@@ -856,17 +860,17 @@ typedef struct smb_com_write_rsp { ...@@ -856,17 +860,17 @@ typedef struct smb_com_write_rsp {
/* legacy read request for older servers */ /* legacy read request for older servers */
typedef struct smb_com_readx_req { typedef struct smb_com_readx_req {
struct smb_hdr hdr; /* wct = 10 */ struct smb_hdr hdr; /* wct = 10 */
__u8 AndXCommand; __u8 AndXCommand;
__u8 AndXReserved; __u8 AndXReserved;
__le16 AndXOffset; __le16 AndXOffset;
__u16 Fid; __u16 Fid;
__le32 OffsetLow; __le32 OffsetLow;
__le16 MaxCount; __le16 MaxCount;
__le16 MinCount; /* obsolete */ __le16 MinCount; /* obsolete */
__le32 Reserved; __le32 Reserved;
__le16 Remaining; __le16 Remaining;
__le16 ByteCount; __le16 ByteCount;
} __attribute__((packed)) READX_REQ; } __attribute__((packed)) READX_REQ;
typedef struct smb_com_read_req { typedef struct smb_com_read_req {
...@@ -897,7 +901,8 @@ typedef struct smb_com_read_rsp { ...@@ -897,7 +901,8 @@ typedef struct smb_com_read_rsp {
__le16 DataLengthHigh; __le16 DataLengthHigh;
__u64 Reserved2; __u64 Reserved2;
__u16 ByteCount; __u16 ByteCount;
__u8 Pad; /* BB check for whether padded to DWORD boundary and optimum performance here */ __u8 Pad; /* BB check for whether padded to DWORD
boundary and optimum performance here */
char Data[1]; char Data[1];
} __attribute__((packed)) READ_RSP; } __attribute__((packed)) READ_RSP;
...@@ -968,7 +973,7 @@ typedef struct smb_com_rename_req { ...@@ -968,7 +973,7 @@ typedef struct smb_com_rename_req {
#define COPY_TARGET_MODE_ASCII 0x0004 /* if not set, binary */ #define COPY_TARGET_MODE_ASCII 0x0004 /* if not set, binary */
#define COPY_SOURCE_MODE_ASCII 0x0008 /* if not set, binary */ #define COPY_SOURCE_MODE_ASCII 0x0008 /* if not set, binary */
#define COPY_VERIFY_WRITES 0x0010 #define COPY_VERIFY_WRITES 0x0010
#define COPY_TREE 0x0020 #define COPY_TREE 0x0020
typedef struct smb_com_copy_req { typedef struct smb_com_copy_req {
struct smb_hdr hdr; /* wct = 3 */ struct smb_hdr hdr; /* wct = 3 */
...@@ -976,7 +981,7 @@ typedef struct smb_com_copy_req { ...@@ -976,7 +981,7 @@ typedef struct smb_com_copy_req {
__le16 OpenFunction; __le16 OpenFunction;
__le16 Flags; __le16 Flags;
__le16 ByteCount; __le16 ByteCount;
__u8 BufferFormat; /* 4 = ASCII or Unicode */ __u8 BufferFormat; /* 4 = ASCII or Unicode */
unsigned char OldFileName[1]; unsigned char OldFileName[1];
/* followed by __u8 BufferFormat2 */ /* followed by __u8 BufferFormat2 */
/* followed by NewFileName string */ /* followed by NewFileName string */
...@@ -1084,28 +1089,28 @@ typedef struct smb_com_setattr_rsp { ...@@ -1084,28 +1089,28 @@ typedef struct smb_com_setattr_rsp {
/*******************************************************/ /*******************************************************/
/* NT Transact structure defintions follow */ /* NT Transact structure defintions follow */
/* Currently only ioctl, acl (get security descriptor) */ /* Currently only ioctl, acl (get security descriptor) */
/* and notify are implemented */ /* and notify are implemented */
/*******************************************************/ /*******************************************************/
typedef struct smb_com_ntransact_req { typedef struct smb_com_ntransact_req {
struct smb_hdr hdr; /* wct >= 19 */ struct smb_hdr hdr; /* wct >= 19 */
__u8 MaxSetupCount; __u8 MaxSetupCount;
__u16 Reserved; __u16 Reserved;
__le32 TotalParameterCount; __le32 TotalParameterCount;
__le32 TotalDataCount; __le32 TotalDataCount;
__le32 MaxParameterCount; __le32 MaxParameterCount;
__le32 MaxDataCount; __le32 MaxDataCount;
__le32 ParameterCount; __le32 ParameterCount;
__le32 ParameterOffset; __le32 ParameterOffset;
__le32 DataCount; __le32 DataCount;
__le32 DataOffset; __le32 DataOffset;
__u8 SetupCount; /* four setup words follow subcommand */ __u8 SetupCount; /* four setup words follow subcommand */
/* SNIA spec incorrectly included spurious pad here */ /* SNIA spec incorrectly included spurious pad here */
__le16 SubCommand; /* 2 = IOCTL/FSCTL */ __le16 SubCommand; /* 2 = IOCTL/FSCTL */
/* SetupCount words follow then */ /* SetupCount words follow then */
__le16 ByteCount; __le16 ByteCount;
__u8 Pad[3]; __u8 Pad[3];
__u8 Parms[0]; __u8 Parms[0];
} __attribute__((packed)) NTRANSACT_REQ; } __attribute__((packed)) NTRANSACT_REQ;
typedef struct smb_com_ntransact_rsp { typedef struct smb_com_ntransact_rsp {
...@@ -1121,7 +1126,7 @@ typedef struct smb_com_ntransact_rsp { ...@@ -1121,7 +1126,7 @@ typedef struct smb_com_ntransact_rsp {
__le32 DataDisplacement; __le32 DataDisplacement;
__u8 SetupCount; /* 0 */ __u8 SetupCount; /* 0 */
__u16 ByteCount; __u16 ByteCount;
/* __u8 Pad[3]; */ /* __u8 Pad[3]; */
/* parms and data follow */ /* parms and data follow */
} __attribute__((packed)) NTRANSACT_RSP; } __attribute__((packed)) NTRANSACT_RSP;
...@@ -1216,7 +1221,7 @@ typedef struct smb_com_transaction_change_notify_req { ...@@ -1216,7 +1221,7 @@ typedef struct smb_com_transaction_change_notify_req {
/* __u8 Data[1];*/ /* __u8 Data[1];*/
} __attribute__((packed)) TRANSACT_CHANGE_NOTIFY_REQ; } __attribute__((packed)) TRANSACT_CHANGE_NOTIFY_REQ;
/* BB eventually change to use generic ntransact rsp struct /* BB eventually change to use generic ntransact rsp struct
and validation routine */ and validation routine */
typedef struct smb_com_transaction_change_notify_rsp { typedef struct smb_com_transaction_change_notify_rsp {
struct smb_hdr hdr; /* wct = 18 */ struct smb_hdr hdr; /* wct = 18 */
...@@ -1263,7 +1268,7 @@ struct file_notify_information { ...@@ -1263,7 +1268,7 @@ struct file_notify_information {
__le32 Action; __le32 Action;
__le32 FileNameLength; __le32 FileNameLength;
__u8 FileName[0]; __u8 FileName[0];
} __attribute__((packed)); } __attribute__((packed));
struct reparse_data { struct reparse_data {
__u32 ReparseTag; __u32 ReparseTag;
...@@ -1332,7 +1337,7 @@ struct trans2_resp { ...@@ -1332,7 +1337,7 @@ struct trans2_resp {
__u8 Reserved1; __u8 Reserved1;
/* SetupWords[SetupCount]; /* SetupWords[SetupCount];
__u16 ByteCount; __u16 ByteCount;
__u16 Reserved2;*/ __u16 Reserved2;*/
/* data area follows */ /* data area follows */
} __attribute__((packed)); } __attribute__((packed));
...@@ -1371,9 +1376,9 @@ struct smb_t2_rsp { ...@@ -1371,9 +1376,9 @@ struct smb_t2_rsp {
#define SMB_QUERY_FILE_INTERNAL_INFO 0x3ee #define SMB_QUERY_FILE_INTERNAL_INFO 0x3ee
#define SMB_QUERY_FILE_ACCESS_INFO 0x3f0 #define SMB_QUERY_FILE_ACCESS_INFO 0x3f0
#define SMB_QUERY_FILE_NAME_INFO2 0x3f1 /* 0x30 bytes */ #define SMB_QUERY_FILE_NAME_INFO2 0x3f1 /* 0x30 bytes */
#define SMB_QUERY_FILE_POSITION_INFO 0x3f6 #define SMB_QUERY_FILE_POSITION_INFO 0x3f6
#define SMB_QUERY_FILE_MODE_INFO 0x3f8 #define SMB_QUERY_FILE_MODE_INFO 0x3f8
#define SMB_QUERY_FILE_ALGN_INFO 0x3f9 #define SMB_QUERY_FILE_ALGN_INFO 0x3f9
#define SMB_SET_FILE_BASIC_INFO 0x101 #define SMB_SET_FILE_BASIC_INFO 0x101
...@@ -1507,35 +1512,35 @@ struct smb_com_transaction2_sfi_req { ...@@ -1507,35 +1512,35 @@ struct smb_com_transaction2_sfi_req {
__u16 Pad1; __u16 Pad1;
__u16 Fid; __u16 Fid;
__le16 InformationLevel; __le16 InformationLevel;
__u16 Reserved4; __u16 Reserved4;
} __attribute__((packed)); } __attribute__((packed));
struct smb_com_transaction2_sfi_rsp { struct smb_com_transaction2_sfi_rsp {
struct smb_hdr hdr; /* wct = 10 + SetupCount */ struct smb_hdr hdr; /* wct = 10 + SetupCount */
struct trans2_resp t2; struct trans2_resp t2;
__u16 ByteCount; __u16 ByteCount;
__u16 Reserved2; /* parameter word reserved - __u16 Reserved2; /* parameter word reserved -
present for infolevels > 100 */ present for infolevels > 100 */
} __attribute__((packed)); } __attribute__((packed));
struct smb_t2_qfi_req { struct smb_t2_qfi_req {
struct smb_hdr hdr; struct smb_hdr hdr;
struct trans2_req t2; struct trans2_req t2;
__u8 Pad; __u8 Pad;
__u16 Fid; __u16 Fid;
__le16 InformationLevel; __le16 InformationLevel;
} __attribute__((packed)); } __attribute__((packed));
struct smb_t2_qfi_rsp { struct smb_t2_qfi_rsp {
struct smb_hdr hdr; /* wct = 10 + SetupCount */ struct smb_hdr hdr; /* wct = 10 + SetupCount */
struct trans2_resp t2; struct trans2_resp t2;
__u16 ByteCount; __u16 ByteCount;
__u16 Reserved2; /* parameter word reserved - __u16 Reserved2; /* parameter word reserved -
present for infolevels > 100 */ present for infolevels > 100 */
} __attribute__((packed)); } __attribute__((packed));
/* /*
* Flags on T2 FINDFIRST and FINDNEXT * Flags on T2 FINDFIRST and FINDNEXT
*/ */
#define CIFS_SEARCH_CLOSE_ALWAYS 0x0001 #define CIFS_SEARCH_CLOSE_ALWAYS 0x0001
#define CIFS_SEARCH_CLOSE_AT_END 0x0002 #define CIFS_SEARCH_CLOSE_AT_END 0x0002
...@@ -1744,7 +1749,9 @@ typedef struct smb_com_transaction2_get_dfs_refer_req { ...@@ -1744,7 +1749,9 @@ typedef struct smb_com_transaction2_get_dfs_refer_req {
__u8 Reserved3; __u8 Reserved3;
__le16 SubCommand; /* one setup word */ __le16 SubCommand; /* one setup word */
__le16 ByteCount; __le16 ByteCount;
__u8 Pad[3]; /* Win2K has sent 0x0F01 (max resp length perhaps?) followed by one byte pad - doesn't seem to matter though */ __u8 Pad[3]; /* Win2K has sent 0x0F01 (max response length
perhaps?) followed by one byte pad - doesn't
seem to matter though */
__le16 MaxReferralLevel; __le16 MaxReferralLevel;
char RequestFileName[1]; char RequestFileName[1];
} __attribute__((packed)) TRANSACTION2_GET_DFS_REFER_REQ; } __attribute__((packed)) TRANSACTION2_GET_DFS_REFER_REQ;
...@@ -1753,7 +1760,10 @@ typedef struct dfs_referral_level_3 { ...@@ -1753,7 +1760,10 @@ typedef struct dfs_referral_level_3 {
__le16 VersionNumber; __le16 VersionNumber;
__le16 ReferralSize; __le16 ReferralSize;
__le16 ServerType; /* 0x0001 = CIFS server */ __le16 ServerType; /* 0x0001 = CIFS server */
__le16 ReferralFlags; /* or proximity - not clear which since always set to zero - SNIA spec says 0x01 means strip off PathConsumed chars before submitting RequestFileName to remote node */ __le16 ReferralFlags; /* or proximity - not clear which since it is
always set to zero - SNIA spec says 0x01
means strip off PathConsumed chars before
submitting RequestFileName to remote node */
__le16 TimeToLive; __le16 TimeToLive;
__le16 Proximity; __le16 Proximity;
__le16 DfsPathOffset; __le16 DfsPathOffset;
...@@ -1779,11 +1789,13 @@ typedef struct smb_com_transaction_get_dfs_refer_rsp { ...@@ -1779,11 +1789,13 @@ typedef struct smb_com_transaction_get_dfs_refer_rsp {
#define DFSREF_STORAGE_SERVER 0x0002 #define DFSREF_STORAGE_SERVER 0x0002
/* IOCTL information */ /* IOCTL information */
/* List of ioctl function codes that look to be of interest to remote clients like this. */ /*
/* Need to do some experimentation to make sure they all work remotely. */ * List of ioctl function codes that look to be of interest to remote clients
/* Some of the following such as the encryption/compression ones would be */ * like this one. Need to do some experimentation to make sure they all work
/* invoked from tools via a specialized hook into the VFS rather than via the */ * remotely. Some of the following, such as the encryption/compression ones
/* standard vfs entry points */ * would be invoked from tools via a specialized hook into the VFS rather
* than via the standard vfs entry points
*/
#define FSCTL_REQUEST_OPLOCK_LEVEL_1 0x00090000 #define FSCTL_REQUEST_OPLOCK_LEVEL_1 0x00090000
#define FSCTL_REQUEST_OPLOCK_LEVEL_2 0x00090004 #define FSCTL_REQUEST_OPLOCK_LEVEL_2 0x00090004
#define FSCTL_REQUEST_BATCH_OPLOCK 0x00090008 #define FSCTL_REQUEST_BATCH_OPLOCK 0x00090008
...@@ -1812,7 +1824,7 @@ typedef struct smb_com_transaction_get_dfs_refer_rsp { ...@@ -1812,7 +1824,7 @@ typedef struct smb_com_transaction_get_dfs_refer_rsp {
/* /*
************************************************************************ ************************************************************************
* All structs for everything above the SMB PDUs themselves * All structs for everything above the SMB PDUs themselves
* (such as the T2 level specific data) go here * (such as the T2 level specific data) go here
************************************************************************ ************************************************************************
*/ */
...@@ -1858,7 +1870,7 @@ typedef struct { ...@@ -1858,7 +1870,7 @@ typedef struct {
__le64 FreeAllocationUnits; __le64 FreeAllocationUnits;
__le32 SectorsPerAllocationUnit; __le32 SectorsPerAllocationUnit;
__le32 BytesPerSector; __le32 BytesPerSector;
} __attribute__((packed)) FILE_SYSTEM_INFO; /* size info, level 0x103 */ } __attribute__((packed)) FILE_SYSTEM_INFO; /* size info, level 0x103 */
typedef struct { typedef struct {
__le32 fsid; __le32 fsid;
...@@ -1872,7 +1884,7 @@ typedef struct { ...@@ -1872,7 +1884,7 @@ typedef struct {
__le16 MajorVersionNumber; __le16 MajorVersionNumber;
__le16 MinorVersionNumber; __le16 MinorVersionNumber;
__le64 Capability; __le64 Capability;
} __attribute__((packed)) FILE_SYSTEM_UNIX_INFO; /* Unix extensions info, level 0x200 */ } __attribute__((packed)) FILE_SYSTEM_UNIX_INFO; /* Unix extension level 0x200*/
/* Version numbers for CIFS UNIX major and minor. */ /* Version numbers for CIFS UNIX major and minor. */
#define CIFS_UNIX_MAJOR_VERSION 1 #define CIFS_UNIX_MAJOR_VERSION 1
...@@ -1888,7 +1900,7 @@ typedef struct { ...@@ -1888,7 +1900,7 @@ typedef struct {
calls including posix open calls including posix open
and posix unlink */ and posix unlink */
#define CIFS_UNIX_LARGE_READ_CAP 0x00000040 /* support reads >128K (up #define CIFS_UNIX_LARGE_READ_CAP 0x00000040 /* support reads >128K (up
to 0xFFFF00 */ to 0xFFFF00 */
#define CIFS_UNIX_LARGE_WRITE_CAP 0x00000080 #define CIFS_UNIX_LARGE_WRITE_CAP 0x00000080
#ifdef CONFIG_CIFS_POSIX #ifdef CONFIG_CIFS_POSIX
...@@ -1898,8 +1910,8 @@ typedef struct { ...@@ -1898,8 +1910,8 @@ typedef struct {
as non-posix handles (can affect write behavior with byte range locks. as non-posix handles (can affect write behavior with byte range locks.
We can add back in POSIX_PATH_OPS cap when Posix Create/Mkdir finished */ We can add back in POSIX_PATH_OPS cap when Posix Create/Mkdir finished */
/* #define CIFS_UNIX_CAP_MASK 0x000000fb */ /* #define CIFS_UNIX_CAP_MASK 0x000000fb */
#define CIFS_UNIX_CAP_MASK 0x000000db #define CIFS_UNIX_CAP_MASK 0x000000db
#else #else
#define CIFS_UNIX_CAP_MASK 0x00000013 #define CIFS_UNIX_CAP_MASK 0x00000013
#endif /* CONFIG_CIFS_POSIX */ #endif /* CONFIG_CIFS_POSIX */
...@@ -1909,10 +1921,10 @@ typedef struct { ...@@ -1909,10 +1921,10 @@ typedef struct {
typedef struct { typedef struct {
/* For undefined recommended transfer size return -1 in that field */ /* For undefined recommended transfer size return -1 in that field */
__le32 OptimalTransferSize; /* bsize on some os, iosize on other os */ __le32 OptimalTransferSize; /* bsize on some os, iosize on other os */
__le32 BlockSize; __le32 BlockSize;
/* The next three fields are in terms of the block size. /* The next three fields are in terms of the block size.
(above). If block size is unknown, 4096 would be a (above). If block size is unknown, 4096 would be a
reasonable block size for a server to report. reasonable block size for a server to report.
Note that returning the blocks/blocksavail removes need Note that returning the blocks/blocksavail removes need
to make a second call (to QFSInfo level 0x103 to get this info. to make a second call (to QFSInfo level 0x103 to get this info.
UserBlockAvail is typically less than or equal to BlocksAvail, UserBlockAvail is typically less than or equal to BlocksAvail,
...@@ -2067,9 +2079,9 @@ struct file_alt_name_info { ...@@ -2067,9 +2079,9 @@ struct file_alt_name_info {
struct file_stream_info { struct file_stream_info {
__le32 number_of_streams; /* BB check sizes and verify location */ __le32 number_of_streams; /* BB check sizes and verify location */
/* followed by info on streams themselves /* followed by info on streams themselves
u64 size; u64 size;
u64 allocation_size u64 allocation_size
stream info */ stream info */
}; /* level 0x109 */ }; /* level 0x109 */
...@@ -2088,7 +2100,7 @@ struct cifs_posix_ace { /* access control entry (ACE) */ ...@@ -2088,7 +2100,7 @@ struct cifs_posix_ace { /* access control entry (ACE) */
__u8 cifs_e_tag; __u8 cifs_e_tag;
__u8 cifs_e_perm; __u8 cifs_e_perm;
__le64 cifs_uid; /* or gid */ __le64 cifs_uid; /* or gid */
} __attribute__((packed)); } __attribute__((packed));
struct cifs_posix_acl { /* access conrol list (ACL) */ struct cifs_posix_acl { /* access conrol list (ACL) */
__le16 version; __le16 version;
...@@ -2159,7 +2171,7 @@ struct file_attrib_tag { ...@@ -2159,7 +2171,7 @@ struct file_attrib_tag {
/********************************************************/ /********************************************************/
/* FindFirst/FindNext transact2 data buffer formats */ /* FindFirst/FindNext transact2 data buffer formats */
/********************************************************/ /********************************************************/
typedef struct { typedef struct {
...@@ -2237,7 +2249,7 @@ typedef struct { ...@@ -2237,7 +2249,7 @@ typedef struct {
__le64 EndOfFile; __le64 EndOfFile;
__le64 AllocationSize; __le64 AllocationSize;
__le32 ExtFileAttributes; __le32 ExtFileAttributes;
__le32 FileNameLength; __le32 FileNameLength;
__le32 EaSize; /* length of the xattrs */ __le32 EaSize; /* length of the xattrs */
__u8 ShortNameLength; __u8 ShortNameLength;
__u8 Reserved; __u8 Reserved;
...@@ -2264,7 +2276,7 @@ typedef struct { ...@@ -2264,7 +2276,7 @@ typedef struct {
struct win_dev { struct win_dev {
unsigned char type[8]; /* IntxCHR or IntxBLK */ unsigned char type[8]; /* IntxCHR or IntxBLK */
__le64 major; __le64 major;
__le64 minor; __le64 minor;
} __attribute__((packed)); } __attribute__((packed));
struct gea { struct gea {
...@@ -2296,36 +2308,36 @@ struct fealist { ...@@ -2296,36 +2308,36 @@ struct fealist {
struct data_blob { struct data_blob {
__u8 *data; __u8 *data;
size_t length; size_t length;
void (*free) (struct data_blob * data_blob); void (*free) (struct data_blob *data_blob);
} __attribute__((packed)); } __attribute__((packed));
#ifdef CONFIG_CIFS_POSIX #ifdef CONFIG_CIFS_POSIX
/* /*
For better POSIX semantics from Linux client, (even better For better POSIX semantics from Linux client, (even better
than the existing CIFS Unix Extensions) we need updated PDUs for: than the existing CIFS Unix Extensions) we need updated PDUs for:
1) PosixCreateX - to set and return the mode, inode#, device info and 1) PosixCreateX - to set and return the mode, inode#, device info and
perhaps add a CreateDevice - to create Pipes and other special .inodes perhaps add a CreateDevice - to create Pipes and other special .inodes
Also note POSIX open flags Also note POSIX open flags
2) Close - to return the last write time to do cache across close 2) Close - to return the last write time to do cache across close
more safely more safely
3) FindFirst return unique inode number - what about resume key, two 3) FindFirst return unique inode number - what about resume key, two
forms short (matches readdir) and full (enough info to cache inodes) forms short (matches readdir) and full (enough info to cache inodes)
4) Mkdir - set mode 4) Mkdir - set mode
And under consideration: And under consideration:
5) FindClose2 (return nanosecond timestamp ??) 5) FindClose2 (return nanosecond timestamp ??)
6) Use nanosecond timestamps throughout all time fields if 6) Use nanosecond timestamps throughout all time fields if
corresponding attribute flag is set corresponding attribute flag is set
7) sendfile - handle based copy 7) sendfile - handle based copy
8) Direct i/o 8) Direct i/o
9) Misc fcntls? 9) Misc fcntls?
what about fixing 64 bit alignment what about fixing 64 bit alignment
There are also various legacy SMB/CIFS requests used as is There are also various legacy SMB/CIFS requests used as is
From existing Lanman and NTLM dialects: From existing Lanman and NTLM dialects:
-------------------------------------- --------------------------------------
NEGOTIATE NEGOTIATE
...@@ -2346,48 +2358,48 @@ struct data_blob { ...@@ -2346,48 +2358,48 @@ struct data_blob {
(BB verify that never need to set allocation size) (BB verify that never need to set allocation size)
SMB_SET_FILE_BASIC_INFO2 (setting times - BB can it be done via SMB_SET_FILE_BASIC_INFO2 (setting times - BB can it be done via
Unix ext?) Unix ext?)
COPY (note support for copy across directories) - FUTURE, OPTIONAL COPY (note support for copy across directories) - FUTURE, OPTIONAL
setting/getting OS/2 EAs - FUTURE (BB can this handle setting/getting OS/2 EAs - FUTURE (BB can this handle
setting Linux xattrs perfectly) - OPTIONAL setting Linux xattrs perfectly) - OPTIONAL
dnotify - FUTURE, OPTIONAL dnotify - FUTURE, OPTIONAL
quota - FUTURE, OPTIONAL quota - FUTURE, OPTIONAL
Note that various requests implemented for NT interop such as Note that various requests implemented for NT interop such as
NT_TRANSACT (IOCTL) QueryReparseInfo NT_TRANSACT (IOCTL) QueryReparseInfo
are unneeded to servers compliant with the CIFS POSIX extensions are unneeded to servers compliant with the CIFS POSIX extensions
From CIFS Unix Extensions: From CIFS Unix Extensions:
------------------------- -------------------------
T2 SET_PATH_INFO (SMB_SET_FILE_UNIX_LINK) for symlinks T2 SET_PATH_INFO (SMB_SET_FILE_UNIX_LINK) for symlinks
T2 SET_PATH_INFO (SMB_SET_FILE_BASIC_INFO2) T2 SET_PATH_INFO (SMB_SET_FILE_BASIC_INFO2)
T2 QUERY_PATH_INFO (SMB_QUERY_FILE_UNIX_LINK) T2 QUERY_PATH_INFO (SMB_QUERY_FILE_UNIX_LINK)
T2 QUERY_PATH_INFO (SMB_QUERY_FILE_UNIX_BASIC) - BB check for missing inode fields T2 QUERY_PATH_INFO (SMB_QUERY_FILE_UNIX_BASIC) BB check for missing
Actually need QUERY_FILE_UNIX_INFO since has inode num inode fields
BB what about a) blksize/blkbits/blocks Actually a need QUERY_FILE_UNIX_INFO
since has inode num
BB what about a) blksize/blkbits/blocks
b) i_version b) i_version
c) i_rdev c) i_rdev
d) notify mask? d) notify mask?
e) generation e) generation
f) size_seqcount f) size_seqcount
T2 FIND_FIRST/FIND_NEXT FIND_FILE_UNIX T2 FIND_FIRST/FIND_NEXT FIND_FILE_UNIX
TRANS2_GET_DFS_REFERRAL - OPTIONAL but recommended TRANS2_GET_DFS_REFERRAL - OPTIONAL but recommended
T2_QFS_INFO QueryDevice/AttributeInfo - OPTIONAL T2_QFS_INFO QueryDevice/AttributeInfo - OPTIONAL
*/ */
/* xsymlink is a symlink format (used by MacOS) that can be used /* xsymlink is a symlink format (used by MacOS) that can be used
to save symlink info in a regular file when to save symlink info in a regular file when
mounted to operating systems that do not mounted to operating systems that do not
support the cifs Unix extensions or EAs (for xattr support the cifs Unix extensions or EAs (for xattr
based symlinks). For such a file to be recognized based symlinks). For such a file to be recognized
as containing symlink data: as containing symlink data:
1) file size must be 1067, 1) file size must be 1067,
2) signature must begin file data, 2) signature must begin file data,
3) length field must be set to ASCII representation 3) length field must be set to ASCII representation
of a number which is less than or equal to 1024, of a number which is less than or equal to 1024,
4) md5 must match that of the path data */ 4) md5 must match that of the path data */
struct xsymlink { struct xsymlink {
...@@ -2398,10 +2410,10 @@ struct xsymlink { ...@@ -2398,10 +2410,10 @@ struct xsymlink {
char length[4]; char length[4];
char cr1; /* \n */ char cr1; /* \n */
/* md5 of valid subset of path ie path[0] through path[length-1] */ /* md5 of valid subset of path ie path[0] through path[length-1] */
__u8 md5[32]; __u8 md5[32];
char cr2; /* \n */ char cr2; /* \n */
/* if room left, then end with \n then 0x20s by convention but not required */ /* if room left, then end with \n then 0x20s by convention but not required */
char path[1024]; char path[1024];
} __attribute__((packed)); } __attribute__((packed));
typedef struct file_xattr_info { typedef struct file_xattr_info {
...@@ -2410,7 +2422,8 @@ typedef struct file_xattr_info { ...@@ -2410,7 +2422,8 @@ typedef struct file_xattr_info {
__u32 xattr_value_len; __u32 xattr_value_len;
char xattr_name[0]; char xattr_name[0];
/* followed by xattr_value[xattr_value_len], no pad */ /* followed by xattr_value[xattr_value_len], no pad */
} __attribute__((packed)) FILE_XATTR_INFO; /* extended attribute, info level 0x205 */ } __attribute__((packed)) FILE_XATTR_INFO; /* extended attribute info
level 0x205 */
/* flags for chattr command */ /* flags for chattr command */
...@@ -2436,8 +2449,9 @@ typedef struct file_xattr_info { ...@@ -2436,8 +2449,9 @@ typedef struct file_xattr_info {
typedef struct file_chattr_info { typedef struct file_chattr_info {
__le64 mask; /* list of all possible attribute bits */ __le64 mask; /* list of all possible attribute bits */
__le64 mode; /* list of actual attribute bits on this inode */ __le64 mode; /* list of actual attribute bits on this inode */
} __attribute__((packed)) FILE_CHATTR_INFO; /* ext attributes (chattr, chflags) level 0x206 */ } __attribute__((packed)) FILE_CHATTR_INFO; /* ext attributes
(chattr, chflags) level 0x206 */
#endif #endif
#endif /* _CIFSPDU_H */ #endif /* _CIFSPDU_H */
...@@ -71,12 +71,12 @@ extern void header_assemble(struct smb_hdr *, char /* command */ , ...@@ -71,12 +71,12 @@ extern void header_assemble(struct smb_hdr *, char /* command */ ,
fixed section (word count) in two byte units */); fixed section (word count) in two byte units */);
extern int small_smb_init_no_tc(const int smb_cmd, const int wct, extern int small_smb_init_no_tc(const int smb_cmd, const int wct,
struct cifsSesInfo *ses, struct cifsSesInfo *ses,
void ** request_buf); void **request_buf);
extern int CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, extern int CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses,
const int stage, const int stage,
const struct nls_table *nls_cp); const struct nls_table *nls_cp);
extern __u16 GetNextMid(struct TCP_Server_Info *server); extern __u16 GetNextMid(struct TCP_Server_Info *server);
extern struct oplock_q_entry * AllocOplockQEntry(struct inode *, u16, extern struct oplock_q_entry *AllocOplockQEntry(struct inode *, u16,
struct cifsTconInfo *); struct cifsTconInfo *);
extern void DeleteOplockQEntry(struct oplock_q_entry *); extern void DeleteOplockQEntry(struct oplock_q_entry *);
extern struct timespec cifs_NTtimeToUnix(u64 /* utc nanoseconds since 1601 */ ); extern struct timespec cifs_NTtimeToUnix(u64 /* utc nanoseconds since 1601 */ );
...@@ -146,7 +146,7 @@ extern int get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, ...@@ -146,7 +146,7 @@ extern int get_dfs_path(int xid, struct cifsSesInfo *pSesInfo,
const char *old_path, const char *old_path,
const struct nls_table *nls_codepage, const struct nls_table *nls_codepage,
unsigned int *pnum_referrals, unsigned int *pnum_referrals,
unsigned char ** preferrals, unsigned char **preferrals,
int remap); int remap);
extern void reset_cifs_unix_caps(int xid, struct cifsTconInfo *tcon, extern void reset_cifs_unix_caps(int xid, struct cifsTconInfo *tcon,
struct super_block *sb, struct smb_vol *vol); struct super_block *sb, struct smb_vol *vol);
...@@ -312,9 +312,9 @@ extern int CIFSSMBCopy(int xid, ...@@ -312,9 +312,9 @@ extern int CIFSSMBCopy(int xid,
const char *fromName, const char *fromName,
const __u16 target_tid, const __u16 target_tid,
const char *toName, const int flags, const char *toName, const int flags,
const struct nls_table *nls_codepage, const struct nls_table *nls_codepage,
int remap_special_chars); int remap_special_chars);
extern int CIFSSMBNotify(const int xid, struct cifsTconInfo *tcon, extern int CIFSSMBNotify(const int xid, struct cifsTconInfo *tcon,
const int notify_subdirs, const __u16 netfid, const int notify_subdirs, const __u16 netfid,
__u32 filter, struct file *file, int multishot, __u32 filter, struct file *file, int multishot,
const struct nls_table *nls_codepage); const struct nls_table *nls_codepage);
...@@ -323,7 +323,7 @@ extern ssize_t CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon, ...@@ -323,7 +323,7 @@ extern ssize_t CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon,
size_t bufsize, const struct nls_table *nls_codepage, size_t bufsize, const struct nls_table *nls_codepage,
int remap_special_chars); int remap_special_chars);
extern ssize_t CIFSSMBQueryEA(const int xid, struct cifsTconInfo *tcon, extern ssize_t CIFSSMBQueryEA(const int xid, struct cifsTconInfo *tcon,
const unsigned char * searchName, const unsigned char *ea_name, const unsigned char *searchName, const unsigned char *ea_name,
unsigned char *ea_value, size_t buf_size, unsigned char *ea_value, size_t buf_size,
const struct nls_table *nls_codepage, int remap_special_chars); const struct nls_table *nls_codepage, int remap_special_chars);
extern int CIFSSMBSetEA(const int xid, struct cifsTconInfo *tcon, extern int CIFSSMBSetEA(const int xid, struct cifsTconInfo *tcon,
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -121,7 +121,7 @@ cifs_reconnect(struct TCP_Server_Info *server) ...@@ -121,7 +121,7 @@ cifs_reconnect(struct TCP_Server_Info *server)
struct cifsSesInfo *ses; struct cifsSesInfo *ses;
struct cifsTconInfo *tcon; struct cifsTconInfo *tcon;
struct mid_q_entry *mid_entry; struct mid_q_entry *mid_entry;
spin_lock(&GlobalMid_Lock); spin_lock(&GlobalMid_Lock);
if ( kthread_should_stop() ) { if ( kthread_should_stop() ) {
/* the demux thread will exit normally /* the demux thread will exit normally
...@@ -284,13 +284,13 @@ static int coalesce_t2(struct smb_hdr *psecond, struct smb_hdr *pTargetSMB) ...@@ -284,13 +284,13 @@ static int coalesce_t2(struct smb_hdr *psecond, struct smb_hdr *pTargetSMB)
total_in_buf = le16_to_cpu(pSMBt->t2_rsp.DataCount); total_in_buf = le16_to_cpu(pSMBt->t2_rsp.DataCount);
remaining = total_data_size - total_in_buf; remaining = total_data_size - total_in_buf;
if (remaining < 0) if (remaining < 0)
return -EINVAL; return -EINVAL;
if (remaining == 0) /* nothing to do, ignore */ if (remaining == 0) /* nothing to do, ignore */
return 0; return 0;
total_in_buf2 = le16_to_cpu(pSMB2->t2_rsp.DataCount); total_in_buf2 = le16_to_cpu(pSMB2->t2_rsp.DataCount);
if (remaining < total_in_buf2) { if (remaining < total_in_buf2) {
cFYI(1, ("transact2 2nd response contains too much data")); cFYI(1, ("transact2 2nd response contains too much data"));
...@@ -318,7 +318,7 @@ static int coalesce_t2(struct smb_hdr *psecond, struct smb_hdr *pTargetSMB) ...@@ -318,7 +318,7 @@ static int coalesce_t2(struct smb_hdr *psecond, struct smb_hdr *pTargetSMB)
byte_count += total_in_buf2; byte_count += total_in_buf2;
/* BB also add check that we are not beyond maximum buffer size */ /* BB also add check that we are not beyond maximum buffer size */
pTargetSMB->smb_buf_length = byte_count; pTargetSMB->smb_buf_length = byte_count;
if (remaining == total_in_buf2) { if (remaining == total_in_buf2) {
...@@ -560,7 +560,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server) ...@@ -560,7 +560,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
continue; continue;
length += 4; /* account for rfc1002 hdr */ length += 4; /* account for rfc1002 hdr */
dump_smb(smb_buffer, length); dump_smb(smb_buffer, length);
if (checkSMB(smb_buffer, smb_buffer->Mid, total_read+4)) { if (checkSMB(smb_buffer, smb_buffer->Mid, total_read+4)) {
...@@ -574,7 +574,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server) ...@@ -574,7 +574,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
list_for_each(tmp, &server->pending_mid_q) { list_for_each(tmp, &server->pending_mid_q) {
mid_entry = list_entry(tmp, struct mid_q_entry, qhead); mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
if ((mid_entry->mid == smb_buffer->Mid) && if ((mid_entry->mid == smb_buffer->Mid) &&
(mid_entry->midState == MID_REQUEST_SUBMITTED) && (mid_entry->midState == MID_REQUEST_SUBMITTED) &&
(mid_entry->command == smb_buffer->Command)) { (mid_entry->command == smb_buffer->Command)) {
if (check2ndT2(smb_buffer,server->maxBuf) > 0) { if (check2ndT2(smb_buffer,server->maxBuf) > 0) {
...@@ -582,20 +582,20 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server) ...@@ -582,20 +582,20 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
isMultiRsp = TRUE; isMultiRsp = TRUE;
if (mid_entry->resp_buf) { if (mid_entry->resp_buf) {
/* merge response - fix up 1st*/ /* merge response - fix up 1st*/
if (coalesce_t2(smb_buffer, if (coalesce_t2(smb_buffer,
mid_entry->resp_buf)) { mid_entry->resp_buf)) {
mid_entry->multiRsp = 1; mid_entry->multiRsp = 1;
break; break;
} else { } else {
/* all parts received */ /* all parts received */
mid_entry->multiEnd = 1; mid_entry->multiEnd = 1;
goto multi_t2_fnd; goto multi_t2_fnd;
} }
} else { } else {
if (!isLargeBuf) { if (!isLargeBuf) {
cERROR(1,("1st trans2 resp needs bigbuf")); cERROR(1,("1st trans2 resp needs bigbuf"));
/* BB maybe we can fix this up, switch /* BB maybe we can fix this up, switch
to already allocated large buffer? */ to already allocated large buffer? */
} else { } else {
/* Have first buffer */ /* Have first buffer */
mid_entry->resp_buf = mid_entry->resp_buf =
...@@ -605,7 +605,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server) ...@@ -605,7 +605,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
} }
} }
break; break;
} }
mid_entry->resp_buf = smb_buffer; mid_entry->resp_buf = smb_buffer;
if (isLargeBuf) if (isLargeBuf)
mid_entry->largeBuf = 1; mid_entry->largeBuf = 1;
...@@ -636,15 +636,16 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server) ...@@ -636,15 +636,16 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
} }
wake_up_process(task_to_wake); wake_up_process(task_to_wake);
} else if ((is_valid_oplock_break(smb_buffer, server) == FALSE) } else if ((is_valid_oplock_break(smb_buffer, server) == FALSE)
&& (isMultiRsp == FALSE)) { && (isMultiRsp == FALSE)) {
cERROR(1, ("No task to wake, unknown frame rcvd! NumMids %d", midCount.counter)); cERROR(1, ("No task to wake, unknown frame received! "
cifs_dump_mem("Received Data is: ",(char *)smb_buffer, "NumMids %d", midCount.counter));
cifs_dump_mem("Received Data is: ", (char *)smb_buffer,
sizeof(struct smb_hdr)); sizeof(struct smb_hdr));
#ifdef CONFIG_CIFS_DEBUG2 #ifdef CONFIG_CIFS_DEBUG2
cifs_dump_detail(smb_buffer); cifs_dump_detail(smb_buffer);
cifs_dump_mids(server); cifs_dump_mids(server);
#endif /* CIFS_DEBUG2 */ #endif /* CIFS_DEBUG2 */
} }
} /* end while !EXITING */ } /* end while !EXITING */
...@@ -659,7 +660,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server) ...@@ -659,7 +660,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
/* We do not want to set the max_pending too low or we /* We do not want to set the max_pending too low or we
could end up with the counter going negative */ could end up with the counter going negative */
spin_unlock(&GlobalMid_Lock); spin_unlock(&GlobalMid_Lock);
/* Although there should not be any requests blocked on /* Although there should not be any requests blocked on
this queue it can not hurt to be paranoid and try to wake up requests this queue it can not hurt to be paranoid and try to wake up requests
that may haven been blocked when more than 50 at time were on the wire that may haven been blocked when more than 50 at time were on the wire
to the same server - they now will see the session is in exit state to the same server - they now will see the session is in exit state
...@@ -667,7 +668,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server) ...@@ -667,7 +668,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
wake_up_all(&server->request_q); wake_up_all(&server->request_q);
/* give those requests time to exit */ /* give those requests time to exit */
msleep(125); msleep(125);
if (server->ssocket) { if (server->ssocket) {
sock_release(csocket); sock_release(csocket);
server->ssocket = NULL; server->ssocket = NULL;
...@@ -708,8 +709,8 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server) ...@@ -708,8 +709,8 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
list_for_each(tmp, &server->pending_mid_q) { list_for_each(tmp, &server->pending_mid_q) {
mid_entry = list_entry(tmp, struct mid_q_entry, qhead); mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
if (mid_entry->midState == MID_REQUEST_SUBMITTED) { if (mid_entry->midState == MID_REQUEST_SUBMITTED) {
cFYI(1, cFYI(1, ("Clearing Mid 0x%x - waking up ",
("Clearing Mid 0x%x - waking up ",mid_entry->mid)); mid_entry->mid));
task_to_wake = mid_entry->tsk; task_to_wake = mid_entry->tsk;
if (task_to_wake) { if (task_to_wake) {
wake_up_process(task_to_wake); wake_up_process(task_to_wake);
...@@ -723,7 +724,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server) ...@@ -723,7 +724,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
} }
if (!list_empty(&server->pending_mid_q)) { if (!list_empty(&server->pending_mid_q)) {
/* mpx threads have not exited yet give them /* mpx threads have not exited yet give them
at least the smb send timeout time for long ops */ at least the smb send timeout time for long ops */
/* due to delays on oplock break requests, we need /* due to delays on oplock break requests, we need
to wait at least 45 seconds before giving up to wait at least 45 seconds before giving up
...@@ -741,7 +742,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server) ...@@ -741,7 +742,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
/* last chance to mark ses pointers invalid /* last chance to mark ses pointers invalid
if there are any pointing to this (e.g if there are any pointing to this (e.g
if a crazy root user tried to kill cifsd if a crazy root user tried to kill cifsd
kernel thread explicitly this might happen) */ kernel thread explicitly this might happen) */
list_for_each(tmp, &GlobalSMBSessionList) { list_for_each(tmp, &GlobalSMBSessionList) {
ses = list_entry(tmp, struct cifsSesInfo, ses = list_entry(tmp, struct cifsSesInfo,
...@@ -758,12 +759,13 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server) ...@@ -758,12 +759,13 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
length + cifs_min_rcv, length + cifs_min_rcv,
GFP_KERNEL); GFP_KERNEL);
} }
return 0; return 0;
} }
static int static int
cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) cifs_parse_mount_options(char *options, const char *devname,
struct smb_vol *vol)
{ {
char *value; char *value;
char *data; char *data;
...@@ -771,15 +773,15 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -771,15 +773,15 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
char separator[2]; char separator[2];
separator[0] = ','; separator[0] = ',';
separator[1] = 0; separator[1] = 0;
if (Local_System_Name[0] != 0) if (Local_System_Name[0] != 0)
memcpy(vol->source_rfc1001_name, Local_System_Name,15); memcpy(vol->source_rfc1001_name, Local_System_Name, 15);
else { else {
char *nodename = utsname()->nodename; char *nodename = utsname()->nodename;
int n = strnlen(nodename,15); int n = strnlen(nodename, 15);
memset(vol->source_rfc1001_name,0x20,15); memset(vol->source_rfc1001_name, 0x20, 15);
for(i=0 ; i < n ; i++) { for (i = 0; i < n; i++) {
/* does not have to be perfect mapping since field is /* does not have to be perfect mapping since field is
informational, only used for servers that do not support informational, only used for servers that do not support
port 445 and it can be overridden at mount time */ port 445 and it can be overridden at mount time */
...@@ -804,7 +806,7 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -804,7 +806,7 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
if (!options) if (!options)
return 1; return 1;
if (strncmp(options,"sep=",4) == 0) { if (strncmp(options, "sep=", 4) == 0) {
if (options[4] != 0) { if (options[4] != 0) {
separator[0] = options[4]; separator[0] = options[4];
options += 5; options += 5;
...@@ -812,16 +814,17 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -812,16 +814,17 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
cFYI(1, ("Null separator not allowed")); cFYI(1, ("Null separator not allowed"));
} }
} }
while ((data = strsep(&options, separator)) != NULL) { while ((data = strsep(&options, separator)) != NULL) {
if (!*data) if (!*data)
continue; continue;
if ((value = strchr(data, '=')) != NULL) if ((value = strchr(data, '=')) != NULL)
*value++ = '\0'; *value++ = '\0';
if (strnicmp(data, "user_xattr",10) == 0) {/*parse before user*/ /* Have to parse this before we parse for "user" */
if (strnicmp(data, "user_xattr", 10) == 0) {
vol->no_xattr = 0; vol->no_xattr = 0;
} else if (strnicmp(data, "nouser_xattr",12) == 0) { } else if (strnicmp(data, "nouser_xattr", 12) == 0) {
vol->no_xattr = 1; vol->no_xattr = 1;
} else if (strnicmp(data, "user", 4) == 0) { } else if (strnicmp(data, "user", 4) == 0) {
if (!value) { if (!value) {
...@@ -856,7 +859,7 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -856,7 +859,7 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
/* removed password length check, NTLM passwords /* removed password length check, NTLM passwords
can be arbitrarily long */ can be arbitrarily long */
/* if comma in password, the string will be /* if comma in password, the string will be
prematurely null terminated. Commas in password are prematurely null terminated. Commas in password are
specified across the cifs mount interface by a double specified across the cifs mount interface by a double
comma ie ,, and a comma used as in other cases ie ',' comma ie ,, and a comma used as in other cases ie ','
...@@ -866,18 +869,18 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -866,18 +869,18 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
/* NB: password legally can have multiple commas and /* NB: password legally can have multiple commas and
the only illegal character in a password is null */ the only illegal character in a password is null */
if ((value[temp_len] == 0) && if ((value[temp_len] == 0) &&
(value[temp_len+1] == separator[0])) { (value[temp_len+1] == separator[0])) {
/* reinsert comma */ /* reinsert comma */
value[temp_len] = separator[0]; value[temp_len] = separator[0];
temp_len+=2; /* move after the second comma */ temp_len += 2; /* move after second comma */
while(value[temp_len] != 0) { while (value[temp_len] != 0) {
if (value[temp_len] == separator[0]) { if (value[temp_len] == separator[0]) {
if (value[temp_len+1] == if (value[temp_len+1] ==
separator[0]) { separator[0]) {
/* skip second comma */ /* skip second comma */
temp_len++; temp_len++;
} else { } else {
/* single comma indicating start /* single comma indicating start
of next parm */ of next parm */
break; break;
...@@ -892,15 +895,16 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -892,15 +895,16 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
/* point option to start of next parm */ /* point option to start of next parm */
options = value + temp_len + 1; options = value + temp_len + 1;
} }
/* go from value to value + temp_len condensing /* go from value to value + temp_len condensing
double commas to singles. Note that this ends up double commas to singles. Note that this ends up
allocating a few bytes too many, which is ok */ allocating a few bytes too many, which is ok */
vol->password = kzalloc(temp_len, GFP_KERNEL); vol->password = kzalloc(temp_len, GFP_KERNEL);
if (vol->password == NULL) { if (vol->password == NULL) {
printk("CIFS: no memory for pass\n"); printk(KERN_WARNING "CIFS: no memory "
"for password\n");
return 1; return 1;
} }
for(i=0,j=0;i<temp_len;i++,j++) { for (i = 0, j = 0; i < temp_len; i++, j++) {
vol->password[j] = value[i]; vol->password[j] = value[i];
if (value[i] == separator[0] if (value[i] == separator[0]
&& value[i+1] == separator[0]) { && value[i+1] == separator[0]) {
...@@ -912,7 +916,8 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -912,7 +916,8 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
} else { } else {
vol->password = kzalloc(temp_len+1, GFP_KERNEL); vol->password = kzalloc(temp_len+1, GFP_KERNEL);
if (vol->password == NULL) { if (vol->password == NULL) {
printk("CIFS: no memory for pass\n"); printk(KERN_WARNING "CIFS: no memory "
"for password\n");
return 1; return 1;
} }
strcpy(vol->password, value); strcpy(vol->password, value);
...@@ -923,20 +928,21 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -923,20 +928,21 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
} else if (strnlen(value, 35) < 35) { } else if (strnlen(value, 35) < 35) {
vol->UNCip = value; vol->UNCip = value;
} else { } else {
printk(KERN_WARNING "CIFS: ip address too long\n"); printk(KERN_WARNING "CIFS: ip address "
"too long\n");
return 1; return 1;
} }
} else if (strnicmp(data, "sec", 3) == 0) { } else if (strnicmp(data, "sec", 3) == 0) {
if (!value || !*value) { if (!value || !*value) {
cERROR(1,("no security value specified")); cERROR(1, ("no security value specified"));
continue; continue;
} else if (strnicmp(value, "krb5i", 5) == 0) { } else if (strnicmp(value, "krb5i", 5) == 0) {
vol->secFlg |= CIFSSEC_MAY_KRB5 | vol->secFlg |= CIFSSEC_MAY_KRB5 |
CIFSSEC_MUST_SIGN; CIFSSEC_MUST_SIGN;
} else if (strnicmp(value, "krb5p", 5) == 0) { } else if (strnicmp(value, "krb5p", 5) == 0) {
/* vol->secFlg |= CIFSSEC_MUST_SEAL | /* vol->secFlg |= CIFSSEC_MUST_SEAL |
CIFSSEC_MAY_KRB5; */ CIFSSEC_MAY_KRB5; */
cERROR(1,("Krb5 cifs privacy not supported")); cERROR(1, ("Krb5 cifs privacy not supported"));
return 1; return 1;
} else if (strnicmp(value, "krb5", 4) == 0) { } else if (strnicmp(value, "krb5", 4) == 0) {
vol->secFlg |= CIFSSEC_MAY_KRB5; vol->secFlg |= CIFSSEC_MAY_KRB5;
...@@ -956,33 +962,34 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -956,33 +962,34 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
vol->secFlg |= CIFSSEC_MAY_NTLMV2; vol->secFlg |= CIFSSEC_MAY_NTLMV2;
#ifdef CONFIG_CIFS_WEAK_PW_HASH #ifdef CONFIG_CIFS_WEAK_PW_HASH
} else if (strnicmp(value, "lanman", 6) == 0) { } else if (strnicmp(value, "lanman", 6) == 0) {
vol->secFlg |= CIFSSEC_MAY_LANMAN; vol->secFlg |= CIFSSEC_MAY_LANMAN;
#endif #endif
} else if (strnicmp(value, "none", 4) == 0) { } else if (strnicmp(value, "none", 4) == 0) {
vol->nullauth = 1; vol->nullauth = 1;
} else { } else {
cERROR(1,("bad security option: %s", value)); cERROR(1, ("bad security option: %s", value));
return 1; return 1;
} }
} else if ((strnicmp(data, "unc", 3) == 0) } else if ((strnicmp(data, "unc", 3) == 0)
|| (strnicmp(data, "target", 6) == 0) || (strnicmp(data, "target", 6) == 0)
|| (strnicmp(data, "path", 4) == 0)) { || (strnicmp(data, "path", 4) == 0)) {
if (!value || !*value) { if (!value || !*value) {
printk(KERN_WARNING printk(KERN_WARNING "CIFS: invalid path to "
"CIFS: invalid path to network resource\n"); "network resource\n");
return 1; /* needs_arg; */ return 1; /* needs_arg; */
} }
if ((temp_len = strnlen(value, 300)) < 300) { if ((temp_len = strnlen(value, 300)) < 300) {
vol->UNC = kmalloc(temp_len+1,GFP_KERNEL); vol->UNC = kmalloc(temp_len+1, GFP_KERNEL);
if (vol->UNC == NULL) if (vol->UNC == NULL)
return 1; return 1;
strcpy(vol->UNC,value); strcpy(vol->UNC, value);
if (strncmp(vol->UNC, "//", 2) == 0) { if (strncmp(vol->UNC, "//", 2) == 0) {
vol->UNC[0] = '\\'; vol->UNC[0] = '\\';
vol->UNC[1] = '\\'; vol->UNC[1] = '\\';
} else if (strncmp(vol->UNC, "\\\\", 2) != 0) { } else if (strncmp(vol->UNC, "\\\\", 2) != 0) {
printk(KERN_WARNING printk(KERN_WARNING
"CIFS: UNC Path does not begin with // or \\\\ \n"); "CIFS: UNC Path does not begin "
"with // or \\\\ \n");
return 1; return 1;
} }
} else { } else {
...@@ -1001,41 +1008,43 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -1001,41 +1008,43 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
vol->domainname = value; vol->domainname = value;
cFYI(1, ("Domain name set")); cFYI(1, ("Domain name set"));
} else { } else {
printk(KERN_WARNING "CIFS: domain name too long\n"); printk(KERN_WARNING "CIFS: domain name too "
"long\n");
return 1; return 1;
} }
} else if (strnicmp(data, "prefixpath", 10) == 0) { } else if (strnicmp(data, "prefixpath", 10) == 0) {
if (!value || !*value) { if (!value || !*value) {
printk(KERN_WARNING printk(KERN_WARNING
"CIFS: invalid path prefix\n"); "CIFS: invalid path prefix\n");
return 1; /* needs_arg; */ return 1; /* needs_argument */
} }
if ((temp_len = strnlen(value, 1024)) < 1024) { if ((temp_len = strnlen(value, 1024)) < 1024) {
if (value[0] != '/') if (value[0] != '/')
temp_len++; /* missing leading slash */ temp_len++; /* missing leading slash */
vol->prepath = kmalloc(temp_len+1,GFP_KERNEL); vol->prepath = kmalloc(temp_len+1, GFP_KERNEL);
if (vol->prepath == NULL) if (vol->prepath == NULL)
return 1; return 1;
if (value[0] != '/') { if (value[0] != '/') {
vol->prepath[0] = '/'; vol->prepath[0] = '/';
strcpy(vol->prepath+1,value); strcpy(vol->prepath+1, value);
} else } else
strcpy(vol->prepath,value); strcpy(vol->prepath, value);
cFYI(1, ("prefix path %s",vol->prepath)); cFYI(1, ("prefix path %s", vol->prepath));
} else { } else {
printk(KERN_WARNING "CIFS: prefix too long\n"); printk(KERN_WARNING "CIFS: prefix too long\n");
return 1; return 1;
} }
} else if (strnicmp(data, "iocharset", 9) == 0) { } else if (strnicmp(data, "iocharset", 9) == 0) {
if (!value || !*value) { if (!value || !*value) {
printk(KERN_WARNING "CIFS: invalid iocharset specified\n"); printk(KERN_WARNING "CIFS: invalid iocharset specified\n");
return 1; /* needs_arg; */ return 1; /* needs_arg; */
} }
if (strnlen(value, 65) < 65) { if (strnlen(value, 65) < 65) {
if (strnicmp(value,"default",7)) if (strnicmp(value, "default", 7))
vol->iocharset = value; vol->iocharset = value;
/* if iocharset not set load_nls_default used by caller */ /* if iocharset not set then load_nls_default
cFYI(1, ("iocharset set to %s",value)); is used by caller */
cFYI(1, ("iocharset set to %s", value));
} else { } else {
printk(KERN_WARNING "CIFS: iocharset name too long.\n"); printk(KERN_WARNING "CIFS: iocharset name too long.\n");
return 1; return 1;
...@@ -1091,22 +1100,24 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -1091,22 +1100,24 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
if (!value || !*value || (*value == ' ')) { if (!value || !*value || (*value == ' ')) {
cFYI(1, ("invalid (empty) netbiosname specified")); cFYI(1, ("invalid (empty) netbiosname specified"));
} else { } else {
memset(vol->source_rfc1001_name,0x20,15); memset(vol->source_rfc1001_name, 0x20, 15);
for(i=0;i<15;i++) { for (i = 0; i < 15; i++) {
/* BB are there cases in which a comma can be /* BB are there cases in which a comma can be
valid in this workstation netbios name (and need valid in this workstation netbios name (and need
special handling)? */ special handling)? */
/* We do not uppercase netbiosname for user */ /* We do not uppercase netbiosname for user */
if (value[i]==0) if (value[i] == 0)
break; break;
else else
vol->source_rfc1001_name[i] = value[i]; vol->source_rfc1001_name[i] =
value[i];
} }
/* The string has 16th byte zero still from /* The string has 16th byte zero still from
set at top of the function */ set at top of the function */
if ((i==15) && (value[i] != 0)) if ((i == 15) && (value[i] != 0))
printk(KERN_WARNING "CIFS: netbiosname longer than 15 truncated.\n"); printk(KERN_WARNING "CIFS: netbiosname"
" longer than 15 truncated.\n");
} }
} else if (strnicmp(data, "servern", 7) == 0) { } else if (strnicmp(data, "servern", 7) == 0) {
/* servernetbiosname specified override *SMBSERVER */ /* servernetbiosname specified override *SMBSERVER */
...@@ -1114,29 +1125,32 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -1114,29 +1125,32 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
cFYI(1, ("empty server netbiosname specified")); cFYI(1, ("empty server netbiosname specified"));
} else { } else {
/* last byte, type, is 0x20 for servr type */ /* last byte, type, is 0x20 for servr type */
memset(vol->target_rfc1001_name,0x20,16); memset(vol->target_rfc1001_name, 0x20, 16);
for(i=0;i<15;i++) { for (i = 0; i < 15; i++) {
/* BB are there cases in which a comma can be /* BB are there cases in which a comma can be
valid in this workstation netbios name (and need valid in this workstation netbios name
special handling)? */ (and need special handling)? */
/* user or mount helper must uppercase netbiosname */ /* user or mount helper must uppercase
if (value[i]==0) the netbiosname */
if (value[i] == 0)
break; break;
else else
vol->target_rfc1001_name[i] = value[i]; vol->target_rfc1001_name[i] =
value[i];
} }
/* The string has 16th byte zero still from /* The string has 16th byte zero still from
set at top of the function */ set at top of the function */
if ((i==15) && (value[i] != 0)) if ((i == 15) && (value[i] != 0))
printk(KERN_WARNING "CIFS: server netbiosname longer than 15 truncated.\n"); printk(KERN_WARNING "CIFS: server net"
"biosname longer than 15 truncated.\n");
} }
} else if (strnicmp(data, "credentials", 4) == 0) { } else if (strnicmp(data, "credentials", 4) == 0) {
/* ignore */ /* ignore */
} else if (strnicmp(data, "version", 3) == 0) { } else if (strnicmp(data, "version", 3) == 0) {
/* ignore */ /* ignore */
} else if (strnicmp(data, "guest",5) == 0) { } else if (strnicmp(data, "guest", 5) == 0) {
/* ignore */ /* ignore */
} else if (strnicmp(data, "rw", 2) == 0) { } else if (strnicmp(data, "rw", 2) == 0) {
vol->rw = TRUE; vol->rw = TRUE;
...@@ -1148,11 +1162,11 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -1148,11 +1162,11 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
(strnicmp(data, "noauto", 6) == 0) || (strnicmp(data, "noauto", 6) == 0) ||
(strnicmp(data, "dev", 3) == 0)) { (strnicmp(data, "dev", 3) == 0)) {
/* The mount tool or mount.cifs helper (if present) /* The mount tool or mount.cifs helper (if present)
uses these opts to set flags, and the flags are read uses these opts to set flags, and the flags are read
by the kernel vfs layer before we get here (ie by the kernel vfs layer before we get here (ie
before read super) so there is no point trying to before read super) so there is no point trying to
parse these options again and set anything and it parse these options again and set anything and it
is ok to just ignore them */ is ok to just ignore them */
continue; continue;
} else if (strnicmp(data, "ro", 2) == 0) { } else if (strnicmp(data, "ro", 2) == 0) {
vol->rw = FALSE; vol->rw = FALSE;
...@@ -1168,26 +1182,27 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -1168,26 +1182,27 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
vol->remap = 1; vol->remap = 1;
} else if (strnicmp(data, "nomapchars", 10) == 0) { } else if (strnicmp(data, "nomapchars", 10) == 0) {
vol->remap = 0; vol->remap = 0;
} else if (strnicmp(data, "sfu", 3) == 0) { } else if (strnicmp(data, "sfu", 3) == 0) {
vol->sfu_emul = 1; vol->sfu_emul = 1;
} else if (strnicmp(data, "nosfu", 5) == 0) { } else if (strnicmp(data, "nosfu", 5) == 0) {
vol->sfu_emul = 0; vol->sfu_emul = 0;
} else if (strnicmp(data, "posixpaths", 10) == 0) { } else if (strnicmp(data, "posixpaths", 10) == 0) {
vol->posix_paths = 1; vol->posix_paths = 1;
} else if (strnicmp(data, "noposixpaths", 12) == 0) { } else if (strnicmp(data, "noposixpaths", 12) == 0) {
vol->posix_paths = 0; vol->posix_paths = 0;
} else if ((strnicmp(data, "nocase", 6) == 0) || } else if ((strnicmp(data, "nocase", 6) == 0) ||
(strnicmp(data, "ignorecase", 10) == 0)) { (strnicmp(data, "ignorecase", 10) == 0)) {
vol->nocase = 1; vol->nocase = 1;
} else if (strnicmp(data, "brl", 3) == 0) { } else if (strnicmp(data, "brl", 3) == 0) {
vol->nobrl = 0; vol->nobrl = 0;
} else if ((strnicmp(data, "nobrl", 5) == 0) || } else if ((strnicmp(data, "nobrl", 5) == 0) ||
(strnicmp(data, "nolock", 6) == 0)) { (strnicmp(data, "nolock", 6) == 0)) {
vol->nobrl = 1; vol->nobrl = 1;
/* turn off mandatory locking in mode /* turn off mandatory locking in mode
if remote locking is turned off since the if remote locking is turned off since the
local vfs will do advisory */ local vfs will do advisory */
if (vol->file_mode == (S_IALLUGO & ~(S_ISUID | S_IXGRP))) if (vol->file_mode ==
(S_IALLUGO & ~(S_ISUID | S_IXGRP)))
vol->file_mode = S_IALLUGO; vol->file_mode = S_IALLUGO;
} else if (strnicmp(data, "setuids", 7) == 0) { } else if (strnicmp(data, "setuids", 7) == 0) {
vol->setuids = 1; vol->setuids = 1;
...@@ -1201,55 +1216,61 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -1201,55 +1216,61 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
vol->intr = 0; vol->intr = 0;
} else if (strnicmp(data, "intr", 4) == 0) { } else if (strnicmp(data, "intr", 4) == 0) {
vol->intr = 1; vol->intr = 1;
} else if (strnicmp(data, "serverino",7) == 0) { } else if (strnicmp(data, "serverino", 7) == 0) {
vol->server_ino = 1; vol->server_ino = 1;
} else if (strnicmp(data, "noserverino",9) == 0) { } else if (strnicmp(data, "noserverino", 9) == 0) {
vol->server_ino = 0; vol->server_ino = 0;
} else if (strnicmp(data, "cifsacl",7) == 0) { } else if (strnicmp(data, "cifsacl", 7) == 0) {
vol->cifs_acl = 1; vol->cifs_acl = 1;
} else if (strnicmp(data, "nocifsacl", 9) == 0) { } else if (strnicmp(data, "nocifsacl", 9) == 0) {
vol->cifs_acl = 0; vol->cifs_acl = 0;
} else if (strnicmp(data, "acl",3) == 0) { } else if (strnicmp(data, "acl", 3) == 0) {
vol->no_psx_acl = 0; vol->no_psx_acl = 0;
} else if (strnicmp(data, "noacl",5) == 0) { } else if (strnicmp(data, "noacl", 5) == 0) {
vol->no_psx_acl = 1; vol->no_psx_acl = 1;
} else if (strnicmp(data, "sign",4) == 0) { } else if (strnicmp(data, "sign", 4) == 0) {
vol->secFlg |= CIFSSEC_MUST_SIGN; vol->secFlg |= CIFSSEC_MUST_SIGN;
/* } else if (strnicmp(data, "seal",4) == 0) { /* } else if (strnicmp(data, "seal",4) == 0) {
vol->secFlg |= CIFSSEC_MUST_SEAL; */ vol->secFlg |= CIFSSEC_MUST_SEAL; */
} else if (strnicmp(data, "direct",6) == 0) { } else if (strnicmp(data, "direct", 6) == 0) {
vol->direct_io = 1; vol->direct_io = 1;
} else if (strnicmp(data, "forcedirectio",13) == 0) { } else if (strnicmp(data, "forcedirectio", 13) == 0) {
vol->direct_io = 1; vol->direct_io = 1;
} else if (strnicmp(data, "in6_addr",8) == 0) { } else if (strnicmp(data, "in6_addr", 8) == 0) {
if (!value || !*value) { if (!value || !*value) {
vol->in6_addr = NULL; vol->in6_addr = NULL;
} else if (strnlen(value, 49) == 48) { } else if (strnlen(value, 49) == 48) {
vol->in6_addr = value; vol->in6_addr = value;
} else { } else {
printk(KERN_WARNING "CIFS: ip v6 address not 48 characters long\n"); printk(KERN_WARNING "CIFS: ip v6 address not "
"48 characters long\n");
return 1; return 1;
} }
} else if (strnicmp(data, "noac", 4) == 0) { } else if (strnicmp(data, "noac", 4) == 0) {
printk(KERN_WARNING "CIFS: Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n"); printk(KERN_WARNING "CIFS: Mount option noac not "
"supported. Instead set "
"/proc/fs/cifs/LookupCacheEnabled to 0\n");
} else } else
printk(KERN_WARNING "CIFS: Unknown mount option %s\n",data); printk(KERN_WARNING "CIFS: Unknown mount option %s\n",
data);
} }
if (vol->UNC == NULL) { if (vol->UNC == NULL) {
if (devname == NULL) { if (devname == NULL) {
printk(KERN_WARNING "CIFS: Missing UNC name for mount target\n"); printk(KERN_WARNING "CIFS: Missing UNC name for mount "
"target\n");
return 1; return 1;
} }
if ((temp_len = strnlen(devname, 300)) < 300) { if ((temp_len = strnlen(devname, 300)) < 300) {
vol->UNC = kmalloc(temp_len+1,GFP_KERNEL); vol->UNC = kmalloc(temp_len+1, GFP_KERNEL);
if (vol->UNC == NULL) if (vol->UNC == NULL)
return 1; return 1;
strcpy(vol->UNC,devname); strcpy(vol->UNC, devname);
if (strncmp(vol->UNC, "//", 2) == 0) { if (strncmp(vol->UNC, "//", 2) == 0) {
vol->UNC[0] = '\\'; vol->UNC[0] = '\\';
vol->UNC[1] = '\\'; vol->UNC[1] = '\\';
} else if (strncmp(vol->UNC, "\\\\", 2) != 0) { } else if (strncmp(vol->UNC, "\\\\", 2) != 0) {
printk(KERN_WARNING "CIFS: UNC Path does not begin with // or \\\\ \n"); printk(KERN_WARNING "CIFS: UNC Path does not "
"begin with // or \\\\ \n");
return 1; return 1;
} }
} else { } else {
...@@ -1264,7 +1285,7 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol) ...@@ -1264,7 +1285,7 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
} }
static struct cifsSesInfo * static struct cifsSesInfo *
cifs_find_tcp_session(struct in_addr * target_ip_addr, cifs_find_tcp_session(struct in_addr *target_ip_addr,
struct in6_addr *target_ip6_addr, struct in6_addr *target_ip6_addr,
char *userName, struct TCP_Server_Info **psrvTcp) char *userName, struct TCP_Server_Info **psrvTcp)
{ {
...@@ -1276,19 +1297,25 @@ cifs_find_tcp_session(struct in_addr * target_ip_addr, ...@@ -1276,19 +1297,25 @@ cifs_find_tcp_session(struct in_addr * target_ip_addr,
list_for_each(tmp, &GlobalSMBSessionList) { list_for_each(tmp, &GlobalSMBSessionList) {
ses = list_entry(tmp, struct cifsSesInfo, cifsSessionList); ses = list_entry(tmp, struct cifsSesInfo, cifsSessionList);
if (ses->server) { if (ses->server) {
if ((target_ip_addr && if ((target_ip_addr &&
(ses->server->addr.sockAddr.sin_addr.s_addr (ses->server->addr.sockAddr.sin_addr.s_addr
== target_ip_addr->s_addr)) || (target_ip6_addr == target_ip_addr->s_addr)) || (target_ip6_addr
&& memcmp(&ses->server->addr.sockAddr6.sin6_addr, && memcmp(&ses->server->addr.sockAddr6.sin6_addr,
target_ip6_addr,sizeof(*target_ip6_addr)))){ target_ip6_addr, sizeof(*target_ip6_addr)))) {
/* BB lock server and tcp session and increment use count here?? */ /* BB lock server and tcp session and increment
*psrvTcp = ses->server; /* found a match on the TCP session */ use count here?? */
/* found a match on the TCP session */
*psrvTcp = ses->server;
/* BB check if reconnection needed */ /* BB check if reconnection needed */
if (strncmp if (strncmp
(ses->userName, userName, (ses->userName, userName,
MAX_USERNAME_SIZE) == 0){ MAX_USERNAME_SIZE) == 0){
read_unlock(&GlobalSMBSeslock); read_unlock(&GlobalSMBSeslock);
return ses; /* found exact match on both tcp and SMB sessions */ /* Found exact match on both TCP and
SMB sessions */
return ses;
} }
} }
} }
...@@ -1319,7 +1346,8 @@ find_unc(__be32 new_target_ip_addr, char *uncName, char *userName) ...@@ -1319,7 +1346,8 @@ find_unc(__be32 new_target_ip_addr, char *uncName, char *userName)
/* BB lock tcon, server and tcp session and increment use count here? */ /* BB lock tcon, server and tcp session and increment use count here? */
/* found a match on the TCP session */ /* found a match on the TCP session */
/* BB check if reconnection needed */ /* BB check if reconnection needed */
cFYI(1, ("IP match, old UNC: %s new: %s", cFYI(1,
("IP match, old UNC: %s new: %s",
tcon->treeName, uncName)); tcon->treeName, uncName));
if (strncmp if (strncmp
(tcon->treeName, uncName, (tcon->treeName, uncName,
...@@ -1354,11 +1382,11 @@ connect_to_dfs_path(int xid, struct cifsSesInfo *pSesInfo, ...@@ -1354,11 +1382,11 @@ connect_to_dfs_path(int xid, struct cifsSesInfo *pSesInfo,
unsigned int num_referrals; unsigned int num_referrals;
int rc = 0; int rc = 0;
rc = get_dfs_path(xid, pSesInfo,old_path, nls_codepage, rc = get_dfs_path(xid, pSesInfo, old_path, nls_codepage,
&num_referrals, &referrals, remap); &num_referrals, &referrals, remap);
/* BB Add in code to: if valid refrl, if not ip address contact /* BB Add in code to: if valid refrl, if not ip address contact
the helper that resolves tcp names, mount to it, try to the helper that resolves tcp names, mount to it, try to
tcon to it unmount it if fail */ tcon to it unmount it if fail */
kfree(referrals); kfree(referrals);
...@@ -1367,10 +1395,9 @@ connect_to_dfs_path(int xid, struct cifsSesInfo *pSesInfo, ...@@ -1367,10 +1395,9 @@ connect_to_dfs_path(int xid, struct cifsSesInfo *pSesInfo,
} }
int int
get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, const char *old_path,
const char *old_path, const struct nls_table *nls_codepage, const struct nls_table *nls_codepage, unsigned int *pnum_referrals,
unsigned int *pnum_referrals, unsigned char **preferrals, int remap)
unsigned char ** preferrals, int remap)
{ {
char *temp_unc; char *temp_unc;
int rc = 0; int rc = 0;
...@@ -1379,7 +1406,8 @@ get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, ...@@ -1379,7 +1406,8 @@ get_dfs_path(int xid, struct cifsSesInfo *pSesInfo,
if (pSesInfo->ipc_tid == 0) { if (pSesInfo->ipc_tid == 0) {
temp_unc = kmalloc(2 /* for slashes */ + temp_unc = kmalloc(2 /* for slashes */ +
strnlen(pSesInfo->serverName,SERVER_NAME_LEN_WITH_NULL * 2) strnlen(pSesInfo->serverName,
SERVER_NAME_LEN_WITH_NULL * 2)
+ 1 + 4 /* slash IPC$ */ + 2, + 1 + 4 /* slash IPC$ */ + 2,
GFP_KERNEL); GFP_KERNEL);
if (temp_unc == NULL) if (temp_unc == NULL)
...@@ -1390,7 +1418,7 @@ get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, ...@@ -1390,7 +1418,7 @@ get_dfs_path(int xid, struct cifsSesInfo *pSesInfo,
strcpy(temp_unc + 2 + strlen(pSesInfo->serverName), "\\IPC$"); strcpy(temp_unc + 2 + strlen(pSesInfo->serverName), "\\IPC$");
rc = CIFSTCon(xid, pSesInfo, temp_unc, NULL, nls_codepage); rc = CIFSTCon(xid, pSesInfo, temp_unc, NULL, nls_codepage);
cFYI(1, cFYI(1,
("CIFS Tcon rc = %d ipc_tid = %d", rc,pSesInfo->ipc_tid)); ("CIFS Tcon rc = %d ipc_tid = %d", rc, pSesInfo->ipc_tid));
kfree(temp_unc); kfree(temp_unc);
} }
if (rc == 0) if (rc == 0)
...@@ -1401,38 +1429,39 @@ get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, ...@@ -1401,38 +1429,39 @@ get_dfs_path(int xid, struct cifsSesInfo *pSesInfo,
} }
/* See RFC1001 section 14 on representation of Netbios names */ /* See RFC1001 section 14 on representation of Netbios names */
static void rfc1002mangle(char * target,char * source, unsigned int length) static void rfc1002mangle(char *target, char *source, unsigned int length)
{ {
unsigned int i,j; unsigned int i, j;
for(i=0,j=0;i<(length);i++) { for (i = 0, j = 0; i < (length); i++) {
/* mask a nibble at a time and encode */ /* mask a nibble at a time and encode */
target[j] = 'A' + (0x0F & (source[i] >> 4)); target[j] = 'A' + (0x0F & (source[i] >> 4));
target[j+1] = 'A' + (0x0F & source[i]); target[j+1] = 'A' + (0x0F & source[i]);
j+=2; j += 2;
} }
} }
static int static int
ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket, ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
char * netbios_name, char * target_name) char *netbios_name, char *target_name)
{ {
int rc = 0; int rc = 0;
int connected = 0; int connected = 0;
__be16 orig_port = 0; __be16 orig_port = 0;
if (*csocket == NULL) { if (*csocket == NULL) {
rc = sock_create_kern(PF_INET, SOCK_STREAM, IPPROTO_TCP, csocket); rc = sock_create_kern(PF_INET, SOCK_STREAM,
IPPROTO_TCP, csocket);
if (rc < 0) { if (rc < 0) {
cERROR(1, ("Error %d creating socket",rc)); cERROR(1, ("Error %d creating socket", rc));
*csocket = NULL; *csocket = NULL;
return rc; return rc;
} else { } else {
/* BB other socket options to set KEEPALIVE, NODELAY? */ /* BB other socket options to set KEEPALIVE, NODELAY? */
cFYI(1, ("Socket created")); cFYI(1, ("Socket created"));
(*csocket)->sk->sk_allocation = GFP_NOFS; (*csocket)->sk->sk_allocation = GFP_NOFS;
} }
} }
...@@ -1440,13 +1469,13 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket, ...@@ -1440,13 +1469,13 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
if (psin_server->sin_port) { /* user overrode default port */ if (psin_server->sin_port) { /* user overrode default port */
rc = (*csocket)->ops->connect(*csocket, rc = (*csocket)->ops->connect(*csocket,
(struct sockaddr *) psin_server, (struct sockaddr *) psin_server,
sizeof (struct sockaddr_in),0); sizeof (struct sockaddr_in), 0);
if (rc >= 0) if (rc >= 0)
connected = 1; connected = 1;
} }
if (!connected) { if (!connected) {
/* save original port so we can retry user specified port /* save original port so we can retry user specified port
later if fall back ports fail this time */ later if fall back ports fail this time */
orig_port = psin_server->sin_port; orig_port = psin_server->sin_port;
...@@ -1456,7 +1485,7 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket, ...@@ -1456,7 +1485,7 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
rc = (*csocket)->ops->connect(*csocket, rc = (*csocket)->ops->connect(*csocket,
(struct sockaddr *) psin_server, (struct sockaddr *) psin_server,
sizeof (struct sockaddr_in),0); sizeof (struct sockaddr_in), 0);
if (rc >= 0) if (rc >= 0)
connected = 1; connected = 1;
} }
...@@ -1464,8 +1493,9 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket, ...@@ -1464,8 +1493,9 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
if (!connected) { if (!connected) {
psin_server->sin_port = htons(RFC1001_PORT); psin_server->sin_port = htons(RFC1001_PORT);
rc = (*csocket)->ops->connect(*csocket, (struct sockaddr *) rc = (*csocket)->ops->connect(*csocket, (struct sockaddr *)
psin_server, sizeof (struct sockaddr_in),0); psin_server,
if (rc >= 0) sizeof (struct sockaddr_in), 0);
if (rc >= 0)
connected = 1; connected = 1;
} }
...@@ -1474,15 +1504,16 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket, ...@@ -1474,15 +1504,16 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
if (!connected) { if (!connected) {
if (orig_port) if (orig_port)
psin_server->sin_port = orig_port; psin_server->sin_port = orig_port;
cFYI(1, ("Error %d connecting to server via ipv4",rc)); cFYI(1, ("Error %d connecting to server via ipv4", rc));
sock_release(*csocket); sock_release(*csocket);
*csocket = NULL; *csocket = NULL;
return rc; return rc;
} }
/* Eventually check for other socket options to change from /* Eventually check for other socket options to change from
the default. sock_setsockopt not used because it expects the default. sock_setsockopt not used because it expects
user space buffer */ user space buffer */
cFYI(1, ("sndbuf %d rcvbuf %d rcvtimeo 0x%lx",(*csocket)->sk->sk_sndbuf, cFYI(1, ("sndbuf %d rcvbuf %d rcvtimeo 0x%lx",
(*csocket)->sk->sk_sndbuf,
(*csocket)->sk->sk_rcvbuf, (*csocket)->sk->sk_rcvtimeo)); (*csocket)->sk->sk_rcvbuf, (*csocket)->sk->sk_rcvtimeo));
(*csocket)->sk->sk_rcvtimeo = 7 * HZ; (*csocket)->sk->sk_rcvtimeo = 7 * HZ;
/* make the bufsizes depend on wsize/rsize and max requests */ /* make the bufsizes depend on wsize/rsize and max requests */
...@@ -1494,11 +1525,12 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket, ...@@ -1494,11 +1525,12 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
/* send RFC1001 sessinit */ /* send RFC1001 sessinit */
if (psin_server->sin_port == htons(RFC1001_PORT)) { if (psin_server->sin_port == htons(RFC1001_PORT)) {
/* some servers require RFC1001 sessinit before sending /* some servers require RFC1001 sessinit before sending
negprot - BB check reconnection in case where second negprot - BB check reconnection in case where second
sessinit is sent but no second negprot */ sessinit is sent but no second negprot */
struct rfc1002_session_packet * ses_init_buf; struct rfc1002_session_packet *ses_init_buf;
struct smb_hdr * smb_buf; struct smb_hdr *smb_buf;
ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet), GFP_KERNEL); ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
GFP_KERNEL);
if (ses_init_buf) { if (ses_init_buf) {
ses_init_buf->trailer.session_req.called_len = 32; ses_init_buf->trailer.session_req.called_len = 32;
if (target_name && (target_name[0] != 0)) { if (target_name && (target_name[0] != 0)) {
...@@ -1506,18 +1538,18 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket, ...@@ -1506,18 +1538,18 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
target_name, 16); target_name, 16);
} else { } else {
rfc1002mangle(ses_init_buf->trailer.session_req.called_name, rfc1002mangle(ses_init_buf->trailer.session_req.called_name,
DEFAULT_CIFS_CALLED_NAME,16); DEFAULT_CIFS_CALLED_NAME, 16);
} }
ses_init_buf->trailer.session_req.calling_len = 32; ses_init_buf->trailer.session_req.calling_len = 32;
/* calling name ends in null (byte 16) from old smb /* calling name ends in null (byte 16) from old smb
convention. */ convention. */
if (netbios_name && (netbios_name[0] !=0)) { if (netbios_name && (netbios_name[0] != 0)) {
rfc1002mangle(ses_init_buf->trailer.session_req.calling_name, rfc1002mangle(ses_init_buf->trailer.session_req.calling_name,
netbios_name,16); netbios_name, 16);
} else { } else {
rfc1002mangle(ses_init_buf->trailer.session_req.calling_name, rfc1002mangle(ses_init_buf->trailer.session_req.calling_name,
"LINUX_CIFS_CLNT",16); "LINUX_CIFS_CLNT", 16);
} }
ses_init_buf->trailer.session_req.scope1 = 0; ses_init_buf->trailer.session_req.scope1 = 0;
ses_init_buf->trailer.session_req.scope2 = 0; ses_init_buf->trailer.session_req.scope2 = 0;
...@@ -1527,20 +1559,20 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket, ...@@ -1527,20 +1559,20 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
rc = smb_send(*csocket, smb_buf, 0x44, rc = smb_send(*csocket, smb_buf, 0x44,
(struct sockaddr *)psin_server); (struct sockaddr *)psin_server);
kfree(ses_init_buf); kfree(ses_init_buf);
msleep(1); /* RFC1001 layer in at least one server msleep(1); /* RFC1001 layer in at least one server
requires very short break before negprot requires very short break before negprot
presumably because not expecting negprot presumably because not expecting negprot
to follow so fast. This is a simple to follow so fast. This is a simple
solution that works without solution that works without
complicating the code and causes no complicating the code and causes no
significant slowing down on mount significant slowing down on mount
for everyone else */ for everyone else */
} }
/* else the negprot may still work without this /* else the negprot may still work without this
even though malloc failed */ even though malloc failed */
} }
return rc; return rc;
} }
...@@ -1552,9 +1584,10 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket) ...@@ -1552,9 +1584,10 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket)
__be16 orig_port = 0; __be16 orig_port = 0;
if (*csocket == NULL) { if (*csocket == NULL) {
rc = sock_create_kern(PF_INET6, SOCK_STREAM, IPPROTO_TCP, csocket); rc = sock_create_kern(PF_INET6, SOCK_STREAM,
IPPROTO_TCP, csocket);
if (rc < 0) { if (rc < 0) {
cERROR(1, ("Error %d creating ipv6 socket",rc)); cERROR(1, ("Error %d creating ipv6 socket", rc));
*csocket = NULL; *csocket = NULL;
return rc; return rc;
} else { } else {
...@@ -1569,13 +1602,13 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket) ...@@ -1569,13 +1602,13 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket)
if (psin_server->sin6_port) { /* user overrode default port */ if (psin_server->sin6_port) { /* user overrode default port */
rc = (*csocket)->ops->connect(*csocket, rc = (*csocket)->ops->connect(*csocket,
(struct sockaddr *) psin_server, (struct sockaddr *) psin_server,
sizeof (struct sockaddr_in6),0); sizeof (struct sockaddr_in6), 0);
if (rc >= 0) if (rc >= 0)
connected = 1; connected = 1;
} }
if (!connected) { if (!connected) {
/* save original port so we can retry user specified port /* save original port so we can retry user specified port
later if fall back ports fail this time */ later if fall back ports fail this time */
orig_port = psin_server->sin6_port; orig_port = psin_server->sin6_port;
...@@ -1585,7 +1618,7 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket) ...@@ -1585,7 +1618,7 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket)
rc = (*csocket)->ops->connect(*csocket, rc = (*csocket)->ops->connect(*csocket,
(struct sockaddr *) psin_server, (struct sockaddr *) psin_server,
sizeof (struct sockaddr_in6),0); sizeof (struct sockaddr_in6), 0);
if (rc >= 0) if (rc >= 0)
connected = 1; connected = 1;
} }
...@@ -1593,8 +1626,8 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket) ...@@ -1593,8 +1626,8 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket)
if (!connected) { if (!connected) {
psin_server->sin6_port = htons(RFC1001_PORT); psin_server->sin6_port = htons(RFC1001_PORT);
rc = (*csocket)->ops->connect(*csocket, (struct sockaddr *) rc = (*csocket)->ops->connect(*csocket, (struct sockaddr *)
psin_server, sizeof (struct sockaddr_in6),0); psin_server, sizeof (struct sockaddr_in6), 0);
if (rc >= 0) if (rc >= 0)
connected = 1; connected = 1;
} }
...@@ -1603,21 +1636,21 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket) ...@@ -1603,21 +1636,21 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket)
if (!connected) { if (!connected) {
if (orig_port) if (orig_port)
psin_server->sin6_port = orig_port; psin_server->sin6_port = orig_port;
cFYI(1, ("Error %d connecting to server via ipv6",rc)); cFYI(1, ("Error %d connecting to server via ipv6", rc));
sock_release(*csocket); sock_release(*csocket);
*csocket = NULL; *csocket = NULL;
return rc; return rc;
} }
/* Eventually check for other socket options to change from /* Eventually check for other socket options to change from
the default. sock_setsockopt not used because it expects the default. sock_setsockopt not used because it expects
user space buffer */ user space buffer */
(*csocket)->sk->sk_rcvtimeo = 7 * HZ; (*csocket)->sk->sk_rcvtimeo = 7 * HZ;
return rc; return rc;
} }
void reset_cifs_unix_caps(int xid, struct cifsTconInfo * tcon, void reset_cifs_unix_caps(int xid, struct cifsTconInfo *tcon,
struct super_block * sb, struct smb_vol * vol_info) struct super_block *sb, struct smb_vol *vol_info)
{ {
/* if we are reconnecting then should we check to see if /* if we are reconnecting then should we check to see if
* any requested capabilities changed locally e.g. via * any requested capabilities changed locally e.g. via
...@@ -1629,26 +1662,26 @@ void reset_cifs_unix_caps(int xid, struct cifsTconInfo * tcon, ...@@ -1629,26 +1662,26 @@ void reset_cifs_unix_caps(int xid, struct cifsTconInfo * tcon,
* What if we wanted to mount the server share twice once with * What if we wanted to mount the server share twice once with
* and once without posixacls or posix paths? */ * and once without posixacls or posix paths? */
__u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability); __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
if (!CIFSSMBQFSUnixInfo(xid, tcon)) { if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
__u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability); __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
/* check for reconnect case in which we do not /* check for reconnect case in which we do not
want to change the mount behavior if we can avoid it */ want to change the mount behavior if we can avoid it */
if (vol_info == NULL) { if (vol_info == NULL) {
/* turn off POSIX ACL and PATHNAMES if not set /* turn off POSIX ACL and PATHNAMES if not set
originally at mount time */ originally at mount time */
if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0) if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
cap &= ~CIFS_UNIX_POSIX_ACL_CAP; cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0)
cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP; cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
} }
cap &= CIFS_UNIX_CAP_MASK; cap &= CIFS_UNIX_CAP_MASK;
if (vol_info && vol_info->no_psx_acl) if (vol_info && vol_info->no_psx_acl)
cap &= ~CIFS_UNIX_POSIX_ACL_CAP; cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
...@@ -1663,13 +1696,13 @@ void reset_cifs_unix_caps(int xid, struct cifsTconInfo * tcon, ...@@ -1663,13 +1696,13 @@ void reset_cifs_unix_caps(int xid, struct cifsTconInfo * tcon,
else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) { else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
cFYI(1, ("negotiate posix pathnames")); cFYI(1, ("negotiate posix pathnames"));
if (sb) if (sb)
CIFS_SB(sb)->mnt_cifs_flags |= CIFS_SB(sb)->mnt_cifs_flags |=
CIFS_MOUNT_POSIX_PATHS; CIFS_MOUNT_POSIX_PATHS;
} }
/* We might be setting the path sep back to a different /* We might be setting the path sep back to a different
form if we are reconnecting and the server switched its form if we are reconnecting and the server switched its
posix path capability for this share */ posix path capability for this share */
if (sb && (CIFS_SB(sb)->prepathlen > 0)) if (sb && (CIFS_SB(sb)->prepathlen > 0))
CIFS_SB(sb)->prepath[0] = CIFS_DIR_SEP(CIFS_SB(sb)); CIFS_SB(sb)->prepath[0] = CIFS_DIR_SEP(CIFS_SB(sb));
...@@ -1681,9 +1714,9 @@ void reset_cifs_unix_caps(int xid, struct cifsTconInfo * tcon, ...@@ -1681,9 +1714,9 @@ void reset_cifs_unix_caps(int xid, struct cifsTconInfo * tcon,
#endif #endif
} }
} }
cFYI(1, ("Negotiate caps 0x%x",(int)cap)); cFYI(1, ("Negotiate caps 0x%x", (int)cap));
#ifdef CONFIG_CIFS_DEBUG2 #ifdef CONFIG_CIFS_DEBUG2
if (cap & CIFS_UNIX_FCNTL_CAP) if (cap & CIFS_UNIX_FCNTL_CAP)
cFYI(1, ("FCNTL cap")); cFYI(1, ("FCNTL cap"));
...@@ -1725,8 +1758,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1725,8 +1758,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
xid = GetXid(); xid = GetXid();
/* cFYI(1, ("Entering cifs_mount. Xid: %d with: %s", xid, mount_data)); */ /* cFYI(1, ("Entering cifs_mount. Xid: %d with: %s", xid, mount_data)); */
memset(&volume_info,0,sizeof(struct smb_vol)); memset(&volume_info, 0, sizeof(struct smb_vol));
if (cifs_parse_mount_options(mount_data, devname, &volume_info)) { if (cifs_parse_mount_options(mount_data, devname, &volume_info)) {
kfree(volume_info.UNC); kfree(volume_info.UNC);
kfree(volume_info.password); kfree(volume_info.password);
...@@ -1743,8 +1776,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1743,8 +1776,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
cFYI(1, ("Username: %s", volume_info.username)); cFYI(1, ("Username: %s", volume_info.username));
} else { } else {
cifserror("No username specified"); cifserror("No username specified");
/* In userspace mount helper we can get user name from alternate /* In userspace mount helper we can get user name from alternate
locations such as env variables and files on disk */ locations such as env variables and files on disk */
kfree(volume_info.UNC); kfree(volume_info.UNC);
kfree(volume_info.password); kfree(volume_info.password);
kfree(volume_info.prepath); kfree(volume_info.prepath);
...@@ -1753,17 +1786,19 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1753,17 +1786,19 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
} }
if (volume_info.UNCip && volume_info.UNC) { if (volume_info.UNCip && volume_info.UNC) {
rc = cifs_inet_pton(AF_INET, volume_info.UNCip,&sin_server.sin_addr.s_addr); rc = cifs_inet_pton(AF_INET, volume_info.UNCip,
&sin_server.sin_addr.s_addr);
if (rc <= 0) { if (rc <= 0) {
/* not ipv4 address, try ipv6 */ /* not ipv4 address, try ipv6 */
rc = cifs_inet_pton(AF_INET6,volume_info.UNCip,&sin_server6.sin6_addr.in6_u); rc = cifs_inet_pton(AF_INET6, volume_info.UNCip,
&sin_server6.sin6_addr.in6_u);
if (rc > 0) if (rc > 0)
address_type = AF_INET6; address_type = AF_INET6;
} else { } else {
address_type = AF_INET; address_type = AF_INET;
} }
if (rc <= 0) { if (rc <= 0) {
/* we failed translating address */ /* we failed translating address */
kfree(volume_info.UNC); kfree(volume_info.UNC);
...@@ -1776,9 +1811,10 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1776,9 +1811,10 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
cFYI(1, ("UNC: %s ip: %s", volume_info.UNC, volume_info.UNCip)); cFYI(1, ("UNC: %s ip: %s", volume_info.UNC, volume_info.UNCip));
/* success */ /* success */
rc = 0; rc = 0;
} else if (volume_info.UNCip){ } else if (volume_info.UNCip) {
/* BB using ip addr as server name connect to the DFS root below */ /* BB using ip addr as server name to connect to the
cERROR(1,("Connecting to DFS root not implemented yet")); DFS root below */
cERROR(1, ("Connecting to DFS root not implemented yet"));
kfree(volume_info.UNC); kfree(volume_info.UNC);
kfree(volume_info.password); kfree(volume_info.password);
kfree(volume_info.prepath); kfree(volume_info.prepath);
...@@ -1786,7 +1822,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1786,7 +1822,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
return -EINVAL; return -EINVAL;
} else /* which servers DFS root would we conect to */ { } else /* which servers DFS root would we conect to */ {
cERROR(1, cERROR(1,
("CIFS mount error: No UNC path (e.g. -o unc=//192.168.1.100/public) specified")); ("CIFS mount error: No UNC path (e.g. -o "
"unc=//192.168.1.100/public) specified"));
kfree(volume_info.UNC); kfree(volume_info.UNC);
kfree(volume_info.password); kfree(volume_info.password);
kfree(volume_info.prepath); kfree(volume_info.prepath);
...@@ -1801,7 +1838,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1801,7 +1838,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
} else { } else {
cifs_sb->local_nls = load_nls(volume_info.iocharset); cifs_sb->local_nls = load_nls(volume_info.iocharset);
if (cifs_sb->local_nls == NULL) { if (cifs_sb->local_nls == NULL) {
cERROR(1,("CIFS mount error: iocharset %s not found",volume_info.iocharset)); cERROR(1, ("CIFS mount error: iocharset %s not found",
volume_info.iocharset));
kfree(volume_info.UNC); kfree(volume_info.UNC);
kfree(volume_info.password); kfree(volume_info.password);
kfree(volume_info.prepath); kfree(volume_info.prepath);
...@@ -1827,9 +1865,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1827,9 +1865,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
return -EINVAL; return -EINVAL;
} }
if (srvTcp) { if (srvTcp) {
cFYI(1, ("Existing tcp session with server found")); cFYI(1, ("Existing tcp session with server found"));
} else { /* create socket */ } else { /* create socket */
if (volume_info.port) if (volume_info.port)
sin_server.sin_port = htons(volume_info.port); sin_server.sin_port = htons(volume_info.port);
...@@ -1839,14 +1876,14 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1839,14 +1876,14 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
cFYI(1, ("attempting ipv6 connect")); cFYI(1, ("attempting ipv6 connect"));
/* BB should we allow ipv6 on port 139? */ /* BB should we allow ipv6 on port 139? */
/* other OS never observed in Wild doing 139 with v6 */ /* other OS never observed in Wild doing 139 with v6 */
rc = ipv6_connect(&sin_server6,&csocket); rc = ipv6_connect(&sin_server6, &csocket);
} else } else
rc = ipv4_connect(&sin_server,&csocket, rc = ipv4_connect(&sin_server, &csocket,
volume_info.source_rfc1001_name, volume_info.source_rfc1001_name,
volume_info.target_rfc1001_name); volume_info.target_rfc1001_name);
if (rc < 0) { if (rc < 0) {
cERROR(1, cERROR(1, ("Error connecting to IPv4 socket. "
("Error connecting to IPv4 socket. Aborting operation")); "Aborting operation"));
if (csocket != NULL) if (csocket != NULL)
sock_release(csocket); sock_release(csocket);
kfree(volume_info.UNC); kfree(volume_info.UNC);
...@@ -1867,8 +1904,9 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1867,8 +1904,9 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
return rc; return rc;
} else { } else {
memset(srvTcp, 0, sizeof (struct TCP_Server_Info)); memset(srvTcp, 0, sizeof (struct TCP_Server_Info));
memcpy(&srvTcp->addr.sockAddr, &sin_server, sizeof (struct sockaddr_in)); memcpy(&srvTcp->addr.sockAddr, &sin_server,
atomic_set(&srvTcp->inFlight,0); sizeof (struct sockaddr_in));
atomic_set(&srvTcp->inFlight, 0);
/* BB Add code for ipv6 case too */ /* BB Add code for ipv6 case too */
srvTcp->ssocket = csocket; srvTcp->ssocket = csocket;
srvTcp->protocolType = IPV4; srvTcp->protocolType = IPV4;
...@@ -1883,7 +1921,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1883,7 +1921,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
srvTcp->tsk = kthread_run((void *)(void *)cifs_demultiplex_thread, srvTcp, "cifsd"); srvTcp->tsk = kthread_run((void *)(void *)cifs_demultiplex_thread, srvTcp, "cifsd");
if ( IS_ERR(srvTcp->tsk) ) { if ( IS_ERR(srvTcp->tsk) ) {
rc = PTR_ERR(srvTcp->tsk); rc = PTR_ERR(srvTcp->tsk);
cERROR(1,("error %d create cifsd thread", rc)); cERROR(1, ("error %d create cifsd thread", rc));
srvTcp->tsk = NULL; srvTcp->tsk = NULL;
sock_release(csocket); sock_release(csocket);
kfree(volume_info.UNC); kfree(volume_info.UNC);
...@@ -1894,8 +1932,10 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1894,8 +1932,10 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
} }
wait_for_completion(&cifsd_complete); wait_for_completion(&cifsd_complete);
rc = 0; rc = 0;
memcpy(srvTcp->workstation_RFC1001_name, volume_info.source_rfc1001_name,16); memcpy(srvTcp->workstation_RFC1001_name,
memcpy(srvTcp->server_RFC1001_name, volume_info.target_rfc1001_name,16); volume_info.source_rfc1001_name, 16);
memcpy(srvTcp->server_RFC1001_name,
volume_info.target_rfc1001_name, 16);
srvTcp->sequence_number = 0; srvTcp->sequence_number = 0;
} }
} }
...@@ -1916,16 +1956,17 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1916,16 +1956,17 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
NIPQUAD(sin_server.sin_addr.s_addr)); NIPQUAD(sin_server.sin_addr.s_addr));
} }
if (!rc){ if (!rc) {
/* volume_info.password freed at unmount */ /* volume_info.password freed at unmount */
if (volume_info.password) if (volume_info.password)
pSesInfo->password = volume_info.password; pSesInfo->password = volume_info.password;
if (volume_info.username) if (volume_info.username)
strncpy(pSesInfo->userName, strncpy(pSesInfo->userName,
volume_info.username,MAX_USERNAME_SIZE); volume_info.username,
MAX_USERNAME_SIZE);
if (volume_info.domainname) { if (volume_info.domainname) {
int len = strlen(volume_info.domainname); int len = strlen(volume_info.domainname);
pSesInfo->domainName = pSesInfo->domainName =
kmalloc(len + 1, GFP_KERNEL); kmalloc(len + 1, GFP_KERNEL);
if (pSesInfo->domainName) if (pSesInfo->domainName)
strcpy(pSesInfo->domainName, strcpy(pSesInfo->domainName,
...@@ -1935,18 +1976,19 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1935,18 +1976,19 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
pSesInfo->overrideSecFlg = volume_info.secFlg; pSesInfo->overrideSecFlg = volume_info.secFlg;
down(&pSesInfo->sesSem); down(&pSesInfo->sesSem);
/* BB FIXME need to pass vol->secFlgs BB */ /* BB FIXME need to pass vol->secFlgs BB */
rc = cifs_setup_session(xid,pSesInfo, cifs_sb->local_nls); rc = cifs_setup_session(xid, pSesInfo,
cifs_sb->local_nls);
up(&pSesInfo->sesSem); up(&pSesInfo->sesSem);
if (!rc) if (!rc)
atomic_inc(&srvTcp->socketUseCount); atomic_inc(&srvTcp->socketUseCount);
} else } else
kfree(volume_info.password); kfree(volume_info.password);
} }
/* search for existing tcon to this server share */ /* search for existing tcon to this server share */
if (!rc) { if (!rc) {
if (volume_info.rsize > CIFSMaxBufSize) { if (volume_info.rsize > CIFSMaxBufSize) {
cERROR(1,("rsize %d too large, using MaxBufSize", cERROR(1, ("rsize %d too large, using MaxBufSize",
volume_info.rsize)); volume_info.rsize));
cifs_sb->rsize = CIFSMaxBufSize; cifs_sb->rsize = CIFSMaxBufSize;
} else if ((volume_info.rsize) && } else if ((volume_info.rsize) &&
...@@ -1956,24 +1998,24 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1956,24 +1998,24 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
cifs_sb->rsize = CIFSMaxBufSize; cifs_sb->rsize = CIFSMaxBufSize;
if (volume_info.wsize > PAGEVEC_SIZE * PAGE_CACHE_SIZE) { if (volume_info.wsize > PAGEVEC_SIZE * PAGE_CACHE_SIZE) {
cERROR(1,("wsize %d too large, using 4096 instead", cERROR(1, ("wsize %d too large, using 4096 instead",
volume_info.wsize)); volume_info.wsize));
cifs_sb->wsize = 4096; cifs_sb->wsize = 4096;
} else if (volume_info.wsize) } else if (volume_info.wsize)
cifs_sb->wsize = volume_info.wsize; cifs_sb->wsize = volume_info.wsize;
else else
cifs_sb->wsize = cifs_sb->wsize =
min_t(const int, PAGEVEC_SIZE * PAGE_CACHE_SIZE, min_t(const int, PAGEVEC_SIZE * PAGE_CACHE_SIZE,
127*1024); 127*1024);
/* old default of CIFSMaxBufSize was too small now /* old default of CIFSMaxBufSize was too small now
that SMB Write2 can send multiple pages in kvec. that SMB Write2 can send multiple pages in kvec.
RFC1001 does not describe what happens when frame RFC1001 does not describe what happens when frame
bigger than 128K is sent so use that as max in bigger than 128K is sent so use that as max in
conjunction with 52K kvec constraint on arch with 4K conjunction with 52K kvec constraint on arch with 4K
page size */ page size */
if (cifs_sb->rsize < 2048) { if (cifs_sb->rsize < 2048) {
cifs_sb->rsize = 2048; cifs_sb->rsize = 2048;
/* Windows ME may prefer this */ /* Windows ME may prefer this */
cFYI(1, ("readsize set to minimum: 2048")); cFYI(1, ("readsize set to minimum: 2048"));
} }
...@@ -1983,7 +2025,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -1983,7 +2025,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
cifs_sb->prepathlen = strlen(cifs_sb->prepath); cifs_sb->prepathlen = strlen(cifs_sb->prepath);
cifs_sb->prepath[0] = CIFS_DIR_SEP(cifs_sb); cifs_sb->prepath[0] = CIFS_DIR_SEP(cifs_sb);
volume_info.prepath = NULL; volume_info.prepath = NULL;
} else } else
cifs_sb->prepathlen = 0; cifs_sb->prepathlen = 0;
cifs_sb->mnt_uid = volume_info.linux_uid; cifs_sb->mnt_uid = volume_info.linux_uid;
cifs_sb->mnt_gid = volume_info.linux_gid; cifs_sb->mnt_gid = volume_info.linux_gid;
...@@ -2024,7 +2066,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -2024,7 +2066,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
cFYI(1, ("Found match on UNC path")); cFYI(1, ("Found match on UNC path"));
/* we can have only one retry value for a connection /* we can have only one retry value for a connection
to a share so for resources mounted more than once to a share so for resources mounted more than once
to the same server share the last value passed in to the same server share the last value passed in
for the retry flag is used */ for the retry flag is used */
tcon->retry = volume_info.retry; tcon->retry = volume_info.retry;
tcon->nocase = volume_info.nocase; tcon->nocase = volume_info.nocase;
...@@ -2033,17 +2075,17 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -2033,17 +2075,17 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
if (tcon == NULL) if (tcon == NULL)
rc = -ENOMEM; rc = -ENOMEM;
else { else {
/* check for null share name ie connecting to /* check for null share name ie connecting to
* dfs root */ * dfs root */
/* BB check if this works for exactly length /* BB check if this works for exactly length
* three strings */ * three strings */
if ((strchr(volume_info.UNC + 3, '\\') == NULL) if ((strchr(volume_info.UNC + 3, '\\') == NULL)
&& (strchr(volume_info.UNC + 3, '/') == && (strchr(volume_info.UNC + 3, '/') ==
NULL)) { NULL)) {
rc = connect_to_dfs_path(xid, pSesInfo, rc = connect_to_dfs_path(xid, pSesInfo,
"", cifs_sb->local_nls, "", cifs_sb->local_nls,
cifs_sb->mnt_cifs_flags & cifs_sb->mnt_cifs_flags &
CIFS_MOUNT_MAP_SPECIAL_CHR); CIFS_MOUNT_MAP_SPECIAL_CHR);
kfree(volume_info.UNC); kfree(volume_info.UNC);
FreeXid(xid); FreeXid(xid);
...@@ -2052,7 +2094,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -2052,7 +2094,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
/* BB Do we need to wrap sesSem around /* BB Do we need to wrap sesSem around
* this TCon call and Unix SetFS as * this TCon call and Unix SetFS as
* we do on SessSetup and reconnect? */ * we do on SessSetup and reconnect? */
rc = CIFSTCon(xid, pSesInfo, rc = CIFSTCon(xid, pSesInfo,
volume_info.UNC, volume_info.UNC,
tcon, cifs_sb->local_nls); tcon, cifs_sb->local_nls);
cFYI(1, ("CIFS Tcon rc = %d", rc)); cFYI(1, ("CIFS Tcon rc = %d", rc));
...@@ -2089,7 +2131,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -2089,7 +2131,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
always wake up processes blocked in always wake up processes blocked in
tcp in recv_mesg then we could remove the tcp in recv_mesg then we could remove the
send_sig call */ send_sig call */
force_sig(SIGKILL,srvTcp->tsk); force_sig(SIGKILL, srvTcp->tsk);
tsk = srvTcp->tsk; tsk = srvTcp->tsk;
if (tsk) if (tsk)
kthread_stop(tsk); kthread_stop(tsk);
...@@ -2100,13 +2142,13 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -2100,13 +2142,13 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
tconInfoFree(tcon); tconInfoFree(tcon);
if (existingCifsSes == NULL) { if (existingCifsSes == NULL) {
if (pSesInfo) { if (pSesInfo) {
if ((pSesInfo->server) && if ((pSesInfo->server) &&
(pSesInfo->status == CifsGood)) { (pSesInfo->status == CifsGood)) {
int temp_rc; int temp_rc;
temp_rc = CIFSSMBLogoff(xid, pSesInfo); temp_rc = CIFSSMBLogoff(xid, pSesInfo);
/* if the socketUseCount is now zero */ /* if the socketUseCount is now zero */
if ((temp_rc == -ESHUTDOWN) && if ((temp_rc == -ESHUTDOWN) &&
(pSesInfo->server) && (pSesInfo->server) &&
(pSesInfo->server->tsk)) { (pSesInfo->server->tsk)) {
struct task_struct *tsk; struct task_struct *tsk;
force_sig(SIGKILL, force_sig(SIGKILL,
...@@ -2129,7 +2171,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -2129,7 +2171,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
/* do not care if following two calls succeed - informational */ /* do not care if following two calls succeed - informational */
CIFSSMBQFSDeviceInfo(xid, tcon); CIFSSMBQFSDeviceInfo(xid, tcon);
CIFSSMBQFSAttributeInfo(xid, tcon); CIFSSMBQFSAttributeInfo(xid, tcon);
/* tell server which Unix caps we support */ /* tell server which Unix caps we support */
if (tcon->ses->capabilities & CAP_UNIX) if (tcon->ses->capabilities & CAP_UNIX)
reset_cifs_unix_caps(xid, tcon, sb, &volume_info); reset_cifs_unix_caps(xid, tcon, sb, &volume_info);
...@@ -2138,16 +2180,16 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -2138,16 +2180,16 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
#ifdef CONFIG_CIFS_DEBUG2 #ifdef CONFIG_CIFS_DEBUG2
cFYI(1, ("no very large read support, rsize 127K")); cFYI(1, ("no very large read support, rsize 127K"));
#endif #endif
} }
if (!(tcon->ses->capabilities & CAP_LARGE_WRITE_X)) if (!(tcon->ses->capabilities & CAP_LARGE_WRITE_X))
cifs_sb->wsize = min(cifs_sb->wsize, cifs_sb->wsize = min(cifs_sb->wsize,
(tcon->ses->server->maxBuf - (tcon->ses->server->maxBuf -
MAX_CIFS_HDR_SIZE)); MAX_CIFS_HDR_SIZE));
if (!(tcon->ses->capabilities & CAP_LARGE_READ_X)) if (!(tcon->ses->capabilities & CAP_LARGE_READ_X))
cifs_sb->rsize = min(cifs_sb->rsize, cifs_sb->rsize = min(cifs_sb->rsize,
(tcon->ses->server->maxBuf - (tcon->ses->server->maxBuf -
MAX_CIFS_HDR_SIZE)); MAX_CIFS_HDR_SIZE));
} }
/* volume_info.password is freed above when existing session found /* volume_info.password is freed above when existing session found
...@@ -2200,7 +2242,8 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses, ...@@ -2200,7 +2242,8 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
pSMB->req_no_secext.MaxBufferSize = cpu_to_le16(ses->server->maxBuf); pSMB->req_no_secext.MaxBufferSize = cpu_to_le16(ses->server->maxBuf);
pSMB->req_no_secext.MaxMpxCount = cpu_to_le16(ses->server->maxReq); pSMB->req_no_secext.MaxMpxCount = cpu_to_le16(ses->server->maxReq);
if (ses->server->secMode & (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) if (ses->server->secMode &
(SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE; smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
capabilities = CAP_LARGE_FILES | CAP_NT_SMBS | CAP_LEVEL_II_OPLOCKS | capabilities = CAP_LARGE_FILES | CAP_NT_SMBS | CAP_LEVEL_II_OPLOCKS |
...@@ -2219,7 +2262,7 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses, ...@@ -2219,7 +2262,7 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
} }
pSMB->req_no_secext.Capabilities = cpu_to_le32(capabilities); pSMB->req_no_secext.Capabilities = cpu_to_le32(capabilities);
pSMB->req_no_secext.CaseInsensitivePasswordLength = pSMB->req_no_secext.CaseInsensitivePasswordLength =
cpu_to_le16(CIFS_SESS_KEY_SIZE); cpu_to_le16(CIFS_SESS_KEY_SIZE);
pSMB->req_no_secext.CaseSensitivePasswordLength = pSMB->req_no_secext.CaseSensitivePasswordLength =
...@@ -2237,9 +2280,9 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses, ...@@ -2237,9 +2280,9 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
} }
if (user == NULL) if (user == NULL)
bytes_returned = 0; /* skip null user */ bytes_returned = 0; /* skip null user */
else else
bytes_returned = bytes_returned =
cifs_strtoUCS((__le16 *) bcc_ptr, user, 100, cifs_strtoUCS((__le16 *) bcc_ptr, user, 100,
nls_codepage); nls_codepage);
/* convert number of 16 bit words to bytes */ /* convert number of 16 bit words to bytes */
bcc_ptr += 2 * bytes_returned; bcc_ptr += 2 * bytes_returned;
...@@ -2269,7 +2312,7 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses, ...@@ -2269,7 +2312,7 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
bcc_ptr += 2 * bytes_returned; bcc_ptr += 2 * bytes_returned;
bcc_ptr += 2; bcc_ptr += 2;
} else { } else {
if (user != NULL) { if (user != NULL) {
strncpy(bcc_ptr, user, 200); strncpy(bcc_ptr, user, 200);
bcc_ptr += strnlen(user, 200); bcc_ptr += strnlen(user, 200);
} }
...@@ -2304,11 +2347,12 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses, ...@@ -2304,11 +2347,12 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
__u16 action = le16_to_cpu(pSMBr->resp.Action); __u16 action = le16_to_cpu(pSMBr->resp.Action);
__u16 blob_len = le16_to_cpu(pSMBr->resp.SecurityBlobLength); __u16 blob_len = le16_to_cpu(pSMBr->resp.SecurityBlobLength);
if (action & GUEST_LOGIN) if (action & GUEST_LOGIN)
cFYI(1, (" Guest login")); /* do we want to mark SesInfo struct ? */ cFYI(1, (" Guest login")); /* BB mark SesInfo struct? */
ses->Suid = smb_buffer_response->Uid; /* UID left in wire format (le) */ ses->Suid = smb_buffer_response->Uid; /* UID left in wire format
(little endian) */
cFYI(1, ("UID = %d ", ses->Suid)); cFYI(1, ("UID = %d ", ses->Suid));
/* response can have either 3 or 4 word count - Samba sends 3 */ /* response can have either 3 or 4 word count - Samba sends 3 */
bcc_ptr = pByteArea(smb_buffer_response); bcc_ptr = pByteArea(smb_buffer_response);
if ((pSMBr->resp.hdr.WordCount == 3) if ((pSMBr->resp.hdr.WordCount == 3)
|| ((pSMBr->resp.hdr.WordCount == 4) || ((pSMBr->resp.hdr.WordCount == 4)
&& (blob_len < pSMBr->resp.ByteCount))) { && (blob_len < pSMBr->resp.ByteCount))) {
...@@ -2318,8 +2362,10 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses, ...@@ -2318,8 +2362,10 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
if (smb_buffer->Flags2 & SMBFLG2_UNICODE) { if (smb_buffer->Flags2 & SMBFLG2_UNICODE) {
if ((long) (bcc_ptr) % 2) { if ((long) (bcc_ptr) % 2) {
remaining_words = remaining_words =
(BCC(smb_buffer_response) - 1) /2; (BCC(smb_buffer_response) - 1) / 2;
bcc_ptr++; /* Unicode strings must be word aligned */ /* Unicode strings must be word
aligned */
bcc_ptr++;
} else { } else {
remaining_words = remaining_words =
BCC(smb_buffer_response) / 2; BCC(smb_buffer_response) / 2;
...@@ -2332,11 +2378,13 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses, ...@@ -2332,11 +2378,13 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
terminating last Unicode string in response */ terminating last Unicode string in response */
if (ses->serverOS) if (ses->serverOS)
kfree(ses->serverOS); kfree(ses->serverOS);
ses->serverOS = kzalloc(2 * (len + 1), GFP_KERNEL); ses->serverOS = kzalloc(2 * (len + 1),
GFP_KERNEL);
if (ses->serverOS == NULL) if (ses->serverOS == NULL)
goto sesssetup_nomem; goto sesssetup_nomem;
cifs_strfromUCS_le(ses->serverOS, cifs_strfromUCS_le(ses->serverOS,
(__le16 *)bcc_ptr, len,nls_codepage); (__le16 *)bcc_ptr,
len, nls_codepage);
bcc_ptr += 2 * (len + 1); bcc_ptr += 2 * (len + 1);
remaining_words -= len + 1; remaining_words -= len + 1;
ses->serverOS[2 * len] = 0; ses->serverOS[2 * len] = 0;
...@@ -2345,42 +2393,49 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses, ...@@ -2345,42 +2393,49 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
len = UniStrnlen((wchar_t *)bcc_ptr, len = UniStrnlen((wchar_t *)bcc_ptr,
remaining_words-1); remaining_words-1);
kfree(ses->serverNOS); kfree(ses->serverNOS);
ses->serverNOS = kzalloc(2 * (len + 1),GFP_KERNEL); ses->serverNOS = kzalloc(2 * (len + 1),
GFP_KERNEL);
if (ses->serverNOS == NULL) if (ses->serverNOS == NULL)
goto sesssetup_nomem; goto sesssetup_nomem;
cifs_strfromUCS_le(ses->serverNOS, cifs_strfromUCS_le(ses->serverNOS,
(__le16 *)bcc_ptr,len,nls_codepage); (__le16 *)bcc_ptr,
len, nls_codepage);
bcc_ptr += 2 * (len + 1); bcc_ptr += 2 * (len + 1);
ses->serverNOS[2 * len] = 0; ses->serverNOS[2 * len] = 0;
ses->serverNOS[1 + (2 * len)] = 0; ses->serverNOS[1 + (2 * len)] = 0;
if (strncmp(ses->serverNOS, if (strncmp(ses->serverNOS,
"NT LAN Manager 4",16) == 0) { "NT LAN Manager 4", 16) == 0) {
cFYI(1, ("NT4 server")); cFYI(1, ("NT4 server"));
ses->flags |= CIFS_SES_NT4; ses->flags |= CIFS_SES_NT4;
} }
remaining_words -= len + 1; remaining_words -= len + 1;
if (remaining_words > 0) { if (remaining_words > 0) {
len = UniStrnlen((wchar_t *) bcc_ptr, remaining_words); len = UniStrnlen((wchar_t *) bcc_ptr, remaining_words);
/* last string is not always null terminated (for e.g. for Windows XP & 2000) */ /* last string is not always null terminated
(for e.g. for Windows XP & 2000) */
if (ses->serverDomain) if (ses->serverDomain)
kfree(ses->serverDomain); kfree(ses->serverDomain);
ses->serverDomain = ses->serverDomain =
kzalloc(2*(len+1),GFP_KERNEL); kzalloc(2*(len+1),
GFP_KERNEL);
if (ses->serverDomain == NULL) if (ses->serverDomain == NULL)
goto sesssetup_nomem; goto sesssetup_nomem;
cifs_strfromUCS_le(ses->serverDomain, cifs_strfromUCS_le(ses->serverDomain,
(__le16 *)bcc_ptr,len,nls_codepage); (__le16 *)bcc_ptr,
len, nls_codepage);
bcc_ptr += 2 * (len + 1); bcc_ptr += 2 * (len + 1);
ses->serverDomain[2*len] = 0; ses->serverDomain[2*len] = 0;
ses->serverDomain[1+(2*len)] = 0; ses->serverDomain[1+(2*len)] = 0;
} /* else no more room so create dummy domain string */ } else { /* else no more room so create
else { dummy domain string */
if (ses->serverDomain) if (ses->serverDomain)
kfree(ses->serverDomain); kfree(ses->serverDomain);
ses->serverDomain = ses->serverDomain =
kzalloc(2, GFP_KERNEL); kzalloc(2, GFP_KERNEL);
} }
} else { /* no room so create dummy domain and NOS string */ } else { /* no room so create dummy domain
and NOS string */
/* if these kcallocs fail not much we /* if these kcallocs fail not much we
can do, but better to not fail the can do, but better to not fail the
sesssetup itself */ sesssetup itself */
...@@ -2397,18 +2452,21 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses, ...@@ -2397,18 +2452,21 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
pByteArea(smb_buffer_response) pByteArea(smb_buffer_response)
<= BCC(smb_buffer_response)) { <= BCC(smb_buffer_response)) {
kfree(ses->serverOS); kfree(ses->serverOS);
ses->serverOS = kzalloc(len + 1,GFP_KERNEL); ses->serverOS = kzalloc(len + 1,
GFP_KERNEL);
if (ses->serverOS == NULL) if (ses->serverOS == NULL)
goto sesssetup_nomem; goto sesssetup_nomem;
strncpy(ses->serverOS,bcc_ptr, len); strncpy(ses->serverOS, bcc_ptr, len);
bcc_ptr += len; bcc_ptr += len;
bcc_ptr[0] = 0; /* null terminate the string */ /* null terminate the string */
bcc_ptr[0] = 0;
bcc_ptr++; bcc_ptr++;
len = strnlen(bcc_ptr, 1024); len = strnlen(bcc_ptr, 1024);
kfree(ses->serverNOS); kfree(ses->serverNOS);
ses->serverNOS = kzalloc(len + 1,GFP_KERNEL); ses->serverNOS = kzalloc(len + 1,
GFP_KERNEL);
if (ses->serverNOS == NULL) if (ses->serverNOS == NULL)
goto sesssetup_nomem; goto sesssetup_nomem;
strncpy(ses->serverNOS, bcc_ptr, len); strncpy(ses->serverNOS, bcc_ptr, len);
...@@ -2419,21 +2477,25 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses, ...@@ -2419,21 +2477,25 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
len = strnlen(bcc_ptr, 1024); len = strnlen(bcc_ptr, 1024);
if (ses->serverDomain) if (ses->serverDomain)
kfree(ses->serverDomain); kfree(ses->serverDomain);
ses->serverDomain = kzalloc(len + 1,GFP_KERNEL); ses->serverDomain = kzalloc(len + 1,
GFP_KERNEL);
if (ses->serverDomain == NULL) if (ses->serverDomain == NULL)
goto sesssetup_nomem; goto sesssetup_nomem;
strncpy(ses->serverDomain, bcc_ptr, len); strncpy(ses->serverDomain, bcc_ptr,
len);
bcc_ptr += len; bcc_ptr += len;
bcc_ptr[0] = 0; bcc_ptr[0] = 0;
bcc_ptr++; bcc_ptr++;
} else } else
cFYI(1, cFYI(1,
("Variable field of length %d extends beyond end of smb ", ("Variable field of length %d "
"extends beyond end of smb ",
len)); len));
} }
} else { } else {
cERROR(1, cERROR(1,
(" Security Blob Length extends beyond end of SMB")); (" Security Blob Length extends beyond "
"end of SMB"));
} }
} else { } else {
cERROR(1, cERROR(1,
...@@ -2452,7 +2514,7 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses, ...@@ -2452,7 +2514,7 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
static int static int
CIFSNTLMSSPNegotiateSessSetup(unsigned int xid, CIFSNTLMSSPNegotiateSessSetup(unsigned int xid,
struct cifsSesInfo *ses, int * pNTLMv2_flag, struct cifsSesInfo *ses, int *pNTLMv2_flag,
const struct nls_table *nls_codepage) const struct nls_table *nls_codepage)
{ {
struct smb_hdr *smb_buffer; struct smb_hdr *smb_buffer;
...@@ -2596,11 +2658,11 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid, ...@@ -2596,11 +2658,11 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid,
__u16 blob_len = le16_to_cpu(pSMBr->resp.SecurityBlobLength); __u16 blob_len = le16_to_cpu(pSMBr->resp.SecurityBlobLength);
if (action & GUEST_LOGIN) if (action & GUEST_LOGIN)
cFYI(1, (" Guest login")); cFYI(1, (" Guest login"));
/* Do we want to set anything in SesInfo struct when guest login? */ /* Do we want to set anything in SesInfo struct when guest login? */
bcc_ptr = pByteArea(smb_buffer_response); bcc_ptr = pByteArea(smb_buffer_response);
/* response can have either 3 or 4 word count - Samba sends 3 */ /* response can have either 3 or 4 word count - Samba sends 3 */
SecurityBlob2 = (PCHALLENGE_MESSAGE) bcc_ptr; SecurityBlob2 = (PCHALLENGE_MESSAGE) bcc_ptr;
if (SecurityBlob2->MessageType != NtLmChallenge) { if (SecurityBlob2->MessageType != NtLmChallenge) {
...@@ -2608,7 +2670,7 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid, ...@@ -2608,7 +2670,7 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid,
("Unexpected NTLMSSP message type received %d", ("Unexpected NTLMSSP message type received %d",
SecurityBlob2->MessageType)); SecurityBlob2->MessageType));
} else if (ses) { } else if (ses) {
ses->Suid = smb_buffer_response->Uid; /* UID left in le format */ ses->Suid = smb_buffer_response->Uid; /* UID left in le format */
cFYI(1, ("UID = %d", ses->Suid)); cFYI(1, ("UID = %d", ses->Suid));
if ((pSMBr->resp.hdr.WordCount == 3) if ((pSMBr->resp.hdr.WordCount == 3)
|| ((pSMBr->resp.hdr.WordCount == 4) || ((pSMBr->resp.hdr.WordCount == 4)
...@@ -2626,18 +2688,18 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid, ...@@ -2626,18 +2688,18 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid,
memcpy(ses->server->cryptKey, memcpy(ses->server->cryptKey,
SecurityBlob2->Challenge, SecurityBlob2->Challenge,
CIFS_CRYPTO_KEY_SIZE); CIFS_CRYPTO_KEY_SIZE);
if (SecurityBlob2->NegotiateFlags & if (SecurityBlob2->NegotiateFlags &
cpu_to_le32(NTLMSSP_NEGOTIATE_NTLMV2)) cpu_to_le32(NTLMSSP_NEGOTIATE_NTLMV2))
*pNTLMv2_flag = TRUE; *pNTLMv2_flag = TRUE;
if ((SecurityBlob2->NegotiateFlags & if ((SecurityBlob2->NegotiateFlags &
cpu_to_le32(NTLMSSP_NEGOTIATE_ALWAYS_SIGN)) cpu_to_le32(NTLMSSP_NEGOTIATE_ALWAYS_SIGN))
|| (sign_CIFS_PDUs > 1)) || (sign_CIFS_PDUs > 1))
ses->server->secMode |= ses->server->secMode |=
SECMODE_SIGN_REQUIRED; SECMODE_SIGN_REQUIRED;
if ((SecurityBlob2->NegotiateFlags & if ((SecurityBlob2->NegotiateFlags &
cpu_to_le32(NTLMSSP_NEGOTIATE_SIGN)) && (sign_CIFS_PDUs)) cpu_to_le32(NTLMSSP_NEGOTIATE_SIGN)) && (sign_CIFS_PDUs))
ses->server->secMode |= ses->server->secMode |=
SECMODE_SIGN_ENABLED; SECMODE_SIGN_ENABLED;
if (smb_buffer->Flags2 & SMBFLG2_UNICODE) { if (smb_buffer->Flags2 & SMBFLG2_UNICODE) {
...@@ -2645,7 +2707,8 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid, ...@@ -2645,7 +2707,8 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid,
remaining_words = remaining_words =
(BCC(smb_buffer_response) (BCC(smb_buffer_response)
- 1) / 2; - 1) / 2;
bcc_ptr++; /* Unicode strings must be word aligned */ /* Must word align unicode strings */
bcc_ptr++;
} else { } else {
remaining_words = remaining_words =
BCC BCC
...@@ -2690,8 +2753,9 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid, ...@@ -2690,8 +2753,9 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid,
(2 * len)] = 0; (2 * len)] = 0;
remaining_words -= len + 1; remaining_words -= len + 1;
if (remaining_words > 0) { if (remaining_words > 0) {
len = UniStrnlen((wchar_t *) bcc_ptr, remaining_words); len = UniStrnlen((wchar_t *) bcc_ptr, remaining_words);
/* last string is not always null terminated (for e.g. for Windows XP & 2000) */ /* last string not always null terminated
(for e.g. for Windows XP & 2000) */
kfree(ses->serverDomain); kfree(ses->serverDomain);
ses->serverDomain = ses->serverDomain =
kzalloc(2 * kzalloc(2 *
...@@ -2756,7 +2820,8 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid, ...@@ -2756,7 +2820,8 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid,
ses->serverDomain = ses->serverDomain =
kzalloc(len + 1, kzalloc(len + 1,
GFP_KERNEL); GFP_KERNEL);
strncpy(ses->serverDomain, bcc_ptr, len); strncpy(ses->serverDomain,
bcc_ptr, len);
bcc_ptr += len; bcc_ptr += len;
bcc_ptr[0] = 0; bcc_ptr[0] = 0;
bcc_ptr++; bcc_ptr++;
...@@ -2766,8 +2831,8 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid, ...@@ -2766,8 +2831,8 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid,
len)); len));
} }
} else { } else {
cERROR(1, cERROR(1, ("Security Blob Length extends beyond"
(" Security Blob Length extends beyond end of SMB")); " end of SMB"));
} }
} else { } else {
cERROR(1, ("No session structure passed in.")); cERROR(1, ("No session structure passed in."));
...@@ -2855,7 +2920,7 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses, ...@@ -2855,7 +2920,7 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses,
strncpy(SecurityBlob->Signature, NTLMSSP_SIGNATURE, 8); strncpy(SecurityBlob->Signature, NTLMSSP_SIGNATURE, 8);
SecurityBlob->MessageType = NtLmAuthenticate; SecurityBlob->MessageType = NtLmAuthenticate;
bcc_ptr += SecurityBlobLength; bcc_ptr += SecurityBlobLength;
negotiate_flags = negotiate_flags =
NTLMSSP_NEGOTIATE_UNICODE | NTLMSSP_REQUEST_TARGET | NTLMSSP_NEGOTIATE_UNICODE | NTLMSSP_REQUEST_TARGET |
NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_NEGOTIATE_TARGET_INFO | NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_NEGOTIATE_TARGET_INFO |
0x80000000 | NTLMSSP_NEGOTIATE_128; 0x80000000 | NTLMSSP_NEGOTIATE_128;
...@@ -3017,17 +3082,20 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses, ...@@ -3017,17 +3082,20 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses,
__u16 blob_len = __u16 blob_len =
le16_to_cpu(pSMBr->resp.SecurityBlobLength); le16_to_cpu(pSMBr->resp.SecurityBlobLength);
if (action & GUEST_LOGIN) if (action & GUEST_LOGIN)
cFYI(1, (" Guest login")); /* BB do we want to set anything in SesInfo struct ? */ cFYI(1, (" Guest login")); /* BB Should we set anything
/* if (SecurityBlob2->MessageType != NtLm??){ in SesInfo struct ? */
cFYI("Unexpected message type on auth response is %d ")); /* if (SecurityBlob2->MessageType != NtLm??) {
} */ cFYI("Unexpected message type on auth response is %d"));
} */
if (ses) { if (ses) {
cFYI(1, cFYI(1,
("Does UID on challenge %d match auth response UID %d ", ("Check challenge UID %d vs auth response UID %d",
ses->Suid, smb_buffer_response->Uid)); ses->Suid, smb_buffer_response->Uid));
ses->Suid = smb_buffer_response->Uid; /* UID left in wire format */ /* UID left in wire format */
bcc_ptr = pByteArea(smb_buffer_response); ses->Suid = smb_buffer_response->Uid;
/* response can have either 3 or 4 word count - Samba sends 3 */ bcc_ptr = pByteArea(smb_buffer_response);
/* response can have either 3 or 4 word count - Samba sends 3 */
if ((pSMBr->resp.hdr.WordCount == 3) if ((pSMBr->resp.hdr.WordCount == 3)
|| ((pSMBr->resp.hdr.WordCount == 4) || ((pSMBr->resp.hdr.WordCount == 4)
&& (blob_len < && (blob_len <
...@@ -3089,7 +3157,7 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses, ...@@ -3089,7 +3157,7 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses,
ses->serverNOS[1+(2*len)] = 0; ses->serverNOS[1+(2*len)] = 0;
remaining_words -= len + 1; remaining_words -= len + 1;
if (remaining_words > 0) { if (remaining_words > 0) {
len = UniStrnlen((wchar_t *) bcc_ptr, remaining_words); len = UniStrnlen((wchar_t *) bcc_ptr, remaining_words);
/* last string not always null terminated (e.g. for Windows XP & 2000) */ /* last string not always null terminated (e.g. for Windows XP & 2000) */
if (ses->serverDomain) if (ses->serverDomain)
kfree(ses->serverDomain); kfree(ses->serverDomain);
...@@ -3132,8 +3200,8 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses, ...@@ -3132,8 +3200,8 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses,
} }
} else { /* ASCII */ } else { /* ASCII */
len = strnlen(bcc_ptr, 1024); len = strnlen(bcc_ptr, 1024);
if (((long) bcc_ptr + len) - if (((long) bcc_ptr + len) -
(long) pByteArea(smb_buffer_response) (long) pByteArea(smb_buffer_response)
<= BCC(smb_buffer_response)) { <= BCC(smb_buffer_response)) {
if (ses->serverOS) if (ses->serverOS)
kfree(ses->serverOS); kfree(ses->serverOS);
...@@ -3146,8 +3214,9 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses, ...@@ -3146,8 +3214,9 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses,
len = strnlen(bcc_ptr, 1024); len = strnlen(bcc_ptr, 1024);
kfree(ses->serverNOS); kfree(ses->serverNOS);
ses->serverNOS = kzalloc(len+1,GFP_KERNEL); ses->serverNOS = kzalloc(len+1,
strncpy(ses->serverNOS, bcc_ptr, len); GFP_KERNEL);
strncpy(ses->serverNOS, bcc_ptr, len);
bcc_ptr += len; bcc_ptr += len;
bcc_ptr[0] = 0; bcc_ptr[0] = 0;
bcc_ptr++; bcc_ptr++;
...@@ -3233,7 +3302,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses, ...@@ -3233,7 +3302,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
by Samba (not sure whether other servers allow by Samba (not sure whether other servers allow
NTLMv2 password here) */ NTLMv2 password here) */
#ifdef CONFIG_CIFS_WEAK_PW_HASH #ifdef CONFIG_CIFS_WEAK_PW_HASH
if ((extended_security & CIFSSEC_MAY_LANMAN) && if ((extended_security & CIFSSEC_MAY_LANMAN) &&
(ses->server->secType == LANMAN)) (ses->server->secType == LANMAN))
calc_lanman_hash(ses, bcc_ptr); calc_lanman_hash(ses, bcc_ptr);
else else
...@@ -3250,7 +3319,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses, ...@@ -3250,7 +3319,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
} }
} }
if (ses->server->secMode & if (ses->server->secMode &
(SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE; smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
...@@ -3263,8 +3332,8 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses, ...@@ -3263,8 +3332,8 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
if (ses->capabilities & CAP_UNICODE) { if (ses->capabilities & CAP_UNICODE) {
smb_buffer->Flags2 |= SMBFLG2_UNICODE; smb_buffer->Flags2 |= SMBFLG2_UNICODE;
length = length =
cifs_strtoUCS((__le16 *) bcc_ptr, tree, cifs_strtoUCS((__le16 *) bcc_ptr, tree,
6 /* max utf8 char length in bytes */ * 6 /* max utf8 char length in bytes */ *
(/* server len*/ + 256 /* share len */), nls_codepage); (/* server len*/ + 256 /* share len */), nls_codepage);
bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */ bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
bcc_ptr += 2; /* skip trailing null */ bcc_ptr += 2; /* skip trailing null */
...@@ -3288,8 +3357,8 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses, ...@@ -3288,8 +3357,8 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
tcon->tid = smb_buffer_response->Tid; tcon->tid = smb_buffer_response->Tid;
bcc_ptr = pByteArea(smb_buffer_response); bcc_ptr = pByteArea(smb_buffer_response);
length = strnlen(bcc_ptr, BCC(smb_buffer_response) - 2); length = strnlen(bcc_ptr, BCC(smb_buffer_response) - 2);
/* skip service field (NB: this field is always ASCII) */ /* skip service field (NB: this field is always ASCII) */
bcc_ptr += length + 1; bcc_ptr += length + 1;
strncpy(tcon->treeName, tree, MAX_TREE_SIZE); strncpy(tcon->treeName, tree, MAX_TREE_SIZE);
if (smb_buffer->Flags2 & SMBFLG2_UNICODE) { if (smb_buffer->Flags2 & SMBFLG2_UNICODE) {
length = UniStrnlen((wchar_t *) bcc_ptr, 512); length = UniStrnlen((wchar_t *) bcc_ptr, 512);
...@@ -3307,7 +3376,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses, ...@@ -3307,7 +3376,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
bcc_ptr[1] = 0; bcc_ptr[1] = 0;
bcc_ptr += 2; bcc_ptr += 2;
} }
/* else do not bother copying these informational fields */ /* else do not bother copying these information fields*/
} else { } else {
length = strnlen(bcc_ptr, 1024); length = strnlen(bcc_ptr, 1024);
if ((bcc_ptr + length) - if ((bcc_ptr + length) -
...@@ -3319,7 +3388,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses, ...@@ -3319,7 +3388,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
strncpy(tcon->nativeFileSystem, bcc_ptr, strncpy(tcon->nativeFileSystem, bcc_ptr,
length); length);
} }
/* else do not bother copying these informational fields */ /* else do not bother copying these information fields*/
} }
if ((smb_buffer_response->WordCount == 3) || if ((smb_buffer_response->WordCount == 3) ||
(smb_buffer_response->WordCount == 7)) (smb_buffer_response->WordCount == 7))
...@@ -3329,7 +3398,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses, ...@@ -3329,7 +3398,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
tcon->Flags = 0; tcon->Flags = 0;
cFYI(1, ("Tcon flags: 0x%x ", tcon->Flags)); cFYI(1, ("Tcon flags: 0x%x ", tcon->Flags));
} else if ((rc == 0) && tcon == NULL) { } else if ((rc == 0) && tcon == NULL) {
/* all we need to save for IPC$ connection */ /* all we need to save for IPC$ connection */
ses->ipc_tid = smb_buffer_response->Tid; ses->ipc_tid = smb_buffer_response->Tid;
} }
...@@ -3345,7 +3414,7 @@ cifs_umount(struct super_block *sb, struct cifs_sb_info *cifs_sb) ...@@ -3345,7 +3414,7 @@ cifs_umount(struct super_block *sb, struct cifs_sb_info *cifs_sb)
int xid; int xid;
struct cifsSesInfo *ses = NULL; struct cifsSesInfo *ses = NULL;
struct task_struct *cifsd_task; struct task_struct *cifsd_task;
char * tmp; char *tmp;
xid = GetXid(); xid = GetXid();
...@@ -3368,7 +3437,7 @@ cifs_umount(struct super_block *sb, struct cifs_sb_info *cifs_sb) ...@@ -3368,7 +3437,7 @@ cifs_umount(struct super_block *sb, struct cifs_sb_info *cifs_sb)
} else if (rc == -ESHUTDOWN) { } else if (rc == -ESHUTDOWN) {
cFYI(1, ("Waking up socket by sending signal")); cFYI(1, ("Waking up socket by sending signal"));
if (cifsd_task) { if (cifsd_task) {
force_sig(SIGKILL,cifsd_task); force_sig(SIGKILL, cifsd_task);
kthread_stop(cifsd_task); kthread_stop(cifsd_task);
} }
rc = 0; rc = 0;
...@@ -3377,7 +3446,7 @@ cifs_umount(struct super_block *sb, struct cifs_sb_info *cifs_sb) ...@@ -3377,7 +3446,7 @@ cifs_umount(struct super_block *sb, struct cifs_sb_info *cifs_sb)
} else } else
cFYI(1, ("No session or bad tcon")); cFYI(1, ("No session or bad tcon"));
} }
cifs_sb->tcon = NULL; cifs_sb->tcon = NULL;
tmp = cifs_sb->prepath; tmp = cifs_sb->prepath;
cifs_sb->prepathlen = 0; cifs_sb->prepathlen = 0;
...@@ -3389,11 +3458,11 @@ cifs_umount(struct super_block *sb, struct cifs_sb_info *cifs_sb) ...@@ -3389,11 +3458,11 @@ cifs_umount(struct super_block *sb, struct cifs_sb_info *cifs_sb)
sesInfoFree(ses); sesInfoFree(ses);
FreeXid(xid); FreeXid(xid);
return rc; /* BB check if we should always return zero here */ return rc; /* BB check if we should always return zero here */
} }
int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo, int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo,
struct nls_table * nls_info) struct nls_table *nls_info)
{ {
int rc = 0; int rc = 0;
char ntlm_session_key[CIFS_SESS_KEY_SIZE]; char ntlm_session_key[CIFS_SESS_KEY_SIZE];
...@@ -3405,7 +3474,7 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo, ...@@ -3405,7 +3474,7 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo,
rc = CIFSSMBNegotiate(xid, pSesInfo); rc = CIFSSMBNegotiate(xid, pSesInfo);
if (rc == -EAGAIN) /* retry only once on 1st time connection */ { if (rc == -EAGAIN) /* retry only once on 1st time connection */ {
rc = CIFSSMBNegotiate(xid, pSesInfo); rc = CIFSSMBNegotiate(xid, pSesInfo);
if (rc == -EAGAIN) if (rc == -EAGAIN)
rc = -EHOSTDOWN; rc = -EHOSTDOWN;
} }
if (rc == 0) { if (rc == 0) {
...@@ -3425,7 +3494,8 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo, ...@@ -3425,7 +3494,8 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo,
if (linuxExtEnabled == 0) if (linuxExtEnabled == 0)
pSesInfo->capabilities &= (~CAP_UNIX); pSesInfo->capabilities &= (~CAP_UNIX);
/* pSesInfo->sequence_number = 0;*/ /* pSesInfo->sequence_number = 0;*/
cFYI(1, ("Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d", cFYI(1,
("Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d",
pSesInfo->server->secMode, pSesInfo->server->secMode,
pSesInfo->server->capabilities, pSesInfo->server->capabilities,
pSesInfo->server->timeAdj)); pSesInfo->server->timeAdj));
...@@ -3433,7 +3503,7 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo, ...@@ -3433,7 +3503,7 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo,
rc = CIFS_SessSetup(xid, pSesInfo, rc = CIFS_SessSetup(xid, pSesInfo,
first_time, nls_info); first_time, nls_info);
else if (extended_security else if (extended_security
&& (pSesInfo->capabilities && (pSesInfo->capabilities
& CAP_EXTENDED_SECURITY) & CAP_EXTENDED_SECURITY)
&& (pSesInfo->server->secType == NTLMSSP)) { && (pSesInfo->server->secType == NTLMSSP)) {
rc = -EOPNOTSUPP; rc = -EOPNOTSUPP;
...@@ -3447,20 +3517,21 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo, ...@@ -3447,20 +3517,21 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo,
nls_info); nls_info);
if (!rc) { if (!rc) {
if (ntlmv2_flag) { if (ntlmv2_flag) {
char * v2_response; char *v2_response;
cFYI(1, ("more secure NTLM ver2 hash")); cFYI(1, ("more secure NTLM ver2 hash"));
if (CalcNTLMv2_partial_mac_key(pSesInfo, if (CalcNTLMv2_partial_mac_key(pSesInfo,
nls_info)) { nls_info)) {
rc = -ENOMEM; rc = -ENOMEM;
goto ss_err_exit; goto ss_err_exit;
} else } else
v2_response = kmalloc(16 + 64 /* blob */, GFP_KERNEL); v2_response = kmalloc(16 + 64 /* blob */, GFP_KERNEL);
if (v2_response) { if (v2_response) {
CalcNTLMv2_response(pSesInfo,v2_response); CalcNTLMv2_response(pSesInfo,
v2_response);
/* if (first_time) /* if (first_time)
cifs_calculate_ntlmv2_mac_key( cifs_calculate_ntlmv2_mac_key(
pSesInfo->server->mac_signing_key, pSesInfo->server->mac_signing_key,
response, ntlm_session_key, */ response, ntlm_session_key,*/
kfree(v2_response); kfree(v2_response);
/* BB Put dummy sig in SessSetup PDU? */ /* BB Put dummy sig in SessSetup PDU? */
} else { } else {
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
* along with this library; if not, write to the Free Software * along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
/* /*
* See Documentation/filesystems/Exporting * See Documentation/filesystems/Exporting
* and examples in fs/exportfs * and examples in fs/exportfs
...@@ -43,16 +43,16 @@ ...@@ -43,16 +43,16 @@
#include "cifsglob.h" #include "cifsglob.h"
#include "cifs_debug.h" #include "cifs_debug.h"
#ifdef CONFIG_CIFS_EXPERIMENTAL #ifdef CONFIG_CIFS_EXPERIMENTAL
static struct dentry *cifs_get_parent(struct dentry *dentry) static struct dentry *cifs_get_parent(struct dentry *dentry)
{ {
/* BB need to add code here eventually to enable export via NFSD */ /* BB need to add code here eventually to enable export via NFSD */
cFYI(1, ("get parent for %p", dentry)); cFYI(1, ("get parent for %p", dentry));
return ERR_PTR(-EACCES); return ERR_PTR(-EACCES);
} }
struct export_operations cifs_export_ops = { struct export_operations cifs_export_ops = {
.get_parent = cifs_get_parent, .get_parent = cifs_get_parent,
/* Following five export operations are unneeded so far and can default: /* Following five export operations are unneeded so far and can default:
...@@ -62,6 +62,6 @@ struct export_operations cifs_export_ops = { ...@@ -62,6 +62,6 @@ struct export_operations cifs_export_ops = {
.decode_fh = .decode_fh =
.encode_fs = */ .encode_fs = */
}; };
#endif /* EXPERIMENTAL */ #endif /* EXPERIMENTAL */
...@@ -189,7 +189,7 @@ int cifs_open(struct inode *inode, struct file *file) ...@@ -189,7 +189,7 @@ int cifs_open(struct inode *inode, struct file *file)
/* needed for writepage */ /* needed for writepage */
pCifsFile->pfile = file; pCifsFile->pfile = file;
file->private_data = pCifsFile; file->private_data = pCifsFile;
break; break;
} }
...@@ -378,7 +378,7 @@ static int cifs_reopen_file(struct file *file, int can_flush) ...@@ -378,7 +378,7 @@ static int cifs_reopen_file(struct file *file, int can_flush)
rc = -EBADF; rc = -EBADF;
goto reopen_error_exit; goto reopen_error_exit;
} }
cifs_sb = CIFS_SB(inode->i_sb); cifs_sb = CIFS_SB(inode->i_sb);
pTcon = cifs_sb->tcon; pTcon = cifs_sb->tcon;
...@@ -735,7 +735,7 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock) ...@@ -735,7 +735,7 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock)
posix_lock_type = CIFS_RDLCK; posix_lock_type = CIFS_RDLCK;
else else
posix_lock_type = CIFS_WRLCK; posix_lock_type = CIFS_WRLCK;
if (numUnlock == 1) if (numUnlock == 1)
posix_lock_type = CIFS_UNLCK; posix_lock_type = CIFS_UNLCK;
...@@ -810,7 +810,7 @@ ssize_t cifs_user_write(struct file *file, const char __user *write_data, ...@@ -810,7 +810,7 @@ ssize_t cifs_user_write(struct file *file, const char __user *write_data,
if (file->private_data == NULL) if (file->private_data == NULL)
return -EBADF; return -EBADF;
open_file = (struct cifsFileInfo *) file->private_data; open_file = (struct cifsFileInfo *) file->private_data;
xid = GetXid(); xid = GetXid();
if (*poffset > file->f_path.dentry->d_inode->i_size) if (*poffset > file->f_path.dentry->d_inode->i_size)
...@@ -909,7 +909,7 @@ static ssize_t cifs_write(struct file *file, const char *write_data, ...@@ -909,7 +909,7 @@ static ssize_t cifs_write(struct file *file, const char *write_data,
if (file->private_data == NULL) if (file->private_data == NULL)
return -EBADF; return -EBADF;
open_file = (struct cifsFileInfo *)file->private_data; open_file = (struct cifsFileInfo *)file->private_data;
xid = GetXid(); xid = GetXid();
if (*poffset > file->f_path.dentry->d_inode->i_size) if (*poffset > file->f_path.dentry->d_inode->i_size)
...@@ -1035,7 +1035,8 @@ struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode) ...@@ -1035,7 +1035,8 @@ struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode)
/* if it fails, try another handle - might be */ /* if it fails, try another handle - might be */
/* dangerous to hold up writepages with retry */ /* dangerous to hold up writepages with retry */
if (rc) { if (rc) {
cFYI(1, ("failed on reopen file in wp")); cFYI(1,
("failed on reopen file in wp"));
read_lock(&GlobalSMBSeslock); read_lock(&GlobalSMBSeslock);
/* can not use this handle, no write /* can not use this handle, no write
pending on this one after all */ pending on this one after all */
...@@ -1136,7 +1137,7 @@ static int cifs_writepages(struct address_space *mapping, ...@@ -1136,7 +1137,7 @@ static int cifs_writepages(struct address_space *mapping,
int xid; int xid;
cifs_sb = CIFS_SB(mapping->host->i_sb); cifs_sb = CIFS_SB(mapping->host->i_sb);
/* /*
* If wsize is smaller that the page cache size, default to writing * If wsize is smaller that the page cache size, default to writing
* one page at a time via cifs_writepage * one page at a time via cifs_writepage
...@@ -1419,7 +1420,7 @@ int cifs_fsync(struct file *file, struct dentry *dentry, int datasync) ...@@ -1419,7 +1420,7 @@ int cifs_fsync(struct file *file, struct dentry *dentry, int datasync)
cFYI(1, ("Sync file - name: %s datasync: 0x%x", cFYI(1, ("Sync file - name: %s datasync: 0x%x",
dentry->d_name.name, datasync)); dentry->d_name.name, datasync));
rc = filemap_fdatawrite(inode->i_mapping); rc = filemap_fdatawrite(inode->i_mapping);
if (rc == 0) if (rc == 0)
CIFS_I(inode)->write_behind_rc = 0; CIFS_I(inode)->write_behind_rc = 0;
...@@ -1476,7 +1477,7 @@ int cifs_flush(struct file *file, fl_owner_t id) ...@@ -1476,7 +1477,7 @@ int cifs_flush(struct file *file, fl_owner_t id)
rc = filemap_fdatawrite(inode->i_mapping); rc = filemap_fdatawrite(inode->i_mapping);
if (!rc) /* reset wb rc if we were able to write out dirty pages */ if (!rc) /* reset wb rc if we were able to write out dirty pages */
CIFS_I(inode)->write_behind_rc = 0; CIFS_I(inode)->write_behind_rc = 0;
cFYI(1, ("Flush inode %p file %p rc %d", inode, file, rc)); cFYI(1, ("Flush inode %p file %p rc %d", inode, file, rc));
return rc; return rc;
...@@ -1914,7 +1915,7 @@ int is_size_safe_to_change(struct cifsInodeInfo *cifsInode, __u64 end_of_file) ...@@ -1914,7 +1915,7 @@ int is_size_safe_to_change(struct cifsInodeInfo *cifsInode, __u64 end_of_file)
if (cifsInode) if (cifsInode)
open_file = find_writable_file(cifsInode); open_file = find_writable_file(cifsInode);
if (open_file) { if (open_file) {
struct cifs_sb_info *cifs_sb; struct cifs_sb_info *cifs_sb;
......
...@@ -92,7 +92,7 @@ int cifs_get_inode_info_unix(struct inode **pinode, ...@@ -92,7 +92,7 @@ int cifs_get_inode_info_unix(struct inode **pinode,
} /* note ino incremented to unique num in new_inode */ } /* note ino incremented to unique num in new_inode */
if (sb->s_flags & MS_NOATIME) if (sb->s_flags & MS_NOATIME)
(*pinode)->i_flags |= S_NOATIME | S_NOCMTIME; (*pinode)->i_flags |= S_NOATIME | S_NOCMTIME;
insert_inode_hash(*pinode); insert_inode_hash(*pinode);
} }
...@@ -139,7 +139,7 @@ int cifs_get_inode_info_unix(struct inode **pinode, ...@@ -139,7 +139,7 @@ int cifs_get_inode_info_unix(struct inode **pinode,
inode->i_mode |= S_IFREG; inode->i_mode |= S_IFREG;
cFYI(1, ("unknown type %d", type)); cFYI(1, ("unknown type %d", type));
} }
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID) if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)
inode->i_uid = cifs_sb->mnt_uid; inode->i_uid = cifs_sb->mnt_uid;
else else
...@@ -149,7 +149,7 @@ int cifs_get_inode_info_unix(struct inode **pinode, ...@@ -149,7 +149,7 @@ int cifs_get_inode_info_unix(struct inode **pinode,
inode->i_gid = cifs_sb->mnt_gid; inode->i_gid = cifs_sb->mnt_gid;
else else
inode->i_gid = le64_to_cpu(findData.Gid); inode->i_gid = le64_to_cpu(findData.Gid);
inode->i_nlink = le64_to_cpu(findData.Nlinks); inode->i_nlink = le64_to_cpu(findData.Nlinks);
spin_lock(&inode->i_lock); spin_lock(&inode->i_lock);
...@@ -235,7 +235,7 @@ static int decode_sfu_inode(struct inode *inode, __u64 size, ...@@ -235,7 +235,7 @@ static int decode_sfu_inode(struct inode *inode, __u64 size,
} else if (size < 8) { } else if (size < 8) {
return -EINVAL; /* EOPNOTSUPP? */ return -EINVAL; /* EOPNOTSUPP? */
} }
rc = CIFSSMBOpen(xid, pTcon, path, FILE_OPEN, GENERIC_READ, rc = CIFSSMBOpen(xid, pTcon, path, FILE_OPEN, GENERIC_READ,
CREATE_NOT_DIR, &netfid, &oplock, NULL, CREATE_NOT_DIR, &netfid, &oplock, NULL,
cifs_sb->local_nls, cifs_sb->local_nls,
...@@ -285,7 +285,6 @@ static int decode_sfu_inode(struct inode *inode, __u64 size, ...@@ -285,7 +285,6 @@ static int decode_sfu_inode(struct inode *inode, __u64 size,
CIFSSMBClose(xid, pTcon, netfid); CIFSSMBClose(xid, pTcon, netfid);
} }
return rc; return rc;
} }
#define SFBITS_MASK (S_ISVTX | S_ISGID | S_ISUID) /* SETFILEBITS valid bits */ #define SFBITS_MASK (S_ISVTX | S_ISGID | S_ISUID) /* SETFILEBITS valid bits */
...@@ -317,8 +316,6 @@ static int get_sfu_uid_mode(struct inode *inode, ...@@ -317,8 +316,6 @@ static int get_sfu_uid_mode(struct inode *inode,
#else #else
return -EOPNOTSUPP; return -EOPNOTSUPP;
#endif #endif
} }
int cifs_get_inode_info(struct inode **pinode, int cifs_get_inode_info(struct inode **pinode,
...@@ -364,7 +361,6 @@ int cifs_get_inode_info(struct inode **pinode, ...@@ -364,7 +361,6 @@ int cifs_get_inode_info(struct inode **pinode,
CIFS_MOUNT_MAP_SPECIAL_CHR); CIFS_MOUNT_MAP_SPECIAL_CHR);
adjustTZ = TRUE; adjustTZ = TRUE;
} }
} }
/* dump_mem("\nQPathInfo return data",&findData, sizeof(findData)); */ /* dump_mem("\nQPathInfo return data",&findData, sizeof(findData)); */
if (rc) { if (rc) {
...@@ -513,7 +509,7 @@ int cifs_get_inode_info(struct inode **pinode, ...@@ -513,7 +509,7 @@ int cifs_get_inode_info(struct inode **pinode,
/* BB add code here - /* BB add code here -
validate if device or weird share or device type? */ validate if device or weird share or device type? */
} }
spin_lock(&inode->i_lock); spin_lock(&inode->i_lock);
if (is_size_safe_to_change(cifsInfo, le64_to_cpu(pfindData->EndOfFile))) { if (is_size_safe_to_change(cifsInfo, le64_to_cpu(pfindData->EndOfFile))) {
/* can not safely shrink the file size here if the /* can not safely shrink the file size here if the
...@@ -836,7 +832,7 @@ static void posix_fill_in_inode(struct inode *tmp_inode, ...@@ -836,7 +832,7 @@ static void posix_fill_in_inode(struct inode *tmp_inode,
tmp_inode->i_fop = &cifs_file_direct_nobrl_ops; tmp_inode->i_fop = &cifs_file_direct_nobrl_ops;
else else
tmp_inode->i_fop = &cifs_file_direct_ops; tmp_inode->i_fop = &cifs_file_direct_ops;
} else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
tmp_inode->i_fop = &cifs_file_nobrl_ops; tmp_inode->i_fop = &cifs_file_nobrl_ops;
else else
...@@ -898,7 +894,7 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode) ...@@ -898,7 +894,7 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
FreeXid(xid); FreeXid(xid);
return -ENOMEM; return -ENOMEM;
} }
if ((pTcon->ses->capabilities & CAP_UNIX) && if ((pTcon->ses->capabilities & CAP_UNIX) &&
(CIFS_UNIX_POSIX_PATH_OPS_CAP & (CIFS_UNIX_POSIX_PATH_OPS_CAP &
le64_to_cpu(pTcon->fsUnixInfo.Capability))) { le64_to_cpu(pTcon->fsUnixInfo.Capability))) {
...@@ -909,7 +905,7 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode) ...@@ -909,7 +905,7 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
rc = -ENOMEM; rc = -ENOMEM;
goto mkdir_out; goto mkdir_out;
} }
rc = CIFSPOSIXCreate(xid, pTcon, SMB_O_DIRECTORY | SMB_O_CREAT, rc = CIFSPOSIXCreate(xid, pTcon, SMB_O_DIRECTORY | SMB_O_CREAT,
mode, NULL /* netfid */, pInfo, &oplock, mode, NULL /* netfid */, pInfo, &oplock,
full_path, cifs_sb->local_nls, full_path, cifs_sb->local_nls,
...@@ -963,7 +959,7 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode) ...@@ -963,7 +959,7 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
kfree(pInfo); kfree(pInfo);
goto mkdir_out; goto mkdir_out;
} }
/* BB add setting the equivalent of mode via CreateX w/ACLs */ /* BB add setting the equivalent of mode via CreateX w/ACLs */
rc = CIFSSMBMkDir(xid, pTcon, full_path, cifs_sb->local_nls, rc = CIFSSMBMkDir(xid, pTcon, full_path, cifs_sb->local_nls,
cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
...@@ -1316,7 +1312,7 @@ int cifs_revalidate(struct dentry *direntry) ...@@ -1316,7 +1312,7 @@ int cifs_revalidate(struct dentry *direntry)
} }
} }
/* mutex_unlock(&direntry->d_inode->i_mutex); */ /* mutex_unlock(&direntry->d_inode->i_mutex); */
kfree(full_path); kfree(full_path);
FreeXid(xid); FreeXid(xid);
return rc; return rc;
...@@ -1433,7 +1429,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs) ...@@ -1433,7 +1429,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
} else } else
rc = 0; rc = 0;
} }
full_path = build_path_from_dentry(direntry); full_path = build_path_from_dentry(direntry);
if (full_path == NULL) { if (full_path == NULL) {
FreeXid(xid); FreeXid(xid);
...@@ -1588,7 +1584,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs) ...@@ -1588,7 +1584,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
stamps are changed explicitly (i.e. by utime() stamps are changed explicitly (i.e. by utime()
since we would then have a mix of client and since we would then have a mix of client and
server times */ server times */
if (set_time && (attrs->ia_valid & ATTR_CTIME)) { if (set_time && (attrs->ia_valid & ATTR_CTIME)) {
set_time = TRUE; set_time = TRUE;
/* Although Samba throws this field away /* Although Samba throws this field away
......
...@@ -274,7 +274,6 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen) ...@@ -274,7 +274,6 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen)
else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) { else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) {
cERROR(1, ("SFU style symlinks not implemented yet")); cERROR(1, ("SFU style symlinks not implemented yet"));
/* add open and read as in fs/cifs/inode.c */ /* add open and read as in fs/cifs/inode.c */
} else { } else {
rc = CIFSSMBOpen(xid, pTcon, full_path, FILE_OPEN, GENERIC_READ, rc = CIFSSMBOpen(xid, pTcon, full_path, FILE_OPEN, GENERIC_READ,
OPEN_REPARSE_POINT, &fid, &oplock, NULL, OPEN_REPARSE_POINT, &fid, &oplock, NULL,
...@@ -315,7 +314,9 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen) ...@@ -315,7 +314,9 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen)
num_referrals)); num_referrals));
if (referrals) { if (referrals) {
cFYI(1,("referral string: %s", referrals)); cFYI(1,("referral string: %s", referrals));
strncpy(tmpbuffer, referrals, len-1); strncpy(tmpbuffer,
referrals,
len-1);
} }
} }
kfree(referrals); kfree(referrals);
......
...@@ -4,17 +4,17 @@ ...@@ -4,17 +4,17 @@
a implementation of MD4 designed for use in the SMB authentication protocol a implementation of MD4 designed for use in the SMB authentication protocol
Copyright (C) Andrew Tridgell 1997-1998. Copyright (C) Andrew Tridgell 1997-1998.
Modified by Steve French (sfrench@us.ibm.com) 2002-2003 Modified by Steve French (sfrench@us.ibm.com) 2002-2003
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or the Free Software Foundation; either version 2 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
......
...@@ -47,8 +47,10 @@ _GetXid(void) ...@@ -47,8 +47,10 @@ _GetXid(void)
spin_lock(&GlobalMid_Lock); spin_lock(&GlobalMid_Lock);
GlobalTotalActiveXid++; GlobalTotalActiveXid++;
/* keep high water mark for number of simultaneous ops in filesystem */
if (GlobalTotalActiveXid > GlobalMaxActiveXid) if (GlobalTotalActiveXid > GlobalMaxActiveXid)
GlobalMaxActiveXid = GlobalTotalActiveXid; /* keep high water mark for number of simultaneous vfs ops in our filesystem */ GlobalMaxActiveXid = GlobalTotalActiveXid;
if (GlobalTotalActiveXid > 65000) if (GlobalTotalActiveXid > 65000)
cFYI(1, ("warning: more than 65000 requests active")); cFYI(1, ("warning: more than 65000 requests active"));
xid = GlobalCurrentXid++; xid = GlobalCurrentXid++;
...@@ -148,8 +150,8 @@ cifs_buf_get(void) ...@@ -148,8 +150,8 @@ cifs_buf_get(void)
but it may be more efficient to always alloc same size but it may be more efficient to always alloc same size
albeit slightly larger than necessary and maxbuffersize albeit slightly larger than necessary and maxbuffersize
defaults to this and can not be bigger */ defaults to this and can not be bigger */
ret_buf = ret_buf = (struct smb_hdr *) mempool_alloc(cifs_req_poolp,
(struct smb_hdr *) mempool_alloc(cifs_req_poolp, GFP_KERNEL | GFP_NOFS); GFP_KERNEL | GFP_NOFS);
/* clear the first few header bytes */ /* clear the first few header bytes */
/* for most paths, more is cleared in header_assemble */ /* for most paths, more is cleared in header_assemble */
...@@ -187,8 +189,8 @@ cifs_small_buf_get(void) ...@@ -187,8 +189,8 @@ cifs_small_buf_get(void)
but it may be more efficient to always alloc same size but it may be more efficient to always alloc same size
albeit slightly larger than necessary and maxbuffersize albeit slightly larger than necessary and maxbuffersize
defaults to this and can not be bigger */ defaults to this and can not be bigger */
ret_buf = ret_buf = (struct smb_hdr *) mempool_alloc(cifs_sm_req_poolp,
(struct smb_hdr *) mempool_alloc(cifs_sm_req_poolp, GFP_KERNEL | GFP_NOFS); GFP_KERNEL | GFP_NOFS);
if (ret_buf) { if (ret_buf) {
/* No need to clear memory here, cleared in header assemble */ /* No need to clear memory here, cleared in header assemble */
/* memset(ret_buf, 0, sizeof(struct smb_hdr) + 27);*/ /* memset(ret_buf, 0, sizeof(struct smb_hdr) + 27);*/
......
...@@ -816,7 +816,7 @@ map_smb_to_linux_error(struct smb_hdr *smb) ...@@ -816,7 +816,7 @@ map_smb_to_linux_error(struct smb_hdr *smb)
cFYI(1, (" !!Mapping smb error code %d to POSIX err %d !!", cFYI(1, (" !!Mapping smb error code %d to POSIX err %d !!",
smberrcode, rc)); smberrcode, rc));
/* generic corrective action e.g. reconnect SMB session on /* generic corrective action e.g. reconnect SMB session on
* ERRbaduid could be added */ * ERRbaduid could be added */
return rc; return rc;
......
...@@ -6,17 +6,17 @@ ...@@ -6,17 +6,17 @@
Copyright (C) John H Terpstra 1996-2000 Copyright (C) John H Terpstra 1996-2000
Copyright (C) Luke Kenneth Casson Leighton 1996-2000 Copyright (C) Luke Kenneth Casson Leighton 1996-2000
Copyright (C) Paul Ashton 1998-2000 Copyright (C) Paul Ashton 1998-2000
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or the Free Software Foundation; either version 2 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
......
...@@ -51,7 +51,6 @@ static void dump_cifs_file_struct(struct file *file, char *label) ...@@ -51,7 +51,6 @@ static void dump_cifs_file_struct(struct file *file, char *label)
if (cf->srch_inf.emptyDir) { if (cf->srch_inf.emptyDir) {
cFYI(1, ("empty dir")); cFYI(1, ("empty dir"));
} }
} }
} }
#endif /* DEBUG2 */ #endif /* DEBUG2 */
...@@ -255,7 +254,6 @@ static void fill_in_inode(struct inode *tmp_inode, int new_buf_type, ...@@ -255,7 +254,6 @@ static void fill_in_inode(struct inode *tmp_inode, int new_buf_type,
tmp_inode->i_fop = &cifs_file_direct_nobrl_ops; tmp_inode->i_fop = &cifs_file_direct_nobrl_ops;
else else
tmp_inode->i_fop = &cifs_file_direct_ops; tmp_inode->i_fop = &cifs_file_direct_ops;
} else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
tmp_inode->i_fop = &cifs_file_nobrl_ops; tmp_inode->i_fop = &cifs_file_nobrl_ops;
else else
...@@ -644,11 +642,11 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon, ...@@ -644,11 +642,11 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon,
loff_t index_to_find = file->f_pos; loff_t index_to_find = file->f_pos;
struct cifsFileInfo *cifsFile = file->private_data; struct cifsFileInfo *cifsFile = file->private_data;
/* check if index in the buffer */ /* check if index in the buffer */
if ((cifsFile == NULL) || (ppCurrentEntry == NULL) || if ((cifsFile == NULL) || (ppCurrentEntry == NULL) ||
(num_to_ret == NULL)) (num_to_ret == NULL))
return -ENOENT; return -ENOENT;
*ppCurrentEntry = NULL; *ppCurrentEntry = NULL;
first_entry_in_buffer = first_entry_in_buffer =
cifsFile->srch_inf.index_of_last_entry - cifsFile->srch_inf.index_of_last_entry -
...@@ -712,7 +710,7 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon, ...@@ -712,7 +710,7 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon,
pos_in_buf = index_to_find - first_entry_in_buffer; pos_in_buf = index_to_find - first_entry_in_buffer;
cFYI(1, ("found entry - pos_in_buf %d", pos_in_buf)); cFYI(1, ("found entry - pos_in_buf %d", pos_in_buf));
for (i=0;(i<(pos_in_buf)) && (current_entry != NULL);i++) { for (i=0; (i < (pos_in_buf)) && (current_entry != NULL); i++) {
/* go entry by entry figuring out which is first */ /* go entry by entry figuring out which is first */
current_entry = nxt_dir_entry(current_entry, end_of_smb, current_entry = nxt_dir_entry(current_entry, end_of_smb,
cifsFile->srch_inf.info_level); cifsFile->srch_inf.info_level);
...@@ -839,7 +837,7 @@ static int cifs_filldir(char *pfindEntry, struct file *file, ...@@ -839,7 +837,7 @@ static int cifs_filldir(char *pfindEntry, struct file *file,
return -EINVAL; return -EINVAL;
pCifsF = file->private_data; pCifsF = file->private_data;
if ((scratch_buf == NULL) || (pfindEntry == NULL) || (pCifsF == NULL)) if ((scratch_buf == NULL) || (pfindEntry == NULL) || (pCifsF == NULL))
return -ENOENT; return -ENOENT;
...@@ -892,7 +890,7 @@ static int cifs_filldir(char *pfindEntry, struct file *file, ...@@ -892,7 +890,7 @@ static int cifs_filldir(char *pfindEntry, struct file *file,
if (rc == 2) if (rc == 2)
d_rehash(tmp_dentry); d_rehash(tmp_dentry);
} }
rc = filldir(direntry, qstring.name, qstring.len, file->f_pos, rc = filldir(direntry, qstring.name, qstring.len, file->f_pos,
tmp_inode->i_ino, obj_type); tmp_inode->i_ino, obj_type);
...@@ -951,7 +949,7 @@ static int cifs_save_resume_key(const char *current_entry, ...@@ -951,7 +949,7 @@ static int cifs_save_resume_key(const char *current_entry,
len = le32_to_cpu(pFindData->FileNameLength); len = le32_to_cpu(pFindData->FileNameLength);
cifsFile->srch_inf.resume_key = pFindData->FileIndex; cifsFile->srch_inf.resume_key = pFindData->FileIndex;
} else if (level == SMB_FIND_FILE_BOTH_DIRECTORY_INFO) { } else if (level == SMB_FIND_FILE_BOTH_DIRECTORY_INFO) {
FILE_BOTH_DIRECTORY_INFO *pFindData = FILE_BOTH_DIRECTORY_INFO *pFindData =
(FILE_BOTH_DIRECTORY_INFO *)current_entry; (FILE_BOTH_DIRECTORY_INFO *)current_entry;
filename = &pFindData->FileName[0]; filename = &pFindData->FileName[0];
len = le32_to_cpu(pFindData->FileNameLength); len = le32_to_cpu(pFindData->FileNameLength);
...@@ -982,7 +980,7 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir) ...@@ -982,7 +980,7 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir)
char *current_entry; char *current_entry;
int num_to_fill = 0; int num_to_fill = 0;
char *tmp_buf = NULL; char *tmp_buf = NULL;
char * end_of_smb; char *end_of_smb;
int max_len; int max_len;
xid = GetXid(); xid = GetXid();
......
...@@ -191,7 +191,7 @@ static int decode_unicode_ssetup(char **pbcc_area, int bleft, ...@@ -191,7 +191,7 @@ static int decode_unicode_ssetup(char **pbcc_area, int bleft,
their final Unicode string - in which case we their final Unicode string - in which case we
now will not attempt to decode the byte of junk now will not attempt to decode the byte of junk
which follows it */ which follows it */
words_left = bleft / 2; words_left = bleft / 2;
/* save off server operating system */ /* save off server operating system */
...@@ -266,11 +266,11 @@ static int decode_ascii_ssetup(char **pbcc_area, int bleft, ...@@ -266,11 +266,11 @@ static int decode_ascii_ssetup(char **pbcc_area, int bleft,
char *bcc_ptr = *pbcc_area; char *bcc_ptr = *pbcc_area;
cFYI(1, ("decode sessetup ascii. bleft %d", bleft)); cFYI(1, ("decode sessetup ascii. bleft %d", bleft));
len = strnlen(bcc_ptr, bleft); len = strnlen(bcc_ptr, bleft);
if (len >= bleft) if (len >= bleft)
return rc; return rc;
if (ses->serverOS) if (ses->serverOS)
kfree(ses->serverOS); kfree(ses->serverOS);
...@@ -412,7 +412,7 @@ CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time, ...@@ -412,7 +412,7 @@ CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time,
cpu_to_le16(CIFS_SESS_KEY_SIZE); cpu_to_le16(CIFS_SESS_KEY_SIZE);
pSMB->req_no_secext.CaseSensitivePasswordLength = pSMB->req_no_secext.CaseSensitivePasswordLength =
cpu_to_le16(CIFS_SESS_KEY_SIZE); cpu_to_le16(CIFS_SESS_KEY_SIZE);
/* calculate session key */ /* calculate session key */
SMBNTencrypt(ses->password, ses->server->cryptKey, SMBNTencrypt(ses->password, ses->server->cryptKey,
ntlm_session_key); ntlm_session_key);
...@@ -536,7 +536,7 @@ CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time, ...@@ -536,7 +536,7 @@ CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time,
ses, nls_cp); ses, nls_cp);
else else
rc = decode_ascii_ssetup(&bcc_ptr, bytes_remaining, ses,nls_cp); rc = decode_ascii_ssetup(&bcc_ptr, bytes_remaining, ses,nls_cp);
ssetup_exit: ssetup_exit:
kfree(str_area); kfree(str_area);
if (resp_buf_type == CIFS_SMALL_BUFFER) { if (resp_buf_type == CIFS_SMALL_BUFFER) {
......
...@@ -7,17 +7,17 @@ ...@@ -7,17 +7,17 @@
Copyright (C) Andrew Tridgell 1998 Copyright (C) Andrew Tridgell 1998
Modified by Steve French (sfrench@us.ibm.com) 2002,2004 Modified by Steve French (sfrench@us.ibm.com) 2002,2004
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or the Free Software Foundation; either version 2 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
......
...@@ -7,17 +7,17 @@ ...@@ -7,17 +7,17 @@
Modified by Jeremy Allison 1995. Modified by Jeremy Allison 1995.
Copyright (C) Andrew Bartlett <abartlet@samba.org> 2002-2003 Copyright (C) Andrew Bartlett <abartlet@samba.org> 2002-2003
Modified by Steve French (sfrench@us.ibm.com) 2002-2003 Modified by Steve French (sfrench@us.ibm.com) 2002-2003
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or the Free Software Foundation; either version 2 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
...@@ -73,7 +73,7 @@ SMBencrypt(unsigned char *passwd, unsigned char *c8, unsigned char *p24) ...@@ -73,7 +73,7 @@ SMBencrypt(unsigned char *passwd, unsigned char *c8, unsigned char *p24)
E_P16(p14, p21); E_P16(p14, p21);
SMBOWFencrypt(p21, c8, p24); SMBOWFencrypt(p21, c8, p24);
memset(p14, 0, 15); memset(p14, 0, 15);
memset(p21, 0, 21); memset(p21, 0, 21);
} }
...@@ -178,8 +178,8 @@ ntv2_owf_gen(const unsigned char owf[16], const char *user_n, ...@@ -178,8 +178,8 @@ ntv2_owf_gen(const unsigned char owf[16], const char *user_n,
const char *domain_n, unsigned char kr_buf[16], const char *domain_n, unsigned char kr_buf[16],
const struct nls_table *nls_codepage) const struct nls_table *nls_codepage)
{ {
wchar_t * user_u; wchar_t *user_u;
wchar_t * dom_u; wchar_t *dom_u;
int user_l, domain_l; int user_l, domain_l;
struct HMACMD5Context ctx; struct HMACMD5Context ctx;
...@@ -188,7 +188,7 @@ ntv2_owf_gen(const unsigned char owf[16], const char *user_n, ...@@ -188,7 +188,7 @@ ntv2_owf_gen(const unsigned char owf[16], const char *user_n,
if (user_u == NULL) if (user_u == NULL)
return; return;
dom_u = user_u + 1024; dom_u = user_u + 1024;
/* push_ucs2(NULL, user_u, user_n, (user_l+1)*2, STR_UNICODE|STR_NOALIGN|STR_TERMINATE|STR_UPPER); /* push_ucs2(NULL, user_u, user_n, (user_l+1)*2, STR_UNICODE|STR_NOALIGN|STR_TERMINATE|STR_UPPER);
push_ucs2(NULL, dom_u, domain_n, (domain_l+1)*2, STR_UNICODE|STR_NOALIGN|STR_TERMINATE|STR_UPPER); */ push_ucs2(NULL, dom_u, domain_n, (domain_l+1)*2, STR_UNICODE|STR_NOALIGN|STR_TERMINATE|STR_UPPER); */
......
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
#include "cifsglob.h" #include "cifsglob.h"
#include "cifsproto.h" #include "cifsproto.h"
#include "cifs_debug.h" #include "cifs_debug.h"
extern mempool_t *cifs_mid_poolp; extern mempool_t *cifs_mid_poolp;
extern struct kmem_cache *cifs_oplock_cachep; extern struct kmem_cache *cifs_oplock_cachep;
...@@ -49,7 +49,7 @@ AllocMidQEntry(const struct smb_hdr *smb_buffer, struct cifsSesInfo *ses) ...@@ -49,7 +49,7 @@ AllocMidQEntry(const struct smb_hdr *smb_buffer, struct cifsSesInfo *ses)
cERROR(1, ("Null TCP session in AllocMidQEntry")); cERROR(1, ("Null TCP session in AllocMidQEntry"));
return NULL; return NULL;
} }
temp = (struct mid_q_entry *) mempool_alloc(cifs_mid_poolp, temp = (struct mid_q_entry *) mempool_alloc(cifs_mid_poolp,
GFP_KERNEL | GFP_NOFS); GFP_KERNEL | GFP_NOFS);
if (temp == NULL) if (temp == NULL)
...@@ -223,7 +223,7 @@ smb_send2(struct socket *ssocket, struct kvec *iov, int n_vec, ...@@ -223,7 +223,7 @@ smb_send2(struct socket *ssocket, struct kvec *iov, int n_vec,
unsigned int total_len; unsigned int total_len;
int first_vec = 0; int first_vec = 0;
unsigned int smb_buf_length = smb_buffer->smb_buf_length; unsigned int smb_buf_length = smb_buffer->smb_buf_length;
if (ssocket == NULL) if (ssocket == NULL)
return -ENOTSOCK; /* BB eventually add reconnect code here */ return -ENOTSOCK; /* BB eventually add reconnect code here */
...@@ -335,7 +335,7 @@ static int wait_for_free_request(struct cifsSesInfo *ses, const int long_op) ...@@ -335,7 +335,7 @@ static int wait_for_free_request(struct cifsSesInfo *ses, const int long_op)
/* can not count locking commands against total /* can not count locking commands against total
as they are allowed to block on server */ as they are allowed to block on server */
/* update # of requests on the wire to server */ /* update # of requests on the wire to server */
if (long_op < 3) if (long_op < 3)
atomic_inc(&ses->server->inFlight); atomic_inc(&ses->server->inFlight);
...@@ -426,7 +426,7 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses, ...@@ -426,7 +426,7 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses,
unsigned long timeout; unsigned long timeout;
struct mid_q_entry *midQ; struct mid_q_entry *midQ;
struct smb_hdr *in_buf = iov[0].iov_base; struct smb_hdr *in_buf = iov[0].iov_base;
*pRespBufType = CIFS_NO_BUFFER; /* no response buf yet */ *pRespBufType = CIFS_NO_BUFFER; /* no response buf yet */
if ((ses == NULL) || (ses->server == NULL)) { if ((ses == NULL) || (ses->server == NULL)) {
...@@ -537,7 +537,7 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses, ...@@ -537,7 +537,7 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses,
wake_up(&ses->server->request_q); wake_up(&ses->server->request_q);
return rc; return rc;
} }
if (receive_len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE) { if (receive_len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE) {
cERROR(1, ("Frame too large received. Length: %d Xid: %d", cERROR(1, ("Frame too large received. Length: %d Xid: %d",
receive_len, xid)); receive_len, xid));
...@@ -718,7 +718,7 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses, ...@@ -718,7 +718,7 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses,
wake_up(&ses->server->request_q); wake_up(&ses->server->request_q);
return rc; return rc;
} }
if (receive_len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE) { if (receive_len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE) {
cERROR(1, ("Frame too large received. Length: %d Xid: %d", cERROR(1, ("Frame too large received. Length: %d Xid: %d",
receive_len, xid)); receive_len, xid));
...@@ -962,7 +962,7 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifsTconInfo *tcon, ...@@ -962,7 +962,7 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifsTconInfo *tcon,
DeleteMidQEntry(midQ); DeleteMidQEntry(midQ);
return rc; return rc;
} }
if (receive_len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE) { if (receive_len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE) {
cERROR(1, ("Frame too large received. Length: %d Xid: %d", cERROR(1, ("Frame too large received. Length: %d Xid: %d",
receive_len, xid)); receive_len, xid));
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
#define XATTR_TRUSTED_PREFIX_LEN 8 #define XATTR_TRUSTED_PREFIX_LEN 8
#define XATTR_SECURITY_PREFIX_LEN 9 #define XATTR_SECURITY_PREFIX_LEN 9
/* BB need to add server (Samba e.g) support for security and trusted prefix */ /* BB need to add server (Samba e.g) support for security and trusted prefix */
int cifs_removexattr(struct dentry *direntry, const char *ea_name) int cifs_removexattr(struct dentry *direntry, const char *ea_name)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment