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 975245527c1fcc0b1d301341132f22e227f6ec9e..246e92c05aac42d1965fb3d062e2b3d58dd410fe 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 3897334e3950d5f2de1451961a159708cf4b8077..7b87763e2f8a69f5edef68e2e657ed417e911cb8 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 d099218e494a8457d546ee0e330b2095e7b9d9fc..f2832f70e7e0a861070d066bf1ee71c19fbf5ae2 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)
 {