during the local client kernel build will be used.
                If server does not support Unicode, this parameter is
                unused.
-  rsize                default read size (usually 16K)
-  wsize                default write size (usually 16K, 32K is often better over GigE)
-               maximum wsize currently allowed by CIFS is 57344 (14 4096 byte
-               pages)
+  rsize                default read size (usually 16K). The client currently
+               can not use rsize larger than CIFSMaxBufSize. CIFSMaxBufSize
+               defaults to 16K and may be changed (from 8K to the maximum
+               kmalloc size allowed by your kernel) at module install time
+               for cifs.ko. Setting CIFSMaxBufSize to a very large value
+               will cause cifs to use more memory and may reduce performance
+               in some cases.  To use rsize greater than 127K (the original
+               cifs protocol maximum) also requires that the server support
+               a new Unix Capability flag (for very large read) which some
+               newer servers (e.g. Samba 3.0.26 or later) do. rsize can be
+               set from a minimum of 2048 to a maximum of 130048 (127K or
+               CIFSMaxBufSize, whichever is smaller)
+  wsize                default write size (default 57344)
+               maximum wsize currently allowed by CIFS is 57344 (fourteen
+               4096 byte pages)
   rw           mount the network share read-write (note that the
                server may still consider the share read-only)
   ro           mount network share read-only
 
        echo 1 > /proc/fs/cifs/traceSMB
 
-Two other experimental features are under development and to test 
-require enabling CONFIG_CIFS_EXPERIMENTAL
+Two other experimental features are under development. To test these
+requires enabling CONFIG_CIFS_EXPERIMENTAL
 
-       More efficient write operations
+       ipv6 enablement
 
        DNOTIFY fcntl: needed for support of directory change 
                            notification and perhaps later for file leases)
 
 #define REQ_OPLOCK         0x00000002
 #define REQ_BATCHOPLOCK    0x00000004
 #define REQ_OPENDIRONLY    0x00000008
