nfit_test: when clearing poison, also remove badrange entries
authorVishal Verma <vishal.l.verma@intel.com>
Mon, 30 Oct 2017 20:22:23 +0000 (13:22 -0700)
committerDan Williams <dan.j.williams@intel.com>
Thu, 2 Nov 2017 17:42:30 +0000 (10:42 -0700)
The injected badrange entries can only be cleared from the kernel's
accounting by writing to the affected blocks, so when such a write sends
the clear errror DSM to nfit_test, also clear the ranges from
nfit_test's badrange list. This lets an 'ARS Inject error status' DSM to
return the correct status, omitting the cleared ranges.

Cc: Dave Jiang <dave.jiang@intel.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
Reviewed-by: Dave Jiang <dave.jiang@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
tools/testing/nvdimm/test/nfit.c

index 788b1a5..79c5cb2 100644 (file)
@@ -344,7 +344,8 @@ static int nfit_test_cmd_ars_status(struct ars_state *ars_state,
        return 0;
 }
 
-static int nfit_test_cmd_clear_error(struct nd_cmd_clear_error *clear_err,
+static int nfit_test_cmd_clear_error(struct nfit_test *t,
+               struct nd_cmd_clear_error *clear_err,
                unsigned int buf_len, int *cmd_rc)
 {
        const u64 mask = NFIT_TEST_CLEAR_ERR_UNIT - 1;
@@ -354,12 +355,7 @@ static int nfit_test_cmd_clear_error(struct nd_cmd_clear_error *clear_err,
        if ((clear_err->address & mask) || (clear_err->length & mask))
                return -EINVAL;
 
-       /*
-        * Report 'all clear' success for all commands even though a new
-        * scrub will find errors again.  This is enough to have the
-        * error removed from the 'badblocks' tracking in the pmem
-        * driver.
-        */
+       badrange_forget(&t->badrange, clear_err->address, clear_err->length);
        clear_err->status = 0;
        clear_err->cleared = clear_err->length;
        *cmd_rc = 0;
@@ -687,7 +683,7 @@ static int nfit_test_ctl(struct nvdimm_bus_descriptor *nd_desc,
                                        cmd_rc);
                        break;
                case ND_CMD_CLEAR_ERROR:
-                       rc = nfit_test_cmd_clear_error(buf, buf_len, cmd_rc);
+                       rc = nfit_test_cmd_clear_error(t, buf, buf_len, cmd_rc);
                        break;
                default:
                        return -ENOTTY;