]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
nvme-fabrics: clarify AUTHREQ result handling
authorHannes Reinecke <hare@suse.de>
Thu, 8 Dec 2022 07:49:20 +0000 (08:49 +0100)
committerChristoph Hellwig <hch@lst.de>
Wed, 1 Feb 2023 13:21:58 +0000 (14:21 +0100)
The NVMe 2.0 spec defines the ATR and ASCR bits in the AUTHREQ
connect response field to be mutually exclusive. So to clarify the
handling here switch the AUTHREQ handling to use the bit definitions
and check for both bits.
And while we're at it, add a message to the user that secure
concatenation is not supported (yet).

Suggested-by: Mark Lehrer <mark.lehrer@wdc.com>
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/fabrics.c

index ce27276f552dada471ea5306bc43450a04484909..bbaa04a0c502bfc3298915e233956884bf71cf21 100644 (file)
@@ -410,7 +410,14 @@ int nvmf_connect_admin_queue(struct nvme_ctrl *ctrl)
 
        result = le32_to_cpu(res.u32);
        ctrl->cntlid = result & 0xFFFF;
-       if ((result >> 16) & 0x3) {
+       if (result & (NVME_CONNECT_AUTHREQ_ATR | NVME_CONNECT_AUTHREQ_ASCR)) {
+               /* Secure concatenation is not implemented */
+               if (result & NVME_CONNECT_AUTHREQ_ASCR) {
+                       dev_warn(ctrl->device,
+                                "qid 0: secure concatenation is not supported\n");
+                       ret = NVME_SC_AUTH_REQUIRED;
+                       goto out_free_data;
+               }
                /* Authentication required */
                ret = nvme_auth_negotiate(ctrl, 0);
                if (ret) {
@@ -486,7 +493,14 @@ int nvmf_connect_io_queue(struct nvme_ctrl *ctrl, u16 qid)
                                       &cmd, data);
        }
        result = le32_to_cpu(res.u32);
-       if ((result >> 16) & 2) {
+       if (result & (NVME_CONNECT_AUTHREQ_ATR | NVME_CONNECT_AUTHREQ_ASCR)) {
+               /* Secure concatenation is not implemented */
+               if (result & NVME_CONNECT_AUTHREQ_ASCR) {
+                       dev_warn(ctrl->device,
+                                "qid 0: secure concatenation is not supported\n");
+                       ret = NVME_SC_AUTH_REQUIRED;
+                       goto out_free_data;
+               }
                /* Authentication required */
                ret = nvme_auth_negotiate(ctrl, qid);
                if (ret) {
@@ -500,6 +514,7 @@ int nvmf_connect_io_queue(struct nvme_ctrl *ctrl, u16 qid)
                                         "qid %u: authentication failed\n", qid);
                }
        }
+out_free_data:
        kfree(data);
        return ret;
 }