<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:p="urn:schemas-microsoft-com:office:powerpoint" xmlns:a="urn:schemas-microsoft-com:office:access" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns:b="urn:schemas-microsoft-com:office:publisher" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:odc="urn:schemas-microsoft-com:office:odc" xmlns:oa="urn:schemas-microsoft-com:office:activation" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:q="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rtc="http://microsoft.com/officenet/conferencing" xmlns:D="DAV:" xmlns:Repl="http://schemas.microsoft.com/repl/" xmlns:mt="http://schemas.microsoft.com/sharepoint/soap/meetings/" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ppda="http://www.passport.com/NameSpace.xsd" xmlns:ois="http://schemas.microsoft.com/sharepoint/soap/ois/" xmlns:dir="http://schemas.microsoft.com/sharepoint/soap/directory/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:dsp="http://schemas.microsoft.com/sharepoint/dsp" xmlns:udc="http://schemas.microsoft.com/data/udc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sub="http://schemas.microsoft.com/sharepoint/soap/2002/1/alerts/" xmlns:ec="http://www.w3.org/2001/04/xmlenc#" xmlns:sp="http://schemas.microsoft.com/sharepoint/" xmlns:sps="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:udcs="http://schemas.microsoft.com/data/udc/soap" xmlns:udcxf="http://schemas.microsoft.com/data/udc/xmlfile" xmlns:udcp2p="http://schemas.microsoft.com/data/udc/parttopart" xmlns:wf="http://schemas.microsoft.com/sharepoint/soap/workflow/" xmlns:dsss="http://schemas.microsoft.com/office/2006/digsig-setup" xmlns:dssi="http://schemas.microsoft.com/office/2006/digsig" xmlns:mdssi="http://schemas.openxmlformats.org/package/2006/digital-signature" xmlns:mver="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns:mrels="http://schemas.openxmlformats.org/package/2006/relationships" xmlns:spwp="http://microsoft.com/sharepoint/webpartpages" xmlns:ex12t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:ex12m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:pptsl="http://schemas.microsoft.com/sharepoint/soap/SlideLibrary/" xmlns:spsl="http://microsoft.com/webservices/SharePointPortalServer/PublishedLinksService" xmlns:Z="urn:schemas-microsoft-com:" xmlns:st="" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv=Content-Type content="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<!--[if !mso]>
<style>
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]-->
<style>
<!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
        {mso-style-priority:99;
        mso-style-link:"Balloon Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:8.0pt;
        font-family:"Tahoma","sans-serif";}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0in;
        margin-right:0in;
        margin-bottom:0in;
        margin-left:.5in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
span.BalloonTextChar
        {mso-style-name:"Balloon Text Char";
        mso-style-priority:99;
        mso-style-link:"Balloon Text";
        font-family:"Tahoma","sans-serif";}
span.EmailStyle20
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.EmailStyle22
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page Section1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.Section1
        {page:Section1;}
