mtip32xx: Correctly handle security locked condition
If power is removed during a secure erase, the drive will end up in a security locked condition. This patch causes the driver to identify, log, and flag the security lock state. IOs are prevented from submission to the drive until the locked state is addressed with a secure erase. Bumped version number to reflect this capability. Signed-off-by: Sam Bradshaw <sbradshaw@micron.com> Signed-off-by: Asai Thambi S P <asamymuthupa@micron.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
188b9f49d4
commit
26d580575b
2 changed files with 15 additions and 3 deletions
|
@ -920,8 +920,9 @@ static void mtip_handle_tfe(struct driver_data *dd)
|
||||||
fail_reason = "thermal shutdown";
|
fail_reason = "thermal shutdown";
|
||||||
}
|
}
|
||||||
if (buf[288] == 0xBF) {
|
if (buf[288] == 0xBF) {
|
||||||
|
set_bit(MTIP_DDF_SEC_LOCK_BIT, &dd->dd_flag);
|
||||||
dev_info(&dd->pdev->dev,
|
dev_info(&dd->pdev->dev,
|
||||||
"Drive indicates rebuild has failed.\n");
|
"Drive indicates rebuild has failed. Secure erase required.\n");
|
||||||
fail_all_ncq_cmds = 1;
|
fail_all_ncq_cmds = 1;
|
||||||
fail_reason = "rebuild failed";
|
fail_reason = "rebuild failed";
|
||||||
}
|
}
|
||||||
|
@ -1587,6 +1588,12 @@ static int mtip_get_identify(struct mtip_port *port, void __user *user_buffer)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Check security locked state */
|
||||||
|
if (port->identify[128] & 0x4)
|
||||||
|
set_bit(MTIP_DDF_SEC_LOCK_BIT, &port->dd->dd_flag);
|
||||||
|
else
|
||||||
|
clear_bit(MTIP_DDF_SEC_LOCK_BIT, &port->dd->dd_flag);
|
||||||
|
|
||||||
#ifdef MTIP_TRIM /* Disabling TRIM support temporarily */
|
#ifdef MTIP_TRIM /* Disabling TRIM support temporarily */
|
||||||
/* Demux ID.DRAT & ID.RZAT to determine trim support */
|
/* Demux ID.DRAT & ID.RZAT to determine trim support */
|
||||||
if (port->identify[69] & (1 << 14) && port->identify[69] & (1 << 5))
|
if (port->identify[69] & (1 << 14) && port->identify[69] & (1 << 5))
|
||||||
|
@ -1908,6 +1915,10 @@ static void mtip_dump_identify(struct mtip_port *port)
|
||||||
strlcpy(cbuf, (char *)(port->identify+27), 41);
|
strlcpy(cbuf, (char *)(port->identify+27), 41);
|
||||||
dev_info(&port->dd->pdev->dev, "Model: %s\n", cbuf);
|
dev_info(&port->dd->pdev->dev, "Model: %s\n", cbuf);
|
||||||
|
|
||||||
|
dev_info(&port->dd->pdev->dev, "Security: %04x %s\n",
|
||||||
|
port->identify[128],
|
||||||
|
port->identify[128] & 0x4 ? "(LOCKED)" : "");
|
||||||
|
|
||||||
if (mtip_hw_get_capacity(port->dd, §ors))
|
if (mtip_hw_get_capacity(port->dd, §ors))
|
||||||
dev_info(&port->dd->pdev->dev,
|
dev_info(&port->dd->pdev->dev,
|
||||||
"Capacity: %llu sectors (%llu MB)\n",
|
"Capacity: %llu sectors (%llu MB)\n",
|
||||||
|
@ -3678,7 +3689,8 @@ static int mtip_hw_exit(struct driver_data *dd)
|
||||||
* saves its state.
|
* saves its state.
|
||||||
*/
|
*/
|
||||||
if (!dd->sr) {
|
if (!dd->sr) {
|
||||||
if (!test_bit(MTIP_DDF_REBUILD_FAILED_BIT, &dd->dd_flag))
|
if (!test_bit(MTIP_PF_REBUILD_BIT, &dd->port->flags) &&
|
||||||
|
!test_bit(MTIP_DDF_SEC_LOCK_BIT, &dd->dd_flag))
|
||||||
if (mtip_standby_immediate(dd->port))
|
if (mtip_standby_immediate(dd->port))
|
||||||
dev_warn(&dd->pdev->dev,
|
dev_warn(&dd->pdev->dev,
|
||||||
"STANDBY IMMEDIATE failed\n");
|
"STANDBY IMMEDIATE failed\n");
|
||||||
|
|
|
@ -92,7 +92,7 @@
|
||||||
|
|
||||||
/* Driver name and version strings */
|
/* Driver name and version strings */
|
||||||
#define MTIP_DRV_NAME "mtip32xx"
|
#define MTIP_DRV_NAME "mtip32xx"
|
||||||
#define MTIP_DRV_VERSION "1.2.6os3"
|
#define MTIP_DRV_VERSION "1.3.0"
|
||||||
|
|
||||||
/* Maximum number of minor device numbers per device. */
|
/* Maximum number of minor device numbers per device. */
|
||||||
#define MTIP_MAX_MINORS 16
|
#define MTIP_MAX_MINORS 16
|
||||||
|
|
Loading…
Reference in a new issue