diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-29 13:37:27 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-29 13:37:27 -0400 |
commit | b4020c1b198c0f0c0b0ff0cfdd824a26b93edd6f (patch) | |
tree | f2d0dcca7bae865606e90ffc2599c993da1a888f /fs/cifs/cifsglob.h | |
parent | 435f49a518c78eec8e2edbbadd912737246cbe20 (diff) | |
parent | d3686d54c7902a303bd65d751226aa1647319863 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6:
cifs: Cleanup and thus reduce smb session structure and fields used during authentication
NTLM auth and sign - Use appropriate server challenge
cifs: add kfree() on error path
NTLM auth and sign - minor error corrections and cleanup
NTLM auth and sign - Use kernel crypto apis to calculate hashes and smb signatures
NTLM auth and sign - Define crypto hash functions and create and send keys needed for key exchange
cifs: cifs_convert_address() returns zero on error
NTLM auth and sign - Allocate session key/client response dynamically
cifs: update comments - [s/GlobalSMBSesLock/cifs_file_list_lock/g]
cifs: eliminate cifsInodeInfo->write_behind_rc (try #6)
[CIFS] Fix checkpatch warnings and bump cifs version number
cifs: wait for writeback to complete in cifs_flush
cifs: convert cifsFileInfo->count to non-atomic counter
Diffstat (limited to 'fs/cifs/cifsglob.h')
-rw-r--r-- | fs/cifs/cifsglob.h | 55 |
1 files changed, 37 insertions, 18 deletions
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h index 3365e77f6f24..f259e4d7612d 100644 --- a/fs/cifs/cifsglob.h +++ b/fs/cifs/cifsglob.h | |||
@@ -25,6 +25,9 @@ | |||
25 | #include <linux/workqueue.h> | 25 | #include <linux/workqueue.h> |
26 | #include "cifs_fs_sb.h" | 26 | #include "cifs_fs_sb.h" |
27 | #include "cifsacl.h" | 27 | #include "cifsacl.h" |
28 | #include <crypto/internal/hash.h> | ||
29 | #include <linux/scatterlist.h> | ||
30 | |||
28 | /* | 31 | /* |
29 | * The sizes of various internal tables and strings | 32 | * The sizes of various internal tables and strings |
30 | */ | 33 | */ |
@@ -74,7 +77,7 @@ | |||
74 | * CIFS vfs client Status information (based on what we know.) | 77 | * CIFS vfs client Status information (based on what we know.) |
75 | */ | 78 | */ |
76 | 79 | ||
77 | /* associated with each tcp and smb session */ | 80 | /* associated with each tcp and smb session */ |
78 | enum statusEnum { | 81 | enum statusEnum { |
79 | CifsNew = 0, | 82 | CifsNew = 0, |
80 | CifsGood, | 83 | CifsGood, |
@@ -99,14 +102,29 @@ enum protocolEnum { | |||
99 | 102 | ||
100 | struct session_key { | 103 | struct session_key { |
101 | unsigned int len; | 104 | unsigned int len; |
102 | union { | 105 | char *response; |
103 | char ntlm[CIFS_SESS_KEY_SIZE + 16]; | 106 | }; |
104 | char krb5[CIFS_SESS_KEY_SIZE + 16]; /* BB: length correct? */ | 107 | |
105 | struct { | 108 | /* crypto security descriptor definition */ |
106 | char key[16]; | 109 | struct sdesc { |
107 | struct ntlmv2_resp resp; | 110 | struct shash_desc shash; |
108 | } ntlmv2; | 111 | char ctx[]; |
109 | } data; | 112 | }; |
113 | |||
114 | /* crypto hashing related structure/fields, not specific to a sec mech */ | ||
115 | struct cifs_secmech { | ||
116 | struct crypto_shash *hmacmd5; /* hmac-md5 hash function */ | ||
117 | struct crypto_shash *md5; /* md5 hash function */ | ||
118 | struct sdesc *sdeschmacmd5; /* ctxt to generate ntlmv2 hash, CR1 */ | ||
119 | struct sdesc *sdescmd5; /* ctxt to generate cifs/smb signature */ | ||
120 | }; | ||
121 | |||
122 | /* per smb session structure/fields */ | ||
123 | struct ntlmssp_auth { | ||
124 | __u32 client_flags; /* sent by client in type 1 ntlmsssp exchange */ | ||
125 | __u32 server_flags; /* sent by server in type 2 ntlmssp exchange */ | ||
126 | unsigned char ciphertext[CIFS_CPHTXT_SIZE]; /* sent to server */ | ||
127 | char cryptkey[CIFS_CRYPTO_KEY_SIZE]; /* used by ntlmssp */ | ||
110 | }; | 128 | }; |
111 | 129 | ||
112 | struct cifs_cred { | 130 | struct cifs_cred { |
@@ -179,12 +197,14 @@ struct TCP_Server_Info { | |||
179 | int capabilities; /* allow selective disabling of caps by smb sess */ | 197 | int capabilities; /* allow selective disabling of caps by smb sess */ |
180 | int timeAdj; /* Adjust for difference in server time zone in sec */ | 198 | int timeAdj; /* Adjust for difference in server time zone in sec */ |
181 | __u16 CurrentMid; /* multiplex id - rotating counter */ | 199 | __u16 CurrentMid; /* multiplex id - rotating counter */ |
200 | char cryptkey[CIFS_CRYPTO_KEY_SIZE]; /* used by ntlm, ntlmv2 etc */ | ||
182 | /* 16th byte of RFC1001 workstation name is always null */ | 201 | /* 16th byte of RFC1001 workstation name is always null */ |
183 | char workstation_RFC1001_name[RFC1001_NAME_LEN_WITH_NULL]; | 202 | char workstation_RFC1001_name[RFC1001_NAME_LEN_WITH_NULL]; |
184 | __u32 sequence_number; /* needed for CIFS PDU signature */ | 203 | __u32 sequence_number; /* needed for CIFS PDU signature */ |
185 | struct session_key session_key; | 204 | struct session_key session_key; |
186 | unsigned long lstrp; /* when we got last response from this server */ | 205 | unsigned long lstrp; /* when we got last response from this server */ |
187 | u16 dialect; /* dialect index that server chose */ | 206 | u16 dialect; /* dialect index that server chose */ |
207 | struct cifs_secmech secmech; /* crypto sec mech functs, descriptors */ | ||
188 | /* extended security flavors that server supports */ | 208 | /* extended security flavors that server supports */ |
189 | bool sec_kerberos; /* supports plain Kerberos */ | 209 | bool sec_kerberos; /* supports plain Kerberos */ |
190 | bool sec_mskerberos; /* supports legacy MS Kerberos */ | 210 | bool sec_mskerberos; /* supports legacy MS Kerberos */ |
@@ -222,11 +242,8 @@ struct cifsSesInfo { | |||
222 | char userName[MAX_USERNAME_SIZE + 1]; | 242 | char userName[MAX_USERNAME_SIZE + 1]; |
223 | char *domainName; | 243 | char *domainName; |
224 | char *password; | 244 | char *password; |
225 | char cryptKey[CIFS_CRYPTO_KEY_SIZE]; | ||
226 | struct session_key auth_key; | 245 | struct session_key auth_key; |
227 | char ntlmv2_hash[16]; | 246 | struct ntlmssp_auth *ntlmssp; /* ciphertext, flags, server challenge */ |
228 | unsigned int tilen; /* length of the target info blob */ | ||
229 | unsigned char *tiblob; /* target info blob in challenge response */ | ||
230 | bool need_reconnect:1; /* connection reset, uid now invalid */ | 247 | bool need_reconnect:1; /* connection reset, uid now invalid */ |
231 | }; | 248 | }; |
232 | /* no more than one of the following three session flags may be set */ | 249 | /* no more than one of the following three session flags may be set */ |
@@ -395,16 +412,19 @@ struct cifsFileInfo { | |||
395 | struct list_head llist; /* list of byte range locks we have. */ | 412 | struct list_head llist; /* list of byte range locks we have. */ |
396 | bool invalidHandle:1; /* file closed via session abend */ | 413 | bool invalidHandle:1; /* file closed via session abend */ |
397 | bool oplock_break_cancelled:1; | 414 | bool oplock_break_cancelled:1; |
398 | atomic_t count; /* reference count */ | 415 | int count; /* refcount protected by cifs_file_list_lock */ |
399 | struct mutex fh_mutex; /* prevents reopen race after dead ses*/ | 416 | struct mutex fh_mutex; /* prevents reopen race after dead ses*/ |
400 | struct cifs_search_info srch_inf; | 417 | struct cifs_search_info srch_inf; |
401 | struct work_struct oplock_break; /* work for oplock breaks */ | 418 | struct work_struct oplock_break; /* work for oplock breaks */ |
402 | }; | 419 | }; |
403 | 420 | ||
404 | /* Take a reference on the file private data */ | 421 | /* |
422 | * Take a reference on the file private data. Must be called with | ||
423 | * cifs_file_list_lock held. | ||
424 | */ | ||
405 | static inline void cifsFileInfo_get(struct cifsFileInfo *cifs_file) | 425 | static inline void cifsFileInfo_get(struct cifsFileInfo *cifs_file) |
406 | { | 426 | { |
407 | atomic_inc(&cifs_file->count); | 427 | ++cifs_file->count; |
408 | } | 428 | } |
409 | 429 | ||
410 | void cifsFileInfo_put(struct cifsFileInfo *cifs_file); | 430 | void cifsFileInfo_put(struct cifsFileInfo *cifs_file); |
@@ -417,7 +437,6 @@ struct cifsInodeInfo { | |||
417 | struct list_head lockList; | 437 | struct list_head lockList; |
418 | /* BB add in lists for dirty pages i.e. write caching info for oplock */ | 438 | /* BB add in lists for dirty pages i.e. write caching info for oplock */ |
419 | struct list_head openFileList; | 439 | struct list_head openFileList; |
420 | int write_behind_rc; | ||
421 | __u32 cifsAttrs; /* e.g. DOS archive bit, sparse, compressed, system */ | 440 | __u32 cifsAttrs; /* e.g. DOS archive bit, sparse, compressed, system */ |
422 | unsigned long time; /* jiffies of last update/check of inode */ | 441 | unsigned long time; /* jiffies of last update/check of inode */ |
423 | bool clientCanCacheRead:1; /* read oplock */ | 442 | bool clientCanCacheRead:1; /* read oplock */ |
@@ -668,7 +687,7 @@ require use of the stronger protocol */ | |||
668 | * GlobalMid_Lock protects: | 687 | * GlobalMid_Lock protects: |
669 | * list operations on pending_mid_q and oplockQ | 688 | * list operations on pending_mid_q and oplockQ |
670 | * updates to XID counters, multiplex id and SMB sequence numbers | 689 | * updates to XID counters, multiplex id and SMB sequence numbers |
671 | * GlobalSMBSesLock protects: | 690 | * cifs_file_list_lock protects: |
672 | * list operations on tcp and SMB session lists and tCon lists | 691 | * list operations on tcp and SMB session lists and tCon lists |
673 | * f_owner.lock protects certain per file struct operations | 692 | * f_owner.lock protects certain per file struct operations |
674 | * mapping->page_lock protects certain per page operations | 693 | * mapping->page_lock protects certain per page operations |