OSDN Git Service

nvme-auth: don't use NVMe status codes
authorHannes Reinecke <hare@suse.de>
Tue, 13 Dec 2022 19:00:26 +0000 (20:00 +0100)
committerChristoph Hellwig <hch@lst.de>
Wed, 1 Feb 2023 13:21:58 +0000 (14:21 +0100)
NVMe status codes are part of the wire protocol, and shouldn't be
fabricated in the stack. So with this patch the authentication code
is switched over to use error codes; as a side effect authentication
failures due to internal error won't be retried anymore.
But that shouldn't have happened anyway.

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

index 4424f53..7875374 100644 (file)
@@ -158,7 +158,7 @@ static int nvme_auth_process_dhchap_challenge(struct nvme_ctrl *ctrl,
 
        if (size > CHAP_BUF_SIZE) {
                chap->status = NVME_AUTH_DHCHAP_FAILURE_INCORRECT_PAYLOAD;
-               return NVME_SC_INVALID_FIELD;
+               return -EINVAL;
        }
 
        hmac_name = nvme_auth_hmac_name(data->hashid);
@@ -167,7 +167,7 @@ static int nvme_auth_process_dhchap_challenge(struct nvme_ctrl *ctrl,
                         "qid %d: invalid HASH ID %d\n",
                         chap->qid, data->hashid);
                chap->status = NVME_AUTH_DHCHAP_FAILURE_HASH_UNUSABLE;
-               return NVME_SC_INVALID_FIELD;
+               return -EPROTO;
        }
 
        if (chap->hash_id == data->hashid && chap->shash_tfm &&
@@ -193,7 +193,7 @@ static int nvme_auth_process_dhchap_challenge(struct nvme_ctrl *ctrl,
                         chap->qid, hmac_name, PTR_ERR(chap->shash_tfm));
                chap->shash_tfm = NULL;
                chap->status = NVME_AUTH_DHCHAP_FAILURE_FAILED;
-               return NVME_SC_AUTH_REQUIRED;
+               return -ENOMEM;
        }
 
        if (crypto_shash_digestsize(chap->shash_tfm) != data->hl) {
@@ -203,7 +203,7 @@ static int nvme_auth_process_dhchap_challenge(struct nvme_ctrl *ctrl,
                crypto_free_shash(chap->shash_tfm);
                chap->shash_tfm = NULL;
                chap->status = NVME_AUTH_DHCHAP_FAILURE_HASH_UNUSABLE;
-               return NVME_SC_AUTH_REQUIRED;
+               return -EPROTO;
        }
 
        chap->hash_id = data->hashid;
@@ -219,7 +219,7 @@ select_kpp:
                         chap->qid, data->dhgid);
                chap->status = NVME_AUTH_DHCHAP_FAILURE_DHGROUP_UNUSABLE;
                /* Leave previous dh_tfm intact */
-               return NVME_SC_AUTH_REQUIRED;
+               return -EPROTO;
        }
 
        if (chap->dhgroup_id == data->dhgid &&
@@ -242,7 +242,7 @@ select_kpp:
                                 "qid %d: empty DH value\n",
                                 chap->qid);
                        chap->status = NVME_AUTH_DHCHAP_FAILURE_DHGROUP_UNUSABLE;
-                       return NVME_SC_INVALID_FIELD;
+                       return -EPROTO;
                }
 
                chap->dh_tfm = crypto_alloc_kpp(kpp_name, 0, 0);
@@ -254,7 +254,7 @@ select_kpp:
                                 chap->qid, ret, gid_name);
                        chap->status = NVME_AUTH_DHCHAP_FAILURE_DHGROUP_UNUSABLE;
                        chap->dh_tfm = NULL;
-                       return NVME_SC_AUTH_REQUIRED;
+                       return -ret;
                }
                dev_dbg(ctrl->device, "qid %d: selected DH group %s\n",
                        chap->qid, gid_name);
@@ -263,7 +263,7 @@ select_kpp:
                         "qid %d: invalid DH value for NULL DH\n",
                         chap->qid);
                chap->status = NVME_AUTH_DHCHAP_FAILURE_INCORRECT_PAYLOAD;
-               return NVME_SC_INVALID_FIELD;
+               return -EPROTO;
        }
        chap->dhgroup_id = data->dhgid;
 
@@ -274,7 +274,7 @@ skip_kpp:
                chap->ctrl_key = kmalloc(dhvlen, GFP_KERNEL);
                if (!chap->ctrl_key) {
                        chap->status = NVME_AUTH_DHCHAP_FAILURE_FAILED;
-                       return NVME_SC_AUTH_REQUIRED;
+                       return -ENOMEM;
                }
                chap->ctrl_key_len = dhvlen;
                memcpy(chap->ctrl_key, data->cval + chap->hash_len,
@@ -344,7 +344,7 @@ static int nvme_auth_process_dhchap_success1(struct nvme_ctrl *ctrl,
 
        if (size > CHAP_BUF_SIZE) {
                chap->status = NVME_AUTH_DHCHAP_FAILURE_INCORRECT_PAYLOAD;
-               return NVME_SC_INVALID_FIELD;
+               return -EINVAL;
        }
 
        if (data->hl != chap->hash_len) {
@@ -352,7 +352,7 @@ static int nvme_auth_process_dhchap_success1(struct nvme_ctrl *ctrl,
                         "qid %d: invalid hash length %u\n",
                         chap->qid, data->hl);
                chap->status = NVME_AUTH_DHCHAP_FAILURE_HASH_UNUSABLE;
-               return NVME_SC_INVALID_FIELD;
+               return -EPROTO;
        }
 
        /* Just print out information for the admin queue */
@@ -376,7 +376,7 @@ static int nvme_auth_process_dhchap_success1(struct nvme_ctrl *ctrl,
                         "qid %d: controller authentication failed\n",
                         chap->qid);
                chap->status = NVME_AUTH_DHCHAP_FAILURE_FAILED;
-               return NVME_SC_AUTH_REQUIRED;
+               return -ECONNREFUSED;
        }
 
        /* Just print out information for the admin queue */
@@ -730,7 +730,7 @@ static void nvme_queue_auth_work(struct work_struct *work)
                                         NVME_AUTH_DHCHAP_MESSAGE_CHALLENGE);
        if (ret) {
                chap->status = ret;
-               chap->error = NVME_SC_AUTH_REQUIRED;
+               chap->error = -ECONNREFUSED;
                return;
        }
 
@@ -798,7 +798,7 @@ static void nvme_queue_auth_work(struct work_struct *work)
                                         NVME_AUTH_DHCHAP_MESSAGE_SUCCESS1);
        if (ret) {
                chap->status = ret;
-               chap->error = NVME_SC_AUTH_REQUIRED;
+               chap->error = -ECONNREFUSED;
                return;
        }
 
@@ -819,7 +819,7 @@ static void nvme_queue_auth_work(struct work_struct *work)
        ret = nvme_auth_process_dhchap_success1(ctrl, chap);
        if (ret) {
                /* Controller authentication failed */
-               chap->error = NVME_SC_AUTH_REQUIRED;
+               chap->error = -ECONNREFUSED;
                goto fail2;
        }