nfit_test: when clearing poison, also remove badrange entries

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>
This commit is contained in:
Vishal Verma 2017-10-30 13:22:23 -07:00 committed by Dan Williams
parent 89360b87c3
commit 5e096ef3b2

View File

@ -344,7 +344,8 @@ static int nfit_test_cmd_ars_status(struct ars_state *ars_state,
return 0; 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) unsigned int buf_len, int *cmd_rc)
{ {
const u64 mask = NFIT_TEST_CLEAR_ERR_UNIT - 1; 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)) if ((clear_err->address & mask) || (clear_err->length & mask))
return -EINVAL; return -EINVAL;
/* badrange_forget(&t->badrange, clear_err->address, clear_err->length);
* 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.
*/
clear_err->status = 0; clear_err->status = 0;
clear_err->cleared = clear_err->length; clear_err->cleared = clear_err->length;
*cmd_rc = 0; *cmd_rc = 0;
@ -687,7 +683,7 @@ static int nfit_test_ctl(struct nvdimm_bus_descriptor *nd_desc,
cmd_rc); cmd_rc);
break; break;
case ND_CMD_CLEAR_ERROR: 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; break;
default: default:
return -ENOTTY; return -ENOTTY;