+#define REQ_EXTENDED_INFO  0x00000010
 
 typedef struct smb_com_open_req {      /* also handles create */
        struct smb_hdr hdr;     /* wct = 24 */
 #define CIFS_UNIX_POSIX_PATHNAMES_CAP   0x00000010 /* Allow POSIX path chars  */
 #define CIFS_UNIX_POSIX_PATH_OPS_CAP    0x00000020 /* Allow new POSIX path based
                                                      calls including posix open
-                                                     and posix unlink */ 
+                                                     and posix unlink */
+#define CIFS_UNIX_LARGE_READ_CAP        0x00000040 /* support reads >128K (up
+                                                     to 0xFFFF00 */                                   
+#define CIFS_UNIX_LARGE_WRITE_CAP       0x00000080
+
 #ifdef CONFIG_CIFS_POSIX
 /* Can not set pathnames cap yet until we send new posix create SMB since
    otherwise server can treat such handles opened with older ntcreatex
    (by a new client which knows how to send posix path ops)
    as non-posix handles (can affect write behavior with byte range locks.
    We can add back in POSIX_PATH_OPS cap when Posix Create/Mkdir finished */
-/* #define CIFS_UNIX_CAP_MASK              0x0000003b */
-#define CIFS_UNIX_CAP_MASK              0x0000001b 
+/* #define CIFS_UNIX_CAP_MASK              0x000000fb */
+#define CIFS_UNIX_CAP_MASK              0x000000db 
 #else 
 #define CIFS_UNIX_CAP_MASK              0x00000013
 #endif /* CONFIG_CIFS_POSIX */
 
 /*
  *   fs/cifs/connect.c
  *
- *   Copyright (C) International Business Machines  Corp., 2002,2006
+ *   Copyright (C) International Business Machines  Corp., 2002,2007
  *   Author(s): Steve French (sfrench@us.ibm.com)
  *
  *   This library is free software; you can redistribute it and/or modify
                }
                
                cap &= CIFS_UNIX_CAP_MASK;
-               if(vol_info && vol_info->no_psx_acl)
+               if (vol_info && vol_info->no_psx_acl)
                        cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
-               else if(CIFS_UNIX_POSIX_ACL_CAP & cap) {
+               else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
                        cFYI(1,("negotiated posix acl support"));
                        if(sb)
                                sb->s_flags |= MS_POSIXACL;
                }
 
-               if(vol_info && vol_info->posix_paths == 0)
+               if (vol_info && vol_info->posix_paths == 0)
                        cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
-               else if(cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
+               else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
                        cFYI(1,("negotiate posix pathnames"));
-                       if(sb)
+                       if (sb)
                                CIFS_SB(sb)->mnt_cifs_flags |= 
                                        CIFS_MOUNT_POSIX_PATHS;
                }
                /* We might be setting the path sep back to a different
                form if we are reconnecting and the server switched its
                posix path capability for this share */ 
-               if(sb && (CIFS_SB(sb)->prepathlen > 0))
+               if (sb && (CIFS_SB(sb)->prepathlen > 0))
                        CIFS_SB(sb)->prepath[0] = CIFS_DIR_SEP(CIFS_SB(sb));
+
+               if (sb && (CIFS_SB(sb)->rsize > 127 * 1024)) {
+                       if ((cap & CIFS_UNIX_LARGE_READ_CAP) == 0) {
+                               CIFS_SB(sb)->rsize = 127 * 1024;
+#ifdef CONFIG_CIFS_DEBUG2
+                               cFYI(1,("larger reads not supported by srv"));
+#endif
+                       }
+               }
+               
        
                cFYI(1,("Negotiate caps 0x%x",(int)cap));
 #ifdef CONFIG_CIFS_DEBUG2
-               if(cap & CIFS_UNIX_FCNTL_CAP)
+               if (cap & CIFS_UNIX_FCNTL_CAP)
                        cFYI(1,("FCNTL cap"));
-               if(cap & CIFS_UNIX_EXTATTR_CAP)
+               if (cap & CIFS_UNIX_EXTATTR_CAP)
                        cFYI(1,("EXTATTR cap"));
-               if(cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
+               if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
                        cFYI(1,("POSIX path cap"));
-               if(cap & CIFS_UNIX_XATTR_CAP)
+               if (cap & CIFS_UNIX_XATTR_CAP)
                        cFYI(1,("XATTR cap"));
-               if(cap & CIFS_UNIX_POSIX_ACL_CAP)
+               if (cap & CIFS_UNIX_POSIX_ACL_CAP)
                        cFYI(1,("POSIX ACL cap"));
+               if (cap & CIFS_UNIX_LARGE_READ_CAP)
+                       cFYI(1,("very large read cap"));
+               if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
+                       cFYI(1,("very large write cap"));
 #endif /* CIFS_DEBUG2 */
                if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
                        cFYI(1,("setting capabilities failed"));
                        cERROR(1,("rsize %d too large, using MaxBufSize",
                                volume_info.rsize));
                        cifs_sb->rsize = CIFSMaxBufSize;
-               } else if((volume_info.rsize) && (volume_info.rsize <= CIFSMaxBufSize))
+               } else if ((volume_info.rsize) &&
+                               (volume_info.rsize <= CIFSMaxBufSize))
                        cifs_sb->rsize = volume_info.rsize;
                else /* default */
                        cifs_sb->rsize = CIFSMaxBufSize;
 
                if (volume_info.wsize > PAGEVEC_SIZE * PAGE_CACHE_SIZE) {
-                       cERROR(1,("wsize %d too large using 4096 instead",
+                       cERROR(1,("wsize %d too large, using 4096 instead",
                                  volume_info.wsize));
                        cifs_sb->wsize = 4096;
                } else if (volume_info.wsize)
                if (cifs_sb->rsize < 2048) {
                        cifs_sb->rsize = 2048; 
                        /* Windows ME may prefer this */
-                       cFYI(1,("readsize set to minimum 2048"));
+                       cFYI(1,("readsize set to minimum: 2048"));
                }
                /* calculate prepath */
                cifs_sb->prepath = volume_info.prepath;
                /* tell server which Unix caps we support */
                if (tcon->ses->capabilities & CAP_UNIX)
                        reset_cifs_unix_caps(xid, tcon, sb, &volume_info);
-               
+               else if(cifs_sb->rsize > (1024 * 127)) {
+                       cifs_sb->rsize = 1024 * 127;
+#ifdef CONFIG_CIFS_DEBUG2
+                       cFYI(1,("no very large read support, rsize 127K"));
+#endif
+                       
+               }
                if (!(tcon->ses->capabilities & CAP_LARGE_WRITE_X))
                        cifs_sb->wsize = min(cifs_sb->wsize,
                                             (tcon->ses->server->maxBuf -