]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
[CIFS] Workaround various server bugs found in testing at connectathon
authorSteve French <sfrench@us.ibm.com>
Fri, 3 Mar 2006 09:53:36 +0000 (09:53 +0000)
committerSteve French <sfrench@us.ibm.com>
Fri, 3 Mar 2006 09:53:36 +0000 (09:53 +0000)
- slow down negprot 1ms during mount when RFC1001 over port 139
to give buggy servers time to clear sess_init
- remap some plausible but incorrect SMB return codes to the
right ones in truncate and hardlink paths

Signed-off-by: Steve French <sfrench@us.ibm.com>
fs/cifs/CHANGES
fs/cifs/cifsfs.h
fs/cifs/connect.c
fs/cifs/inode.c
fs/cifs/link.c

index 25d7df4a00c32cd7f5e65e78674705a09a522f13..6238da96cc77514f2dd962cc6c877575e9ec3e15 100644 (file)
@@ -8,7 +8,8 @@ max smb buffer size when CIFSMaxBufSize over 64K.  Fix oops in
 cifs_user_read and cifs_readpages (when EAGAIN on send of smb
 on socket is returned over and over).  Add POSIX (advisory) byte range
 locking support (requires server with newest CIFS UNIX Extensions
-to the protocol implemented).
+to the protocol implemented). Slow down negprot slightly in port 139
+RFC1001 case to give session_init time on buggy servers.
 
 Version 1.40
 ------------
index 4cf10f23cda9523204a0ca953bb9449345a11deb..b4dcdc2052a0e72f36d0b7106834c1818f9bcae6 100644 (file)
@@ -99,5 +99,5 @@ extern ssize_t        cifs_getxattr(struct dentry *, const char *, void *, size_t);
 extern ssize_t cifs_listxattr(struct dentry *, char *, size_t);
 extern int cifs_ioctl (struct inode * inode, struct file * filep,
                       unsigned int command, unsigned long arg);
-#define CIFS_VERSION   "1.41"
+#define CIFS_VERSION   "1.42"
 #endif                         /* _CIFSFS_H */
index b8f1baabd3438d3532604df8dde78a1c2413c242..3651deca4f24d74411f5e33a418a13514deb638f 100644 (file)
@@ -1476,6 +1476,14 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
                        rc = smb_send(*csocket, smb_buf, 0x44,
                                (struct sockaddr *)psin_server);
                        kfree(ses_init_buf);
+                       msleep(1); /* RFC1001 layer in at least one server 
+                                     requires very short break before negprot
+                                     presumably because not expecting negprot
+                                     to follow so fast.  This is a simple
+                                     solution that works without 
+                                     complicating the code and causes no
+                                     significant slowing down on mount
+                                     for everyone else */
                }
                /* else the negprot may still work without this 
                even though malloc failed */
index 0a46a9395ec44782a775bede25a1a79add156114..b21038b99fc27c6859ab165f5df7645fd5a6d453 100644 (file)
@@ -1166,7 +1166,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
                                                nfid, npid, FALSE);
                        atomic_dec(&open_file->wrtPending);
                        cFYI(1,("SetFSize for attrs rc = %d", rc));
-                       if((rc == -EINVAL) ||(rc == -EOPNOTSUPP)) {
+                       if((rc == -EINVAL) || (rc == -EOPNOTSUPP)) {
                                int bytes_written;
                                rc = CIFSSMBWrite(xid, pTcon,
                                                  nfid, 0, attrs->ia_size,
@@ -1188,7 +1188,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
                                           cifs_sb->mnt_cifs_flags &
                                                CIFS_MOUNT_MAP_SPECIAL_CHR);
                        cFYI(1, ("SetEOF by path (setattrs) rc = %d", rc));
-                       if(rc == -EINVAL) {
+                       if((rc == -EINVAL) || (rc == -EOPNOTSUPP)) {
                                __u16 netfid;
                                int oplock = FALSE;
 
index 0f99aae33162fbd68f5e08a32713db3055a418cf..ce86ec69fe01c2dc4fe47965c84f0e7e8e74ac7f 100644 (file)
@@ -67,7 +67,7 @@ cifs_hardlink(struct dentry *old_file, struct inode *inode,
                                        cifs_sb_target->local_nls, 
                                        cifs_sb_target->mnt_cifs_flags &
                                                CIFS_MOUNT_MAP_SPECIAL_CHR);
-               if(rc == -EIO)
+               if((rc == -EIO) || (rc == -EINVAL))
                        rc = -EOPNOTSUPP;  
        }