/* List Definitions */
@list l0
        {mso-list-id:650208659;
        mso-list-type:hybrid;
        mso-list-template-ids:1246244970 67698705 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
        {mso-level-text:"%1\)";
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
-->
</style>
<!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang=EN-US link=blue vlink=purple>
<div class=Section1>
<p class=MsoNormal><span style='color:#1F497D'>Steven,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> I completed the
investigation on the behavior described in your e-mail. It is a normal
behavior that has been documented in the MS-SMB2 document. The following
is the explanation:<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span style='color:#002060'> The server
processing logic is described in details in “3.3.5.14
Receiving an SMB2 Lock Request”. You
are right that the both unlock and lock requests cannot be mixed in the
same SMB2_LOCK request.</span><span style='color:#002060'> The
server processes the Locks array in SMB2_LOCK request as either a series
of locks or a series of unlocks based on if the initial SMB2_LOCK entry
has SMB2_LOCFLAG_UNLOCK bit set or not. Any combination
of unlocks and locks in the same SMB2_LOCK request will fail with STATUS_</span><span
style='color:#002060'> INVALID_PARAMETER. </span><span
style='color:#002060'><o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#002060'><o:p> </o:p></span></p>
<p class=MsoNormal><span style='color:#002060'> As per 3.3.5.14.1, when
the lock array in SMB_LOCK is considered as a series of unlocks, for
any SMB2_LOCK entry, if either SMB2_LOCKFLAG_SHARED_LOCK or
SMB2_LOCKFLAG_EXCLUSIVE_LOCK is set, the server MUST fail the request with
STATUS_INVALID_PARAMETER and stop processing further entries in the Locks array,
and all successfully processed unlock operations will <b>not be rolled back</b>.</span><span
style='color:#002060'><o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#002060'><o:p> </o:p></span></p>
<p class=MsoNormal><span style='color:#002060'> For the
network traffic you mentioned, we can see that<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#002060'><o:p> </o:p></span></p>
<p class=MsoListParagraph style='text-indent:-.25in;mso-list:l0 level1 lfo1'><![if !supportLists]><span
style='color:#002060'><span style='mso-list:Ignore'>1)<span style='font:7.0pt "Times New Roman"'>
</span></span></span><![endif]><span style='color:#002060'>Packet 27-28:
A single lock request succeeding on range 0-10.<o:p></o:p></span></p>
<p class=MsoNormal style='margin-left:.25in'><span style='color:#002060'>ANS: Single
lock succeeded as expected.<o:p></o:p></span></p>
<p class=MsoListParagraph><span style='color:#002060'><o:p> </o:p></span></p>
<p class=MsoListParagraph style='text-indent:-.25in;mso-list:l0 level1 lfo1'><![if !supportLists]><span
style='color:#002060'><span style='mso-list:Ignore'>2)<span style='font:7.0pt "Times New Roman"'>
</span></span></span><![endif]><span style='color:#002060'>Packet 29-30:
A lock request with unlock(0-10) and lock(10-10) failing with INVALID_PARAMETER.<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#002060'>
ANS: Since the initial SMB2_LOCK in the locks array has SMB2_LOCKFLAG_UNLOCK
bit set, server MUST process the lock array as a series of unlocks.(3.3.5.14)
and the logic in 3.3.5.14.1 will be applied. Because the
second lock in the Locks array has SMB2_LOCKFLAG_SHARED_LOCK set, the
server fails with STATUS_INVALID_PARAMETER. But the first unlock
request has been processed and will not be rolled back. <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#002060'><o:p> </o:p></span></p>
<p class=MsoNormal><span style='color:#002060'> 3)
Packet 31-32: A lock request with lock(0-10) and lock(10-10) succeeding,
showing that the previous request, though it returned an error, succeeded in
unlocking.<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#002060'>
ANS: This is expected since the unlock for range (0-10) succeeded
in 2).<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#002060'><o:p> </o:p></span></p>
<p class=MsoNormal><span style='color:#002060'> If
you have further questions regarding this behavior , please let us know.<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>Thanks!<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>--------------------------------------------------------------------<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>Hongwei Sun - Sr. Support
Escalation Engineer<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>DSC Protocol Team,
Microsoft<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'><a
href="mailto:hongweis@microsoft.com">hongweis@microsoft.com</a><o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>Tel: 469-7757027 x 57027<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>---------------------------------------------------------------------<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p>
<div>
<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>
<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Steven Danneman
[mailto:steven.danneman@isilon.com] <br>
<b>Sent:</b> Monday, November 30, 2009 5:58 PM<br>
<b>To:</b> Interoperability Documentation Help; cifs-protocol@samba.org;
pfif@tridgell.net<br>
<b>Subject:</b> SMB2 mixed lock & unlock requests in a single SMB_LOCK
request<o:p></o:p></span></p>
</div>
</div>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>Hello,<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>I’ve come across another SMB2 locking issue that I
can’t find explicit documentation for in MS-SMB2 (v18.0).<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>My first question, is whether a single SMB_LOCK request can
contain both unlock and lock requests as the LockingAndX command type in SMBv1
could? The MS-SMB2 document hints that the answer to this question is
“no” but it doesn’t seem to explicitly state it anywhere.<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>Section 2.2.26 states: “The SMB2 LOCK Request packet
is sent by the client to either lock or unlock portions of a file.” <o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>This statement is ambiguous as to whether the
“or” is inclusive or exclusive.<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>In my testing, sending both lock and unlock requests in a
single SMB2 locking request returns a STATUS_INVALID_PARAMETER. However,
if the requests are ordered such that a unlock structure come first, the unlock
request seems to succeed.<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>The attached pcap, against W2K8R2 shows:<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>1) Packet 27-28: A single lock request succeeding on
range 0-10.<o:p></o:p></p>
<p class=MsoNormal>2) Packet 29-30: A lock request with unlock(0-10) and
lock(10-10) failing with INVALID_PARAMETER.<o:p></o:p></p>
<p class=MsoNormal>3) Packet 31-32: A lock request with lock(0-10) and
lock(10-10) succeeding, showing that the previous request, though it returned
an error, succeeded in unlocking.<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>It seems to me the server behavior should be to return
STATUS_INVALID_PARAMETER without completing any of the lock/unlock requests
when they are mixed. Both the fact that this isn’t allowed, and the
W2K8R2 behavior deviation should be documented.<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>Thanks,<o:p></o:p></p>
<p><b><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:black'>Steven Danneman</span></b><b><span style='font-size:10.0pt;
font-family:"Arial","sans-serif";color:#666666'> </span></b><b><span
style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#2676AE'>|</span></b><b><span
style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#666666'> <strong><span
style='font-family:"Arial","sans-serif"'>Software Development Engineer</span></strong><br>
</span></b><b><span style='font-size:8.0pt;font-family:"Arial","sans-serif";
color:black'>Isilon Systems</span></b><b><span style='font-size:7.5pt;
font-family:"Arial","sans-serif";color:#666666'> P </span></b><b><span
style='font-size:7.5pt;font-family:"Arial","sans-serif";color:black'>+1-206-315-7500</span></b><b><span
style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#666666'> </span></b><b><span
style='font-size:7.5pt;font-family:"Arial","sans-serif";color:#666666'>
F </span></b><b><span style='font-size:7.5pt;font-family:"Arial","sans-serif";
color:black'>+1-206-315-7501</span></b><b><span style='font-size:10.0pt;
font-family:"Arial","sans-serif";color:#666666'><br>
</span></b><b><span style='font-size:7.5pt;font-family:"Arial","sans-serif";
color:#003366'><a href="http://www.isilon.com">www.isilon.com</a></span></b><b><span
style='font-size:7.5pt;font-family:"Arial","sans-serif";color:#666666'> </span></b><b><span
style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#666666'> </span></b><b><span
style='font-size:7.5pt;font-family:"Arial","sans-serif";color:#666666'> </span></b><b><span
style='font-size:7.5pt;font-family:"Arial","sans-serif";color:black'> </span></b><b><span
style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#666666'> </span></b><b><span
style='font-size:7.5pt;font-family:"Arial","sans-serif";color:#666666'> </span></b><b><span
style='font-size:10.0pt;font-family:"Arial","sans-serif";color:#666666'><o:p></o:p></span></b></p>
<p style='vertical-align:middle'><span style='color:navy'><img border=0
width=82 height=46 id="Picture_x0020_1" src="cid:image001.gif@01CA735C.C01BBFF0"
alt="cid:image001.gif@01C81005.1792D9C0"> </span><b><span
style='color:#666666'> </span></b><strong><span style='font-size:
10.0pt;font-family:"Arial","sans-serif";color:#666666'>How breakthroughs begin.
™</span></strong><o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
</div>
</body>
</html>