<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: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";}
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.EmailStyle21
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle23
        {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;}
-->
</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'>Hey Hongwei,<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'>That’s very interesting
and indeed explains the behavior I’ve seen. <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 can understand the motivation
for delaying a small timeout for locks that the server knows are already
held. However, the “</span><span style='color:#002060'>Offset >=
LockViolationDelayOffset” is strange to me. I don’t
understand the usefulness of that condition.<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'>Perhaps this is an Office
specific feature, since Office applications take small byte range locks past
the end of file range as a primitive IPC mechanism.<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'>Can you tell me what the value
of LockViolationDelayOffset is? The smbtorture testing seems to indicate
it is Offset > 0xEF000000.<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'>Thanks for your help. I
certainly wouldn’t have figured these semantics out on my own.<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'>-Steven</span><span
style='color:#1F497D'><o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p>
<div style='border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt'>
<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"'> Hongwei Sun
[mailto:hongweis@microsoft.com] <br>
<b>Sent:</b> Monday, December 07, 2009 4:03 PM<br>
<b>To:</b> Steven Danneman; cifs-protocol@samba.org; pfif@tridgell.net<br>
<b>Subject:</b> RE: SMBv1 LockAndX return status on lock conflict<o:p></o:p></span></p>
</div>
</div>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal style='text-autospace:none'><span style='color:#002060'>Hi,
Steven,<o:p></o:p></span></p>
<p class=MsoNormal style='margin-left:.25in;text-autospace:none'><span
style='color:#002060'><o:p> </o:p></span></p>
<p class=MsoNormal style='text-autospace:none'><span style='color:#002060'>
For the error returned when a byte range lock conflicts with an existing lock
in SMB, the logic is as follows: If a lock request is
above a configured offset, or if a lock request matches a previously failed
lock offset, it will change it from “fail immediately” with timeout
of 0 to timeout of 250 ms on operation issue. The result is that the lock
will be pending for 250ms waiting for lock availability, and if it does
not retrieve it, it returns a different error
(STATUS_FILE_LOCK_CONFLICT). <o:p></o:p></span></p>
<p class=MsoNormal style='margin-left:.25in;text-autospace:none'><span
style='color:#002060'><o:p> </o:p></span></p>
<p class=MsoNormal style='text-autospace:none'><span style='color:#002060'>
Pseudo code of above logic should be something as below:<o:p></o:p></span></p>
<p class=MsoNormal style='margin-left:.25in;text-autospace:none'><span
style='color:#002060'><o:p> </o:p></span></p>
<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='color:#002060'>If (FailImmediately) // Timeout =
0<o:p></o:p></span></p>
<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='color:#002060'><o:p> </o:p></span></p>
<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='color:#002060'>
If Offset == Open.LastFailedLockOffset OR Offset >= LockViolationDelayOffset<o:p></o:p></span></p>
<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='color:#002060'>
<o:p></o:p></span></p>
<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='color:#002060'> Set
Timeout = LockViolationDelay // within 250 milliseconds<o:p></o:p></span></p>
<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='color:#002060'>
End If<o:p></o:p></span></p>
<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='color:#002060'><o:p> </o:p></span></p>
<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='color:#002060'>End If<o:p></o:p></span></p>
<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='color:#002060'><o:p> </o:p></span></p>
<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='color:#002060'>If Timeout = 0 and Lock Not Acquired<o:p></o:p></span></p>
<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='color:#002060'><o:p> </o:p></span></p>
<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='color:#002060'>
Set LockViolationDelayOffset = (Offset of lock attempt)<o:p></o:p></span></p>
<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='color:#002060'><o:p> </o:p></span></p>
<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='color:#002060'>
return STATUS_LOCK_NOT_GRANTED<o:p></o:p></span></p>
<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='color:#002060'><o:p> </o:p></span></p>
<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='color:#002060'>Else If Timeout > 0 and Lock Not Acquired after
Timeout<o:p></o:p></span></p>
<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='color:#002060'><o:p> </o:p></span></p>
<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='color:#002060'>
return STATUS_FILE_LOCK_CONFLICT<o:p></o:p></span></p>
<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='color:#002060'><o:p> </o:p></span></p>
<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='color:#002060'>Else <o:p></o:p></span></p>
<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='color:#002060'> return
STATUS_SUCCESS<o:p></o:p></span></p>
<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='color:#002060'><o:p> </o:p></span></p>
<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='color:#002060'>End If.<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'> With
the logic above, you can easily explain what shows in your network
trace. We will add the logic to the SMB protocol document.
Please let us know if you have further questions regarding
this behavior. <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'>Thanks!<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'>--------------------------------------------------------------------<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#002060'>Hongwei Sun - Sr. Support
Escalation Engineer<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#002060'>DSC Protocol Team,
Microsoft<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#002060'><a
href="mailto:hongweis@microsoft.com"><span style='color:#002060'>hongweis@microsoft.com</span></a><o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#002060'>Tel: 469-7757027 x 57027<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:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><b><u><span style='color:#1F497D'><o:p><span
style='text-decoration:none'> </span></o:p></span></u></b></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> Wednesday, November 25, 2009 5:54 PM<br>
<b>To:</b> Interoperability Documentation Help; cifs-protocol@samba.org;
pfif@tridgell.net<br>
<b>Subject:</b> SMBv1 LockAndX return status on lock conflict<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>When requesting a byte-range lock over SMBv1 on a range of a
file which is already locked and thus will contend, the error code returned is
inconsistent. The first attempt to acquire a held lock will return
STATUS_LOCK_NOT_GRANTED. Subsequent requests will return
STATUS_FILE_LOCK_CONFLICT.<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>This seems as though it may be an error in the
implementation of the SMBv1 protocol as the explanation of the two errors in
MS-ERREF implies that STATUS_LOCK_NOT_GRANTED should always be returned in this
circumstance:<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>STATUS_LOCK_NOT_GRANTED
A requested file lock cannot be granted due to other existing locks.<o:p></o:p></p>
<p class=MsoNormal>STATUS_FILE_LOCK_CONFLICT
A
requested read/write cannot be granted due to a conflicting file lock.<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>And in this same scenario the SMBv2 protocol always returns
STATUS_LOCK_NOT_GRANTED.<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>I aware this is a well known issue, as the Samba torture
test demonstrating this behavior have existed for a number of years, but I
haven’t found any Microsoft documentation describing the semantics of
this behavior. I’ve looked in MS-CIFS, MS-SMB, MS-SMB2, and MS-FSA.<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>Furthermore, which error code is returned becomes even more
complicated when additional lock requests are interspersed. For example
the attached pcap against a W2K8R2 server shows:<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>1) Two file handles opened to the same file 0x400b, 0x400c<o:p></o:p></p>
<p class=MsoNormal>2) Packet 27,28: Handle 0x400b successfully acquiring an
exclusive lock on range 100 – 110<o:p></o:p></p>
<p class=MsoNormal>3) Packet 29-32: Handles 0x400b and 0x400c requesting the
same held range and receiving STATUS_LOCK_NOT_GRANTED<o:p></o:p></p>
<p class=MsoNormal>4) Packet 33-44: Again requesting the same held range and
receiving STATUS_FILE_LOCK_CONFLICT<o:p></o:p></p>
<p class=MsoNormal>5) Packet 45-54: Requesting a lock on an overlapping range, 105-115,
and receiving the same pattern of errors<o:p></o:p></p>
<p class=MsoNormal>6) Packet 55-64: Requesting a lock on the previous range,
100-110, and now having the response be “reset” back to
STATUS_LOCK_NOT_GRANTED<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>I’d like to have some documentation of the algorithm
for determining which error to return based on the state of existing locks, or
history of previously requested locks.<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@01CA776F.CA983B90"
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>
</div>
</div>
</body>
</html>