Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 190fdeb8 authored by Steve French's avatar Steve French
Browse files

[CIFS] Fix byte range locking to Windows when Windows server returns

illegal RFC1001 length (which had caused the lock to block forever
until killed).
parent 0ae0efad
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
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,
+2 −2
Original line number Diff line number Diff line
@@ -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
+3 −3
Original line number Diff line number Diff line
version 1.36 September 6, 2005
version 1.37 October 9, 2005

A Partial List of Missing Features
==================================
@@ -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.
+15 −7
Original line number Diff line number Diff line
@@ -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));
@@ -440,19 +441,26 @@ 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));
		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;