Skip to content

Commit

Permalink
[CIFS] Fix byte range locking to Windows when Windows server returns
Browse files Browse the repository at this point in the history
illegal RFC1001 length (which had caused the lock to block forever
until killed).
  • Loading branch information
Steve French committed Oct 10, 2005
1 parent 0ae0efa commit 190fdeb
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 12 deletions.
12 changes: 12 additions & 0 deletions fs/cifs/CHANGES
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
Version 1.38
------------
Fix tcp socket retransmission timeouts (e.g. on ENOSPACE from the socket)
to be smaller at first (but increasing) so large write performance performance
over GigE is better. Do not hang thread on illegal byte range lock response
from Windows (Windows can send an RFC1001 size which does not match smb size) by
allowing an SMBs TCP length to be up to a few bytes longer than it should be.
wsize and rsize can now be larger than negotiated buffer size if server
supports large readx/writex, even when directio mount flag not specified.
Write size will in many cases now be 16K instead of 4K which greatly helps
file copy performance on lightly loaded networks.

Version 1.37
------------
Fix readdir caching when unlink removes file in current search buffer,
Expand Down
4 changes: 2 additions & 2 deletions fs/cifs/README
Original file line number Diff line number Diff line change
Expand Up @@ -294,8 +294,8 @@ A partial list of the supported mount options follows:
during the local client kernel build will be used.
If server does not support Unicode, this parameter is
unused.
rsize default read size
wsize default write size
rsize default read size (usually 16K)
wsize default write size (usually 16K, 32K is often better over GigE)
rw mount the network share read-write (note that the
server may still consider the share read-only)
ro mount network share read-only
Expand Down
6 changes: 3 additions & 3 deletions fs/cifs/TODO
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
version 1.36 September 6, 2005
version 1.37 October 9, 2005

A Partial List of Missing Features
==================================
Expand Down Expand Up @@ -38,8 +38,8 @@ by unlocking all known byte range locks that we locked on the file.
i) quota support (needs minor kernel change since quota calls
to make it to network filesystems or deviceless filesystems)

j) finish writepages support (multi-page write behind for improved
performance) and syncpage. Started by Shaggy.
j) investigate sync behavior (including syncpage) and check
for proper behavior of intr/nointr

k) hook lower into the sockets api (as NFS/SunRPC does) to avoid the
extra copy in/out of the socket buffers in some cases.
Expand Down
22 changes: 15 additions & 7 deletions fs/cifs/misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -420,6 +420,7 @@ int
checkSMB(struct smb_hdr *smb, __u16 mid, int length)
{
__u32 len = smb->smb_buf_length;
__u32 clc_len; /* calculated length */
cFYI(0,
("Entering checkSMB with Length: %x, smb_buf_length: %x ",
length, len));
Expand All @@ -440,20 +441,27 @@ checkSMB(struct smb_hdr *smb, __u16 mid, int length)
cERROR(1,
("smb_buf_length greater than MaxBufSize"));
cERROR(1,
("bad smb detected. Illegal length. The mid=%d",
("bad smb detected. Illegal length. mid=%d",
smb->Mid));
return 1;
}

if (checkSMBhdr(smb, mid))
return 1;

if ((4 + len != smbCalcSize_LE(smb))
clc_len = smbCalcSize_LE(smb);
if ((4 + len != clc_len)
|| (4 + len != (unsigned int)length)) {
cERROR(1, ("smbCalcSize %x ", smbCalcSize_LE(smb)));
cERROR(1,
("bad smb size detected. The Mid=%d", smb->Mid));
return 1;
cERROR(1, ("Calculated size 0x%x vs actual length 0x%x",
clc_len, 4 + len));
cERROR(1, ("bad smb size detected for Mid=%d", smb->Mid));
/* Windows XP can return a few bytes too much, presumably
an illegal pad, at the end of byte range lock responses
so we allow for up to eight byte pad, as long as actual
received length is as long or longer than calculated length */
if((4+len > clc_len) && (len <= clc_len + 3))
return 0;
else
return 1;
}
return 0;
}
Expand Down

0 comments on commit 190fdeb

Please sign in to comment.