[CIFS] Fix rsize calculation so that large readx flag is checked.

Signed-off-by: Steve French (sfrench@us.ibm.com)
diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c
index b7fb064..6f78109 100644
--- a/fs/cifs/cifs_debug.c
+++ b/fs/cifs/cifs_debug.c
@@ -267,7 +267,7 @@
 			atomic_read(&tcon->num_oplock_brks));
 		buf += item_length;
 		length += item_length;
-		item_length = sprintf(buf, "\nReads:  %d Bytes %lld",
+		item_length = sprintf(buf, "\nReads:  %d Bytes: %lld",
 			atomic_read(&tcon->num_reads),
 			(long long)(tcon->bytes_read));
 		buf += item_length;
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index 31eb9a3..d1c6ace 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -30,6 +30,7 @@
 #include <linux/mempool.h>
 #include <linux/delay.h>
 #include <linux/completion.h>
+#include <linux/pagevec.h>
 #include <asm/uaccess.h>
 #include <asm/processor.h>
 #include "cifspdu.h"
@@ -188,6 +189,7 @@
 					server->server_RFC1001_name);
 		}
 		if(rc) {
+			cERROR(1,("reconnect error %d",rc));
 			msleep(3000);
 		} else {
 			atomic_inc(&tcpSesReconnectCount);
@@ -469,6 +471,7 @@
 			} else {
 				/* give server a second to
 				clean up before reconnect attempt */
+				cERROR(1,("sleep before reconnect"));
 				msleep(1000);
 				/* always try 445 first on reconnect
 				since we get NACK on some if we ever
@@ -556,6 +559,7 @@
 		dump_smb(smb_buffer, length);
 		if (checkSMB (smb_buffer, smb_buffer->Mid, total_read+4)) {
 			cERROR(1, ("Bad SMB Received "));
+			cifs_dump_mem("smb: ", smb_buffer, 48);
 			continue;
 		}
 
@@ -1383,7 +1387,9 @@
 		the default. sock_setsockopt not used because it expects 
 		user space buffer */
 	(*csocket)->sk->sk_rcvtimeo = 7 * HZ;
-
+	 cERROR(1,("sndbuf %d rcvbuf %d reset to 200K each",(*csocket)->sk->sk_sndbuf, (*csocket)->sk->sk_rcvbuf));
+	(*csocket)->sk->sk_sndbuf = 300 * 1024;
+	(*csocket)->sk->sk_rcvbuf = 200 * 1024;
 	/* send RFC1001 sessinit */
 
 	if(psin_server->sin_port == htons(RFC1001_PORT)) {
@@ -1736,11 +1742,20 @@
     
 	/* search for existing tcon to this server share */
 	if (!rc) {
-		if((volume_info.rsize) && (volume_info.rsize <= CIFSMaxBufSize))
+		if(volume_info.rsize > CIFSMaxBufSize) {
+			cERROR(1,("rsize %d too large, using MaxBufSize",
+				volume_info.rsize));
+			cifs_sb->rsize = CIFSMaxBufSize;
+		} else if((volume_info.rsize) && (volume_info.rsize <= CIFSMaxBufSize))
 			cifs_sb->rsize = volume_info.rsize;
-		else
-			cifs_sb->rsize = srvTcp->maxBuf - MAX_CIFS_HDR_SIZE; /* default */
-		if(volume_info.wsize)
+		else /* default */
+			cifs_sb->rsize = CIFSMaxBufSize;
+
+		if(volume_info.wsize > PAGEVEC_SIZE * PAGE_CACHE_SIZE) {
+			cERROR(1,("wsize %d too large using 4096 instead",
+				  volume_info.wsize));
+			cifs_sb->wsize = 4096;
+		} else if(volume_info.wsize)
 			cifs_sb->wsize = volume_info.wsize;
 		else
 			cifs_sb->wsize = CIFSMaxBufSize; /* default */
@@ -1895,6 +1910,10 @@
 			cifs_sb->wsize = min(cifs_sb->wsize,
 					     (tcon->ses->server->maxBuf -
 					      MAX_CIFS_HDR_SIZE));
+		if (!(tcon->ses->capabilities & CAP_LARGE_READ_X))
+                        cifs_sb->rsize = min(cifs_sb->rsize,
+                                             (tcon->ses->server->maxBuf -
+                                              MAX_CIFS_HDR_SIZE));
 	}
 
 	/* volume_info.password is freed above when existing session found
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index 39b23f4..11806c8 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -855,7 +855,7 @@
 				struct kvec iov[2];
 				unsigned int len;
 
-				len = min(cifs_sb->wsize,
+				len = min((size_t)cifs_sb->wsize,
 					  write_size - total_written);
 				/* iov[0] is reserved for smb header */
 				iov[1].iov_base = (char *)write_data +
@@ -920,7 +920,8 @@
 		    ((open_file->pfile->f_flags & O_RDWR) ||
 		     (open_file->pfile->f_flags & O_WRONLY))) {
 			read_unlock(&GlobalSMBSeslock);
-			if(open_file->invalidHandle) {
+			if((open_file->invalidHandle) && 
+			   (!open_file->closePend)) {
 				rc = cifs_reopen_file(&cifs_inode->vfs_inode, 
 						      open_file->pfile, FALSE);
 				/* if it fails, try another handle - might be */