nvme: move passthrough logging attribute to head
authorKeith Busch <kbusch@kernel.org>
Tue, 6 Feb 2024 17:47:21 +0000 (09:47 -0800)
committerKeith Busch <kbusch@kernel.org>
Wed, 7 Feb 2024 18:30:47 +0000 (10:30 -0800)
The namespace does not have attributes, but the head does. Move the new
logging attribute to that structure instead of dereferencing the wrong
type.

And while we're here, fix the reverse-tree coding style.

Fixes: 9f079dda14339e ("nvme: allow passthru cmd error logging")
Reported-by: Tasmiya Nalatwad <tasmiya@linux.vnet.ibm.com>
Tested-by: Tasmiya Nalatwad <tasmiya@linux.vnet.ibm.com>
Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
Reviewed-by: Alan Adamson <alan.adamson@oracle.com>
Signed-off-by: Keith Busch <kbusch@kernel.org>
drivers/nvme/host/core.c
drivers/nvme/host/nvme.h
drivers/nvme/host/sysfs.c

index 9752455..246e92c 100644 (file)
@@ -713,7 +713,7 @@ void nvme_init_request(struct request *req, struct nvme_command *cmd)
        if (req->q->queuedata) {
                struct nvme_ns *ns = req->q->disk->private_data;
 
-               logging_enabled = ns->passthru_err_log_enabled;
+               logging_enabled = ns->head->passthru_err_log_enabled;
                req->timeout = NVME_IO_TIMEOUT;
        } else { /* no queuedata implies admin queue */
                logging_enabled = nr->ctrl->passthru_err_log_enabled;
@@ -3696,7 +3696,6 @@ static void nvme_alloc_ns(struct nvme_ctrl *ctrl, struct nvme_ns_info *info)
 
        ns->disk = disk;
        ns->queue = disk->queue;
-       ns->passthru_err_log_enabled = false;
 
        if (ctrl->opts && ctrl->opts->data_digest)
                blk_queue_flag_set(QUEUE_FLAG_STABLE_WRITES, ns->queue);
index 3897334..7b87763 100644 (file)
@@ -455,6 +455,7 @@ struct nvme_ns_head {
        struct list_head        entry;
        struct kref             ref;
        bool                    shared;
+       bool                    passthru_err_log_enabled;
        int                     instance;
        struct nvme_effects_log *effects;
        u64                     nuse;
@@ -523,7 +524,6 @@ struct nvme_ns {
        struct device           cdev_device;
 
        struct nvme_fault_inject fault_inject;
-       bool                    passthru_err_log_enabled;
 };
 
 /* NVMe ns supports metadata actions by the controller (generate/strip) */
index d099218..f2832f7 100644 (file)
@@ -48,8 +48,8 @@ static ssize_t nvme_adm_passthru_err_log_enabled_store(struct device *dev,
                struct device_attribute *attr, const char *buf, size_t count)
 {
        struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
-       int err;
        bool passthru_err_log_enabled;
+       int err;
 
        err = kstrtobool(buf, &passthru_err_log_enabled);
        if (err)
@@ -60,25 +60,34 @@ static ssize_t nvme_adm_passthru_err_log_enabled_store(struct device *dev,
        return count;
 }
 
+static inline struct nvme_ns_head *dev_to_ns_head(struct device *dev)
+{
+       struct gendisk *disk = dev_to_disk(dev);
+
+       if (nvme_disk_is_ns_head(disk))
+               return disk->private_data;
+       return nvme_get_ns_from_dev(dev)->head;
+}
+
 static ssize_t nvme_io_passthru_err_log_enabled_show(struct device *dev,
                struct device_attribute *attr, char *buf)
 {
-       struct nvme_ns *n = dev_get_drvdata(dev);
+       struct nvme_ns_head *head = dev_to_ns_head(dev);
 
-       return sysfs_emit(buf, n->passthru_err_log_enabled ? "on\n" : "off\n");
+       return sysfs_emit(buf, head->passthru_err_log_enabled ? "on\n" : "off\n");
 }
 
 static ssize_t nvme_io_passthru_err_log_enabled_store(struct device *dev,
                struct device_attribute *attr, const char *buf, size_t count)
 {
-       struct nvme_ns *ns = dev_get_drvdata(dev);
-       int err;
+       struct nvme_ns_head *head = dev_to_ns_head(dev);
        bool passthru_err_log_enabled;
+       int err;
 
        err = kstrtobool(buf, &passthru_err_log_enabled);
        if (err)
                return -EINVAL;
-       ns->passthru_err_log_enabled = passthru_err_log_enabled;
+       head->passthru_err_log_enabled = passthru_err_log_enabled;
 
        return count;
 }
@@ -91,15 +100,6 @@ static struct device_attribute dev_attr_io_passthru_err_log_enabled = \
        __ATTR(passthru_err_log_enabled, S_IRUGO | S_IWUSR, \
        nvme_io_passthru_err_log_enabled_show, nvme_io_passthru_err_log_enabled_store);
 
-static inline struct nvme_ns_head *dev_to_ns_head(struct device *dev)
-{
-       struct gendisk *disk = dev_to_disk(dev);
-
-       if (nvme_disk_is_ns_head(disk))
-               return disk->private_data;
-       return nvme_get_ns_from_dev(dev)->head;
-}
-
 static ssize_t wwid_show(struct device *dev, struct device_attribute *attr,
                char *buf)
 {