nvmet: add error-log definitions
authorChaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Wed, 12 Dec 2018 23:11:39 +0000 (15:11 -0800)
committerChristoph Hellwig <hch@lst.de>
Thu, 13 Dec 2018 08:59:02 +0000 (09:59 +0100)
This patch adds necessary fields in the target data structures to
support error log page. For a target controller, we add a new error log
field to maintain the error log, at any given point we maintain error
entries equal to NVMET_ERROR_LOG_SLOTS for each controller. In the
following patch, we also update the error log page entry in the I/O
completion path so we introduce a spinlock for synchronization of the
log.

For nvmet_req, we add a new field error_loc to hold the location of
the error in the command when the actual error occurs for each request
and a starting LBA if applicable.

Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/target/core.c
drivers/nvme/target/nvmet.h

index e468100b9211f26b800ed9e7960b5a279e41a370..32dca1b50c21746a55371b71f4d64dc229cd55b2 100644 (file)
@@ -769,6 +769,8 @@ bool nvmet_req_init(struct nvmet_req *req, struct nvmet_cq *cq,
        req->rsp->status = 0;
        req->rsp->sq_head = 0;
        req->ns = NULL;
+       req->error_loc = -1;
+       req->error_slba = 0;
 
        /* no support for fused commands yet */
        if (unlikely(flags & (NVME_CMD_FUSE_FIRST | NVME_CMD_FUSE_SECOND))) {
@@ -1174,6 +1176,9 @@ u16 nvmet_alloc_ctrl(const char *subsysnqn, const char *hostnqn,
        /* keep-alive timeout in seconds */
        ctrl->kato = DIV_ROUND_UP(kato, 1000);
 
+       ctrl->err_counter = 0;
+       spin_lock_init(&ctrl->error_lock);
+
        nvmet_start_keep_alive_timer(ctrl);
 
        mutex_lock(&subsys->lock);
index dafee1af4829b9b038fb04fa7408e33d76950bc3..61b3cc4159059fb0a86aa2de709c7cea97d0b4a5 100644 (file)
@@ -202,6 +202,10 @@ struct nvmet_ctrl {
 
        struct device           *p2p_client;
        struct radix_tree_root  p2p_ns_map;
+
+       spinlock_t              error_lock;
+       u64                     err_counter;
+       struct nvme_error_slot  slots[NVMET_ERROR_LOG_SLOTS];
 };
 
 struct nvmet_subsys {
@@ -317,6 +321,8 @@ struct nvmet_req {
 
        struct pci_dev          *p2p_dev;
        struct device           *p2p_client;
+       u16                     error_loc;
+       u64                     error_slba;
 };
 
 extern struct workqueue_struct *buffered_io_wq;