<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:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@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:12.0pt;
        font-family:"Times New Roman","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.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:12.0pt;
        font-family:"Times New Roman","serif";}
span.EmailStyle18
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle19
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle20
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle21
        {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:779295808;
        mso-list-type:hybrid;
        mso-list-template-ids:1888533136 67698703 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level2
        {mso-level-tab-stop:1.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level3
        {mso-level-tab-stop:1.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level4
        {mso-level-tab-stop:2.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level5
        {mso-level-tab-stop:2.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level6
        {mso-level-tab-stop:3.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level7
        {mso-level-tab-stop:3.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level8
        {mso-level-tab-stop:4.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level9
        {mso-level-tab-stop:4.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l1
        {mso-list-id:811409528;
        mso-list-type:hybrid;
        mso-list-template-ids:1110713850 406214214 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l1:level1
        {mso-level-start-at:5;
        mso-level-number-format:bullet;
        mso-level-text:-;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:22.5pt;
        text-indent:-.25in;
        font-family:"Calibri","sans-serif";
        mso-fareast-font-family:Calibri;
        mso-bidi-font-family:Arial;}
@list l2
        {mso-list-id:1815415910;
        mso-list-type:hybrid;
        mso-list-template-ids:-841057238 67698703 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l2:level1
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l2:level2
        {mso-level-tab-stop:1.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l2:level3
        {mso-level-tab-stop:1.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l2:level4
        {mso-level-tab-stop:2.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l2:level5
        {mso-level-tab-stop:2.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l2:level6
        {mso-level-tab-stop:3.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l2:level7
        {mso-level-tab-stop:3.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l2:level8
        {mso-level-tab-stop:4.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l2:level9
        {mso-level-tab-stop:4.5in;
        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='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Improved patch after comments of Fab and Sean.<o:p></o:p></span></p>

<p class=MsoListParagraph style='margin-left:22.5pt;text-indent:-.25in;
mso-list:l1 level1 lfo5'><![if !supportLists]><span style='font-size:11.0pt;
font-family:"Calibri","sans-serif";color:#1F497D'><span style='mso-list:Ignore'>-<span
style='font:7.0pt "Times New Roman"'>         
</span></span></span><![endif]><span dir=LTR></span><span style='font-size:
11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Left only one CSQ.<o:p></o:p></span></p>

<p class=MsoListParagraph style='margin-left:22.5pt;text-indent:-.25in;
mso-list:l1 level1 lfo5'><![if !supportLists]><span style='font-size:11.0pt;
font-family:"Calibri","sans-serif";color:#1F497D'><span style='mso-list:Ignore'>-<span
style='font:7.0pt "Times New Roman"'>         
</span></span></span><![endif]><span dir=LTR></span><span style='font-size:
11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Al_proxy.h copied to
user and kernel directories and removed in the shared place.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
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"'> Fab Tillier
[mailto:ftillier@microsoft.com] <br>
<b>Sent:</b> Monday, June 21, 2010 5:57 PM<br>
<b>To:</b> Leonid Keller; Smith, Stan; Alex Naslednikov<br>
<b>Cc:</b> ofw@lists.openfabrics.org; Uri Habusha<br>
<b>Subject:</b> RE: [ofw] [Patch][Core] Fix at IRP cancellation mechanism<o:p></o:p></span></p>

</div>

</div>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>Hi Leo,<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>I like the CSQ approach, looks pretty nice and clean.<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>A couple of comments:<o:p></o:p></p>

<p class=MsoListParagraph style='text-indent:-.25in;mso-list:l0 level1 lfo2'><![if !supportLists]><span
style='mso-list:Ignore'>1.<span style='font:7.0pt "Times New Roman"'>     
</span></span><![endif]><span dir=LTR></span>Watch your curly braces, I saw a
couple that were end of line, rather than matching the rest of the code.<o:p></o:p></p>

<p class=MsoListParagraph style='text-indent:-.25in;mso-list:l0 level1 lfo2'><![if !supportLists]><span
style='mso-list:Ignore'>2.<span style='font:7.0pt "Times New Roman"'>     
</span></span><![endif]><span dir=LTR></span>Why not have a single CSQ, and use
the peek context as the IOCTL code to pull either comp or misc IOCTLs from the
list?  This would be similar to the CSQ usage in the ND CM code.<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>-Fab<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>

<p class=MsoNormal><b>From:</b> Leonid Keller [mailto:leonid@mellanox.co.il] <br>
<b>Sent:</b> Sunday, June 20, 2010 1:18 AM<br>
<b>To:</b> Smith, Stan; Alex Naslednikov; Fab Tillier<br>
<b>Cc:</b> ofw@lists.openfabrics.org; Uri Habusha<br>
<b>Subject:</b> RE: [ofw] [Patch][Core] Fix at IRP cancellation mechanism<o:p></o:p></p>

</div>

</div>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>Alex went on vacation.<o:p></o:p></p>

<p class=MsoNormal>Beforehand he tried Fab’s idea and for some reason it didn’t
work well.<o:p></o:p></p>

<p class=MsoNormal>Maybe he made some mistake in the implementation …<o:p></o:p></p>

<p class=MsoNormal>I took the problem over from him and made another variant of
the patch, using IoCsqXXX functions as Microsoft recommends.<o:p></o:p></p>

<p class=MsoNormal>It seems like working good.<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>A short description of the patch:<o:p></o:p></p>

<p class=MsoListParagraph style='text-indent:-.25in;mso-list:l2 level1 lfo4'><![if !supportLists]><span
style='mso-list:Ignore'>1.<span style='font:7.0pt "Times New Roman"'>     
</span></span><![endif]><span dir=LTR></span>Removed  ‘h_cm_ioctl’ field
as it seems to be unused.<o:p></o:p></p>

<p class=MsoListParagraph style='text-indent:-.25in;mso-list:l2 level1 lfo4'><![if !supportLists]><span
style='mso-list:Ignore'>2.<span style='font:7.0pt "Times New Roman"'>     
</span></span><![endif]><span dir=LTR></span>Added ‘al_csq_t’ object,
containing CSQ for pending IOCTLs and a pointer to dev_open_context.<o:p></o:p></p>

<p class=MsoListParagraph style='text-indent:-.25in;mso-list:l2 level1 lfo4'><![if !supportLists]><span
style='mso-list:Ignore'>3.<span style='font:7.0pt "Times New Roman"'>     
</span></span><![endif]><span dir=LTR></span>Added callbacks for using this
object with IoCsqXXX functions;<o:p></o:p></p>

<p class=MsoListParagraph style='text-indent:-.25in;mso-list:l2 level1 lfo4'><![if !supportLists]><span
style='mso-list:Ignore'>4.<span style='font:7.0pt "Times New Roman"'>     
</span></span><![endif]><span dir=LTR></span>Replaced ‘h_comp_ioctl’ and
‘h_misc_ioctl’ pointers with  ‘al_csq_t’ objects.<o:p></o:p></p>

<p class=MsoListParagraph style='text-indent:-.25in;mso-list:l2 level1 lfo4'><![if !supportLists]><span
style='mso-list:Ignore'>5.<span style='font:7.0pt "Times New Roman"'>     
</span></span><![endif]><span dir=LTR></span>Removed ‘al_dev_cancel_ioctl()’
and ‘al_dev_cancel_io()’ as unnecessary;<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>To pend an ioctl IBAL now puts it on a CSQ; to complete –
removes it from the queue and completes.<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>Index: core/al/al_dev.h<o:p></o:p></p>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

<p class=MsoNormal>---
core/al/al_dev.h        (revision 5593)<o:p></o:p></p>

<p class=MsoNormal>+++ core/al/al_dev.h     (working copy)<o:p></o:p></p>

<p class=MsoNormal>@@ -82,15 +82,6 @@<o:p></o:p></p>

<p class=MsoNormal> al_dev_ioctl(<o:p></o:p></p>

<p class=MsoNormal>               
IN                                                          
cl_ioctl_handle_t                                            
h_ioctl );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-void<o:p></o:p></p>

<p class=MsoNormal>-al_dev_cancel_ioctl(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
cl_ioctl_handle_t                                            
h_ioctl );<o:p></o:p></p>

<p class=MsoNormal>-<o:p></o:p></p>

<p class=MsoNormal>-void<o:p></o:p></p>

<p class=MsoNormal>-al_dev_cancel_io(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
DEVICE_OBJECT                                                               
*p_dev_obj,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
IRP                                                                                                        
*p_irp );<o:p></o:p></p>

<p class=MsoNormal>-<o:p></o:p></p>

<p class=MsoNormal> cl_status_t<o:p></o:p></p>

<p class=MsoNormal> bus_add_pkey(<o:p></o:p></p>

<p class=MsoNormal>               
IN                                                          
cl_ioctl_handle_t                                            
h_ioctl );<o:p></o:p></p>

<p class=MsoNormal>Index: core/al/al_proxy.h<o:p></o:p></p>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

<p class=MsoNormal>--- core/al/al_proxy.h    (revision 5593)<o:p></o:p></p>

<p class=MsoNormal>+++ core/al/al_proxy.h (working copy)<o:p></o:p></p>

<p class=MsoNormal>@@ -83,8 +83,21 @@<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> }            
proxy_pnp_recs_t;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>+#ifdef CL_KERNEL<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>+typedef struct _al_dev_open_context al_dev_open_context_t;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>+typedef struct _al_csq<o:p></o:p></p>

<p class=MsoNormal>+{<o:p></o:p></p>

<p class=MsoNormal>+            
IO_CSQ                                                                                               
csq;<o:p></o:p></p>

<p class=MsoNormal>+            
KSPIN_LOCK                                                                     
lock;<o:p></o:p></p>

<p class=MsoNormal>+            
LIST_ENTRY                                                                       
queue;<o:p></o:p></p>

<p class=MsoNormal>+            
al_dev_open_context_t                             
*dev_ctx;<o:p></o:p></p>

<p class=MsoNormal>+} al_csq_t;<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+#endif<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal> /**********************************************************<o:p></o:p></p>

<p class=MsoNormal>  *<o:p></o:p></p>

<p class=MsoNormal>  * Per-process device context.<o:p></o:p></p>

<p class=MsoNormal>@@ -110,9 +123,10 @@<o:p></o:p></p>

<p class=MsoNormal>               
cl_mutex_t                                        
pnp_mutex;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>               
/* Pending IOCTLs. */<o:p></o:p></p>

<p class=MsoNormal>-             
cl_ioctl_handle_t            
h_cm_ioctl;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_ioctl_handle_t            
h_comp_ioctl;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_ioctl_handle_t            
h_misc_ioctl;<o:p></o:p></p>

<p class=MsoNormal>+#ifdef CL_KERNEL<o:p></o:p></p>

<p class=MsoNormal>+            
al_csq_t                                              
al_csq_comp;<o:p></o:p></p>

<p class=MsoNormal>+            
al_csq_t                                              
al_csq_misc;<o:p></o:p></p>

<p class=MsoNormal>+#endif<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>               
/* Per-process AL handle. */<o:p></o:p></p>

<p class=MsoNormal>               
ib_al_handle_t                
h_al;<o:p></o:p></p>

<p class=MsoNormal>@@ -191,7 +205,143 @@<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> }            
al_proxy_cb_info_t;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>+#ifdef CL_KERNEL<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>+#pragma warning(disable:4706)<o:p></o:p></p>

<p class=MsoNormal>+static inline void al_csq_flush_que(<o:p></o:p></p>

<p class=MsoNormal>+            
IN          
al_csq_t*                                                                                                           
p_al_csq,<o:p></o:p></p>

<p class=MsoNormal>+            
IN          
NTSTATUS                                                                                                          
completion_code<o:p></o:p></p>

<p class=MsoNormal>+            
)<o:p></o:p></p>

<p class=MsoNormal>+{<o:p></o:p></p>

<p class=MsoNormal>+            
PIRP Irp;<o:p></o:p></p>

<p class=MsoNormal>+            
while( Irp = IoCsqRemoveNextIrp( &p_al_csq->csq, NULL ) )<o:p></o:p></p>

<p class=MsoNormal>+            
{<o:p></o:p></p>

<p class=MsoNormal>+                            
cl_ioctl_complete( Irp, completion_code, 0 );<o:p></o:p></p>

<p class=MsoNormal>+                            
proxy_context_deref( p_al_csq->dev_ctx );<o:p></o:p></p>

<p class=MsoNormal>+            
}<o:p></o:p></p>

<p class=MsoNormal>+}<o:p></o:p></p>

<p class=MsoNormal>+#pragma warning(default:4706)<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+static VOID __insert_irp(<o:p></o:p></p>

<p class=MsoNormal>+            
IN          
PIO_CSQ                                                                                                                                             
Csq,<o:p></o:p></p>

<p class=MsoNormal>+            
IN          
PIRP                                                                                                                                      
Irp<o:p></o:p></p>

<p class=MsoNormal>+            
)<o:p></o:p></p>

<p class=MsoNormal>+{<o:p></o:p></p>

<p class=MsoNormal>+            
al_csq_t *p_al_csq = (al_csq_t*)Csq;<o:p></o:p></p>

<p class=MsoNormal>+            
InsertTailList( &p_al_csq->queue, &Irp->Tail.Overlay.ListEntry );<o:p></o:p></p>

<p class=MsoNormal>+}<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+static VOID __remove_irp(<o:p></o:p></p>

<p class=MsoNormal>+            
IN          
PIO_CSQ                                                                                                                                             
Csq,<o:p></o:p></p>

<p class=MsoNormal>+            
IN          
PIRP                                                                                                                                      
Irp<o:p></o:p></p>

<p class=MsoNormal>+            
)<o:p></o:p></p>

<p class=MsoNormal>+{<o:p></o:p></p>

<p class=MsoNormal>+            
UNUSED_PARAM( Csq );<o:p></o:p></p>

<p class=MsoNormal>+            
RemoveEntryList( &Irp->Tail.Overlay.ListEntry );<o:p></o:p></p>

<p class=MsoNormal>+}<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+static PIRP __peek_next_irp(<o:p></o:p></p>

<p class=MsoNormal>+            
IN          
PIO_CSQ                                                                                                                                             
Csq,<o:p></o:p></p>

<p class=MsoNormal>+            
IN          
PIRP                                                                                                                                      
Irp,<o:p></o:p></p>

<p class=MsoNormal>+            
IN          
PVOID                                                                                                                                  
PeekContext<o:p></o:p></p>

<p class=MsoNormal>+            
)<o:p></o:p></p>

<p class=MsoNormal>+{<o:p></o:p></p>

<p class=MsoNormal>+            
PIRP nextIrp = NULL;<o:p></o:p></p>

<p class=MsoNormal>+            
PLIST_ENTRY nextEntry;<o:p></o:p></p>

<p class=MsoNormal>+            
PLIST_ENTRY listHead;<o:p></o:p></p>

<p class=MsoNormal>+            
al_csq_t *p_al_csq = (al_csq_t*)Csq;<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+            
listHead = &p_al_csq->queue;<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+            
// <o:p></o:p></p>

<p class=MsoNormal>+            
// If the IRP is NULL, we will start peeking from the listhead, else<o:p></o:p></p>

<p class=MsoNormal>+            
// we will start from that IRP onwards. This is done under the<o:p></o:p></p>

<p class=MsoNormal>+            
// assumption that new IRPs are always inserted at the tail.<o:p></o:p></p>

<p class=MsoNormal>+            
//<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+            
if(Irp == NULL)<o:p></o:p></p>

<p class=MsoNormal>+                            
nextEntry = listHead->Flink;<o:p></o:p></p>

<p class=MsoNormal>+            
else<o:p></o:p></p>

<p class=MsoNormal>+                            
nextEntry = Irp->Tail.Overlay.ListEntry.Flink;<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+            
while(nextEntry != listHead) {<o:p></o:p></p>

<p class=MsoNormal>+                            
nextIrp = CONTAINING_RECORD(nextEntry, IRP, Tail.Overlay.ListEntry);<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+                            
//<o:p></o:p></p>

<p class=MsoNormal>+                            
// If context is present, continue until you find a matching one.<o:p></o:p></p>

<p class=MsoNormal>+                            
// Else you break out as you got next one.<o:p></o:p></p>

<p class=MsoNormal>+                            
//<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+                            
if(PeekContext) <o:p></o:p></p>

<p class=MsoNormal>+                            
{<o:p></o:p></p>

<p class=MsoNormal>+                                            
/* for now PeekContext is unused */<o:p></o:p></p>

<p class=MsoNormal>+                            
} <o:p></o:p></p>

<p class=MsoNormal>+                            
else<o:p></o:p></p>

<p class=MsoNormal>+                            
{<o:p></o:p></p>

<p class=MsoNormal>+                                            
break;<o:p></o:p></p>

<p class=MsoNormal>+                            
}<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+                            
nextIrp = NULL;<o:p></o:p></p>

<p class=MsoNormal>+                            
nextEntry = nextEntry->Flink;<o:p></o:p></p>

<p class=MsoNormal>+            
}<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+            
return nextIrp;<o:p></o:p></p>

<p class=MsoNormal>+}<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+static VOID __acquire_lock(<o:p></o:p></p>

<p class=MsoNormal>+            
IN          
PIO_CSQ                                                                                                                                             
Csq,<o:p></o:p></p>

<p class=MsoNormal>+            
OUT      
PKIRQL                                                                                                                                
Irql<o:p></o:p></p>

<p class=MsoNormal>+            
)<o:p></o:p></p>

<p class=MsoNormal>+{<o:p></o:p></p>

<p class=MsoNormal>+            
al_csq_t *p_al_csq = (al_csq_t*)Csq;<o:p></o:p></p>

<p class=MsoNormal>+            
KeAcquireSpinLock( &p_al_csq->lock, Irql );<o:p></o:p></p>

<p class=MsoNormal>+}<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+static VOID __release_lock(<o:p></o:p></p>

<p class=MsoNormal>+            
IN          
PIO_CSQ                                                                                                                                             
Csq,<o:p></o:p></p>

<p class=MsoNormal>+            
IN          
KIRQL                                                                                                                                   
Irql<o:p></o:p></p>

<p class=MsoNormal>+            
)<o:p></o:p></p>

<p class=MsoNormal>+{<o:p></o:p></p>

<p class=MsoNormal>+            
al_csq_t *p_al_csq = (al_csq_t*)Csq;<o:p></o:p></p>

<p class=MsoNormal>+            
KeReleaseSpinLock( &p_al_csq->lock, Irql );<o:p></o:p></p>

<p class=MsoNormal>+}<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+static VOID __complete_cancelled_irp(<o:p></o:p></p>

<p class=MsoNormal>+            
IN          
PIO_CSQ                                                                                                                                             
Csq,<o:p></o:p></p>

<p class=MsoNormal>+            
IN          
PIRP                                                                                                                                      
Irp<o:p></o:p></p>

<p class=MsoNormal>+            
)<o:p></o:p></p>

<p class=MsoNormal>+{<o:p></o:p></p>

<p class=MsoNormal>+            
al_csq_t *p_al_csq = (al_csq_t*)Csq;<o:p></o:p></p>

<p class=MsoNormal>+            
<o:p></o:p></p>

<p class=MsoNormal>+            
cl_ioctl_complete( Irp, CL_CANCELED, 0 );<o:p></o:p></p>

<p class=MsoNormal>+            
proxy_context_deref( p_al_csq->dev_ctx );<o:p></o:p></p>

<p class=MsoNormal>+}<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+static inline NTSTATUS<o:p></o:p></p>

<p class=MsoNormal>+al_csq_init(<o:p></o:p></p>

<p class=MsoNormal>+            
IN                                                          
al_dev_open_context_t * dev_ctx,<o:p></o:p></p>

<p class=MsoNormal>+            
IN                                                          
al_csq_t *                                                          
p_al_csq)<o:p></o:p></p>

<p class=MsoNormal>+{<o:p></o:p></p>

<p class=MsoNormal>+            
NTSTATUS status;<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+            
status = IoCsqInitialize( &p_al_csq->csq, <o:p></o:p></p>

<p class=MsoNormal>+                            
__insert_irp, __remove_irp,<o:p></o:p></p>

<p class=MsoNormal>+                            
__peek_next_irp, __acquire_lock,<o:p></o:p></p>

<p class=MsoNormal>+                            
__release_lock, __complete_cancelled_irp );<o:p></o:p></p>

<p class=MsoNormal>+            
if ( !NT_SUCCESS( status ) )<o:p></o:p></p>

<p class=MsoNormal>+                            
goto exit;<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+            
InitializeListHead( &p_al_csq->queue );<o:p></o:p></p>

<p class=MsoNormal>+            
KeInitializeSpinLock( &p_al_csq->lock );<o:p></o:p></p>

<p class=MsoNormal>+            
p_al_csq->dev_ctx = dev_ctx;<o:p></o:p></p>

<p class=MsoNormal>+            
status = STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+exit:<o:p></o:p></p>

<p class=MsoNormal>+            
return status;<o:p></o:p></p>

<p class=MsoNormal>+}<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+#endif<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal> al_proxy_cb_info_t*<o:p></o:p></p>

<p class=MsoNormal> proxy_cb_get(<o:p></o:p></p>

<p class=MsoNormal>               
IN          
al_dev_open_context_t             
*p_context );<o:p></o:p></p>

<p class=MsoNormal>Index: core/al/kernel/al_dev.c<o:p></o:p></p>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

<p class=MsoNormal>---
core/al/kernel/al_dev.c         
(revision 5593)<o:p></o:p></p>

<p class=MsoNormal>+++
core/al/kernel/al_dev.c       (working copy)<o:p></o:p></p>

<p class=MsoNormal>@@ -94,6 +94,7 @@<o:p></o:p></p>

<p class=MsoNormal>               
IN                          
al_dev_open_context_t                                             
*p_context )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>               
cl_status_t                         
cl_status;<o:p></o:p></p>

<p class=MsoNormal>+            
NTSTATUS                          
status;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>               
cl_status = cl_event_init( &p_context->close_event, FALSE );<o:p></o:p></p>

<p class=MsoNormal>               
if( cl_status != CL_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>@@ -118,6 +119,15 @@<o:p></o:p></p>

<p class=MsoNormal>               
if( cl_status != CL_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>                               
return cl_status;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>+            
status = al_csq_init( p_context, &p_context->al_csq_comp );<o:p></o:p></p>

<p class=MsoNormal>+            
if ( !NT_SUCCESS( status ) )<o:p></o:p></p>

<p class=MsoNormal>+                            
return (cl_status_t)status;<o:p></o:p></p>

<p class=MsoNormal>+            
<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+            
status = al_csq_init( p_context, &p_context->al_csq_misc );<o:p></o:p></p>

<p class=MsoNormal>+            
if ( !NT_SUCCESS( status ) )<o:p></o:p></p>

<p class=MsoNormal>+                            
return (cl_status_t)status;<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>               
return CL_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>@@ -325,6 +335,12 @@<o:p></o:p></p>

<p class=MsoNormal>               
p_io_stack = IoGetCurrentIrpStackLocation( h_ioctl );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>               
/* Determine if the client closed the al_handle. */<o:p></o:p></p>

<p class=MsoNormal>+            
if (!p_io_stack->FileObject)<o:p></o:p></p>

<p class=MsoNormal>+            
{<o:p></o:p></p>

<p class=MsoNormal>+                            
AL_PRINT( TRACE_LEVEL_ERROR, AL_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+                                            
("Client closed with a null open context .\n") );<o:p></o:p></p>

<p class=MsoNormal>+                            
return CL_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+            
}<o:p></o:p></p>

<p class=MsoNormal>               
p_context = (al_dev_open_context_t*)p_io_stack->FileObject->FsContext;<o:p></o:p></p>

<p class=MsoNormal>               
if( !p_context )<o:p></o:p></p>

<p class=MsoNormal>               
{<o:p></o:p></p>

<p class=MsoNormal>@@ -343,12 +359,8 @@<o:p></o:p></p>

<p class=MsoNormal>               
p_context->closing = TRUE;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>               
/* Flush any pending IOCTLs in case user-mode threads died on us. */<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_context->h_cm_ioctl )<o:p></o:p></p>

<p class=MsoNormal>-                             
al_dev_cancel_ioctl( p_context->h_cm_ioctl );<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_context->h_comp_ioctl )<o:p></o:p></p>

<p class=MsoNormal>-                             
al_dev_cancel_ioctl( p_context->h_comp_ioctl );<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_context->h_misc_ioctl )<o:p></o:p></p>

<p class=MsoNormal>-                             
al_dev_cancel_ioctl( p_context->h_misc_ioctl );<o:p></o:p></p>

<p class=MsoNormal>+            
al_csq_flush_que( &p_context->al_csq_comp, STATUS_CANCELLED );<o:p></o:p></p>

<p class=MsoNormal>+            
al_csq_flush_que( &p_context->al_csq_misc, STATUS_CANCELLED );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>               
while( p_context->ref_cnt )<o:p></o:p></p>

<p class=MsoNormal>               
{<o:p></o:p></p>

<p class=MsoNormal>@@ -491,78 +503,3 @@<o:p></o:p></p>

<p class=MsoNormal>               
AL_EXIT( AL_DBG_DEV );<o:p></o:p></p>

<p class=MsoNormal>               
return cl_status;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal>-<o:p></o:p></p>

<p class=MsoNormal>-<o:p></o:p></p>

<p class=MsoNormal>-<o:p></o:p></p>

<p class=MsoNormal>-/*<o:p></o:p></p>

<p class=MsoNormal>- * Cancel any pending IOCTL calls for the specified type.<o:p></o:p></p>

<p class=MsoNormal>- * This routine is also called when closing the device.<o:p></o:p></p>

<p class=MsoNormal>- */<o:p></o:p></p>

<p class=MsoNormal>-void<o:p></o:p></p>

<p class=MsoNormal>-al_dev_cancel_ioctl(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
cl_ioctl_handle_t                                            
h_ioctl )<o:p></o:p></p>

<p class=MsoNormal>-{<o:p></o:p></p>

<p class=MsoNormal>-             
al_dev_open_context_t             
*p_context;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_ioctl_handle_t                            
*ph_ioctl;<o:p></o:p></p>

<p class=MsoNormal>-             
PIO_STACK_LOCATION                
p_io_stack;<o:p></o:p></p>

<p class=MsoNormal>-<o:p></o:p></p>

<p class=MsoNormal>-             
/*<o:p></o:p></p>

<p class=MsoNormal>-             
* Search the ioctl buffer in the process specific queue<o:p></o:p></p>

<p class=MsoNormal>-             
* Dequeue it, if found<o:p></o:p></p>

<p class=MsoNormal>-             
*/<o:p></o:p></p>

<p class=MsoNormal>-             
AL_ENTER( AL_DBG_DEV );<o:p></o:p></p>

<p class=MsoNormal>-<o:p></o:p></p>

<p class=MsoNormal>-             
/* Get the stack location. */<o:p></o:p></p>

<p class=MsoNormal>-             
p_io_stack = IoGetCurrentIrpStackLocation( h_ioctl );<o:p></o:p></p>

<p class=MsoNormal>-<o:p></o:p></p>

<p class=MsoNormal>-             
p_context = (al_dev_open_context_t *)p_io_stack->FileObject->FsContext;<o:p></o:p></p>

<p class=MsoNormal>-             
ASSERT( p_context );<o:p></o:p></p>

<p class=MsoNormal>-<o:p></o:p></p>

<p class=MsoNormal>-             
/* Clear the IOCTL. */<o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_acquire( &p_context->cb_lock );<o:p></o:p></p>

<p class=MsoNormal>-             
switch( cl_ioctl_ctl_code( h_ioctl ) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-             
case UAL_GET_COMP_CB_INFO:<o:p></o:p></p>

<p class=MsoNormal>-                             
ph_ioctl = &p_context->h_comp_ioctl;<o:p></o:p></p>

<p class=MsoNormal>-                             
break;<o:p></o:p></p>

<p class=MsoNormal>-             
case UAL_GET_MISC_CB_INFO:<o:p></o:p></p>

<p class=MsoNormal>-                             
ph_ioctl = &p_context->h_misc_ioctl;<o:p></o:p></p>

<p class=MsoNormal>-                             
break;<o:p></o:p></p>

<p class=MsoNormal>-             
default:<o:p></o:p></p>

<p class=MsoNormal>-                             
AL_PRINT( TRACE_LEVEL_ERROR, AL_DBG_ERROR, ("Invalid CB type\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
ph_ioctl = NULL;<o:p></o:p></p>

<p class=MsoNormal>-                             
break;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-<o:p></o:p></p>

<p class=MsoNormal>-             
if( ph_ioctl && *ph_ioctl == h_ioctl )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
*ph_ioctl = NULL;<o:p></o:p></p>

<p class=MsoNormal>-#pragma warning(push, 3)<o:p></o:p></p>

<p class=MsoNormal>-                             
IoSetCancelRoutine( h_ioctl, NULL );<o:p></o:p></p>

<p class=MsoNormal>-#pragma warning(pop)<o:p></o:p></p>

<p class=MsoNormal>-<o:p></o:p></p>

<p class=MsoNormal>-                             
/* Complete the IOCTL. */<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_ioctl_complete( h_ioctl, CL_CANCELED, 0 );<o:p></o:p></p>

<p class=MsoNormal>-                             
proxy_context_deref( p_context );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_release( &p_context->cb_lock );<o:p></o:p></p>

<p class=MsoNormal>-<o:p></o:p></p>

<p class=MsoNormal>-             
AL_EXIT( AL_DBG_DEV );<o:p></o:p></p>

<p class=MsoNormal>-}<o:p></o:p></p>

<p class=MsoNormal>-<o:p></o:p></p>

<p class=MsoNormal>-<o:p></o:p></p>

<p class=MsoNormal>-void<o:p></o:p></p>

<p class=MsoNormal>-al_dev_cancel_io(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
DEVICE_OBJECT                                                               
*p_dev_obj,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
IRP                                                                                                        
*p_irp )<o:p></o:p></p>

<p class=MsoNormal>-{<o:p></o:p></p>

<p class=MsoNormal>-             
AL_ENTER( AL_DBG_DEV );<o:p></o:p></p>

<p class=MsoNormal>-<o:p></o:p></p>

<p class=MsoNormal>-             
UNUSED_PARAM( p_dev_obj );<o:p></o:p></p>

<p class=MsoNormal>-<o:p></o:p></p>

<p class=MsoNormal>-             
al_dev_cancel_ioctl( p_irp );<o:p></o:p></p>

<p class=MsoNormal>-<o:p></o:p></p>

<p class=MsoNormal>-             
IoReleaseCancelSpinLock( p_irp->CancelIrql );<o:p></o:p></p>

<p class=MsoNormal>-<o:p></o:p></p>

<p class=MsoNormal>-             
AL_EXIT( AL_DBG_DEV );<o:p></o:p></p>

<p class=MsoNormal>-}<o:p></o:p></p>

<p class=MsoNormal>Index: core/al/kernel/al_proxy.c<o:p></o:p></p>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

<p class=MsoNormal>--- core/al/kernel/al_proxy.c     
(revision 5593)<o:p></o:p></p>

<p class=MsoNormal>+++ core/al/kernel/al_proxy.c   (working copy)<o:p></o:p></p>

<p class=MsoNormal>@@ -199,7 +199,7 @@<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>               
cl_qlist_t                                                                             
*p_cb_list;<o:p></o:p></p>

<p class=MsoNormal>               
al_proxy_cb_info_t                                       
*p_cb_info;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_ioctl_handle_t                                            
*ph_ioctl;<o:p></o:p></p>

<p class=MsoNormal>+            
al_csq_t                                                                              
*p_al_csq;<o:p></o:p></p>

<p class=MsoNormal>               
uintn_t                                                                                
ioctl_size;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>               
AL_ENTER( AL_DBG_DEV );<o:p></o:p></p>

<p class=MsoNormal>@@ -209,14 +209,14 @@<o:p></o:p></p>

<p class=MsoNormal>               
{<o:p></o:p></p>

<p class=MsoNormal>               
case UAL_GET_COMP_CB_INFO:<o:p></o:p></p>

<p class=MsoNormal>                               
p_cb_list = &p_context->comp_cb_list;<o:p></o:p></p>

<p class=MsoNormal>-                             
ph_ioctl = &p_context->h_comp_ioctl;<o:p></o:p></p>

<p class=MsoNormal>+                            
p_al_csq = &p_context->al_csq_comp;<o:p></o:p></p>

<p class=MsoNormal>                               
/* TODO: Use output size only. */<o:p></o:p></p>

<p class=MsoNormal>                               
ioctl_size = sizeof( comp_cb_ioctl_info_t );<o:p></o:p></p>

<p class=MsoNormal>                               
break;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>               
case UAL_GET_MISC_CB_INFO:<o:p></o:p></p>

<p class=MsoNormal>                               
p_cb_list = &p_context->misc_cb_list;<o:p></o:p></p>

<p class=MsoNormal>-                             
ph_ioctl = &p_context->h_misc_ioctl;<o:p></o:p></p>

<p class=MsoNormal>+                            
p_al_csq = &p_context->al_csq_misc;<o:p></o:p></p>

<p class=MsoNormal>                               
/* TODO: Use output size only. */<o:p></o:p></p>

<p class=MsoNormal>                               
ioctl_size = sizeof( misc_cb_ioctl_info_t );<o:p></o:p></p>

<p class=MsoNormal>                               
break;<o:p></o:p></p>

<p class=MsoNormal>@@ -254,7 +254,6 @@<o:p></o:p></p>

<p class=MsoNormal>               
}<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>               
/* There are no callbacks to report.  Mark this IOCTL as pending. */<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( !(*ph_ioctl) );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>               
/* If we're closing down, complete the IOCTL with a canceled status. */<o:p></o:p></p>

<p class=MsoNormal>               
if( p_context->closing )<o:p></o:p></p>

<p class=MsoNormal>@@ -264,13 +263,8 @@<o:p></o:p></p>

<p class=MsoNormal>                               
return CL_CANCELED;<o:p></o:p></p>

<p class=MsoNormal>               
}<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
*ph_ioctl = h_ioctl;<o:p></o:p></p>

<p class=MsoNormal>-             
/* Set the cancel routine for this IRP so the app can abort. */<o:p></o:p></p>

<p class=MsoNormal>-#pragma warning(push, 3)<o:p></o:p></p>

<p class=MsoNormal>-             
IoSetCancelRoutine( h_ioctl, al_dev_cancel_io );<o:p></o:p></p>

<p class=MsoNormal>-#pragma warning(pop)<o:p></o:p></p>

<p class=MsoNormal>-             
/* If returning pending, the IRP must be marked as such. */<o:p></o:p></p>

<p class=MsoNormal>-             
IoMarkIrpPending( h_ioctl );<o:p></o:p></p>

<p class=MsoNormal>+            
/* put ioctl on the cancel-safe queue (it makes it pending) */<o:p></o:p></p>

<p class=MsoNormal>+            
IoCsqInsertIrp( (PIO_CSQ)p_al_csq, h_ioctl, NULL );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>               
/* Ref the context until the IOCTL is either completed or cancelled. */<o:p></o:p></p>

<p class=MsoNormal>               
proxy_context_ref( p_context );<o:p></o:p></p>

<p class=MsoNormal>Index: core/al/kernel/al_proxy_verbs.c<o:p></o:p></p>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

<p class=MsoNormal>--- core/al/kernel/al_proxy_verbs.c       
(revision 5593)<o:p></o:p></p>

<p class=MsoNormal>+++ core/al/kernel/al_proxy_verbs.c    
(working copy)<o:p></o:p></p>

<p class=MsoNormal>@@ -254,7 +254,8 @@<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>               
cl_qlist_t                                                                             
*p_cb_list;<o:p></o:p></p>

<p class=MsoNormal>               
al_proxy_cb_info_t                                       
*p_cb_info;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_ioctl_handle_t                                            
*ph_ioctl, h_ioctl;<o:p></o:p></p>

<p class=MsoNormal>+            
cl_ioctl_handle_t                                            
h_ioctl;<o:p></o:p></p>

<p class=MsoNormal>+            
al_csq_t                                                                              
*p_al_csq;<o:p></o:p></p>

<p class=MsoNormal>               
uintn_t                                                                                
ioctl_size;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>               
AL_ENTER( AL_DBG_DEV );<o:p></o:p></p>

<p class=MsoNormal>@@ -264,13 +265,13 @@<o:p></o:p></p>

<p class=MsoNormal>               
{<o:p></o:p></p>

<p class=MsoNormal>               
case UAL_GET_COMP_CB_INFO:<o:p></o:p></p>

<p class=MsoNormal>                               
p_cb_list = &p_context->comp_cb_list;<o:p></o:p></p>

<p class=MsoNormal>-                             
ph_ioctl = &p_context->h_comp_ioctl;<o:p></o:p></p>

<p class=MsoNormal>+                            
p_al_csq = &p_context->al_csq_comp;<o:p></o:p></p>

<p class=MsoNormal>                               
ioctl_size = sizeof( comp_cb_ioctl_info_t );<o:p></o:p></p>

<p class=MsoNormal>                               
break;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>               
case UAL_GET_MISC_CB_INFO:<o:p></o:p></p>

<p class=MsoNormal>                               
p_cb_list = &p_context->misc_cb_list;<o:p></o:p></p>

<p class=MsoNormal>-                             
ph_ioctl = &p_context->h_misc_ioctl;<o:p></o:p></p>

<p class=MsoNormal>+                            
p_al_csq = &p_context->al_csq_misc;<o:p></o:p></p>

<p class=MsoNormal>                               
ioctl_size = sizeof( misc_cb_ioctl_info_t );<o:p></o:p></p>

<p class=MsoNormal>                               
break;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>@@ -299,17 +300,11 @@<o:p></o:p></p>

<p class=MsoNormal>               
cl_spinlock_acquire( &p_context->cb_lock );<o:p></o:p></p>

<p class=MsoNormal>               
cl_qlist_insert_tail( p_cb_list, &p_cb_info->pool_item.list_item );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* See if there is a pending IOCTL ready to receive the callback. */<o:p></o:p></p>

<p class=MsoNormal>-             
if( *ph_ioctl )<o:p></o:p></p>

<p class=MsoNormal>+            
/* remove ioctl from the cancel-safe queue (it makes it unpending) */<o:p></o:p></p>

<p class=MsoNormal>+            
h_ioctl = IoCsqRemoveNextIrp( (PIO_CSQ)p_al_csq, NULL );<o:p></o:p></p>

<p class=MsoNormal>+            
if (h_ioctl) <o:p></o:p></p>

<p class=MsoNormal>               
{<o:p></o:p></p>

<p class=MsoNormal>-                             
h_ioctl = *ph_ioctl;<o:p></o:p></p>

<p class=MsoNormal>-                             
*ph_ioctl = NULL;<o:p></o:p></p>

<p class=MsoNormal>-#pragma warning(push, 3)<o:p></o:p></p>

<p class=MsoNormal>-                             
IoSetCancelRoutine( h_ioctl, NULL );<o:p></o:p></p>

<p class=MsoNormal>-#pragma warning(pop)<o:p></o:p></p>

<p class=MsoNormal>-<o:p></o:p></p>

<p class=MsoNormal>                               
p_cb_info->reported = TRUE;<o:p></o:p></p>

<p class=MsoNormal>-<o:p></o:p></p>

<p class=MsoNormal>                               
/* Complete the IOCTL to return the callback information. */<o:p></o:p></p>

<p class=MsoNormal>                               
CL_ASSERT( cl_ioctl_out_size( h_ioctl ) >= ioctl_size );<o:p></o:p></p>

<p class=MsoNormal>                               
cl_memcpy( cl_ioctl_out_buf( h_ioctl ), p_cb_data, ioctl_size );<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal><o:p> </o:p></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>From:</b> ofw-bounces@lists.openfabrics.org
[mailto:ofw-bounces@lists.openfabrics.org] <b>On Behalf Of </b>Smith, Stan<br>
<b>Sent:</b> Saturday, June 19, 2010 10:35 PM<br>
<b>To:</b> Alex Naslednikov; Fab Tillier<br>
<b>Cc:</b> ofw@lists.openfabrics.org; Uri Habusha<br>
<b>Subject:</b> Re: [ofw] [Patch][Core] Fix at IRP cancellation mechanism<o:p></o:p></p>

</div>

</div>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>Hi Alex,<o:p></o:p></p>

<p class=MsoNormal>  When were you going to commit this patch?<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>thanks,<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>stan.<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<div class=MsoNormal align=center style='text-align:center'>

<hr size=2 width="100%" align=center>

</div>

<p class=MsoNormal style='margin-bottom:12.0pt'><b>From:</b>
ofw-bounces@lists.openfabrics.org [mailto:ofw-bounces@lists.openfabrics.org] <b>On
Behalf Of </b>Alex Naslednikov<br>
<b>Sent:</b> Wednesday, June 09, 2010 2:38 AM<br>
<b>To:</b> Fab Tillier<br>
<b>Cc:</b> ofw@lists.openfabrics.org; Uri Habusha<br>
<b>Subject:</b> Re: [ofw] [Patch][Core] Fix at IRP cancellation mechanism<o:p></o:p></p>

<div>

<p class=MsoNormal>Hi Fab,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>Looks excellent !<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> <o:p></o:p></p>

</div>

<p class=MsoNormal><o:p> </o:p></p>

<div class=MsoNormal align=center style='text-align:center'>

<hr size=2 width="100%" align=center>

</div>

<p class=MsoNormal style='margin-bottom:12.0pt'><b>From:</b> Fab Tillier
[mailto:ftillier@microsoft.com] <br>
<b>Sent:</b> Tuesday, June 08, 2010 6:34 PM<br>
<b>To:</b> Alex Naslednikov; ofw@lists.openfabrics.org; Leonid Keller; Tzachi
Dar<br>
<b>Cc:</b> Uri Habusha<br>
<b>Subject:</b> RE: [ofw] [Patch][Core] Fix at IRP cancellation mechanism<o:p></o:p></p>

<p class=MsoNormal><span style='font-size:11.0pt'>Hi Alex,<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt'><o:p> </o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt'>Why not move the call to
IoSetCancelRoutine up in the function, and check the return value?  If the
return is NULL, then someone else already cancelled the IRP.  If non-NULL,
then the routine cancels it.  This also will close any potential race with
completing the IRP (where the cancel routine should also be cleared.)<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt'><o:p> </o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt'>IoSetCancelRoutine is atomic,
so should provide the correct level of synchronization.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt'><o:p> </o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt'>Thoughts?<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt'>-Fab<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt'><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'>From:</span></b><span
style='font-size:10.0pt'> ofw-bounces@lists.openfabrics.org
[mailto:ofw-bounces@lists.openfabrics.org] <b>On Behalf Of </b>Alex Naslednikov<br>
<b>Sent:</b> Tuesday, June 08, 2010 12:56 AM<br>
<b>To:</b> ofw@lists.openfabrics.org; Leonid Keller; Tzachi Dar<br>
<b>Cc:</b> Uri Habusha<br>
<b>Subject:</b> [ofw] [Patch][Core] Fix at IRP cancellation mechanism<o:p></o:p></span></p>

</div>

</div>

<p class=MsoNormal><o:p> </o:p></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt'>This patch fixes the race
(and BSOD) within IRP cancellation mechanism.<br>
The original problem:<br>
1.Function al_dev_cancel_ioctl() called from the 2 places:<br>
directly from IBAL and by OS (as a callback)<br>
2. This is because I/O request can be cancelled both by user-level mechanism
and <br>
by OS.<br>
3. Function al_dev_cancel_ioctl() calls to IoGetCurrentIrpStackLocation() in
order <br>
to receive context and take a spinlock (p_context->cb_lock)<br>
4. But IoGetCurrentIrpStackLocation() as well further access to stack pointer<br>
should be protected !!! <br>
5. BSOD happened when context or IRP itself were already cancelled by
concurrent <br>
calls to al_dev_cancel_ioctl()</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal> <o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt'>Signed-off by: Alexander
Naslednikov (xalex at mellanox.co.il)<br>
Index: B:/users/xalex/2_1_0/core/al/kernel/al_dev.c<br>
===================================================================<br>
--- B:/users/xalex/2_1_0/core/al/kernel/al_dev.c (revision 5929)<br>
+++ B:/users/xalex/2_1_0/core/al/kernel/al_dev.c (revision 5930)<br>
@@ -65,9 +65,16 @@<br>
 __proxy_cancel_cblists(<br>
  IN  al_dev_open_context_t   *p_context );<br>
 <br>
+CL_INLINE void<br>
+al_dev_cancel_ioctl_unlocked(<br>
+ IN     al_dev_open_context_t *p_context,<br>
+ IN OUT    cl_ioctl_handle_t  *p_ioctl );<br>
 static void<br>
 __construct_open_context(<br>
  IN  al_dev_open_context_t   *p_context )<br>
@@ -343,12 +350,19 @@<br>
  p_context->closing = TRUE;<br>
 <br>
  /* Flush any pending IOCTLs in case user-mode threads died on us.
*/<br>
+ /* Protect IOCTL cancellation by spinlock to avoid race <br>
+ */<br>
+ <br>
+ cl_spinlock_acquire( &p_context->cb_lock );<br>
+ <br>
  if( p_context->h_cm_ioctl )<br>
-  al_dev_cancel_ioctl( p_context->h_cm_ioctl );<br>
- if( p_context->h_comp_ioctl )<br>
-  al_dev_cancel_ioctl( p_context->h_comp_ioctl );<br>
+  al_dev_cancel_ioctl_unlocked( p_context,
&p_context->h_cm_ioctl );<br>
+ if( p_context->h_comp_ioctl ) <br>
+  al_dev_cancel_ioctl_unlocked( p_context,
&p_context->h_comp_ioctl );<br>
  if( p_context->h_misc_ioctl )<br>
-  al_dev_cancel_ioctl( p_context->h_misc_ioctl );<br>
+  al_dev_cancel_ioctl_unlocked( p_context,
&p_context->h_misc_ioctl );<br>
+ <br>
+ cl_spinlock_release ( &p_context->cb_lock );<br>
 <br>
  while( p_context->ref_cnt )<br>
  {<br>
@@ -514,20 +528,31 @@<br>
 <br>
  /* Get the stack location. */<br>
  p_io_stack = IoGetCurrentIrpStackLocation( h_ioctl );<br>
+ if (!p_io_stack) {<br>
+  AL_PRINT( TRACE_LEVEL_WARNING, AL_DBG_DEV, ("This IOCTL was
previosly destroyed \n") );<br>
+  return;<br>
+ }<br>
 <br>
  p_context = (al_dev_open_context_t
*)p_io_stack->FileObject->FsContext;<br>
- ASSERT( p_context );<br>
-<br>
+ if (!p_context) {<br>
+  AL_PRINT( TRACE_LEVEL_ERROR, AL_DBG_ERROR, ("This IOCTL was
previosly destroyed \n") );<br>
+  return;<br>
+ }<br>
  /* Clear the IOCTL. */<br>
  cl_spinlock_acquire( &p_context->cb_lock );<br>
  switch( cl_ioctl_ctl_code( h_ioctl ) )<br>
  {<br>
  case UAL_GET_COMP_CB_INFO:<br>
   ph_ioctl = &p_context->h_comp_ioctl;<br>
+  ASSERT(ph_ioctl);<br>
   break;<br>
  case UAL_GET_MISC_CB_INFO:<br>
   ph_ioctl = &p_context->h_misc_ioctl;<br>
   break;<br>
+ case NULL:<br>
+  AL_PRINT( TRACE_LEVEL_WARNING, AL_DBG_DEV, ("This IOCTL was
previosly destroyed \n") );<br>
+  cl_spinlock_release( &p_context->cb_lock );<br>
+  return;<br>
  default:<br>
   AL_PRINT( TRACE_LEVEL_ERROR, AL_DBG_ERROR, ("Invalid CB
type\n") );<br>
   ph_ioctl = NULL;<br>
@@ -550,7 +575,33 @@<br>
  AL_EXIT( AL_DBG_DEV );<br>
 }<br>
 <br>
+/*<br>
+ * Cancel any pending IOCTL calls for the specified type.<br>
+ * This routine is also called when closing the device.<br>
+ * The lock should already be taken by the caller<br>
+ */<br>
+CL_INLINE void<br>
+al_dev_cancel_ioctl_unlocked(<br>
+ IN     al_dev_open_context_t *p_context,<br>
+ IN OUT    cl_ioctl_handle_t  *p_ioctl )<br>
+{<br>
+ <br>
+ AL_ENTER( AL_DBG_DEV );<br>
 <br>
+#pragma warning(push, 3)<br>
+ IoSetCancelRoutine( *p_ioctl, NULL );<br>
+#pragma warning(pop)<br>
+<br>
+ /* Complete the IOCTL. */<br>
+ cl_ioctl_complete( *p_ioctl, CL_CANCELED, 0 );<br>
+ proxy_context_deref( p_context );<br>
+ *p_ioctl = NULL;<br>
+<br>
+ AL_EXIT( AL_DBG_DEV );<br>
+}<br>
+<br>
+<br>
+<br>
 void<br>
 al_dev_cancel_io(<br>
  IN    DEVICE_OBJECT    *p_dev_obj,<br>
Index: B:/users/xalex/2_1_0/inc/kernel/complib/cl_ioctl_osd.h<br>
===================================================================<br>
--- B:/users/xalex/2_1_0/inc/kernel/complib/cl_ioctl_osd.h (revision 5929)<br>
+++ B:/users/xalex/2_1_0/inc/kernel/complib/cl_ioctl_osd.h (revision 5930)<br>
@@ -49,7 +49,9 @@<br>
 #define IOCTL_CODE( type, cmd ) \<br>
  CTL_CODE( type, (cmd & 0x0FFF), METHOD_BUFFERED,
FILE_ANY_ACCESS)<br>
 <br>
+#define BAD_IRP_STACK 0<br>
 <br>
+<br>
 typedef PIRP cl_ioctl_handle_t;<br>
 <br>
 <br>
@@ -101,6 +103,10 @@<br>
  IO_STACK_LOCATION *p_io_stack;<br>
 <br>
  p_io_stack = IoGetCurrentIrpStackLocation( h_ioctl );<br>
+ if (!p_io_stack) {<br>
+  /* "This IOCTL was previosly destroyed ! */<br>
+  return BAD_IRP_STACK ;<br>
+ }<br>
  return p_io_stack->Parameters.DeviceIoControl.IoControlCode;<br>
 }<br>
 </span><o:p></o:p></p>

</div>

</div>

</div>

</div>

</div>

</body>

</html>