tools/testing/nvdimm: allow custom error code injection
Given that libnvdimm driver stack takes specific actions on DIMM command error codes like -EACCES, provide a facility to inject custom failures. Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
@@ -138,6 +138,7 @@ static u32 handle[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static unsigned long dimm_fail_cmd_flags[NUM_DCR];
|
static unsigned long dimm_fail_cmd_flags[NUM_DCR];
|
||||||
|
static int dimm_fail_cmd_code[NUM_DCR];
|
||||||
|
|
||||||
struct nfit_test_fw {
|
struct nfit_test_fw {
|
||||||
enum intel_fw_update_state state;
|
enum intel_fw_update_state state;
|
||||||
@@ -892,8 +893,11 @@ static int get_dimm(struct nfit_mem *nfit_mem, unsigned int func)
|
|||||||
if (i >= ARRAY_SIZE(handle))
|
if (i >= ARRAY_SIZE(handle))
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
|
|
||||||
if ((1 << func) & dimm_fail_cmd_flags[i])
|
if ((1 << func) & dimm_fail_cmd_flags[i]) {
|
||||||
|
if (dimm_fail_cmd_code[i])
|
||||||
|
return dimm_fail_cmd_code[i];
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
@@ -1225,8 +1229,40 @@ static ssize_t fail_cmd_store(struct device *dev, struct device_attribute *attr,
|
|||||||
}
|
}
|
||||||
static DEVICE_ATTR_RW(fail_cmd);
|
static DEVICE_ATTR_RW(fail_cmd);
|
||||||
|
|
||||||
|
static ssize_t fail_cmd_code_show(struct device *dev, struct device_attribute *attr,
|
||||||
|
char *buf)
|
||||||
|
{
|
||||||
|
int dimm = dimm_name_to_id(dev);
|
||||||
|
|
||||||
|
if (dimm < 0)
|
||||||
|
return dimm;
|
||||||
|
|
||||||
|
return sprintf(buf, "%d\n", dimm_fail_cmd_code[dimm]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t fail_cmd_code_store(struct device *dev, struct device_attribute *attr,
|
||||||
|
const char *buf, size_t size)
|
||||||
|
{
|
||||||
|
int dimm = dimm_name_to_id(dev);
|
||||||
|
unsigned long val;
|
||||||
|
ssize_t rc;
|
||||||
|
|
||||||
|
if (dimm < 0)
|
||||||
|
return dimm;
|
||||||
|
|
||||||
|
rc = kstrtol(buf, 0, &val);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
dimm_fail_cmd_code[dimm] = val;
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
static DEVICE_ATTR_RW(fail_cmd_code);
|
||||||
|
|
||||||
|
|
||||||
static struct attribute *nfit_test_dimm_attributes[] = {
|
static struct attribute *nfit_test_dimm_attributes[] = {
|
||||||
&dev_attr_fail_cmd.attr,
|
&dev_attr_fail_cmd.attr,
|
||||||
|
&dev_attr_fail_cmd_code.attr,
|
||||||
&dev_attr_handle.attr,
|
&dev_attr_handle.attr,
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user