[cifs-protocol] clarification of MaxMpx value in MS-CIFS
Christopher R. Hertel
crh at samba.org
Thu Mar 1 12:55:57 MST 2012
On 03/01/2012 11:19 AM, Jeff Layton wrote:
> Dearest Dochelp...
> We in the Linux CIFS client community are attempting to clean up our
> code to make it better respect the MaxMpxCount value that the server
> advertises in the NEGOTIATE request.
> MS-CIFS currently says this:
>> MaxMpxCount (2 bytes): The maximum number of outstanding SMB operations
>> that the server supports. This value includes existing OpLocks, the
>> NT_TRANSACT_NOTIFY_CHANGE subcommand, and any other commands that are
>> pending on the server.
> It is rumored however that servers are not supposed to count certain
> command types against this limit. For instance, SMB echoes and blocking
> locks. My questions are:
> 1/ what do windows servers do in this regard? Do they count all
> outstanding requests against the maxmpx value, or are certain commands
Section 188.8.131.52, which covers the server's handling of an echo request,
does not list the echo as exempt. It does, however, indicate how a cancel
request would be handled. As I recall (the truth is in the code), you
cannot cancel a request that is *not* in the PendingRequestTable.
That would suggest that SMB_COM_ECHO is not exempt from MaxMpxCount.
...but it would be good to check. My memory is that SMB_COM_ECHO may be
handled separately since it can be executed without a SessionSetup or
TreeConnect. The thing is, an SMB_COM_ECHO must follow (at minimum) a
NegotiateProtocol, which would provide the server's MaxMpxCount.
...so, SMB_COM_ECHO *may* be counted against the MaxMpxCount.
> 2/ do windows clients ever send more than MaxMpxCount requests at a
> time? For instance, suppose I have a MaxMpxCount of 50 and I spawn 100
> threads that attempt to acquire blocking locks. What happens at that
> point? Will the client end up using all of the slots for blocking locks
> in such a way that nothing else can get through? Or does it allow you
> to exceed that value somehow?
> Thanks for the info!
There is code specific to this in both Windows 98SE and NT4 Server (and all
subsequent clients). I do not recall what the code says. A shame, as
that's where the answer lies.
Note to DocHelp: The client code will go through and cancel outstanding
requests that have timed out. That code is rarely exercised, I'd guess. I
just recall that it's there.
"Implementing CIFS - the Common Internet FileSystem" ISBN: 013047116X
Samba Team -- http://www.samba.org/ -)----- Christopher R. Hertel
jCIFS Team -- http://jcifs.samba.org/ -)----- ubiqx development, uninq.
ubiqx Team -- http://www.ubiqx.org/ -)----- crh at ubiqx.mn.org
OnLineBook -- http://ubiqx.org/cifs/ -)----- crh at ubiqx.org
More information about the cifs-protocol