3.19.8-ckt18 -stable review patch.  If anyone has any objections, please let me 
know.

---8<------------------------------------------------------------

From: Asai Thambi SP <asamymuth...@micron.com>

commit aae4a033868c496adae86fc6f9c3e0c405bbf360 upstream.

Allow device initialization to finish gracefully when it is in
FTL rebuild failure state. Also, recover device out of this state
after successfully secure erasing it.

Signed-off-by: Selvan Mani <sm...@micron.com>
Signed-off-by: Vignesh Gunasekaran <vgunaseka...@micron.com>
Signed-off-by: Asai Thambi S P <asamymuth...@micron.com>
Signed-off-by: Jens Axboe <ax...@fb.com>
Signed-off-by: Kamal Mostafa <ka...@canonical.com>
---
 drivers/block/mtip32xx/mtip32xx.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/block/mtip32xx/mtip32xx.c 
b/drivers/block/mtip32xx/mtip32xx.c
index 5613774..3f1d0e1 100644
--- a/drivers/block/mtip32xx/mtip32xx.c
+++ b/drivers/block/mtip32xx/mtip32xx.c
@@ -703,7 +703,7 @@ static void mtip_handle_tfe(struct driver_data *dd)
                        fail_reason = "thermal shutdown";
                }
                if (buf[288] == 0xBF) {
-                       set_bit(MTIP_DDF_SEC_LOCK_BIT, &dd->dd_flag);
+                       set_bit(MTIP_DDF_REBUILD_FAILED_BIT, &dd->dd_flag);
                        dev_info(&dd->pdev->dev,
                                "Drive indicates rebuild has failed. Secure 
erase required.\n");
                        fail_all_ncq_cmds = 1;
@@ -1004,6 +1004,7 @@ static bool mtip_pause_ncq(struct mtip_port *port,
                ((fis->command == 0xFC) &&
                        (fis->features == 0x27 || fis->features == 0x72 ||
                         fis->features == 0x62 || fis->features == 0x26))) {
+               clear_bit(MTIP_DDF_REBUILD_FAILED_BIT, &port->dd->dd_flag);
                /* Com reset after secure erase or lowlevel format */
                mtip_restart_port(port);
                return false;
@@ -1168,6 +1169,7 @@ static int mtip_exec_internal_command(struct mtip_port 
*port,
                if ((rv = wait_for_completion_interruptible_timeout(
                                &wait,
                                msecs_to_jiffies(timeout))) <= 0) {
+
                        if (rv == -ERESTARTSYS) { /* interrupted */
                                dev_err(&dd->pdev->dev,
                                        "Internal command [%02X] was 
interrupted after %u ms\n",
@@ -3175,7 +3177,7 @@ static int mtip_hw_get_identify(struct driver_data *dd)
                if (buf[288] == 0xBF) {
                        dev_info(&dd->pdev->dev,
                                "Drive indicates rebuild has failed.\n");
-                       /* TODO */
+                       set_bit(MTIP_DDF_REBUILD_FAILED_BIT, &dd->dd_flag);
                }
        }
 
@@ -3754,10 +3756,9 @@ static int mtip_submit_request(struct blk_mq_hw_ctx 
*hctx, struct request *rq)
                                rq_data_dir(rq))) {
                        return -ENODATA;
                }
-               if (unlikely(test_bit(MTIP_DDF_SEC_LOCK_BIT, &dd->dd_flag)))
+               if (unlikely(test_bit(MTIP_DDF_SEC_LOCK_BIT, &dd->dd_flag) ||
+                       test_bit(MTIP_DDF_REBUILD_FAILED_BIT, &dd->dd_flag)))
                        return -ENODATA;
-               if (test_bit(MTIP_DDF_REBUILD_FAILED_BIT, &dd->dd_flag))
-                       return -ENXIO;
        }
 
        if (rq->cmd_flags & REQ_DISCARD) {
-- 
2.7.4

Reply via email to