mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 03:06:10 +00:00
[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: Steve French <sfrench@us.ibm.com>
This commit is contained in:
parent
7521a3c566
commit
50c2f75388
27 changed files with 1285 additions and 1160 deletions
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
/*
|
||||
* 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
|
||||
*
|
||||
*
|
||||
* Copyright (c) 2000 RP Internet (www.rpi.net.au).
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@ -80,7 +80,7 @@
|
|||
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 };
|
||||
|
||||
/*
|
||||
/*
|
||||
* ASN.1 context.
|
||||
*/
|
||||
struct asn1_ctx {
|
||||
|
@ -190,7 +190,7 @@ asn1_header_decode(struct asn1_ctx *ctx,
|
|||
unsigned char **eoc,
|
||||
unsigned int *cls, unsigned int *con, unsigned int *tag)
|
||||
{
|
||||
unsigned int def = 0;
|
||||
unsigned int def = 0;
|
||||
unsigned int len = 0;
|
||||
|
||||
if (!asn1_id_decode(ctx, cls, con, tag))
|
||||
|
@ -331,7 +331,7 @@ static unsigned char asn1_ulong_decode(struct asn1_ctx *ctx,
|
|||
*integer |= ch;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
static unsigned char
|
||||
asn1_octets_decode(struct asn1_ctx *ctx,
|
||||
|
@ -376,7 +376,7 @@ asn1_subid_decode(struct asn1_ctx *ctx, unsigned long *subid)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
static int
|
||||
asn1_oid_decode(struct asn1_ctx *ctx,
|
||||
unsigned char *eoc, unsigned long **oid, unsigned int *len)
|
||||
{
|
||||
|
@ -459,7 +459,7 @@ decode_negTokenInit(unsigned char *security_blob, int length,
|
|||
unsigned int cls, con, tag, oidlen, rc;
|
||||
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); */
|
||||
|
||||
|
@ -498,7 +498,8 @@ decode_negTokenInit(unsigned char *security_blob, int length,
|
|||
return 0;
|
||||
} else if ((cls != ASN1_CTX) || (con != ASN1_CON)
|
||||
|| (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));
|
||||
return 0;
|
||||
}
|
||||
|
@ -508,7 +509,8 @@ decode_negTokenInit(unsigned char *security_blob, int length,
|
|||
return 0;
|
||||
} else if ((cls != ASN1_UNI) || (con != ASN1_CON)
|
||||
|| (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));
|
||||
return 0;
|
||||
}
|
||||
|
@ -540,32 +542,34 @@ decode_negTokenInit(unsigned char *security_blob, int length,
|
|||
rc = asn1_header_decode(&ctx, &end, &cls, &con, &tag);
|
||||
if (!rc) {
|
||||
cFYI(1,
|
||||
("Error 1 decoding negTokenInit header exit 2"));
|
||||
("Error decoding negTokenInit hdr exit2"));
|
||||
return 0;
|
||||
}
|
||||
if ((tag == ASN1_OJI) && (con == ASN1_PRI)) {
|
||||
rc = asn1_oid_decode(&ctx, end, &oid, &oidlen);
|
||||
if(rc) {
|
||||
if (rc) {
|
||||
cFYI(1,
|
||||
("OID len = %d oid = 0x%lx 0x%lx 0x%lx 0x%lx",
|
||||
oidlen, *oid, *(oid + 1), *(oid + 2),
|
||||
*(oid + 3)));
|
||||
rc = compare_oid(oid, oidlen, NTLMSSP_OID,
|
||||
NTLMSSP_OID_LEN);
|
||||
("OID len = %d oid = 0x%lx 0x%lx "
|
||||
"0x%lx 0x%lx",
|
||||
oidlen, *oid, *(oid + 1),
|
||||
*(oid + 2), *(oid + 3)));
|
||||
rc = compare_oid(oid, oidlen,
|
||||
NTLMSSP_OID, NTLMSSP_OID_LEN);
|
||||
kfree(oid);
|
||||
if (rc)
|
||||
use_ntlmssp = TRUE;
|
||||
}
|
||||
} 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) {
|
||||
cFYI(1,
|
||||
("Error decoding last part of negTokenInit exit 3"));
|
||||
("Error decoding last part negTokenInit exit3"));
|
||||
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,
|
||||
("Exit 4 cls = %d con = %d tag = %d end = %p (%d)",
|
||||
cls, con, tag, end, *end));
|
||||
|
@ -573,7 +577,7 @@ decode_negTokenInit(unsigned char *security_blob, int length,
|
|||
}
|
||||
if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) {
|
||||
cFYI(1,
|
||||
("Error decoding last part of negTokenInit exit 5"));
|
||||
("Error decoding last part negTokenInit exit5"));
|
||||
return 0;
|
||||
} else if ((cls != ASN1_UNI) || (con != ASN1_CON)
|
||||
|| (tag != ASN1_SEQ)) {
|
||||
|
@ -584,7 +588,7 @@ decode_negTokenInit(unsigned char *security_blob, int length,
|
|||
|
||||
if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) {
|
||||
cFYI(1,
|
||||
("Error decoding last part of negTokenInit exit 7"));
|
||||
("Error decoding last part negTokenInit exit 7"));
|
||||
return 0;
|
||||
} else if ((cls != ASN1_CTX) || (con != ASN1_CON)) {
|
||||
cFYI(1,
|
||||
|
@ -594,20 +598,21 @@ decode_negTokenInit(unsigned char *security_blob, int length,
|
|||
}
|
||||
if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) {
|
||||
cFYI(1,
|
||||
("Error decoding last part of negTokenInit exit 9"));
|
||||
("Error decoding last part negTokenInit exit9"));
|
||||
return 0;
|
||||
} else if ((cls != ASN1_UNI) || (con != ASN1_PRI)
|
||||
|| (tag != ASN1_GENSTR)) {
|
||||
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));
|
||||
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)
|
||||
*secType = Kerberos
|
||||
/* if (use_kerberos)
|
||||
*secType = Kerberos
|
||||
else */
|
||||
if (use_ntlmssp) {
|
||||
*secType = NTLMSSP;
|
||||
|
|
|
@ -145,7 +145,6 @@ cifs_debug_data_read(char *buf, char **beginBuffer, off_t offset,
|
|||
(ses->serverNOS == NULL)) {
|
||||
buf += sprintf(buf, "\nentry for %s not fully "
|
||||
"displayed\n\t", ses->serverName);
|
||||
|
||||
} else {
|
||||
length =
|
||||
sprintf(buf,
|
||||
|
|
|
@ -43,6 +43,6 @@ struct cifs_sb_info {
|
|||
mode_t mnt_dir_mode;
|
||||
int mnt_cifs_flags;
|
||||
int prepathlen;
|
||||
char * prepath;
|
||||
char *prepath;
|
||||
};
|
||||
#endif /* _CIFS_FS_SB_H */
|
||||
|
|
|
@ -66,7 +66,7 @@ cifs_strtoUCS(__le16 * to, const char *from, int len,
|
|||
{
|
||||
int charlen;
|
||||
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) {
|
||||
|
||||
|
|
|
@ -70,7 +70,7 @@ int cifs_strtoUCS(__le16 *, const char *, int, const struct nls_table *);
|
|||
* Address of the first string
|
||||
*/
|
||||
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 */
|
||||
|
||||
|
@ -88,7 +88,7 @@ UniStrcat(wchar_t * ucs1, const wchar_t * ucs2)
|
|||
* or NULL if the character is not in the string
|
||||
*/
|
||||
static inline wchar_t *
|
||||
UniStrchr(const wchar_t * ucs, wchar_t uc)
|
||||
UniStrchr(const wchar_t *ucs, wchar_t uc)
|
||||
{
|
||||
while ((*ucs != uc) && *ucs)
|
||||
ucs++;
|
||||
|
@ -107,7 +107,7 @@ UniStrchr(const wchar_t * ucs, wchar_t uc)
|
|||
* > 0: First string is greater than second
|
||||
*/
|
||||
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) {
|
||||
ucs1++;
|
||||
|
@ -120,7 +120,7 @@ UniStrcmp(const wchar_t * ucs1, const wchar_t * ucs2)
|
|||
* UniStrcpy: Copy a string
|
||||
*/
|
||||
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 */
|
||||
|
||||
|
@ -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)
|
||||
*/
|
||||
static inline size_t
|
||||
UniStrlen(const wchar_t * ucs1)
|
||||
UniStrlen(const wchar_t *ucs1)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
|
@ -146,7 +146,7 @@ UniStrlen(const wchar_t * ucs1)
|
|||
* string (length limited)
|
||||
*/
|
||||
static inline size_t
|
||||
UniStrnlen(const wchar_t * ucs1, int maxlen)
|
||||
UniStrnlen(const wchar_t *ucs1, int maxlen)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
|
@ -162,7 +162,7 @@ UniStrnlen(const wchar_t * ucs1, int maxlen)
|
|||
* UniStrncat: Concatenate length limited string
|
||||
*/
|
||||
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 */
|
||||
|
||||
|
@ -180,7 +180,7 @@ UniStrncat(wchar_t * ucs1, const wchar_t * ucs2, size_t n)
|
|||
* UniStrncmp: Compare length limited string
|
||||
*/
|
||||
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)
|
||||
return 0; /* Null strings are equal */
|
||||
|
@ -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
|
||||
*/
|
||||
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)
|
||||
return 0; /* Null strings are equal */
|
||||
|
@ -210,7 +210,7 @@ UniStrncmp_le(const wchar_t * ucs1, const wchar_t * ucs2, size_t n)
|
|||
* UniStrncpy: Copy length limited string with pad
|
||||
*/
|
||||
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;
|
||||
|
||||
|
@ -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
|
||||
*/
|
||||
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;
|
||||
|
||||
|
@ -248,7 +248,7 @@ UniStrncpy_le(wchar_t * ucs1, const wchar_t * ucs2, size_t n)
|
|||
* NULL if no matching string is found
|
||||
*/
|
||||
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 *anchor2 = ucs2;
|
||||
|
@ -298,7 +298,7 @@ UniToupper(register wchar_t uc)
|
|||
* UniStrupr: Upper case a unicode string
|
||||
*/
|
||||
static inline wchar_t *
|
||||
UniStrupr(register wchar_t * upin)
|
||||
UniStrupr(register wchar_t *upin)
|
||||
{
|
||||
register wchar_t *up;
|
||||
|
||||
|
@ -339,7 +339,7 @@ UniTolower(wchar_t uc)
|
|||
* UniStrlwr: Lower case a unicode string
|
||||
*/
|
||||
static inline wchar_t *
|
||||
UniStrlwr(register wchar_t * upin)
|
||||
UniStrlwr(register wchar_t *upin)
|
||||
{
|
||||
register wchar_t *up;
|
||||
|
||||
|
|
|
@ -5,14 +5,14 @@
|
|||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
* the GNU General Public License for more details.
|
||||
*
|
||||
* 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
|
||||
*
|
||||
* uniupr.h - Unicode compressed case ranges
|
||||
|
@ -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 */
|
||||
-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 */
|
||||
-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, 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);
|
|||
extern void E_md4hash(const unsigned char *passwd, unsigned char *p16);
|
||||
extern void SMBencrypt(unsigned char *passwd, unsigned char *c8,
|
||||
unsigned char *p24);
|
||||
|
||||
|
||||
static int cifs_calculate_signature(const struct smb_hdr *cifs_pdu,
|
||||
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,
|
|||
return rc;
|
||||
|
||||
spin_lock(&GlobalMid_Lock);
|
||||
cifs_pdu->Signature.Sequence.SequenceNumber =
|
||||
cpu_to_le32(server->sequence_number);
|
||||
cifs_pdu->Signature.Sequence.SequenceNumber =
|
||||
cpu_to_le32(server->sequence_number);
|
||||
cifs_pdu->Signature.Sequence.Reserved = 0;
|
||||
|
||||
|
||||
*pexpected_response_sequence_number = server->sequence_number++;
|
||||
server->sequence_number++;
|
||||
spin_unlock(&GlobalMid_Lock);
|
||||
|
@ -98,9 +98,9 @@ static int cifs_calc_signature2(const struct kvec *iov, int n_vec,
|
|||
|
||||
MD5Init(&context);
|
||||
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) {
|
||||
cERROR(1 ,("null iovec entry"));
|
||||
cERROR(1, ("null iovec entry"));
|
||||
return -EIO;
|
||||
} else if (iov[i].iov_len == 0)
|
||||
break; /* bail out if we are sent nothing to sign */
|
||||
|
@ -167,36 +167,38 @@ int cifs_verify_signature(struct smb_hdr *cifs_pdu,
|
|||
return 0;
|
||||
|
||||
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;
|
||||
if (pSMB->LockType & LOCKING_ANDX_OPLOCK_RELEASE)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* BB what if signatures are supposed to be on for session but server does not
|
||||
send one? BB */
|
||||
|
||||
/* BB what if signatures are supposed to be on for session but
|
||||
server does not send one? BB */
|
||||
|
||||
/* Do not need to verify session setups with signature "BSRSPYL " */
|
||||
if(memcmp(cifs_pdu->Signature.SecuritySignature,"BSRSPYL ",8)==0)
|
||||
cFYI(1,("dummy signature received for smb command 0x%x",cifs_pdu->Command));
|
||||
if (memcmp(cifs_pdu->Signature.SecuritySignature, "BSRSPYL ", 8) == 0)
|
||||
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
|
||||
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;
|
||||
|
||||
rc = cifs_calculate_signature(cifs_pdu, mac_key,
|
||||
what_we_think_sig_should_be);
|
||||
|
||||
if(rc)
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
|
||||
/* cifs_dump_mem("what we think it should be: ",what_we_think_sig_should_be,16); */
|
||||
/* cifs_dump_mem("what we think it should be: ",
|
||||
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;
|
||||
else
|
||||
return 0;
|
||||
|
@ -218,30 +220,30 @@ int cifs_calculate_mac_key(struct mac_key *key, const char *rn,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int CalcNTLMv2_partial_mac_key(struct cifsSesInfo * ses,
|
||||
const struct nls_table * nls_info)
|
||||
int CalcNTLMv2_partial_mac_key(struct cifsSesInfo *ses,
|
||||
const struct nls_table *nls_info)
|
||||
{
|
||||
char temp_hash[16];
|
||||
struct HMACMD5Context ctx;
|
||||
char * ucase_buf;
|
||||
__le16 * unicode_buf;
|
||||
unsigned int i,user_name_len,dom_name_len;
|
||||
char *ucase_buf;
|
||||
__le16 *unicode_buf;
|
||||
unsigned int i, user_name_len, dom_name_len;
|
||||
|
||||
if(ses == NULL)
|
||||
if (ses == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
E_md4hash(ses->password, temp_hash);
|
||||
|
||||
hmac_md5_init_limK_to_64(temp_hash, 16, &ctx);
|
||||
user_name_len = strlen(ses->userName);
|
||||
if(user_name_len > MAX_USERNAME_SIZE)
|
||||
if (user_name_len > MAX_USERNAME_SIZE)
|
||||
return -EINVAL;
|
||||
if(ses->domainName == NULL)
|
||||
if (ses->domainName == NULL)
|
||||
return -EINVAL; /* BB should we use CIFS_LINUX_DOM */
|
||||
dom_name_len = strlen(ses->domainName);
|
||||
if (dom_name_len > MAX_USERNAME_SIZE)
|
||||
return -EINVAL;
|
||||
|
||||
|
||||
ucase_buf = kmalloc((MAX_USERNAME_SIZE+1), GFP_KERNEL);
|
||||
if (ucase_buf == NULL)
|
||||
return -ENOMEM;
|
||||
|
@ -250,18 +252,20 @@ int CalcNTLMv2_partial_mac_key(struct cifsSesInfo * ses,
|
|||
kfree(ucase_buf);
|
||||
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] = 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;
|
||||
user_name_len++;
|
||||
|
||||
for (i = 0; i < dom_name_len; i++)
|
||||
ucase_buf[i] = nls_info->charset2upper[(int)ses->domainName[i]];
|
||||
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;
|
||||
hmac_md5_update((const unsigned char *) unicode_buf,
|
||||
|
@ -274,21 +278,22 @@ int CalcNTLMv2_partial_mac_key(struct cifsSesInfo * ses,
|
|||
}
|
||||
|
||||
#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;
|
||||
char password_with_pad[CIFS_ENCPWD_SIZE];
|
||||
|
||||
if(ses->server == NULL)
|
||||
if (ses->server == NULL)
|
||||
return;
|
||||
|
||||
memset(password_with_pad, 0, CIFS_ENCPWD_SIZE);
|
||||
if(ses->password)
|
||||
if (ses->password)
|
||||
strncpy(password_with_pad, ses->password, CIFS_ENCPWD_SIZE);
|
||||
|
||||
if((ses->server->secMode & SECMODE_PW_ENCRYPT) == 0)
|
||||
if(extended_security & CIFSSEC_MAY_PLNTXT) {
|
||||
memcpy(lnm_session_key, password_with_pad, CIFS_ENCPWD_SIZE);
|
||||
if ((ses->server->secMode & SECMODE_PW_ENCRYPT) == 0)
|
||||
if (extended_security & CIFSSEC_MAY_PLNTXT) {
|
||||
memcpy(lnm_session_key, password_with_pad,
|
||||
CIFS_ENCPWD_SIZE);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
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]);
|
||||
}
|
||||
|
||||
|
@ -313,19 +318,19 @@ void calc_lanman_hash(struct cifsSesInfo * ses, char * lnm_session_key)
|
|||
}
|
||||
#endif /* CIFS_WEAK_PW_HASH */
|
||||
|
||||
static int calc_ntlmv2_hash(struct cifsSesInfo *ses,
|
||||
const struct nls_table * nls_cp)
|
||||
static int calc_ntlmv2_hash(struct cifsSesInfo *ses,
|
||||
const struct nls_table *nls_cp)
|
||||
{
|
||||
int rc = 0;
|
||||
int len;
|
||||
char nt_hash[16];
|
||||
struct HMACMD5Context * pctxt;
|
||||
wchar_t * user;
|
||||
wchar_t * domain;
|
||||
struct HMACMD5Context *pctxt;
|
||||
wchar_t *user;
|
||||
wchar_t *domain;
|
||||
|
||||
pctxt = kmalloc(sizeof(struct HMACMD5Context), GFP_KERNEL);
|
||||
|
||||
if(pctxt == NULL)
|
||||
if (pctxt == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
/* calculate md4 hash of password */
|
||||
|
@ -337,18 +342,18 @@ static int calc_ntlmv2_hash(struct cifsSesInfo *ses,
|
|||
/* convert ses->userName to unicode and uppercase */
|
||||
len = strlen(ses->userName);
|
||||
user = kmalloc(2 + (len * 2), GFP_KERNEL);
|
||||
if(user == NULL)
|
||||
if (user == NULL)
|
||||
goto calc_exit_2;
|
||||
len = cifs_strtoUCS(user, ses->userName, len, nls_cp);
|
||||
UniStrupr(user);
|
||||
hmac_md5_update((char *)user, 2*len, pctxt);
|
||||
|
||||
/* convert ses->domainName to unicode and uppercase */
|
||||
if(ses->domainName) {
|
||||
if (ses->domainName) {
|
||||
len = strlen(ses->domainName);
|
||||
|
||||
domain = kmalloc(2 + (len * 2), GFP_KERNEL);
|
||||
if(domain == NULL)
|
||||
domain = kmalloc(2 + (len * 2), GFP_KERNEL);
|
||||
if (domain == NULL)
|
||||
goto calc_exit_1;
|
||||
len = cifs_strtoUCS(domain, ses->domainName, len, nls_cp);
|
||||
/* the following line was removed since it didn't work well
|
||||
|
@ -357,24 +362,24 @@ static int calc_ntlmv2_hash(struct cifsSesInfo *ses,
|
|||
/* UniStrupr(domain); */
|
||||
|
||||
hmac_md5_update((char *)domain, 2*len, pctxt);
|
||||
|
||||
|
||||
kfree(domain);
|
||||
}
|
||||
calc_exit_1:
|
||||
kfree(user);
|
||||
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 */
|
||||
hmac_md5_final(ses->server->ntlmv2_hash, pctxt);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
void setup_ntlmv2_rsp(struct cifsSesInfo * ses, char * resp_buf,
|
||||
const struct nls_table * nls_cp)
|
||||
void setup_ntlmv2_rsp(struct cifsSesInfo *ses, char *resp_buf,
|
||||
const struct nls_table *nls_cp)
|
||||
{
|
||||
int rc;
|
||||
struct ntlmv2_resp * buf = (struct ntlmv2_resp *)resp_buf;
|
||||
struct ntlmv2_resp *buf = (struct ntlmv2_resp *)resp_buf;
|
||||
struct HMACMD5Context context;
|
||||
|
||||
buf->blob_signature = cpu_to_le32(0x00000101);
|
||||
|
@ -389,8 +394,8 @@ void setup_ntlmv2_rsp(struct cifsSesInfo * ses, char * resp_buf,
|
|||
|
||||
/* calculate buf->ntlmv2_hash */
|
||||
rc = calc_ntlmv2_hash(ses, nls_cp);
|
||||
if(rc)
|
||||
cERROR(1,("could not get v2 hash rc %d",rc));
|
||||
if (rc)
|
||||
cERROR(1, ("could not get v2 hash rc %d", rc));
|
||||
CalcNTLMv2_response(ses, resp_buf);
|
||||
|
||||
/* now calculate the MAC key for NTLMv2 */
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
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;
|
||||
/* 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_update(v2_session_response+8,
|
||||
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); */
|
||||
}
|
||||
|
|
|
@ -95,7 +95,7 @@ cifs_read_super(struct super_block *sb, void *data,
|
|||
struct inode *inode;
|
||||
struct cifs_sb_info *cifs_sb;
|
||||
int rc = 0;
|
||||
|
||||
|
||||
/* BB should we make this contingent on mount parm? */
|
||||
sb->s_flags |= MS_NODIRATIME | MS_NOATIME;
|
||||
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,
|
|||
rc = -ENOMEM;
|
||||
goto out_no_root;
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_CIFS_EXPERIMENTAL
|
||||
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
|
||||
cFYI(1, ("export ops supported"));
|
||||
|
@ -153,7 +153,7 @@ out_no_root:
|
|||
out_mount_failed:
|
||||
if (cifs_sb) {
|
||||
if (cifs_sb->local_nls)
|
||||
unload_nls(cifs_sb->local_nls);
|
||||
unload_nls(cifs_sb->local_nls);
|
||||
kfree(cifs_sb);
|
||||
}
|
||||
return rc;
|
||||
|
@ -230,7 +230,7 @@ cifs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
|||
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;
|
||||
|
||||
|
@ -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) {
|
||||
return 0;
|
||||
} else /* file mode might have been restricted at mount time
|
||||
on the client (above and beyond ACL on servers) for
|
||||
} else /* file mode might have been restricted at mount time
|
||||
on the client (above and beyond ACL on servers) for
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -270,7 +270,7 @@ cifs_alloc_inode(struct super_block *sb)
|
|||
cifs_inode->clientCanCacheRead = FALSE;
|
||||
cifs_inode->clientCanCacheAll = FALSE;
|
||||
cifs_inode->vfs_inode.i_blkbits = 14; /* 2**14 = CIFS_MAX_MSGSIZE */
|
||||
|
||||
|
||||
/* Can not set i_flags here - they get immediately overwritten
|
||||
to zero by the VFS */
|
||||
/* cifs_inode->vfs_inode.i_flags = S_NOATIME | S_NOCMTIME;*/
|
||||
|
@ -317,21 +317,21 @@ cifs_show_options(struct seq_file *s, struct vfsmount *m)
|
|||
if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID) ||
|
||||
!(cifs_sb->tcon->ses->capabilities & CAP_UNIX))
|
||||
seq_printf(s, ",gid=%d", cifs_sb->mnt_gid);
|
||||
seq_printf(s, ",rsize=%d",cifs_sb->rsize);
|
||||
seq_printf(s, ",wsize=%d",cifs_sb->wsize);
|
||||
seq_printf(s, ",rsize=%d", cifs_sb->rsize);
|
||||
seq_printf(s, ",wsize=%d", cifs_sb->wsize);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CIFS_QUOTA
|
||||
int cifs_xquota_set(struct super_block * sb, int quota_type, qid_t qid,
|
||||
struct fs_disk_quota * pdquota)
|
||||
int cifs_xquota_set(struct super_block *sb, int quota_type, qid_t qid,
|
||||
struct fs_disk_quota *pdquota)
|
||||
{
|
||||
int xid;
|
||||
int rc = 0;
|
||||
struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
|
||||
struct cifsTconInfo *pTcon;
|
||||
|
||||
|
||||
if (cifs_sb)
|
||||
pTcon = cifs_sb->tcon;
|
||||
else
|
||||
|
@ -340,7 +340,7 @@ int cifs_xquota_set(struct super_block * sb, int quota_type, qid_t qid,
|
|||
|
||||
xid = GetXid();
|
||||
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 {
|
||||
return -EIO;
|
||||
}
|
||||
|
@ -349,8 +349,8 @@ int cifs_xquota_set(struct super_block * sb, int quota_type, qid_t qid,
|
|||
return rc;
|
||||
}
|
||||
|
||||
int cifs_xquota_get(struct super_block * sb, int quota_type, qid_t qid,
|
||||
struct fs_disk_quota * pdquota)
|
||||
int cifs_xquota_get(struct super_block *sb, int quota_type, qid_t qid,
|
||||
struct fs_disk_quota *pdquota)
|
||||
{
|
||||
int xid;
|
||||
int rc = 0;
|
||||
|
@ -364,7 +364,7 @@ int cifs_xquota_get(struct super_block * sb, int quota_type, qid_t qid,
|
|||
|
||||
xid = GetXid();
|
||||
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 {
|
||||
rc = -EIO;
|
||||
}
|
||||
|
@ -373,9 +373,9 @@ int cifs_xquota_get(struct super_block * sb, int quota_type, qid_t qid,
|
|||
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;
|
||||
struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
|
||||
struct cifsTconInfo *pTcon;
|
||||
|
@ -387,7 +387,7 @@ int cifs_xstate_set(struct super_block * sb, unsigned int flags, int operation)
|
|||
|
||||
xid = GetXid();
|
||||
if (pTcon) {
|
||||
cFYI(1,("flags: 0x%x operation: 0x%x",flags,operation));
|
||||
cFYI(1, ("flags: 0x%x operation: 0x%x", flags, operation));
|
||||
} else {
|
||||
rc = -EIO;
|
||||
}
|
||||
|
@ -396,7 +396,7 @@ int cifs_xstate_set(struct super_block * sb, unsigned int flags, int operation)
|
|||
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 rc = 0;
|
||||
|
@ -410,7 +410,7 @@ int cifs_xstate_get(struct super_block * sb, struct fs_quota_stat *qstats)
|
|||
}
|
||||
xid = GetXid();
|
||||
if (pTcon) {
|
||||
cFYI(1,("pqstats %p",qstats));
|
||||
cFYI(1, ("pqstats %p", qstats));
|
||||
} else {
|
||||
rc = -EIO;
|
||||
}
|
||||
|
@ -427,10 +427,10 @@ static struct quotactl_ops cifs_quotactl_ops = {
|
|||
};
|
||||
#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 cifsTconInfo * tcon;
|
||||
struct cifsTconInfo *tcon;
|
||||
|
||||
if (!(flags & MNT_FORCE))
|
||||
return;
|
||||
|
@ -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_notify_requests(tcon); */
|
||||
if (tcon->ses && tcon->ses->server)
|
||||
{
|
||||
cFYI(1,("wake up tasks now - umount begin not complete"));
|
||||
if (tcon->ses && tcon->ses->server) {
|
||||
cFYI(1, ("wake up tasks now - umount begin not complete"));
|
||||
wake_up_all(&tcon->ses->server->request_q);
|
||||
wake_up_all(&tcon->ses->server->response_q);
|
||||
msleep(1); /* yield */
|
||||
|
@ -483,10 +482,11 @@ static const struct super_operations cifs_super_ops = {
|
|||
.statfs = cifs_statfs,
|
||||
.alloc_inode = cifs_alloc_inode,
|
||||
.destroy_inode = cifs_destroy_inode,
|
||||
/* .drop_inode = generic_delete_inode,
|
||||
.delete_inode = cifs_delete_inode, *//* Do not need the above two functions
|
||||
unless later we add lazy close of inodes or unless the kernel forgets to call
|
||||
us with the same number of releases (closes) as opens */
|
||||
/* .drop_inode = generic_delete_inode,
|
||||
.delete_inode = cifs_delete_inode, */ /* Do not need above two
|
||||
functions unless later we add lazy close of inodes or unless the
|
||||
kernel forgets to call us with the same number of releases (closes)
|
||||
as opens */
|
||||
.show_options = cifs_show_options,
|
||||
.umount_begin = cifs_umount_begin,
|
||||
.remount_fs = cifs_remount,
|
||||
|
@ -589,11 +589,11 @@ const struct inode_operations cifs_file_inode_ops = {
|
|||
.getxattr = cifs_getxattr,
|
||||
.listxattr = cifs_listxattr,
|
||||
.removexattr = cifs_removexattr,
|
||||
#endif
|
||||
#endif
|
||||
};
|
||||
|
||||
const struct inode_operations cifs_symlink_inode_ops = {
|
||||
.readlink = generic_readlink,
|
||||
.readlink = generic_readlink,
|
||||
.follow_link = cifs_follow_link,
|
||||
.put_link = cifs_put_link,
|
||||
.permission = cifs_permission,
|
||||
|
@ -605,7 +605,7 @@ const struct inode_operations cifs_symlink_inode_ops = {
|
|||
.getxattr = cifs_getxattr,
|
||||
.listxattr = cifs_listxattr,
|
||||
.removexattr = cifs_removexattr,
|
||||
#endif
|
||||
#endif
|
||||
};
|
||||
|
||||
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 = {
|
||||
/* no mmap, no aio, no readv -
|
||||
/* no mmap, no aio, no readv -
|
||||
BB reevaluate whether they can be done with directio, no cache */
|
||||
.read = cifs_user_read,
|
||||
.write = cifs_user_write,
|
||||
|
@ -671,7 +671,7 @@ const struct file_operations cifs_file_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 */
|
||||
.read = cifs_user_read,
|
||||
.write = cifs_user_write,
|
||||
|
@ -696,11 +696,11 @@ const struct file_operations cifs_dir_ops = {
|
|||
#ifdef CONFIG_CIFS_EXPERIMENTAL
|
||||
.dir_notify = cifs_dir_notify,
|
||||
#endif /* CONFIG_CIFS_EXPERIMENTAL */
|
||||
.ioctl = cifs_ioctl,
|
||||
.ioctl = cifs_ioctl,
|
||||
};
|
||||
|
||||
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;
|
||||
|
||||
|
@ -752,7 +752,7 @@ cifs_init_request_bufs(void)
|
|||
cifs_min_rcv = 1;
|
||||
else if (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,
|
||||
|
@ -765,7 +765,7 @@ cifs_init_request_bufs(void)
|
|||
/* 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
|
||||
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
|
||||
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)
|
||||
|
@ -844,7 +844,7 @@ cifs_destroy_mids(void)
|
|||
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 cifsTconInfo *pTcon;
|
||||
|
@ -855,7 +855,7 @@ static int cifs_oplock_thread(void * dummyarg)
|
|||
do {
|
||||
if (try_to_freeze())
|
||||
continue;
|
||||
|
||||
|
||||
spin_lock(&GlobalMid_Lock);
|
||||
if (list_empty(&GlobalOplock_Q)) {
|
||||
spin_unlock(&GlobalMid_Lock);
|
||||
|
@ -865,7 +865,7 @@ static int cifs_oplock_thread(void * dummyarg)
|
|||
oplock_item = list_entry(GlobalOplock_Q.next,
|
||||
struct oplock_q_entry, qhead);
|
||||
if (oplock_item) {
|
||||
cFYI(1,("found oplock item to write out"));
|
||||
cFYI(1, ("found oplock item to write out"));
|
||||
pTcon = oplock_item->tcon;
|
||||
inode = oplock_item->pinode;
|
||||
netfid = oplock_item->netfid;
|
||||
|
@ -878,7 +878,8 @@ static int cifs_oplock_thread(void * dummyarg)
|
|||
/* mutex_lock(&inode->i_mutex);*/
|
||||
if (S_ISREG(inode->i_mode)) {
|
||||
rc = filemap_fdatawrite(inode->i_mapping);
|
||||
if (CIFS_I(inode)->clientCanCacheRead == 0) {
|
||||
if (CIFS_I(inode)->clientCanCacheRead
|
||||
== 0) {
|
||||
filemap_fdatawait(inode->i_mapping);
|
||||
invalidate_remote_inode(inode);
|
||||
}
|
||||
|
@ -913,7 +914,7 @@ static int cifs_oplock_thread(void * dummyarg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int cifs_dnotify_thread(void * dummyarg)
|
||||
static int cifs_dnotify_thread(void *dummyarg)
|
||||
{
|
||||
struct list_head *tmp;
|
||||
struct cifsSesInfo *ses;
|
||||
|
|
|
@ -45,7 +45,7 @@ extern void cifs_read_inode(struct inode *);
|
|||
extern const struct inode_operations cifs_dir_inode_ops;
|
||||
extern int cifs_create(struct inode *, struct dentry *, int,
|
||||
struct nameidata *);
|
||||
extern struct dentry * cifs_lookup(struct inode *, struct dentry *,
|
||||
extern struct dentry *cifs_lookup(struct inode *, struct dentry *,
|
||||
struct nameidata *);
|
||||
extern int cifs_unlink(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);
|
|||
extern int cifs_close(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,
|
||||
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,
|
||||
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_fsync(struct file *, struct dentry *, int);
|
||||
extern int cifs_flush(struct file *, fl_owner_t id);
|
||||
|
|
|
@ -144,7 +144,7 @@
|
|||
#define SMBOPEN_OAPPEND 0x0001
|
||||
|
||||
/*
|
||||
* SMB flag definitions
|
||||
* SMB flag definitions
|
||||
*/
|
||||
#define SMBFLG_EXTD_LOCK 0x01 /* server supports lock-read write-unlock smb */
|
||||
#define SMBFLG_RCV_POSTED 0x02 /* obsolete */
|
||||
|
@ -157,9 +157,9 @@
|
|||
#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 */
|
||||
#define SMBFLG2_KNOWS_EAS cpu_to_le16(2)
|
||||
#define SMBFLG2_SECURITY_SIGNATURE cpu_to_le16(4)
|
||||
|
@ -260,7 +260,7 @@
|
|||
#define ATTR_SPARSE 0x0200
|
||||
#define ATTR_REPARSE 0x0400
|
||||
#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 */
|
||||
#define ATTR_NOT_CONTENT_INDEXED 0x2000
|
||||
#define ATTR_ENCRYPTED 0x4000
|
||||
|
@ -300,7 +300,7 @@
|
|||
#define CREATE_DELETE_ON_CLOSE 0x00001000
|
||||
#define CREATE_OPEN_BY_ID 0x00002000
|
||||
#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 */
|
||||
|
||||
/* ImpersonationLevel flags */
|
||||
|
@ -366,17 +366,19 @@ struct smb_hdr {
|
|||
#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
|
||||
|
||||
/*
|
||||
* Share Name Length @S8A
|
||||
* Note: This length is limited by the SMB used to get @S8A
|
||||
* the Share info. NetShareEnum only returns 13 @S8A
|
||||
* chars, including the null termination. @S8A
|
||||
* Share Name Length (SNLEN)
|
||||
* Note: This length was limited by the SMB used to get
|
||||
* the Share info. NetShareEnum only returned 13
|
||||
* chars, including the null termination.
|
||||
* This was removed because it no longer is limiting.
|
||||
*/
|
||||
#define SNLEN 12 /*@S8A */
|
||||
|
||||
/*
|
||||
* Comment Length
|
||||
|
@ -394,8 +396,8 @@ struct smb_hdr {
|
|||
*
|
||||
* The Naming convention is the lower case version of 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
|
||||
* for brevity. Although typedefs are not commonly used for
|
||||
* uppercase version of the same name with the prefix SMB_ removed
|
||||
* for brevity. Although typedefs are not commonly used for
|
||||
* structure definitions in the Linux kernel, their use in the
|
||||
* CIFS standards document, which this code is based on, may
|
||||
* make this one of the cases where typedefs for structures make
|
||||
|
@ -403,7 +405,7 @@ struct smb_hdr {
|
|||
* Typedefs can always be removed later if they are too distracting
|
||||
* and they are only used for the CIFSs PDUs themselves, not
|
||||
* internal cifs vfs structures
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
typedef struct negotiate_req {
|
||||
|
@ -511,7 +513,7 @@ typedef union smb_com_session_setup_andx {
|
|||
unsigned char SecurityBlob[1]; /* followed by */
|
||||
/* STRING NativeOS */
|
||||
/* STRING NativeLanMan */
|
||||
} __attribute__((packed)) req; /* NTLM request format (with
|
||||
} __attribute__((packed)) req; /* NTLM request format (with
|
||||
extended security */
|
||||
|
||||
struct { /* request format */
|
||||
|
@ -549,7 +551,7 @@ typedef union smb_com_session_setup_andx {
|
|||
/* unsigned char * NativeOS; */
|
||||
/* unsigned char * NativeLanMan; */
|
||||
/* unsigned char * PrimaryDomain; */
|
||||
} __attribute__((packed)) resp; /* NTLM response
|
||||
} __attribute__((packed)) resp; /* NTLM response
|
||||
(with or without extended sec) */
|
||||
|
||||
struct { /* request format */
|
||||
|
@ -618,7 +620,7 @@ struct ntlmv2_resp {
|
|||
#define CAP_NT_SMBS 0x00000010
|
||||
#define CAP_STATUS32 0x00000040
|
||||
#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?) */
|
||||
#define CAP_BULK_TRANSFER 0x20000000
|
||||
#define CAP_EXTENDED_SECURITY 0x80000000
|
||||
|
@ -676,7 +678,7 @@ typedef struct smb_com_logoff_andx_rsp {
|
|||
__u16 ByteCount;
|
||||
} __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 */
|
||||
/* tdis is probably simplest SMB PDU */
|
||||
struct {
|
||||
|
@ -800,27 +802,28 @@ typedef struct smb_com_openx_rsp {
|
|||
__u32 FileId;
|
||||
__u16 Reserved;
|
||||
__u16 ByteCount;
|
||||
} __attribute__((packed)) OPENX_RSP;
|
||||
} __attribute__((packed)) OPENX_RSP;
|
||||
|
||||
/* For encoding of POSIX Open Request - see trans2 function 0x209 data struct */
|
||||
|
||||
/* Legacy write request for older servers */
|
||||
typedef struct smb_com_writex_req {
|
||||
struct smb_hdr hdr; /* wct = 12 */
|
||||
__u8 AndXCommand;
|
||||
__u8 AndXReserved;
|
||||
__le16 AndXOffset;
|
||||
__u16 Fid;
|
||||
__le32 OffsetLow;
|
||||
__u32 Reserved; /* Timeout */
|
||||
__le16 WriteMode; /* 1 = write through */
|
||||
__le16 Remaining;
|
||||
__le16 Reserved2;
|
||||
__le16 DataLengthLow;
|
||||
__le16 DataOffset;
|
||||
__le16 ByteCount;
|
||||
__u8 Pad; /* BB check for whether padded to DWORD boundary and optimum performance here */
|
||||
char Data[0];
|
||||
struct smb_hdr hdr; /* wct = 12 */
|
||||
__u8 AndXCommand;
|
||||
__u8 AndXReserved;
|
||||
__le16 AndXOffset;
|
||||
__u16 Fid;
|
||||
__le32 OffsetLow;
|
||||
__u32 Reserved; /* Timeout */
|
||||
__le16 WriteMode; /* 1 = write through */
|
||||
__le16 Remaining;
|
||||
__le16 Reserved2;
|
||||
__le16 DataLengthLow;
|
||||
__le16 DataOffset;
|
||||
__le16 ByteCount;
|
||||
__u8 Pad; /* BB check for whether padded to DWORD
|
||||
boundary and optimum performance here */
|
||||
char Data[0];
|
||||
} __attribute__((packed)) WRITEX_REQ;
|
||||
|
||||
typedef struct smb_com_write_req {
|
||||
|
@ -838,7 +841,8 @@ typedef struct smb_com_write_req {
|
|||
__le16 DataOffset;
|
||||
__le32 OffsetHigh;
|
||||
__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];
|
||||
} __attribute__((packed)) WRITE_REQ;
|
||||
|
||||
|
@ -856,17 +860,17 @@ typedef struct smb_com_write_rsp {
|
|||
|
||||
/* legacy read request for older servers */
|
||||
typedef struct smb_com_readx_req {
|
||||
struct smb_hdr hdr; /* wct = 10 */
|
||||
__u8 AndXCommand;
|
||||
__u8 AndXReserved;
|
||||
__le16 AndXOffset;
|
||||
__u16 Fid;
|
||||
__le32 OffsetLow;
|
||||
__le16 MaxCount;
|
||||
__le16 MinCount; /* obsolete */
|
||||
__le32 Reserved;
|
||||
__le16 Remaining;
|
||||
__le16 ByteCount;
|
||||
struct smb_hdr hdr; /* wct = 10 */
|
||||
__u8 AndXCommand;
|
||||
__u8 AndXReserved;
|
||||
__le16 AndXOffset;
|
||||
__u16 Fid;
|
||||
__le32 OffsetLow;
|
||||
__le16 MaxCount;
|
||||
__le16 MinCount; /* obsolete */
|
||||
__le32 Reserved;
|
||||
__le16 Remaining;
|
||||
__le16 ByteCount;
|
||||
} __attribute__((packed)) READX_REQ;
|
||||
|
||||
typedef struct smb_com_read_req {
|
||||
|
@ -897,7 +901,8 @@ typedef struct smb_com_read_rsp {
|
|||
__le16 DataLengthHigh;
|
||||
__u64 Reserved2;
|
||||
__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];
|
||||
} __attribute__((packed)) READ_RSP;
|
||||
|
||||
|
@ -968,7 +973,7 @@ typedef struct smb_com_rename_req {
|
|||
#define COPY_TARGET_MODE_ASCII 0x0004 /* if not set, binary */
|
||||
#define COPY_SOURCE_MODE_ASCII 0x0008 /* if not set, binary */
|
||||
#define COPY_VERIFY_WRITES 0x0010
|
||||
#define COPY_TREE 0x0020
|
||||
#define COPY_TREE 0x0020
|
||||
|
||||
typedef struct smb_com_copy_req {
|
||||
struct smb_hdr hdr; /* wct = 3 */
|
||||
|
@ -976,7 +981,7 @@ typedef struct smb_com_copy_req {
|
|||
__le16 OpenFunction;
|
||||
__le16 Flags;
|
||||
__le16 ByteCount;
|
||||
__u8 BufferFormat; /* 4 = ASCII or Unicode */
|
||||
__u8 BufferFormat; /* 4 = ASCII or Unicode */
|
||||
unsigned char OldFileName[1];
|
||||
/* followed by __u8 BufferFormat2 */
|
||||
/* followed by NewFileName string */
|
||||
|
@ -1084,28 +1089,28 @@ typedef struct smb_com_setattr_rsp {
|
|||
|
||||
/*******************************************************/
|
||||
/* NT Transact structure defintions follow */
|
||||
/* Currently only ioctl, acl (get security descriptor) */
|
||||
/* Currently only ioctl, acl (get security descriptor) */
|
||||
/* and notify are implemented */
|
||||
/*******************************************************/
|
||||
typedef struct smb_com_ntransact_req {
|
||||
struct smb_hdr hdr; /* wct >= 19 */
|
||||
__u8 MaxSetupCount;
|
||||
__u16 Reserved;
|
||||
__le32 TotalParameterCount;
|
||||
__le32 TotalDataCount;
|
||||
__le32 MaxParameterCount;
|
||||
__le32 MaxDataCount;
|
||||
__le32 ParameterCount;
|
||||
__le32 ParameterOffset;
|
||||
__le32 DataCount;
|
||||
__le32 DataOffset;
|
||||
__u8 SetupCount; /* four setup words follow subcommand */
|
||||
/* SNIA spec incorrectly included spurious pad here */
|
||||
__le16 SubCommand; /* 2 = IOCTL/FSCTL */
|
||||
/* SetupCount words follow then */
|
||||
__le16 ByteCount;
|
||||
__u8 Pad[3];
|
||||
__u8 Parms[0];
|
||||
struct smb_hdr hdr; /* wct >= 19 */
|
||||
__u8 MaxSetupCount;
|
||||
__u16 Reserved;
|
||||
__le32 TotalParameterCount;
|
||||
__le32 TotalDataCount;
|
||||
__le32 MaxParameterCount;
|
||||
__le32 MaxDataCount;
|
||||
__le32 ParameterCount;
|
||||
__le32 ParameterOffset;
|
||||
__le32 DataCount;
|
||||
__le32 DataOffset;
|
||||
__u8 SetupCount; /* four setup words follow subcommand */
|
||||
/* SNIA spec incorrectly included spurious pad here */
|
||||
__le16 SubCommand; /* 2 = IOCTL/FSCTL */
|
||||
/* SetupCount words follow then */
|
||||
__le16 ByteCount;
|
||||
__u8 Pad[3];
|
||||
__u8 Parms[0];
|
||||
} __attribute__((packed)) NTRANSACT_REQ;
|
||||
|
||||
typedef struct smb_com_ntransact_rsp {
|
||||
|
@ -1121,7 +1126,7 @@ typedef struct smb_com_ntransact_rsp {
|
|||
__le32 DataDisplacement;
|
||||
__u8 SetupCount; /* 0 */
|
||||
__u16 ByteCount;
|
||||
/* __u8 Pad[3]; */
|
||||
/* __u8 Pad[3]; */
|
||||
/* parms and data follow */
|
||||
} __attribute__((packed)) NTRANSACT_RSP;
|
||||
|
||||
|
@ -1216,7 +1221,7 @@ typedef struct smb_com_transaction_change_notify_req {
|
|||
/* __u8 Data[1];*/
|
||||
} __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 */
|
||||
typedef struct smb_com_transaction_change_notify_rsp {
|
||||
struct smb_hdr hdr; /* wct = 18 */
|
||||
|
@ -1263,7 +1268,7 @@ struct file_notify_information {
|
|||
__le32 Action;
|
||||
__le32 FileNameLength;
|
||||
__u8 FileName[0];
|
||||
} __attribute__((packed));
|
||||
} __attribute__((packed));
|
||||
|
||||
struct reparse_data {
|
||||
__u32 ReparseTag;
|
||||
|
@ -1332,7 +1337,7 @@ struct trans2_resp {
|
|||
__u8 Reserved1;
|
||||
/* SetupWords[SetupCount];
|
||||
__u16 ByteCount;
|
||||
__u16 Reserved2;*/
|
||||
__u16 Reserved2;*/
|
||||
/* data area follows */
|
||||
} __attribute__((packed));
|
||||
|
||||
|
@ -1371,9 +1376,9 @@ struct smb_t2_rsp {
|
|||
#define SMB_QUERY_FILE_INTERNAL_INFO 0x3ee
|
||||
#define SMB_QUERY_FILE_ACCESS_INFO 0x3f0
|
||||
#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_ALGN_INFO 0x3f9
|
||||
#define SMB_QUERY_FILE_ALGN_INFO 0x3f9
|
||||
|
||||
|
||||
#define SMB_SET_FILE_BASIC_INFO 0x101
|
||||
|
@ -1507,35 +1512,35 @@ struct smb_com_transaction2_sfi_req {
|
|||
__u16 Pad1;
|
||||
__u16 Fid;
|
||||
__le16 InformationLevel;
|
||||
__u16 Reserved4;
|
||||
__u16 Reserved4;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct smb_com_transaction2_sfi_rsp {
|
||||
struct smb_hdr hdr; /* wct = 10 + SetupCount */
|
||||
struct trans2_resp t2;
|
||||
__u16 ByteCount;
|
||||
__u16 Reserved2; /* parameter word reserved -
|
||||
__u16 Reserved2; /* parameter word reserved -
|
||||
present for infolevels > 100 */
|
||||
} __attribute__((packed));
|
||||
|
||||
struct smb_t2_qfi_req {
|
||||
struct smb_hdr hdr;
|
||||
struct trans2_req t2;
|
||||
struct smb_hdr hdr;
|
||||
struct trans2_req t2;
|
||||
__u8 Pad;
|
||||
__u16 Fid;
|
||||
__le16 InformationLevel;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct smb_t2_qfi_rsp {
|
||||
struct smb_hdr hdr; /* wct = 10 + SetupCount */
|
||||
struct trans2_resp t2;
|
||||
__u16 ByteCount;
|
||||
__u16 Reserved2; /* parameter word reserved -
|
||||
present for infolevels > 100 */
|
||||
struct smb_hdr hdr; /* wct = 10 + SetupCount */
|
||||
struct trans2_resp t2;
|
||||
__u16 ByteCount;
|
||||
__u16 Reserved2; /* parameter word reserved -
|
||||
present for infolevels > 100 */
|
||||
} __attribute__((packed));
|
||||
|
||||
/*
|
||||
* Flags on T2 FINDFIRST and FINDNEXT
|
||||
* Flags on T2 FINDFIRST and FINDNEXT
|
||||
*/
|
||||
#define CIFS_SEARCH_CLOSE_ALWAYS 0x0001
|
||||
#define CIFS_SEARCH_CLOSE_AT_END 0x0002
|
||||
|
@ -1744,7 +1749,9 @@ typedef struct smb_com_transaction2_get_dfs_refer_req {
|
|||
__u8 Reserved3;
|
||||
__le16 SubCommand; /* one setup word */
|
||||
__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;
|
||||
char RequestFileName[1];
|
||||
} __attribute__((packed)) TRANSACTION2_GET_DFS_REFER_REQ;
|
||||
|
@ -1753,7 +1760,10 @@ typedef struct dfs_referral_level_3 {
|
|||
__le16 VersionNumber;
|
||||
__le16 ReferralSize;
|
||||
__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 Proximity;
|
||||
__le16 DfsPathOffset;
|
||||
|
@ -1779,11 +1789,13 @@ typedef struct smb_com_transaction_get_dfs_refer_rsp {
|
|||
#define DFSREF_STORAGE_SERVER 0x0002
|
||||
|
||||
/* 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. */
|
||||
/* Some of the following such as the encryption/compression ones would be */
|
||||
/* invoked from tools via a specialized hook into the VFS rather than via the */
|
||||
/* standard vfs entry points */
|
||||
/*
|
||||
* List of ioctl function codes that look to be of interest to remote clients
|
||||
* like this one. Need to do some experimentation to make sure they all work
|
||||
* remotely. Some of the following, such as the encryption/compression ones
|
||||
* 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_2 0x00090004
|
||||
#define FSCTL_REQUEST_BATCH_OPLOCK 0x00090008
|
||||
|
@ -1812,7 +1824,7 @@ typedef struct smb_com_transaction_get_dfs_refer_rsp {
|
|||
/*
|
||||
************************************************************************
|
||||
* 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 {
|
|||
__le64 FreeAllocationUnits;
|
||||
__le32 SectorsPerAllocationUnit;
|
||||
__le32 BytesPerSector;
|
||||
} __attribute__((packed)) FILE_SYSTEM_INFO; /* size info, level 0x103 */
|
||||
} __attribute__((packed)) FILE_SYSTEM_INFO; /* size info, level 0x103 */
|
||||
|
||||
typedef struct {
|
||||
__le32 fsid;
|
||||
|
@ -1872,7 +1884,7 @@ typedef struct {
|
|||
__le16 MajorVersionNumber;
|
||||
__le16 MinorVersionNumber;
|
||||
__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. */
|
||||
#define CIFS_UNIX_MAJOR_VERSION 1
|
||||
|
@ -1888,7 +1900,7 @@ typedef struct {
|
|||
calls including posix open
|
||||
and posix unlink */
|
||||
#define CIFS_UNIX_LARGE_READ_CAP 0x00000040 /* support reads >128K (up
|
||||
to 0xFFFF00 */
|
||||
to 0xFFFF00 */
|
||||
#define CIFS_UNIX_LARGE_WRITE_CAP 0x00000080
|
||||
|
||||
#ifdef CONFIG_CIFS_POSIX
|
||||
|
@ -1898,8 +1910,8 @@ typedef struct {
|
|||
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 */
|
||||
/* #define CIFS_UNIX_CAP_MASK 0x000000fb */
|
||||
#define CIFS_UNIX_CAP_MASK 0x000000db
|
||||
#else
|
||||
#define CIFS_UNIX_CAP_MASK 0x000000db
|
||||
#else
|
||||
#define CIFS_UNIX_CAP_MASK 0x00000013
|
||||
#endif /* CONFIG_CIFS_POSIX */
|
||||
|
||||
|
@ -1909,10 +1921,10 @@ typedef struct {
|
|||
typedef struct {
|
||||
/* For undefined recommended transfer size return -1 in that field */
|
||||
__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.
|
||||
(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
|
||||
to make a second call (to QFSInfo level 0x103 to get this info.
|
||||
UserBlockAvail is typically less than or equal to BlocksAvail,
|
||||
|
@ -2067,9 +2079,9 @@ struct file_alt_name_info {
|
|||
|
||||
struct file_stream_info {
|
||||
__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 allocation_size
|
||||
u64 allocation_size
|
||||
stream info */
|
||||
}; /* level 0x109 */
|
||||
|
||||
|
@ -2088,7 +2100,7 @@ struct cifs_posix_ace { /* access control entry (ACE) */
|
|||
__u8 cifs_e_tag;
|
||||
__u8 cifs_e_perm;
|
||||
__le64 cifs_uid; /* or gid */
|
||||
} __attribute__((packed));
|
||||
} __attribute__((packed));
|
||||
|
||||
struct cifs_posix_acl { /* access conrol list (ACL) */
|
||||
__le16 version;
|
||||
|
@ -2159,7 +2171,7 @@ struct file_attrib_tag {
|
|||
|
||||
|
||||
/********************************************************/
|
||||
/* FindFirst/FindNext transact2 data buffer formats */
|
||||
/* FindFirst/FindNext transact2 data buffer formats */
|
||||
/********************************************************/
|
||||
|
||||
typedef struct {
|
||||
|
@ -2237,7 +2249,7 @@ typedef struct {
|
|||
__le64 EndOfFile;
|
||||
__le64 AllocationSize;
|
||||
__le32 ExtFileAttributes;
|
||||
__le32 FileNameLength;
|
||||
__le32 FileNameLength;
|
||||
__le32 EaSize; /* length of the xattrs */
|
||||
__u8 ShortNameLength;
|
||||
__u8 Reserved;
|
||||
|
@ -2264,7 +2276,7 @@ typedef struct {
|
|||
struct win_dev {
|
||||
unsigned char type[8]; /* IntxCHR or IntxBLK */
|
||||
__le64 major;
|
||||
__le64 minor;
|
||||
__le64 minor;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct gea {
|
||||
|
@ -2296,36 +2308,36 @@ struct fealist {
|
|||
struct data_blob {
|
||||
__u8 *data;
|
||||
size_t length;
|
||||
void (*free) (struct data_blob * data_blob);
|
||||
void (*free) (struct data_blob *data_blob);
|
||||
} __attribute__((packed));
|
||||
|
||||
|
||||
#ifdef CONFIG_CIFS_POSIX
|
||||
/*
|
||||
/*
|
||||
For better POSIX semantics from Linux client, (even better
|
||||
than the existing CIFS Unix Extensions) we need updated PDUs for:
|
||||
|
||||
|
||||
1) PosixCreateX - to set and return the mode, inode#, device info and
|
||||
perhaps add a CreateDevice - to create Pipes and other special .inodes
|
||||
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
|
||||
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)
|
||||
4) Mkdir - set mode
|
||||
|
||||
And under consideration:
|
||||
|
||||
And under consideration:
|
||||
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
|
||||
7) sendfile - handle based copy
|
||||
8) Direct i/o
|
||||
9) Misc fcntls?
|
||||
|
||||
|
||||
what about fixing 64 bit alignment
|
||||
|
||||
|
||||
There are also various legacy SMB/CIFS requests used as is
|
||||
|
||||
|
||||
From existing Lanman and NTLM dialects:
|
||||
--------------------------------------
|
||||
NEGOTIATE
|
||||
|
@ -2346,48 +2358,48 @@ struct data_blob {
|
|||
(BB verify that never need to set allocation size)
|
||||
SMB_SET_FILE_BASIC_INFO2 (setting times - BB can it be done via
|
||||
Unix ext?)
|
||||
|
||||
|
||||
COPY (note support for copy across directories) - FUTURE, OPTIONAL
|
||||
setting/getting OS/2 EAs - FUTURE (BB can this handle
|
||||
setting Linux xattrs perfectly) - OPTIONAL
|
||||
dnotify - 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
|
||||
are unneeded to servers compliant with the CIFS POSIX extensions
|
||||
|
||||
|
||||
From CIFS Unix Extensions:
|
||||
-------------------------
|
||||
T2 SET_PATH_INFO (SMB_SET_FILE_UNIX_LINK) for symlinks
|
||||
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_BASIC) - BB check for missing inode fields
|
||||
Actually need QUERY_FILE_UNIX_INFO since has inode num
|
||||
BB what about a) blksize/blkbits/blocks
|
||||
T2 QUERY_PATH_INFO (SMB_QUERY_FILE_UNIX_BASIC) BB check for missing
|
||||
inode fields
|
||||
Actually a need QUERY_FILE_UNIX_INFO
|
||||
since has inode num
|
||||
BB what about a) blksize/blkbits/blocks
|
||||
b) i_version
|
||||
c) i_rdev
|
||||
d) notify mask?
|
||||
e) generation
|
||||
f) size_seqcount
|
||||
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
|
||||
|
||||
|
||||
*/
|
||||
|
||||
/* 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
|
||||
support the cifs Unix extensions or EAs (for xattr
|
||||
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,
|
||||
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 */
|
||||
|
||||
struct xsymlink {
|
||||
|
@ -2398,10 +2410,10 @@ struct xsymlink {
|
|||
char length[4];
|
||||
char cr1; /* \n */
|
||||
/* md5 of valid subset of path ie path[0] through path[length-1] */
|
||||
__u8 md5[32];
|
||||
__u8 md5[32];
|
||||
char cr2; /* \n */
|
||||
/* if room left, then end with \n then 0x20s by convention but not required */
|
||||
char path[1024];
|
||||
char path[1024];
|
||||
} __attribute__((packed));
|
||||
|
||||
typedef struct file_xattr_info {
|
||||
|
@ -2410,7 +2422,8 @@ typedef struct file_xattr_info {
|
|||
__u32 xattr_value_len;
|
||||
char xattr_name[0];
|
||||
/* 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 */
|
||||
|
@ -2436,8 +2449,9 @@ typedef struct file_xattr_info {
|
|||
typedef struct file_chattr_info {
|
||||
__le64 mask; /* list of all possible attribute bits */
|
||||
__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 */
|
||||
|
|
|
@ -71,12 +71,12 @@ extern void header_assemble(struct smb_hdr *, char /* command */ ,
|
|||
fixed section (word count) in two byte units */);
|
||||
extern int small_smb_init_no_tc(const int smb_cmd, const int wct,
|
||||
struct cifsSesInfo *ses,
|
||||
void ** request_buf);
|
||||
void **request_buf);
|
||||
extern int CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses,
|
||||
const int stage,
|
||||
const struct nls_table *nls_cp);
|
||||
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 *);
|
||||
extern void DeleteOplockQEntry(struct oplock_q_entry *);
|
||||
extern struct timespec cifs_NTtimeToUnix(u64 /* utc nanoseconds since 1601 */ );
|
||||
|
@ -146,7 +146,7 @@ extern int get_dfs_path(int xid, struct cifsSesInfo *pSesInfo,
|
|||
const char *old_path,
|
||||
const struct nls_table *nls_codepage,
|
||||
unsigned int *pnum_referrals,
|
||||
unsigned char ** preferrals,
|
||||
unsigned char **preferrals,
|
||||
int remap);
|
||||
extern void reset_cifs_unix_caps(int xid, struct cifsTconInfo *tcon,
|
||||
struct super_block *sb, struct smb_vol *vol);
|
||||
|
@ -312,9 +312,9 @@ extern int CIFSSMBCopy(int xid,
|
|||
const char *fromName,
|
||||
const __u16 target_tid,
|
||||
const char *toName, const int flags,
|
||||
const struct nls_table *nls_codepage,
|
||||
const struct nls_table *nls_codepage,
|
||||
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,
|
||||
__u32 filter, struct file *file, int multishot,
|
||||
const struct nls_table *nls_codepage);
|
||||
|
@ -323,7 +323,7 @@ extern ssize_t CIFSSMBQAllEAs(const int xid, struct cifsTconInfo *tcon,
|
|||
size_t bufsize, const struct nls_table *nls_codepage,
|
||||
int remap_special_chars);
|
||||
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,
|
||||
const struct nls_table *nls_codepage, int remap_special_chars);
|
||||
extern int CIFSSMBSetEA(const int xid, struct cifsTconInfo *tcon,
|
||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -22,7 +22,7 @@
|
|||
* along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* See Documentation/filesystems/Exporting
|
||||
* and examples in fs/exportfs
|
||||
|
@ -43,16 +43,16 @@
|
|||
#include "cifsglob.h"
|
||||
#include "cifs_debug.h"
|
||||
|
||||
|
||||
|
||||
#ifdef CONFIG_CIFS_EXPERIMENTAL
|
||||
|
||||
|
||||
static struct dentry *cifs_get_parent(struct dentry *dentry)
|
||||
{
|
||||
/* BB need to add code here eventually to enable export via NFSD */
|
||||
cFYI(1, ("get parent for %p", dentry));
|
||||
return ERR_PTR(-EACCES);
|
||||
}
|
||||
|
||||
|
||||
struct export_operations cifs_export_ops = {
|
||||
.get_parent = cifs_get_parent,
|
||||
/* Following five export operations are unneeded so far and can default:
|
||||
|
@ -62,6 +62,6 @@ struct export_operations cifs_export_ops = {
|
|||
.decode_fh =
|
||||
.encode_fs = */
|
||||
};
|
||||
|
||||
|
||||
#endif /* EXPERIMENTAL */
|
||||
|
||||
|
||||
|
|
|
@ -189,7 +189,7 @@ int cifs_open(struct inode *inode, struct file *file)
|
|||
|
||||
/* needed for writepage */
|
||||
pCifsFile->pfile = file;
|
||||
|
||||
|
||||
file->private_data = pCifsFile;
|
||||
break;
|
||||
}
|
||||
|
@ -378,7 +378,7 @@ static int cifs_reopen_file(struct file *file, int can_flush)
|
|||
rc = -EBADF;
|
||||
goto reopen_error_exit;
|
||||
}
|
||||
|
||||
|
||||
cifs_sb = CIFS_SB(inode->i_sb);
|
||||
pTcon = cifs_sb->tcon;
|
||||
|
||||
|
@ -735,7 +735,7 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock)
|
|||
posix_lock_type = CIFS_RDLCK;
|
||||
else
|
||||
posix_lock_type = CIFS_WRLCK;
|
||||
|
||||
|
||||
if (numUnlock == 1)
|
||||
posix_lock_type = CIFS_UNLCK;
|
||||
|
||||
|
@ -810,7 +810,7 @@ ssize_t cifs_user_write(struct file *file, const char __user *write_data,
|
|||
if (file->private_data == NULL)
|
||||
return -EBADF;
|
||||
open_file = (struct cifsFileInfo *) file->private_data;
|
||||
|
||||
|
||||
xid = GetXid();
|
||||
|
||||
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,
|
|||
if (file->private_data == NULL)
|
||||
return -EBADF;
|
||||
open_file = (struct cifsFileInfo *)file->private_data;
|
||||
|
||||
|
||||
xid = GetXid();
|
||||
|
||||
if (*poffset > file->f_path.dentry->d_inode->i_size)
|
||||
|
@ -1035,7 +1035,8 @@ struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode)
|
|||
/* if it fails, try another handle - might be */
|
||||
/* dangerous to hold up writepages with retry */
|
||||
if (rc) {
|
||||
cFYI(1, ("failed on reopen file in wp"));
|
||||
cFYI(1,
|
||||
("failed on reopen file in wp"));
|
||||
read_lock(&GlobalSMBSeslock);
|
||||
/* can not use this handle, no write
|
||||
pending on this one after all */
|
||||
|
@ -1136,7 +1137,7 @@ static int cifs_writepages(struct address_space *mapping,
|
|||
int xid;
|
||||
|
||||
cifs_sb = CIFS_SB(mapping->host->i_sb);
|
||||
|
||||
|
||||
/*
|
||||
* If wsize is smaller that the page cache size, default to writing
|
||||
* one page at a time via cifs_writepage
|
||||
|
@ -1419,7 +1420,7 @@ int cifs_fsync(struct file *file, struct dentry *dentry, int datasync)
|
|||
|
||||
cFYI(1, ("Sync file - name: %s datasync: 0x%x",
|
||||
dentry->d_name.name, datasync));
|
||||
|
||||
|
||||
rc = filemap_fdatawrite(inode->i_mapping);
|
||||
if (rc == 0)
|
||||
CIFS_I(inode)->write_behind_rc = 0;
|
||||
|
@ -1476,7 +1477,7 @@ int cifs_flush(struct file *file, fl_owner_t id)
|
|||
rc = filemap_fdatawrite(inode->i_mapping);
|
||||
if (!rc) /* reset wb rc if we were able to write out dirty pages */
|
||||
CIFS_I(inode)->write_behind_rc = 0;
|
||||
|
||||
|
||||
cFYI(1, ("Flush inode %p file %p rc %d", inode, file, rc));
|
||||
|
||||
return rc;
|
||||
|
@ -1914,7 +1915,7 @@ int is_size_safe_to_change(struct cifsInodeInfo *cifsInode, __u64 end_of_file)
|
|||
|
||||
if (cifsInode)
|
||||
open_file = find_writable_file(cifsInode);
|
||||
|
||||
|
||||
if (open_file) {
|
||||
struct cifs_sb_info *cifs_sb;
|
||||
|
||||
|
|
|
@ -92,7 +92,7 @@ int cifs_get_inode_info_unix(struct inode **pinode,
|
|||
} /* note ino incremented to unique num in new_inode */
|
||||
if (sb->s_flags & MS_NOATIME)
|
||||
(*pinode)->i_flags |= S_NOATIME | S_NOCMTIME;
|
||||
|
||||
|
||||
insert_inode_hash(*pinode);
|
||||
}
|
||||
|
||||
|
@ -139,7 +139,7 @@ int cifs_get_inode_info_unix(struct inode **pinode,
|
|||
inode->i_mode |= S_IFREG;
|
||||
cFYI(1, ("unknown type %d", type));
|
||||
}
|
||||
|
||||
|
||||
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)
|
||||
inode->i_uid = cifs_sb->mnt_uid;
|
||||
else
|
||||
|
@ -149,7 +149,7 @@ int cifs_get_inode_info_unix(struct inode **pinode,
|
|||
inode->i_gid = cifs_sb->mnt_gid;
|
||||
else
|
||||
inode->i_gid = le64_to_cpu(findData.Gid);
|
||||
|
||||
|
||||
inode->i_nlink = le64_to_cpu(findData.Nlinks);
|
||||
|
||||
spin_lock(&inode->i_lock);
|
||||
|
@ -235,7 +235,7 @@ static int decode_sfu_inode(struct inode *inode, __u64 size,
|
|||
} else if (size < 8) {
|
||||
return -EINVAL; /* EOPNOTSUPP? */
|
||||
}
|
||||
|
||||
|
||||
rc = CIFSSMBOpen(xid, pTcon, path, FILE_OPEN, GENERIC_READ,
|
||||
CREATE_NOT_DIR, &netfid, &oplock, NULL,
|
||||
cifs_sb->local_nls,
|
||||
|
@ -285,7 +285,6 @@ static int decode_sfu_inode(struct inode *inode, __u64 size,
|
|||
CIFSSMBClose(xid, pTcon, netfid);
|
||||
}
|
||||
return rc;
|
||||
|
||||
}
|
||||
|
||||
#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,
|
|||
#else
|
||||
return -EOPNOTSUPP;
|
||||
#endif
|
||||
|
||||
|
||||
}
|
||||
|
||||
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);
|
||||
adjustTZ = TRUE;
|
||||
}
|
||||
|
||||
}
|
||||
/* dump_mem("\nQPathInfo return data",&findData, sizeof(findData)); */
|
||||
if (rc) {
|
||||
|
@ -513,7 +509,7 @@ int cifs_get_inode_info(struct inode **pinode,
|
|||
/* BB add code here -
|
||||
validate if device or weird share or device type? */
|
||||
}
|
||||
|
||||
|
||||
spin_lock(&inode->i_lock);
|
||||
if (is_size_safe_to_change(cifsInfo, le64_to_cpu(pfindData->EndOfFile))) {
|
||||
/* can not safely shrink the file size here if the
|
||||
|
@ -836,7 +832,7 @@ static void posix_fill_in_inode(struct inode *tmp_inode,
|
|||
tmp_inode->i_fop = &cifs_file_direct_nobrl_ops;
|
||||
else
|
||||
tmp_inode->i_fop = &cifs_file_direct_ops;
|
||||
|
||||
|
||||
} else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
|
||||
tmp_inode->i_fop = &cifs_file_nobrl_ops;
|
||||
else
|
||||
|
@ -898,7 +894,7 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
|
|||
FreeXid(xid);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
||||
if ((pTcon->ses->capabilities & CAP_UNIX) &&
|
||||
(CIFS_UNIX_POSIX_PATH_OPS_CAP &
|
||||
le64_to_cpu(pTcon->fsUnixInfo.Capability))) {
|
||||
|
@ -909,7 +905,7 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
|
|||
rc = -ENOMEM;
|
||||
goto mkdir_out;
|
||||
}
|
||||
|
||||
|
||||
rc = CIFSPOSIXCreate(xid, pTcon, SMB_O_DIRECTORY | SMB_O_CREAT,
|
||||
mode, NULL /* netfid */, pInfo, &oplock,
|
||||
full_path, cifs_sb->local_nls,
|
||||
|
@ -963,7 +959,7 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
|
|||
kfree(pInfo);
|
||||
goto mkdir_out;
|
||||
}
|
||||
|
||||
|
||||
/* BB add setting the equivalent of mode via CreateX w/ACLs */
|
||||
rc = CIFSSMBMkDir(xid, pTcon, full_path, cifs_sb->local_nls,
|
||||
cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
|
||||
|
@ -1316,7 +1312,7 @@ int cifs_revalidate(struct dentry *direntry)
|
|||
}
|
||||
}
|
||||
/* mutex_unlock(&direntry->d_inode->i_mutex); */
|
||||
|
||||
|
||||
kfree(full_path);
|
||||
FreeXid(xid);
|
||||
return rc;
|
||||
|
@ -1433,7 +1429,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
|
|||
} else
|
||||
rc = 0;
|
||||
}
|
||||
|
||||
|
||||
full_path = build_path_from_dentry(direntry);
|
||||
if (full_path == NULL) {
|
||||
FreeXid(xid);
|
||||
|
@ -1588,7 +1584,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
|
|||
stamps are changed explicitly (i.e. by utime()
|
||||
since we would then have a mix of client and
|
||||
server times */
|
||||
|
||||
|
||||
if (set_time && (attrs->ia_valid & ATTR_CTIME)) {
|
||||
set_time = TRUE;
|
||||
/* Although Samba throws this field away
|
||||
|
|
|
@ -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) {
|
||||
cERROR(1, ("SFU style symlinks not implemented yet"));
|
||||
/* add open and read as in fs/cifs/inode.c */
|
||||
|
||||
} else {
|
||||
rc = CIFSSMBOpen(xid, pTcon, full_path, FILE_OPEN, GENERIC_READ,
|
||||
OPEN_REPARSE_POINT, &fid, &oplock, NULL,
|
||||
|
@ -315,7 +314,9 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen)
|
|||
num_referrals));
|
||||
if (referrals) {
|
||||
cFYI(1,("referral string: %s", referrals));
|
||||
strncpy(tmpbuffer, referrals, len-1);
|
||||
strncpy(tmpbuffer,
|
||||
referrals,
|
||||
len-1);
|
||||
}
|
||||
}
|
||||
kfree(referrals);
|
||||
|
|
|
@ -4,17 +4,17 @@
|
|||
a implementation of MD4 designed for use in the SMB authentication protocol
|
||||
Copyright (C) Andrew Tridgell 1997-1998.
|
||||
Modified by Steve French (sfrench@us.ibm.com) 2002-2003
|
||||
|
||||
|
||||
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
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
|
|
@ -47,8 +47,10 @@ _GetXid(void)
|
|||
|
||||
spin_lock(&GlobalMid_Lock);
|
||||
GlobalTotalActiveXid++;
|
||||
|
||||
/* keep high water mark for number of simultaneous ops in filesystem */
|
||||
if (GlobalTotalActiveXid > GlobalMaxActiveXid)
|
||||
GlobalMaxActiveXid = GlobalTotalActiveXid; /* keep high water mark for number of simultaneous vfs ops in our filesystem */
|
||||
GlobalMaxActiveXid = GlobalTotalActiveXid;
|
||||
if (GlobalTotalActiveXid > 65000)
|
||||
cFYI(1, ("warning: more than 65000 requests active"));
|
||||
xid = GlobalCurrentXid++;
|
||||
|
@ -148,8 +150,8 @@ cifs_buf_get(void)
|
|||
but it may be more efficient to always alloc same size
|
||||
albeit slightly larger than necessary and maxbuffersize
|
||||
defaults to this and can not be bigger */
|
||||
ret_buf =
|
||||
(struct smb_hdr *) mempool_alloc(cifs_req_poolp, GFP_KERNEL | GFP_NOFS);
|
||||
ret_buf = (struct smb_hdr *) mempool_alloc(cifs_req_poolp,
|
||||
GFP_KERNEL | GFP_NOFS);
|
||||
|
||||
/* clear the first few header bytes */
|
||||
/* for most paths, more is cleared in header_assemble */
|
||||
|
@ -187,8 +189,8 @@ cifs_small_buf_get(void)
|
|||
but it may be more efficient to always alloc same size
|
||||
albeit slightly larger than necessary and maxbuffersize
|
||||
defaults to this and can not be bigger */
|
||||
ret_buf =
|
||||
(struct smb_hdr *) mempool_alloc(cifs_sm_req_poolp, GFP_KERNEL | GFP_NOFS);
|
||||
ret_buf = (struct smb_hdr *) mempool_alloc(cifs_sm_req_poolp,
|
||||
GFP_KERNEL | GFP_NOFS);
|
||||
if (ret_buf) {
|
||||
/* No need to clear memory here, cleared in header assemble */
|
||||
/* memset(ret_buf, 0, sizeof(struct smb_hdr) + 27);*/
|
||||
|
|
|
@ -816,7 +816,7 @@ map_smb_to_linux_error(struct smb_hdr *smb)
|
|||
cFYI(1, (" !!Mapping smb error code %d to POSIX err %d !!",
|
||||
smberrcode, rc));
|
||||
|
||||
/* generic corrective action e.g. reconnect SMB session on
|
||||
/* generic corrective action e.g. reconnect SMB session on
|
||||
* ERRbaduid could be added */
|
||||
|
||||
return rc;
|
||||
|
|
|
@ -6,17 +6,17 @@
|
|||
Copyright (C) John H Terpstra 1996-2000
|
||||
Copyright (C) Luke Kenneth Casson Leighton 1996-2000
|
||||
Copyright (C) Paul Ashton 1998-2000
|
||||
|
||||
|
||||
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
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
|
|
@ -51,7 +51,6 @@ static void dump_cifs_file_struct(struct file *file, char *label)
|
|||
if (cf->srch_inf.emptyDir) {
|
||||
cFYI(1, ("empty dir"));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
#endif /* DEBUG2 */
|
||||
|
@ -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;
|
||||
else
|
||||
tmp_inode->i_fop = &cifs_file_direct_ops;
|
||||
|
||||
} else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
|
||||
tmp_inode->i_fop = &cifs_file_nobrl_ops;
|
||||
else
|
||||
|
@ -644,11 +642,11 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon,
|
|||
loff_t index_to_find = file->f_pos;
|
||||
struct cifsFileInfo *cifsFile = file->private_data;
|
||||
/* check if index in the buffer */
|
||||
|
||||
|
||||
if ((cifsFile == NULL) || (ppCurrentEntry == NULL) ||
|
||||
(num_to_ret == NULL))
|
||||
return -ENOENT;
|
||||
|
||||
|
||||
*ppCurrentEntry = NULL;
|
||||
first_entry_in_buffer =
|
||||
cifsFile->srch_inf.index_of_last_entry -
|
||||
|
@ -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;
|
||||
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 */
|
||||
current_entry = nxt_dir_entry(current_entry, end_of_smb,
|
||||
cifsFile->srch_inf.info_level);
|
||||
|
@ -839,7 +837,7 @@ static int cifs_filldir(char *pfindEntry, struct file *file,
|
|||
return -EINVAL;
|
||||
|
||||
pCifsF = file->private_data;
|
||||
|
||||
|
||||
if ((scratch_buf == NULL) || (pfindEntry == NULL) || (pCifsF == NULL))
|
||||
return -ENOENT;
|
||||
|
||||
|
@ -892,7 +890,7 @@ static int cifs_filldir(char *pfindEntry, struct file *file,
|
|||
if (rc == 2)
|
||||
d_rehash(tmp_dentry);
|
||||
}
|
||||
|
||||
|
||||
|
||||
rc = filldir(direntry, qstring.name, qstring.len, file->f_pos,
|
||||
tmp_inode->i_ino, obj_type);
|
||||
|
@ -951,7 +949,7 @@ static int cifs_save_resume_key(const char *current_entry,
|
|||
len = le32_to_cpu(pFindData->FileNameLength);
|
||||
cifsFile->srch_inf.resume_key = pFindData->FileIndex;
|
||||
} 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;
|
||||
filename = &pFindData->FileName[0];
|
||||
len = le32_to_cpu(pFindData->FileNameLength);
|
||||
|
@ -982,7 +980,7 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir)
|
|||
char *current_entry;
|
||||
int num_to_fill = 0;
|
||||
char *tmp_buf = NULL;
|
||||
char * end_of_smb;
|
||||
char *end_of_smb;
|
||||
int max_len;
|
||||
|
||||
xid = GetXid();
|
||||
|
|
|
@ -191,7 +191,7 @@ static int decode_unicode_ssetup(char **pbcc_area, int bleft,
|
|||
their final Unicode string - in which case we
|
||||
now will not attempt to decode the byte of junk
|
||||
which follows it */
|
||||
|
||||
|
||||
words_left = bleft / 2;
|
||||
|
||||
/* save off server operating system */
|
||||
|
@ -266,11 +266,11 @@ static int decode_ascii_ssetup(char **pbcc_area, int bleft,
|
|||
char *bcc_ptr = *pbcc_area;
|
||||
|
||||
cFYI(1, ("decode sessetup ascii. bleft %d", bleft));
|
||||
|
||||
|
||||
len = strnlen(bcc_ptr, bleft);
|
||||
if (len >= bleft)
|
||||
return rc;
|
||||
|
||||
|
||||
if (ses->serverOS)
|
||||
kfree(ses->serverOS);
|
||||
|
||||
|
@ -412,7 +412,7 @@ CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time,
|
|||
cpu_to_le16(CIFS_SESS_KEY_SIZE);
|
||||
pSMB->req_no_secext.CaseSensitivePasswordLength =
|
||||
cpu_to_le16(CIFS_SESS_KEY_SIZE);
|
||||
|
||||
|
||||
/* calculate session key */
|
||||
SMBNTencrypt(ses->password, ses->server->cryptKey,
|
||||
ntlm_session_key);
|
||||
|
@ -536,7 +536,7 @@ CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time,
|
|||
ses, nls_cp);
|
||||
else
|
||||
rc = decode_ascii_ssetup(&bcc_ptr, bytes_remaining, ses,nls_cp);
|
||||
|
||||
|
||||
ssetup_exit:
|
||||
kfree(str_area);
|
||||
if (resp_buf_type == CIFS_SMALL_BUFFER) {
|
||||
|
|
|
@ -7,17 +7,17 @@
|
|||
|
||||
Copyright (C) Andrew Tridgell 1998
|
||||
Modified by Steve French (sfrench@us.ibm.com) 2002,2004
|
||||
|
||||
|
||||
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
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
|
|
@ -7,17 +7,17 @@
|
|||
Modified by Jeremy Allison 1995.
|
||||
Copyright (C) Andrew Bartlett <abartlet@samba.org> 2002-2003
|
||||
Modified by Steve French (sfrench@us.ibm.com) 2002-2003
|
||||
|
||||
|
||||
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
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
@ -73,7 +73,7 @@ SMBencrypt(unsigned char *passwd, unsigned char *c8, unsigned char *p24)
|
|||
E_P16(p14, p21);
|
||||
|
||||
SMBOWFencrypt(p21, c8, p24);
|
||||
|
||||
|
||||
memset(p14, 0, 15);
|
||||
memset(p21, 0, 21);
|
||||
}
|
||||
|
@ -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 struct nls_table *nls_codepage)
|
||||
{
|
||||
wchar_t * user_u;
|
||||
wchar_t * dom_u;
|
||||
wchar_t *user_u;
|
||||
wchar_t *dom_u;
|
||||
int user_l, domain_l;
|
||||
struct HMACMD5Context ctx;
|
||||
|
||||
|
@ -188,7 +188,7 @@ ntv2_owf_gen(const unsigned char owf[16], const char *user_n,
|
|||
if (user_u == NULL)
|
||||
return;
|
||||
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, dom_u, domain_n, (domain_l+1)*2, STR_UNICODE|STR_NOALIGN|STR_TERMINATE|STR_UPPER); */
|
||||
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
#include "cifsglob.h"
|
||||
#include "cifsproto.h"
|
||||
#include "cifs_debug.h"
|
||||
|
||||
|
||||
extern mempool_t *cifs_mid_poolp;
|
||||
extern struct kmem_cache *cifs_oplock_cachep;
|
||||
|
||||
|
@ -49,7 +49,7 @@ AllocMidQEntry(const struct smb_hdr *smb_buffer, struct cifsSesInfo *ses)
|
|||
cERROR(1, ("Null TCP session in AllocMidQEntry"));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
temp = (struct mid_q_entry *) mempool_alloc(cifs_mid_poolp,
|
||||
GFP_KERNEL | GFP_NOFS);
|
||||
if (temp == NULL)
|
||||
|
@ -223,7 +223,7 @@ smb_send2(struct socket *ssocket, struct kvec *iov, int n_vec,
|
|||
unsigned int total_len;
|
||||
int first_vec = 0;
|
||||
unsigned int smb_buf_length = smb_buffer->smb_buf_length;
|
||||
|
||||
|
||||
if (ssocket == NULL)
|
||||
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)
|
|||
|
||||
/* can not count locking commands against total
|
||||
as they are allowed to block on server */
|
||||
|
||||
|
||||
/* update # of requests on the wire to server */
|
||||
if (long_op < 3)
|
||||
atomic_inc(&ses->server->inFlight);
|
||||
|
@ -426,7 +426,7 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses,
|
|||
unsigned long timeout;
|
||||
struct mid_q_entry *midQ;
|
||||
struct smb_hdr *in_buf = iov[0].iov_base;
|
||||
|
||||
|
||||
*pRespBufType = CIFS_NO_BUFFER; /* no response buf yet */
|
||||
|
||||
if ((ses == NULL) || (ses->server == NULL)) {
|
||||
|
@ -537,7 +537,7 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses,
|
|||
wake_up(&ses->server->request_q);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
if (receive_len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE) {
|
||||
cERROR(1, ("Frame too large received. Length: %d Xid: %d",
|
||||
receive_len, xid));
|
||||
|
@ -718,7 +718,7 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses,
|
|||
wake_up(&ses->server->request_q);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
if (receive_len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE) {
|
||||
cERROR(1, ("Frame too large received. Length: %d Xid: %d",
|
||||
receive_len, xid));
|
||||
|
@ -962,7 +962,7 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifsTconInfo *tcon,
|
|||
DeleteMidQEntry(midQ);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
if (receive_len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE) {
|
||||
cERROR(1, ("Frame too large received. Length: %d Xid: %d",
|
||||
receive_len, xid));
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
#define XATTR_TRUSTED_PREFIX_LEN 8
|
||||
#define XATTR_SECURITY_PREFIX_LEN 9
|
||||
/* BB need to add server (Samba e.g) support for security and trusted prefix */
|
||||
|
||||
|
||||
|
||||
|
||||
int cifs_removexattr(struct dentry *direntry, const char *ea_name)
|
||||
|
|
Loading…
Reference in a new issue