<HTML xmlns:o><HEAD><TITLE>Samsung Enterprise Portal mySingle</TITLE>
<META content="text/html; charset=windows-1252" http-equiv=Content-Type>
<STYLE id=mysingle_style type=text/css>P {
        MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt; FONT-FAMILY: Arial, arial; MARGIN-TOP: 5px
}
TD {
        MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt; FONT-FAMILY: Arial, arial; MARGIN-TOP: 5px
}
LI {
        MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt; FONT-FAMILY: Arial, arial; MARGIN-TOP: 5px
}
BODY {
        FONT-SIZE: 9pt; FONT-FAMILY: Arial, arial; MARGIN: 10px; LINE-HEIGHT: 1.4
}
</STYLE>

<META content=IE=5 http-equiv=X-UA-Compatible>
<META content=IE=5 http-equiv=X-UA-Compatible>
<META name=GENERATOR content="MSHTML 11.00.9600.18212"></HEAD>
<BODY>
<P><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">Hi all,<BR><BR>This patch includes changes for supporting NVMe Disk read only mode.</SPAN></P>
<P><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">I have made a detailed overview of the changes in the attached doc file(the contents are also copied here below) and the attached zip file contains the source code.</SPAN></P>
<P><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">Password is samsungnvme<BR> <BR>Please let me know if you have any questions.<BR> <BR>Thanks,<BR>Suman</SPAN></P>
<P><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN> </P>
<P><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">******************</SPAN></P>
<P><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN> </P>
<P style='FONT-SIZE: 11pt; TEXT-DECORATION: ; FONT-FAMILY: "Calibri","sans-serif"; MARGIN: 0in 0in 10pt'><B style="mso-bidi-font-weight: normal"><U><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">NVMe Disk End of Life support:</SPAN><o:p><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN></o:p></U></B></P>
<P style='FONT-SIZE: 11pt; TEXT-DECORATION: ; FONT-FAMILY: "Calibri","sans-serif"; MARGIN: 0in 0in 10pt; TEXT-INDENT: 0.5in'><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">Whenever NVMe disk exhausts the P/E cycles, the disk become Read only(reaches End Of Life). In this case, the user should be able to read the data from the disk for backup or migration purpose. To achieve this, the driver should inform the kernel that disk has become read only. If driver does not inform the kernel, the disk will be unusable from Windows.</SPAN><o:p><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN></o:p></P>
<P style='FONT-SIZE: 11pt; TEXT-DECORATION: ; FONT-FAMILY: "Calibri","sans-serif"; MARGIN: 0in 0in 10pt'><U><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">The device has to be detected as Read only in following 2 scenarios – </SPAN><o:p><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN></o:p></U></P>
<P style='FONT-SIZE: 11pt; TEXT-DECORATION: ; FONT-FAMILY: "Calibri","sans-serif"; MARGIN: 0in 0in 10pt'><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">a. Detection during device hot plug </SPAN><o:p><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN></o:p></B></P>
<P style='FONT-SIZE: 11pt; TEXT-DECORATION: ; FONT-FAMILY: "Calibri","sans-serif"; MARGIN: 0in 0in 10pt; TEXT-INDENT: 0.5in'><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">When a Read only device is hot inserted, the kernel should be able to enumerate the device as Read only and alert the user accordingly. When the SSD is hot inserted, as part of disk initialization process, a SCSI mode sense command with page code ‘Return all pages’ (0x3f) is requested by the kernel. The mode page has a mode parameter header, which has a WP bit in the 'Device specific Parameter' field which indicates if the device is Write Protected for some reason. We can make use of this field to report to the kernel that the device has become Read only.</SPAN><o:p><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN></o:p></P>
<P style='FONT-SIZE: 11pt; TEXT-DECORATION: ; FONT-FAMILY: "Calibri","sans-serif"; MARGIN: 0in 0in 10pt; TEXT-INDENT: 0.5in'><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">When the miniport driver receives this request, the NVM Express command Get log page is built with log identifier 'SMART / Health Information' (0x2) and send to the device. The SMART data has a 'Critical Warning' field in which a bit 'MediaInReadOnlyMode' is set whenever the media becomes Read only. So if the device returns SMART data with this bit set, the miniport driver sets the Device specific parameter – WP bit in mode parameter header and completes the command.</SPAN><o:p><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN></o:p></P>
<P style='FONT-SIZE: 11pt; TEXT-DECORATION: ; FONT-FAMILY: "Calibri","sans-serif"; MARGIN: 0in 0in 10pt; TEXT-INDENT: 0.5in'><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">When the WP bit is set in the mode parameter header, the kernel will understand that the device is Write protected and hence kernel will not send any more write requests.</SPAN></P>
<P style='FONT-SIZE: 11pt; TEXT-DECORATION: ; FONT-FAMILY: "Calibri","sans-serif"; MARGIN: 0in 0in 10pt'><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">b. Detection during run time</SPAN><o:p><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN></o:p></B></P>
<P style='FONT-SIZE: 11pt; TEXT-DECORATION: ; FONT-FAMILY: "Calibri","sans-serif"; MARGIN: 0in 0in 10pt'><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">When the device is in use and the Write exhausts and device becomes Read only, the kernel has to immediately report to the user that device has become write protected. To achieve this, whenever the device receives a NVMe Write request after it has become Read only, the device sets SCT to Command Specific Status and SC to 'Attempted Write to Read Only Range' in response to the write command.</SPAN><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri; mso-spacerun: yes">  </SPAN><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">For this the following sense data is returned for the corresponding SCSI write command. </SPAN><o:p><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN></o:p></P>
<P style='FONT-SIZE: 11pt; TEXT-DECORATION: ; FONT-FAMILY: "Calibri","sans-serif"; MARGIN: 0in 0in 10pt'><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">Sense data – SCSI_SENSE_DATA_PROTECT, ASC – SCSI_ADSENSE_WRITE_PROTECT and ASCQ – SCSI_ADSENSE_NO_SENSE.</SPAN><o:p><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN></o:p></P>
<P style='FONT-SIZE: 11pt; TEXT-DECORATION: ; FONT-FAMILY: "Calibri","sans-serif"; MARGIN: 0in 0in 10pt'><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">With this sense data, the kernel will understand that the device is in Write protected state for which the Mode sense command with mode page 'Return all pages' will be send to the device. Again with the NVM Express Get log page – SMART command, the miniport driver will return the mode sense 'Data Specific parameter' accordingly.</SPAN><o:p><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN></o:p></P>
<P style='FONT-SIZE: 11pt; TEXT-DECORATION: ; FONT-FAMILY: "Calibri","sans-serif"; MARGIN: 0in 0in 10pt'><o:p><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"> </SPAN></o:p></P>
<P style='FONT-SIZE: 11pt; TEXT-DECORATION: ; FONT-FAMILY: "Calibri","sans-serif"; MARGIN: 0in 0in 10pt'><o:p><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN></o:p><B style="mso-bidi-font-weight: normal"><U><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">Code changes:</SPAN><o:p><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN></o:p></U></B></P>
<P style='FONT-SIZE: 11pt; TEXT-DECORATION: ; FONT-FAMILY: "Calibri","sans-serif"; MARGIN: 0in 0in 10pt'><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">1. In SntiReturnAllModePages(), build get log page for SMART/health information and send to device.</SPAN><o:p><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN></o:p></P>
<P style='FONT-SIZE: 11pt; TEXT-DECORATION: ; FONT-FAMILY: "Calibri","sans-serif"; MARGIN: 0in 0in 10pt'><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">2. In SntiTranslateModeSenseResponse(), for log page MODE_SENSE_RETURN_ALL, set the Write protect bit in device specific parameter in the mode header based on the media in read only mode bit(03) in critical warning field returned in SMART/health log page.</SPAN><o:p><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN></o:p></P>
<P style='FONT-SIZE: 11pt; TEXT-DECORATION: ; FONT-FAMILY: "Calibri","sans-serif"; MARGIN: 0in 0in 10pt'><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">3. The checking for volatile write cache is moved from SntiReturnAllModePages() to SntiTranslateModeSenseResponse() after successful completion of get log page command.</SPAN></P>
<P style='FONT-SIZE: 11pt; TEXT-DECORATION: ; FONT-FAMILY: "Calibri","sans-serif"; MARGIN: 0in 0in 10pt'><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN><o:p><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN></o:p> </P>
<P style='FONT-SIZE: 11pt; TEXT-DECORATION: ; FONT-FAMILY: "Calibri","sans-serif"; MARGIN: 0in 0in 10pt'><B style="mso-bidi-font-weight: normal"><U><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">We have tested the following:</SPAN><o:p><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN></o:p></U></B></P>
<P style='FONT-SIZE: 11pt; TEXT-DECORATION: ; FONT-FAMILY: "Calibri","sans-serif"; MARGIN: 0in 0in 10pt'><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">a. On a Read only NVMe SSD, install OFA driver with these changes. In the disk management tool, the status of disk is shown as Read Only. Please find attached “DiskMgmt.jpg” (sometimes requires a system restart after driver installation).</SPAN><o:p><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN></o:p></P>
<P style='FONT-SIZE: 11pt; TEXT-DECORATION: ; FONT-FAMILY: "Calibri","sans-serif"; MARGIN: 0in 0in 10pt'><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">b. Hot insert a RO NVMe SSD and observe status as Read Only in disk management tool.</SPAN><o:p><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN></o:p></P>
<P style='FONT-SIZE: 11pt; TEXT-DECORATION: ; FONT-FAMILY: "Calibri","sans-serif"; MARGIN: 0in 0in 10pt'><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">c. On NVMe SSD, which has less % of available spare(for example 10%), execute io meter tool with write commands. When available spare reaches 0%, the error count in io meter tools starts increasing(i.e. write commands fails with the sense data, as explained in above sections), and status becomes Read Only in disk management tool.</SPAN><o:p><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN></o:p></P>
<P style='FONT-SIZE: 11pt; TEXT-DECORATION: ; FONT-FAMILY: "Calibri","sans-serif"; MARGIN: 0in 0in 10pt'><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">d. After disk becomes RO, when we try to copy files to the RO drive, Windows show message "The disk is write protected". Please find attached “FileCopy.jpg”</SPAN><o:p><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN></o:p></P>
<P style='FONT-SIZE: 11pt; TEXT-DECORATION: ; FONT-FAMILY: "Calibri","sans-serif"; MARGIN: 0in 0in 10pt'><B style="mso-bidi-font-weight: normal"><U><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">Note: </SPAN><o:p><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN></o:p></U></B></P>
<P style='FONT-SIZE: 11pt; TEXT-DECORATION: ; FONT-FAMILY: "Calibri","sans-serif"; MARGIN: 0in 0in 10pt'><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">a. As per NVMe spec 1.2, section 5.10.1.2, "There is not namespace specific information defined in the SMART / Health log page in this revision, thus the global log page and namespaces specific log page contain identical information". So when testing with multi namespace, when 1 namespace becomes RO, all the namespace will become RO. Spec has to be defined to have separate SMART /Health data per namespace.</SPAN><o:p><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN></o:p></P>
<P style='FONT-SIZE: 11pt; TEXT-DECORATION: ; FONT-FAMILY: "Calibri","sans-serif"; MARGIN: 0in 0in 10pt'><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">b. For testing, if there is no NVMe SSD which is in RO state, the following changes can to be made in the driver to test this feature:</SPAN><o:p><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN></o:p></P>
<P style='FONT-SIZE: 11pt; TEXT-DECORATION: ; FONT-FAMILY: "Calibri","sans-serif"; MARGIN: 0in 0in 10pt'><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">    1. In SntiTranslateModeSenseResponse(), hardcode pNvmeLogPage->CriticalWarning.MediaInReadOnlyMode to 1, before checking for the value. This can be done for per namespace also.</SPAN><o:p><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN></o:p></P>
<P style='FONT-SIZE: 11pt; TEXT-DECORATION: ; FONT-FAMILY: "Calibri","sans-serif"; MARGIN: 0in 0in 10pt'><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri">    2. In SntiMapCompletionStatus(), for NVMe write command, hardcode statusCodeType to COMMAND_SPECIFIC_ERRORS and statusCode to 0x82. This can be done for per namespace also.<o:p><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN></o:p></SPAN><o:p><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"></SPAN></o:p></P>
<P><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"><BR><BR></SPAN> </P></BODY></HTML><img src='http://ext.samsung.net/mailcheck/SeenTimeChecker?do=9de5907ae3594b9507cc5dd6fcad5cf0daf257cfe78672b87d9badbdf7e30042d1afaaba7860cdcd9564217c646641ad61e16949eaa607501b20909a04efd4d2748cfe1d4e847419cf878f9a26ce15a0' border=0 width=0 height=0 style='display:none'>