diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/cifs/connect.c | 2 | ||||
| -rw-r--r-- | fs/cifs/file.c | 26 | ||||
| -rw-r--r-- | fs/cifs/readdir.c | 10 | ||||
| -rw-r--r-- | fs/cifs/smbencrypt.c | 6 |
4 files changed, 39 insertions, 5 deletions
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index d6a972df0338..8cd4b52d4217 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
| @@ -441,6 +441,8 @@ cifs_readv_from_socket(struct TCP_Server_Info *server, struct kvec *iov_orig, | |||
| 441 | smb_msg.msg_controllen = 0; | 441 | smb_msg.msg_controllen = 0; |
| 442 | 442 | ||
| 443 | for (total_read = 0; to_read; total_read += length, to_read -= length) { | 443 | for (total_read = 0; to_read; total_read += length, to_read -= length) { |
| 444 | try_to_freeze(); | ||
| 445 | |||
| 444 | if (server_unresponsive(server)) { | 446 | if (server_unresponsive(server)) { |
| 445 | total_read = -EAGAIN; | 447 | total_read = -EAGAIN; |
| 446 | break; | 448 | break; |
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index cf0b1539b321..4dd9283885e7 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
| @@ -702,6 +702,13 @@ cifs_find_lock_conflict(struct cifsInodeInfo *cinode, struct cifsLockInfo *lock, | |||
| 702 | lock->type, lock->netfid, conf_lock); | 702 | lock->type, lock->netfid, conf_lock); |
| 703 | } | 703 | } |
| 704 | 704 | ||
| 705 | /* | ||
| 706 | * Check if there is another lock that prevents us to set the lock (mandatory | ||
| 707 | * style). If such a lock exists, update the flock structure with its | ||
| 708 | * properties. Otherwise, set the flock type to F_UNLCK if we can cache brlocks | ||
| 709 | * or leave it the same if we can't. Returns 0 if we don't need to request to | ||
| 710 | * the server or 1 otherwise. | ||
| 711 | */ | ||
| 705 | static int | 712 | static int |
| 706 | cifs_lock_test(struct cifsInodeInfo *cinode, __u64 offset, __u64 length, | 713 | cifs_lock_test(struct cifsInodeInfo *cinode, __u64 offset, __u64 length, |
| 707 | __u8 type, __u16 netfid, struct file_lock *flock) | 714 | __u8 type, __u16 netfid, struct file_lock *flock) |
| @@ -739,6 +746,12 @@ cifs_lock_add(struct cifsInodeInfo *cinode, struct cifsLockInfo *lock) | |||
| 739 | mutex_unlock(&cinode->lock_mutex); | 746 | mutex_unlock(&cinode->lock_mutex); |
| 740 | } | 747 | } |
| 741 | 748 | ||
| 749 | /* | ||
| 750 | * Set the byte-range lock (mandatory style). Returns: | ||
| 751 | * 1) 0, if we set the lock and don't need to request to the server; | ||
| 752 | * 2) 1, if no locks prevent us but we need to request to the server; | ||
| 753 | * 3) -EACCESS, if there is a lock that prevents us and wait is false. | ||
| 754 | */ | ||
| 742 | static int | 755 | static int |
| 743 | cifs_lock_add_if(struct cifsInodeInfo *cinode, struct cifsLockInfo *lock, | 756 | cifs_lock_add_if(struct cifsInodeInfo *cinode, struct cifsLockInfo *lock, |
| 744 | bool wait) | 757 | bool wait) |
| @@ -778,6 +791,13 @@ try_again: | |||
| 778 | return rc; | 791 | return rc; |
| 779 | } | 792 | } |
| 780 | 793 | ||
| 794 | /* | ||
| 795 | * Check if there is another lock that prevents us to set the lock (posix | ||
| 796 | * style). If such a lock exists, update the flock structure with its | ||
| 797 | * properties. Otherwise, set the flock type to F_UNLCK if we can cache brlocks | ||
| 798 | * or leave it the same if we can't. Returns 0 if we don't need to request to | ||
| 799 | * the server or 1 otherwise. | ||
| 800 | */ | ||
| 781 | static int | 801 | static int |
| 782 | cifs_posix_lock_test(struct file *file, struct file_lock *flock) | 802 | cifs_posix_lock_test(struct file *file, struct file_lock *flock) |
| 783 | { | 803 | { |
| @@ -800,6 +820,12 @@ cifs_posix_lock_test(struct file *file, struct file_lock *flock) | |||
| 800 | return rc; | 820 | return rc; |
| 801 | } | 821 | } |
| 802 | 822 | ||
| 823 | /* | ||
| 824 | * Set the byte-range lock (posix style). Returns: | ||
| 825 | * 1) 0, if we set the lock and don't need to request to the server; | ||
| 826 | * 2) 1, if we need to request to the server; | ||
| 827 | * 3) <0, if the error occurs while setting the lock. | ||
| 828 | */ | ||
| 803 | static int | 829 | static int |
| 804 | cifs_posix_lock_set(struct file *file, struct file_lock *flock) | 830 | cifs_posix_lock_set(struct file *file, struct file_lock *flock) |
| 805 | { | 831 | { |
diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c index 5de03ec20144..a090bbe6ee29 100644 --- a/fs/cifs/readdir.c +++ b/fs/cifs/readdir.c | |||
| @@ -554,7 +554,10 @@ static int find_cifs_entry(const int xid, struct cifs_tcon *pTcon, | |||
| 554 | rc); | 554 | rc); |
| 555 | return rc; | 555 | return rc; |
| 556 | } | 556 | } |
| 557 | cifs_save_resume_key(cifsFile->srch_inf.last_entry, cifsFile); | 557 | /* FindFirst/Next set last_entry to NULL on malformed reply */ |
| 558 | if (cifsFile->srch_inf.last_entry) | ||
| 559 | cifs_save_resume_key(cifsFile->srch_inf.last_entry, | ||
| 560 | cifsFile); | ||
| 558 | } | 561 | } |
| 559 | 562 | ||
| 560 | while ((index_to_find >= cifsFile->srch_inf.index_of_last_entry) && | 563 | while ((index_to_find >= cifsFile->srch_inf.index_of_last_entry) && |
| @@ -562,7 +565,10 @@ static int find_cifs_entry(const int xid, struct cifs_tcon *pTcon, | |||
| 562 | cFYI(1, "calling findnext2"); | 565 | cFYI(1, "calling findnext2"); |
| 563 | rc = CIFSFindNext(xid, pTcon, cifsFile->netfid, | 566 | rc = CIFSFindNext(xid, pTcon, cifsFile->netfid, |
| 564 | &cifsFile->srch_inf); | 567 | &cifsFile->srch_inf); |
| 565 | cifs_save_resume_key(cifsFile->srch_inf.last_entry, cifsFile); | 568 | /* FindFirst/Next set last_entry to NULL on malformed reply */ |
| 569 | if (cifsFile->srch_inf.last_entry) | ||
| 570 | cifs_save_resume_key(cifsFile->srch_inf.last_entry, | ||
| 571 | cifsFile); | ||
| 566 | if (rc) | 572 | if (rc) |
| 567 | return -ENOENT; | 573 | return -ENOENT; |
| 568 | } | 574 | } |
diff --git a/fs/cifs/smbencrypt.c b/fs/cifs/smbencrypt.c index 7cacba12b8f1..80d850881938 100644 --- a/fs/cifs/smbencrypt.c +++ b/fs/cifs/smbencrypt.c | |||
| @@ -209,7 +209,7 @@ E_md4hash(const unsigned char *passwd, unsigned char *p16, | |||
| 209 | { | 209 | { |
| 210 | int rc; | 210 | int rc; |
| 211 | int len; | 211 | int len; |
| 212 | __u16 wpwd[129]; | 212 | __le16 wpwd[129]; |
| 213 | 213 | ||
| 214 | /* Password cannot be longer than 128 characters */ | 214 | /* Password cannot be longer than 128 characters */ |
| 215 | if (passwd) /* Password must be converted to NT unicode */ | 215 | if (passwd) /* Password must be converted to NT unicode */ |
| @@ -219,8 +219,8 @@ E_md4hash(const unsigned char *passwd, unsigned char *p16, | |||
| 219 | *wpwd = 0; /* Ensure string is null terminated */ | 219 | *wpwd = 0; /* Ensure string is null terminated */ |
| 220 | } | 220 | } |
| 221 | 221 | ||
| 222 | rc = mdfour(p16, (unsigned char *) wpwd, len * sizeof(__u16)); | 222 | rc = mdfour(p16, (unsigned char *) wpwd, len * sizeof(__le16)); |
| 223 | memset(wpwd, 0, 129 * sizeof(__u16)); | 223 | memset(wpwd, 0, 129 * sizeof(__le16)); |
| 224 | 224 | ||
| 225 | return rc; | 225 | return rc; |
| 226 | } | 226 | } |
