diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-30 21:56:27 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-30 21:56:27 -0500 |
| commit | 9fbf0c08d441888b977f7c459c8aa57f2c0cb6ad (patch) | |
| tree | 000bfa464562b2432e7f9e7c371a40f4f24e4c7a | |
| parent | 4fda116852fe21a3897c478ce64b77bb1ec6b3d6 (diff) | |
| parent | ee2c9258501f83d3ed0fd09ce5df1cec53312cf0 (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: More crypto cleanup (try #2)
CIFS: Add strictcache mount option
CIFS: Implement cifs_strict_writev (try #4)
[CIFS] Replace cifs md5 hashing functions with kernel crypto APIs
| -rw-r--r-- | fs/cifs/Makefile | 2 | ||||
| -rw-r--r-- | fs/cifs/README | 5 | ||||
| -rw-r--r-- | fs/cifs/cifsencrypt.c | 33 | ||||
| -rw-r--r-- | fs/cifs/cifsencrypt.h | 33 | ||||
| -rw-r--r-- | fs/cifs/cifsfs.c | 15 | ||||
| -rw-r--r-- | fs/cifs/cifsfs.h | 4 | ||||
| -rw-r--r-- | fs/cifs/cifsproto.h | 11 | ||||
| -rw-r--r-- | fs/cifs/connect.c | 11 | ||||
| -rw-r--r-- | fs/cifs/file.c | 202 | ||||
| -rw-r--r-- | fs/cifs/link.c | 58 | ||||
| -rw-r--r-- | fs/cifs/md4.c | 205 | ||||
| -rw-r--r-- | fs/cifs/md5.c | 366 | ||||
| -rw-r--r-- | fs/cifs/md5.h | 38 | ||||
| -rw-r--r-- | fs/cifs/smbdes.c | 1 | ||||
| -rw-r--r-- | fs/cifs/smbencrypt.c | 91 |
15 files changed, 371 insertions, 704 deletions
diff --git a/fs/cifs/Makefile b/fs/cifs/Makefile index 43b19dd39191..d87558448e3d 100644 --- a/fs/cifs/Makefile +++ b/fs/cifs/Makefile | |||
| @@ -5,7 +5,7 @@ obj-$(CONFIG_CIFS) += cifs.o | |||
| 5 | 5 | ||
| 6 | cifs-y := cifsfs.o cifssmb.o cifs_debug.o connect.o dir.o file.o inode.o \ | 6 | cifs-y := cifsfs.o cifssmb.o cifs_debug.o connect.o dir.o file.o inode.o \ |
| 7 | link.o misc.o netmisc.o smbdes.o smbencrypt.o transport.o asn1.o \ | 7 | link.o misc.o netmisc.o smbdes.o smbencrypt.o transport.o asn1.o \ |
| 8 | md4.o md5.o cifs_unicode.o nterr.o xattr.o cifsencrypt.o \ | 8 | cifs_unicode.o nterr.o xattr.o cifsencrypt.o \ |
| 9 | readdir.o ioctl.o sess.o export.o | 9 | readdir.o ioctl.o sess.o export.o |
| 10 | 10 | ||
| 11 | cifs-$(CONFIG_CIFS_ACL) += cifsacl.o | 11 | cifs-$(CONFIG_CIFS_ACL) += cifsacl.o |
diff --git a/fs/cifs/README b/fs/cifs/README index 46af99ab3614..fe1683590828 100644 --- a/fs/cifs/README +++ b/fs/cifs/README | |||
| @@ -452,6 +452,11 @@ A partial list of the supported mount options follows: | |||
| 452 | if oplock (caching token) is granted and held. Note that | 452 | if oplock (caching token) is granted and held. Note that |
| 453 | direct allows write operations larger than page size | 453 | direct allows write operations larger than page size |
| 454 | to be sent to the server. | 454 | to be sent to the server. |
| 455 | strictcache Use for switching on strict cache mode. In this mode the | ||
| 456 | client read from the cache all the time it has Oplock Level II, | ||
| 457 | otherwise - read from the server. All written data are stored | ||
| 458 | in the cache, but if the client doesn't have Exclusive Oplock, | ||
| 459 | it writes the data to the server. | ||
| 455 | acl Allow setfacl and getfacl to manage posix ACLs if server | 460 | acl Allow setfacl and getfacl to manage posix ACLs if server |
| 456 | supports them. (default) | 461 | supports them. (default) |
| 457 | noacl Do not allow setfacl and getfacl calls on this mount | 462 | noacl Do not allow setfacl and getfacl calls on this mount |
diff --git a/fs/cifs/cifsencrypt.c b/fs/cifs/cifsencrypt.c index 66f3d50d0676..0db5f1de0227 100644 --- a/fs/cifs/cifsencrypt.c +++ b/fs/cifs/cifsencrypt.c | |||
| @@ -24,7 +24,6 @@ | |||
| 24 | #include "cifspdu.h" | 24 | #include "cifspdu.h" |
| 25 | #include "cifsglob.h" | 25 | #include "cifsglob.h" |
| 26 | #include "cifs_debug.h" | 26 | #include "cifs_debug.h" |
| 27 | #include "md5.h" | ||
| 28 | #include "cifs_unicode.h" | 27 | #include "cifs_unicode.h" |
| 29 | #include "cifsproto.h" | 28 | #include "cifsproto.h" |
| 30 | #include "ntlmssp.h" | 29 | #include "ntlmssp.h" |
| @@ -37,11 +36,6 @@ | |||
| 37 | /* Note that the smb header signature field on input contains the | 36 | /* Note that the smb header signature field on input contains the |
| 38 | sequence number before this function is called */ | 37 | sequence number before this function is called */ |
| 39 | 38 | ||
| 40 | extern void mdfour(unsigned char *out, unsigned char *in, int n); | ||
| 41 | extern void E_md4hash(const unsigned char *passwd, unsigned char *p16); | ||
| 42 | extern void SMBencrypt(unsigned char *passwd, const unsigned char *c8, | ||
| 43 | unsigned char *p24); | ||
| 44 | |||
| 45 | static int cifs_calculate_signature(const struct smb_hdr *cifs_pdu, | 39 | static int cifs_calculate_signature(const struct smb_hdr *cifs_pdu, |
| 46 | struct TCP_Server_Info *server, char *signature) | 40 | struct TCP_Server_Info *server, char *signature) |
| 47 | { | 41 | { |
| @@ -234,6 +228,7 @@ int cifs_verify_signature(struct smb_hdr *cifs_pdu, | |||
| 234 | /* first calculate 24 bytes ntlm response and then 16 byte session key */ | 228 | /* first calculate 24 bytes ntlm response and then 16 byte session key */ |
| 235 | int setup_ntlm_response(struct cifsSesInfo *ses) | 229 | int setup_ntlm_response(struct cifsSesInfo *ses) |
| 236 | { | 230 | { |
| 231 | int rc = 0; | ||
| 237 | unsigned int temp_len = CIFS_SESS_KEY_SIZE + CIFS_AUTH_RESP_SIZE; | 232 | unsigned int temp_len = CIFS_SESS_KEY_SIZE + CIFS_AUTH_RESP_SIZE; |
| 238 | char temp_key[CIFS_SESS_KEY_SIZE]; | 233 | char temp_key[CIFS_SESS_KEY_SIZE]; |
| 239 | 234 | ||
| @@ -247,13 +242,26 @@ int setup_ntlm_response(struct cifsSesInfo *ses) | |||
| 247 | } | 242 | } |
| 248 | ses->auth_key.len = temp_len; | 243 | ses->auth_key.len = temp_len; |
| 249 | 244 | ||
| 250 | SMBNTencrypt(ses->password, ses->server->cryptkey, | 245 | rc = SMBNTencrypt(ses->password, ses->server->cryptkey, |
| 251 | ses->auth_key.response + CIFS_SESS_KEY_SIZE); | 246 | ses->auth_key.response + CIFS_SESS_KEY_SIZE); |
| 247 | if (rc) { | ||
| 248 | cFYI(1, "%s Can't generate NTLM response, error: %d", | ||
| 249 | __func__, rc); | ||
| 250 | return rc; | ||
| 251 | } | ||
| 252 | |||
| 253 | rc = E_md4hash(ses->password, temp_key); | ||
| 254 | if (rc) { | ||
| 255 | cFYI(1, "%s Can't generate NT hash, error: %d", __func__, rc); | ||
| 256 | return rc; | ||
| 257 | } | ||
| 252 | 258 | ||
| 253 | E_md4hash(ses->password, temp_key); | 259 | rc = mdfour(ses->auth_key.response, temp_key, CIFS_SESS_KEY_SIZE); |
| 254 | mdfour(ses->auth_key.response, temp_key, CIFS_SESS_KEY_SIZE); | 260 | if (rc) |
| 261 | cFYI(1, "%s Can't generate NTLM session key, error: %d", | ||
| 262 | __func__, rc); | ||
| 255 | 263 | ||
| 256 | return 0; | 264 | return rc; |
| 257 | } | 265 | } |
| 258 | 266 | ||
| 259 | #ifdef CONFIG_CIFS_WEAK_PW_HASH | 267 | #ifdef CONFIG_CIFS_WEAK_PW_HASH |
| @@ -700,14 +708,13 @@ cifs_crypto_shash_allocate(struct TCP_Server_Info *server) | |||
| 700 | unsigned int size; | 708 | unsigned int size; |
| 701 | 709 | ||
| 702 | server->secmech.hmacmd5 = crypto_alloc_shash("hmac(md5)", 0, 0); | 710 | server->secmech.hmacmd5 = crypto_alloc_shash("hmac(md5)", 0, 0); |
| 703 | if (!server->secmech.hmacmd5 || | 711 | if (IS_ERR(server->secmech.hmacmd5)) { |
| 704 | IS_ERR(server->secmech.hmacmd5)) { | ||
| 705 | cERROR(1, "could not allocate crypto hmacmd5\n"); | 712 | cERROR(1, "could not allocate crypto hmacmd5\n"); |
| 706 | return PTR_ERR(server->secmech.hmacmd5); | 713 | return PTR_ERR(server->secmech.hmacmd5); |
| 707 | } | 714 | } |
| 708 | 715 | ||
| 709 | server->secmech.md5 = crypto_alloc_shash("md5", 0, 0); | 716 | server->secmech.md5 = crypto_alloc_shash("md5", 0, 0); |
| 710 | if (!server->secmech.md5 || IS_ERR(server->secmech.md5)) { | 717 | if (IS_ERR(server->secmech.md5)) { |
| 711 | cERROR(1, "could not allocate crypto md5\n"); | 718 | cERROR(1, "could not allocate crypto md5\n"); |
| 712 | rc = PTR_ERR(server->secmech.md5); | 719 | rc = PTR_ERR(server->secmech.md5); |
| 713 | goto crypto_allocate_md5_fail; | 720 | goto crypto_allocate_md5_fail; |
diff --git a/fs/cifs/cifsencrypt.h b/fs/cifs/cifsencrypt.h deleted file mode 100644 index 15d2ec006474..000000000000 --- a/fs/cifs/cifsencrypt.h +++ /dev/null | |||
| @@ -1,33 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * fs/cifs/cifsencrypt.h | ||
| 3 | * | ||
| 4 | * Copyright (c) International Business Machines Corp., 2005 | ||
| 5 | * Author(s): Steve French (sfrench@us.ibm.com) | ||
| 6 | * | ||
| 7 | * Externs for misc. small encryption routines | ||
| 8 | * so we do not have to put them in cifsproto.h | ||
| 9 | * | ||
| 10 | * This library is free software; you can redistribute it and/or modify | ||
| 11 | * it under the terms of the GNU Lesser General Public License as published | ||
| 12 | * by the Free Software Foundation; either version 2.1 of the License, or | ||
| 13 | * (at your option) any later version. | ||
| 14 | * | ||
| 15 | * This library is distributed in the hope that it will be useful, | ||
| 16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See | ||
| 18 | * the GNU Lesser General Public License for more details. | ||
| 19 | * | ||
| 20 | * You should have received a copy of the GNU Lesser General Public License | ||
| 21 | * along with this library; if not, write to the Free Software | ||
| 22 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 23 | */ | ||
| 24 | |||
| 25 | /* md4.c */ | ||
| 26 | extern void mdfour(unsigned char *out, unsigned char *in, int n); | ||
| 27 | /* smbdes.c */ | ||
| 28 | extern void E_P16(unsigned char *p14, unsigned char *p16); | ||
| 29 | extern void E_P24(unsigned char *p21, const unsigned char *c8, | ||
| 30 | unsigned char *p24); | ||
| 31 | |||
| 32 | |||
| 33 | |||
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index a8323f1dc1c4..f2970136d17d 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c | |||
| @@ -600,10 +600,17 @@ static ssize_t cifs_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
| 600 | { | 600 | { |
| 601 | struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode; | 601 | struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode; |
| 602 | ssize_t written; | 602 | ssize_t written; |
| 603 | int rc; | ||
| 603 | 604 | ||
| 604 | written = generic_file_aio_write(iocb, iov, nr_segs, pos); | 605 | written = generic_file_aio_write(iocb, iov, nr_segs, pos); |
| 605 | if (!CIFS_I(inode)->clientCanCacheAll) | 606 | |
| 606 | filemap_fdatawrite(inode->i_mapping); | 607 | if (CIFS_I(inode)->clientCanCacheAll) |
| 608 | return written; | ||
| 609 | |||
| 610 | |||
