Skip to content

Commit f79d5fd

Browse files
mitaChristoph Hellwig
authored and
Christoph Hellwig
committed
nvme: enable to inject errors into admin commands
This enables to inject errors into the commands submitted to the admin queue. It is useful to test error handling in the controller initialization. # echo 100 > /sys/kernel/debug/nvme0/fault_inject/probability # echo 1 > /sys/kernel/debug/nvme0/fault_inject/times # echo 10 > /sys/kernel/debug/nvme0/fault_inject/space # nvme reset /dev/nvme0 # dmesg ... nvme nvme0: Could not set queue count (16385) nvme nvme0: IO queues not created Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com> Reviewed-by: Minwoo Im <minwoo.im.dev@gmail.com> Reviewed-by: Sagi Grimberg <sagi@grimberg.me> Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Christoph Hellwig <hch@lst.de>
1 parent a364645 commit f79d5fd

File tree

3 files changed

+7
-3
lines changed

3 files changed

+7
-3
lines changed

drivers/nvme/host/core.c

+3
Original file line numberDiff line numberDiff line change
@@ -3722,6 +3722,7 @@ EXPORT_SYMBOL_GPL(nvme_start_ctrl);
37223722

37233723
void nvme_uninit_ctrl(struct nvme_ctrl *ctrl)
37243724
{
3725+
nvme_fault_inject_fini(&ctrl->fault_inject);
37253726
dev_pm_qos_hide_latency_tolerance(ctrl->device);
37263727
cdev_device_del(&ctrl->cdev, ctrl->device);
37273728
}
@@ -3817,6 +3818,8 @@ int nvme_init_ctrl(struct nvme_ctrl *ctrl, struct device *dev,
38173818
dev_pm_qos_update_user_latency_tolerance(ctrl->device,
38183819
min(default_ps_max_latency_us, (unsigned long)S32_MAX));
38193820

3821+
nvme_fault_inject_init(&ctrl->fault_inject, dev_name(ctrl->device));
3822+
38203823
return 0;
38213824
out_free_name:
38223825
kfree_const(ctrl->device->kobj.name);

drivers/nvme/host/fault_inject.c

+2-3
Original file line numberDiff line numberDiff line change
@@ -60,16 +60,15 @@ void nvme_should_fail(struct request *req)
6060
struct nvme_fault_inject *fault_inject = NULL;
6161
u16 status;
6262

63-
/*
64-
* make sure this request is coming from a valid namespace
65-
*/
6663
if (disk) {
6764
struct nvme_ns *ns = disk->private_data;
6865

6966
if (ns)
7067
fault_inject = &ns->fault_inject;
7168
else
7269
WARN_ONCE(1, "No namespace found for request\n");
70+
} else {
71+
fault_inject = &nvme_req(req)->ctrl->fault_inject;
7372
}
7473

7574
if (fault_inject && should_fail(&fault_inject->attr, 1)) {

drivers/nvme/host/nvme.h

+2
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,8 @@ struct nvme_ctrl {
256256

257257
struct page *discard_page;
258258
unsigned long discard_page_busy;
259+
260+
struct nvme_fault_inject fault_inject;
259261
};
260262

261263
enum nvme_iopolicy {

0 commit comments

Comments
 (0)