diff mbox

[linux-cifs-client] cifs: Fix a kernel BUG with remote OS/2 server

Message ID 1269972967-6453-1-git-send-email-sjayaraman@suse.de (mailing list archive)
State New, archived
Headers show

Commit Message

Suresh Jayaraman March 30, 2010, 6:16 p.m. UTC
None
diff mbox

Patch

diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
index 7cc7f83..5872e58 100644
--- a/fs/cifs/cifssmb.c
+++ b/fs/cifs/cifssmb.c
@@ -1517,6 +1517,16 @@  CIFSSMBWrite(const int xid, struct cifsTconInfo *tcon,
 		*nbytes = le16_to_cpu(pSMBr->CountHigh);
 		*nbytes = (*nbytes) << 16;
 		*nbytes += le16_to_cpu(pSMBr->Count);
+
+		/*
+		 * Workaround: Some legacy servers (read OS/2) might incorrectly
+		 * set CountHigh for normal writes resulting in wrong 'nbytes'
+		 * value. So when the write returns successfully and the bytes
+		 * written as returned by the server is greater than bytes
+		 * requested, reset it to original bytes requested.
+		 */
+		if (*nbytes > count)
+			*nbytes = count;
 	}
 
 	cifs_buf_release(pSMB);
@@ -1605,6 +1615,16 @@  CIFSSMBWrite2(const int xid, struct cifsTconInfo *tcon,
 		*nbytes = le16_to_cpu(pSMBr->CountHigh);
 		*nbytes = (*nbytes) << 16;
 		*nbytes += le16_to_cpu(pSMBr->Count);
+
+		/* Workaround: Some legacy servers (read OS/2) might incorrectly
+		 * set CountHigh for normal writes resulting in wrong 'nbytes'
+		 * value. So when the write returns successfully and the bytes
+		 * written as returned by the server is greater than bytes
+		 * requested, reset it to original bytes requested.
+		 */
+
+		if (*nbytes > count)
+			*nbytes = count;
 	}
 
 /*	cifs_small_buf_release(pSMB); */ /* Freed earlier now in SendReceive2 */