nvme-auth: don't ignore key generation failures when initializing ctrl keys
authorSagi Grimberg <sagi@grimberg.me>
Sun, 13 Nov 2022 11:24:10 +0000 (13:24 +0200)
committerChristoph Hellwig <hch@lst.de>
Wed, 16 Nov 2022 07:36:35 +0000 (08:36 +0100)
nvme_auth_generate_key can fail, don't ignore it upon initialization.

Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/host/auth.c
drivers/nvme/host/core.c
drivers/nvme/host/nvme.h

index 0d0542e33484e972a2ea04dfe7ec2ba08c8809a6..d62862ef5b3f3b42a627a243c700bd7703fcdc78 100644 (file)
@@ -972,15 +972,26 @@ static void nvme_ctrl_auth_work(struct work_struct *work)
         */
 }
 
-void nvme_auth_init_ctrl(struct nvme_ctrl *ctrl)
+int nvme_auth_init_ctrl(struct nvme_ctrl *ctrl)
 {
+       int ret;
+
        INIT_LIST_HEAD(&ctrl->dhchap_auth_list);
        INIT_WORK(&ctrl->dhchap_auth_work, nvme_ctrl_auth_work);
        mutex_init(&ctrl->dhchap_auth_mutex);
        if (!ctrl->opts)
-               return;
-       nvme_auth_generate_key(ctrl->opts->dhchap_secret, &ctrl->host_key);
-       nvme_auth_generate_key(ctrl->opts->dhchap_ctrl_secret, &ctrl->ctrl_key);
+               return 0;
+       ret = nvme_auth_generate_key(ctrl->opts->dhchap_secret,
+                       &ctrl->host_key);
+       if (ret)
+               return ret;
+       ret = nvme_auth_generate_key(ctrl->opts->dhchap_ctrl_secret,
+                       &ctrl->ctrl_key);
+       if (ret) {
+               nvme_auth_free_key(ctrl->host_key);
+               ctrl->host_key = NULL;
+       }
+       return ret;
 }
 EXPORT_SYMBOL_GPL(nvme_auth_init_ctrl);
 
index 6040a13d3e2d176f342c1e40ae7d02e35141ca06..3d6751cbf40ef853de73c6a73853fe7d33397f68 100644 (file)
@@ -5119,9 +5119,13 @@ int nvme_init_ctrl(struct nvme_ctrl *ctrl, struct device *dev,
 
        nvme_fault_inject_init(&ctrl->fault_inject, dev_name(ctrl->device));
        nvme_mpath_init_ctrl(ctrl);
-       nvme_auth_init_ctrl(ctrl);
+       ret = nvme_auth_init_ctrl(ctrl);
+       if (ret)
+               goto out_free_cdev;
 
        return 0;
+out_free_cdev:
+       cdev_device_del(&ctrl->cdev, ctrl->device);
 out_free_name:
        nvme_put_ctrl(ctrl);
        kfree_const(ctrl->device->kobj.name);
index 924ff80d85f6041c54ae17e18fccb09018de7263..47f96ab14c6a3d5a083680f823906db649e56cf5 100644 (file)
@@ -1018,14 +1018,17 @@ static inline bool nvme_ctrl_sgl_supported(struct nvme_ctrl *ctrl)
 }
 
 #ifdef CONFIG_NVME_AUTH
-void nvme_auth_init_ctrl(struct nvme_ctrl *ctrl);
+int nvme_auth_init_ctrl(struct nvme_ctrl *ctrl);
 void nvme_auth_stop(struct nvme_ctrl *ctrl);
 int nvme_auth_negotiate(struct nvme_ctrl *ctrl, int qid);
 int nvme_auth_wait(struct nvme_ctrl *ctrl, int qid);
 void nvme_auth_reset(struct nvme_ctrl *ctrl);
 void nvme_auth_free(struct nvme_ctrl *ctrl);
 #else
-static inline void nvme_auth_init_ctrl(struct nvme_ctrl *ctrl) {};
+static inline int nvme_auth_init_ctrl(struct nvme_ctrl *ctrl)
+{
+       return 0;
+}
 static inline void nvme_auth_stop(struct nvme_ctrl *ctrl) {};
 static inline int nvme_auth_negotiate(struct nvme_ctrl *ctrl, int qid)
 {