hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/nvme/host/fault_inject.c
....@@ -1,8 +1,8 @@
1
+// SPDX-License-Identifier: GPL-2.0
12 /*
23 * fault injection support for nvme.
34 *
45 * Copyright (c) 2018, Oracle and/or its affiliates
5
- *
66 */
77
88 #include <linux/moduleparam.h>
....@@ -15,11 +15,10 @@
1515 static char *fail_request;
1616 module_param(fail_request, charp, 0000);
1717
18
-void nvme_fault_inject_init(struct nvme_ns *ns)
18
+void nvme_fault_inject_init(struct nvme_fault_inject *fault_inj,
19
+ const char *dev_name)
1920 {
2021 struct dentry *dir, *parent;
21
- char *name = ns->disk->disk_name;
22
- struct nvme_fault_inject *fault_inj = &ns->fault_inject;
2322 struct fault_attr *attr = &fault_inj->attr;
2423
2524 /* set default fault injection attribute */
....@@ -27,20 +26,20 @@
2726 setup_fault_attr(&fail_default_attr, fail_request);
2827
2928 /* create debugfs directory and attribute */
30
- parent = debugfs_create_dir(name, NULL);
29
+ parent = debugfs_create_dir(dev_name, NULL);
3130 if (!parent) {
32
- pr_warn("%s: failed to create debugfs directory\n", name);
31
+ pr_warn("%s: failed to create debugfs directory\n", dev_name);
3332 return;
3433 }
3534
3635 *attr = fail_default_attr;
3736 dir = fault_create_debugfs_attr("fault_inject", parent, attr);
3837 if (IS_ERR(dir)) {
39
- pr_warn("%s: failed to create debugfs attr\n", name);
38
+ pr_warn("%s: failed to create debugfs attr\n", dev_name);
4039 debugfs_remove_recursive(parent);
4140 return;
4241 }
43
- ns->fault_inject.parent = parent;
42
+ fault_inj->parent = parent;
4443
4544 /* create debugfs for status code and dont_retry */
4645 fault_inj->status = NVME_SC_INVALID_OPCODE;
....@@ -49,29 +48,33 @@
4948 debugfs_create_bool("dont_retry", 0600, dir, &fault_inj->dont_retry);
5049 }
5150
52
-void nvme_fault_inject_fini(struct nvme_ns *ns)
51
+void nvme_fault_inject_fini(struct nvme_fault_inject *fault_inject)
5352 {
5453 /* remove debugfs directories */
55
- debugfs_remove_recursive(ns->fault_inject.parent);
54
+ debugfs_remove_recursive(fault_inject->parent);
5655 }
5756
5857 void nvme_should_fail(struct request *req)
5958 {
6059 struct gendisk *disk = req->rq_disk;
61
- struct nvme_ns *ns = NULL;
60
+ struct nvme_fault_inject *fault_inject = NULL;
6261 u16 status;
6362
64
- /*
65
- * make sure this request is coming from a valid namespace
66
- */
67
- if (!disk)
68
- return;
63
+ if (disk) {
64
+ struct nvme_ns *ns = disk->private_data;
6965
70
- ns = disk->private_data;
71
- if (ns && should_fail(&ns->fault_inject.attr, 1)) {
66
+ if (ns)
67
+ fault_inject = &ns->fault_inject;
68
+ else
69
+ WARN_ONCE(1, "No namespace found for request\n");
70
+ } else {
71
+ fault_inject = &nvme_req(req)->ctrl->fault_inject;
72
+ }
73
+
74
+ if (fault_inject && should_fail(&fault_inject->attr, 1)) {
7275 /* inject status code and DNR bit */
73
- status = ns->fault_inject.status;
74
- if (ns->fault_inject.dont_retry)
76
+ status = fault_inject->status;
77
+ if (fault_inject->dont_retry)
7578 status |= NVME_SC_DNR;
7679 nvme_req(req)->status = status;
7780 }