<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:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" 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 15 (filtered medium)">
<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;}
/* 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:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></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="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal">Hi all,<o:p></o:p></p>
<p class="MsoNormal">This patch includes changes to support Namespace Management updates from the NVMe specification 1.2.  This patch implements some fixes for handling non-continuous namespaces, adds handling for attached and detached namespaces, and implements
 new IOCTLs to create, delete, attach and detach namespaces.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I have made a detailed overview of the changes in the text file in the attached zip file, the contents are also copied here below. 
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Password is intelnvme<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Please let me know if you have any questions.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Carolyn Foster<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">This patch includes changes to support Namespace management, including create, delete,
<o:p></o:p></p>
<p class="MsoNormal">attach and detach namespace operations.  The new functionality in this patch was tested
<o:p></o:p></p>
<p class="MsoNormal">using proprietary tools.  We tested on Server 2008 R2, Server 2012 R2 and Windows 8.1<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">Design Assumptions<o:p></o:p></p>
<p class="MsoNormal">******************<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">1. The numbering of namespaces need not be consecutive.<o:p></o:p></p>
<p class="MsoNormal">2. The namespace ID can be any number between 1 and 2^32.<o:p></o:p></p>
<p class="MsoNormal">3. A namespace is considered “active” only when it is created and attached to this controller.<o:p></o:p></p>
<p class="MsoNormal">4. A detached namespace, or one that is just created but not yet attached is considered “inactive”.
<o:p></o:p></p>
<p class="MsoNormal">5. A non-existent, or deleted namespace is considered “invalid”.<o:p></o:p></p>
<p class="MsoNormal">6. An active namespace will result in one (and only one) “Online” LUN.<o:p></o:p></p>
<p class="MsoNormal">7. Assuming single-host, and single-controller NVMe system.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">*********************<o:p></o:p></p>
<p class="MsoNormal">Architecture Overview<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 four new IOCTLs for namespace management, Create, Delete, Attach and Detach.  An attached
<o:p></o:p></p>
<p class="MsoNormal">namespace will result in a visible LUN to the Windows OS.  The LUN extension table has been updated
<o:p></o:p></p>
<p class="MsoNormal">to have a Namespace status:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">typedef enum _NS_STATUS<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">    INVALID = 0,    //Namespace ID does not exist (not known to controller).<o:p></o:p></p>
<p class="MsoNormal">    INACTIVE,       //Namespace is created, but not attached to controller.<o:p></o:p></p>
<p class="MsoNormal">    ATTACHED        //Namespace is created and attached to controller.<o:p></o:p></p>
<p class="MsoNormal">} NS_STATUS;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">In order to properly build the LUN extension table during initialization, we made changes to identify
<o:p></o:p></p>
<p class="MsoNormal">all namespaces, and to determine each namespace’s status.  These changes include new states in the
<o:p></o:p></p>
<p class="MsoNormal">Init State Machine NVMeRnningWaitOnListAttachedNs and NVMeRunningWaitOnListExistingNs.  The updated
<o:p></o:p></p>
<p class="MsoNormal">state machine steps are as follows:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">1. Send an Identify Namespace command with CNS set to 02h. This should return a list of all active (created and attached) namespaces.<o:p></o:p></p>
<p class="MsoNormal">2. Go through the list and update LUN extension entries accordingly, one entry for each namespace. Set all LUN status to online.<o:p></o:p></p>
<p class="MsoNormal">3. Send an Identify Namespace command with CNS set to 10h. This should return a list of all existing namespaces in the system, active and inactive.<o:p></o:p></p>
<p class="MsoNormal">4. Go through the list. <o:p></o:p></p>
<p class="MsoNormal">5. If a corresponding LUN entry exists, skip this step, as this must have been an active namespace that was covered in previous steps.<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">LUN extension entries are populated as follows:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">When a namespace is created:<o:p></o:p></p>
<p class="MsoNormal">- namespaceId is set.<o:p></o:p></p>
<p class="MsoNormal">- nsStatus is set to “INACTIVE”<o:p></o:p></p>
<p class="MsoNormal">- slotStatus is set to “FREE”<o:p></o:p></p>
<p class="MsoNormal">- identifyData is partially set<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">When a namespace is attached:<o:p></o:p></p>
<p class="MsoNormal">- drive is pulled for namespace identify<o:p></o:p></p>
<p class="MsoNormal">- identifyData is set accordingly<o:p></o:p></p>
<p class="MsoNormal">- nsStatus is set to “ATTACHED”<o:p></o:p></p>
<p class="MsoNormal">- slotStatus is set to “ONLINE”<o:p></o:p></p>
<p class="MsoNormal">- ReadOnly is set to FALSE<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">When a namespace is detached:<o:p></o:p></p>
<p class="MsoNormal">- nsStatus is set to “INACTIVE”<o:p></o:p></p>
<p class="MsoNormal">- slotStatus is set to “FREE”<o:p></o:p></p>
<p class="MsoNormal">- ReadOnly is set to TRUE<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">When a namespace is deleted:<o:p></o:p></p>
<p class="MsoNormal">- The entire LUN extension entry is set to 0.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">There are also new reasons for the LUN to be offline:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">typedef enum _LUN_OFFLINE_REASON<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">    NOT_OFFLINE,<o:p></o:p></p>
<p class="MsoNormal">    FORMAT_IN_PROGRESS,<o:p></o:p></p>
<p class="MsoNormal">    DETACH_IN_PROGRESS,<o:p></o:p></p>
<p class="MsoNormal">    DELETE_IN_PROGRESS<o:p></o:p></p>
<p class="MsoNormal">    // Add more as needed<o:p></o:p></p>
<p class="MsoNormal">} LUN_OFFLINE_REASON;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">When delete or detach requests are made, the driver will call StorportDeviceBusy to pause incoming requests,
<o:p></o:p></p>
<p class="MsoNormal">and the LUN is marked as offline with the appropriate reason.  When a user tries to delete an attached namespace,
<o:p></o:p></p>
<p class="MsoNormal">the driver will first send a detach command, and then the delete command.  
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">*****************<o:p></o:p></p>
<p class="MsoNormal">Known Limitations<o:p></o:p></p>
<p class="MsoNormal">*****************<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">1. If no namepsaces are present, the driver will fail to load.<o:p></o:p></p>
<p class="MsoNormal">2. If an error happens on any one namespace during initialization the driver will fail to load.
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The handling for these two scenarios could be strengthened and improved, which we did not get to in this patch.<o:p></o:p></p>
</div>
</body>
</html>