[PATCH v2 43/53] CIFS: Process STATUS_PENDING responses for SMB2

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Pavel Shilovsky <piastryyy@xxxxxxxxx>

Signed-off-by: Pavel Shilovsky <piastryyy@xxxxxxxxx>
---
 fs/cifs/connect.c |   19 +++++++++++++++++--
 fs/cifs/nterr.h   |    1 +
 2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index ab9e972..e46c2bd 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -825,10 +825,10 @@ standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
 	 * into the payload for debugging purposes.
 	 */
 #ifdef CONFIG_CIFS_SMB2
-	if (server->is_smb2)
+	if (server->is_smb2) {
 		length = checkSMB2(smb2_buffer, smb2_buffer->MessageId,
 				   server->total_read);
-	else
+	} else
 #endif
 		length = checkSMB(smb_buffer, smb_buffer->Mid,
 				  server->total_read);
@@ -836,6 +836,21 @@ standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
 		cifs_dump_mem("Bad SMB: ", buf,
 			min_t(unsigned int, server->total_read, 48));
 
+#ifdef CONFIG_CIFS_SMB2
+	/*
+	* If we negotiate SMB2 protocol and get STATUS_PENDING - update
+	* the number of credits and skip it.
+	*/
+	if (server->is_smb2 &&
+			le32_to_cpu(smb2_buffer->Status) == STATUS_PENDING) {
+		if (!length)
+			atomic_add(le16_to_cpu(smb2_buffer->CreditRequest),
+				   &server->credits);
+		cERROR(1, "STATUS PENDING");
+		return -1;
+	}
+#endif
+
 	if (mid)
 		handle_mid(mid, server, buf, length);
 
diff --git a/fs/cifs/nterr.h b/fs/cifs/nterr.h
index 2572673..e80c0ef 100644
--- a/fs/cifs/nterr.h
+++ b/fs/cifs/nterr.h
@@ -40,6 +40,7 @@ extern const struct nt_err_code_struct nt_errs[];
 #define ERROR_INSUFFICIENT_BUFFER	  0x007a
 #define STATUS_1804	                  0x070c
 #define STATUS_NOTIFY_ENUM_DIR            0x010c
+#define STATUS_PENDING			  0x00000103
 
 /* Win32 Error codes extracted using a loop in smbclient then printing a
    netmon sniff to a file. */
-- 
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux