lkml.org 
[lkml]   [2022]   [Oct]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 6.0 570/862] nvmet-auth: dont try to cancel a non-initialized work_struct
    Date
    From: Christoph Hellwig <hch@lst.de>

    [ Upstream commit 1befd944e05050d76950014f3dc04ed47faba2c3 ]

    Currently blktests nvme/002 trips up debugobjects if CONFIG_NVME_AUTH is
    enabled, but authentication is not on a queue. This is because
    nvmet_auth_sq_free cancels sq->auth_expired_work unconditionaly, while
    auth_expired_work is only ever initialized if authentication is enabled
    for a given controller.

    Fix this by calling most of what is nvmet_init_auth unconditionally
    when initializing the SQ, and just do the setting of the result
    field in the connect command handler.

    Fixes: db1312dd9548 ("nvmet: implement basic In-Band Authentication")
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
    Reviewed-by: Hannes Reinecke <hare@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/nvme/target/core.c | 1 +
    drivers/nvme/target/fabrics-cmd-auth.c | 13 ++++---------
    drivers/nvme/target/fabrics-cmd.c | 6 ++++--
    drivers/nvme/target/nvmet.h | 7 ++++---
    4 files changed, 13 insertions(+), 14 deletions(-)

    diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c
    index 7f4083cf953a..14677145bbba 100644
    --- a/drivers/nvme/target/core.c
    +++ b/drivers/nvme/target/core.c
    @@ -832,6 +832,7 @@ int nvmet_sq_init(struct nvmet_sq *sq)
    }
    init_completion(&sq->free_done);
    init_completion(&sq->confirm_done);
    + nvmet_auth_sq_init(sq);

    return 0;
    }
    diff --git a/drivers/nvme/target/fabrics-cmd-auth.c b/drivers/nvme/target/fabrics-cmd-auth.c
    index ebdf9aa81041..0c078b6b1447 100644
    --- a/drivers/nvme/target/fabrics-cmd-auth.c
    +++ b/drivers/nvme/target/fabrics-cmd-auth.c
    @@ -23,17 +23,12 @@ static void nvmet_auth_expired_work(struct work_struct *work)
    sq->dhchap_tid = -1;
    }

    -void nvmet_init_auth(struct nvmet_ctrl *ctrl, struct nvmet_req *req)
    +void nvmet_auth_sq_init(struct nvmet_sq *sq)
    {
    - u32 result = le32_to_cpu(req->cqe->result.u32);
    -
    /* Initialize in-band authentication */
    - INIT_DELAYED_WORK(&req->sq->auth_expired_work,
    - nvmet_auth_expired_work);
    - req->sq->authenticated = false;
    - req->sq->dhchap_step = NVME_AUTH_DHCHAP_MESSAGE_NEGOTIATE;
    - result |= (u32)NVME_CONNECT_AUTHREQ_ATR << 16;
    - req->cqe->result.u32 = cpu_to_le32(result);
    + INIT_DELAYED_WORK(&sq->auth_expired_work, nvmet_auth_expired_work);
    + sq->authenticated = false;
    + sq->dhchap_step = NVME_AUTH_DHCHAP_MESSAGE_NEGOTIATE;
    }

    static u16 nvmet_auth_negotiate(struct nvmet_req *req, void *d)
    diff --git a/drivers/nvme/target/fabrics-cmd.c b/drivers/nvme/target/fabrics-cmd.c
    index f91a56180d3d..bd739d8b6991 100644
    --- a/drivers/nvme/target/fabrics-cmd.c
    +++ b/drivers/nvme/target/fabrics-cmd.c
    @@ -272,7 +272,8 @@ static void nvmet_execute_admin_connect(struct nvmet_req *req)
    req->cqe->result.u16 = cpu_to_le16(ctrl->cntlid);

    if (nvmet_has_auth(ctrl))
    - nvmet_init_auth(ctrl, req);
    + req->cqe->result.u32 |=
    + cpu_to_le32((u32)NVME_CONNECT_AUTHREQ_ATR << 16);
    out:
    kfree(d);
    complete:
    @@ -334,7 +335,8 @@ static void nvmet_execute_io_connect(struct nvmet_req *req)
    pr_debug("adding queue %d to ctrl %d.\n", qid, ctrl->cntlid);
    req->cqe->result.u16 = cpu_to_le16(ctrl->cntlid);
    if (nvmet_has_auth(ctrl))
    - nvmet_init_auth(ctrl, req);
    + req->cqe->result.u32 |=
    + cpu_to_le32((u32)NVME_CONNECT_AUTHREQ_ATR << 16);

    out:
    kfree(d);
    diff --git a/drivers/nvme/target/nvmet.h b/drivers/nvme/target/nvmet.h
    index 6ffeeb0a1c49..dfe3894205aa 100644
    --- a/drivers/nvme/target/nvmet.h
    +++ b/drivers/nvme/target/nvmet.h
    @@ -704,7 +704,7 @@ int nvmet_auth_set_key(struct nvmet_host *host, const char *secret,
    bool set_ctrl);
    int nvmet_auth_set_host_hash(struct nvmet_host *host, const char *hash);
    int nvmet_setup_auth(struct nvmet_ctrl *ctrl);
    -void nvmet_init_auth(struct nvmet_ctrl *ctrl, struct nvmet_req *req);
    +void nvmet_auth_sq_init(struct nvmet_sq *sq);
    void nvmet_destroy_auth(struct nvmet_ctrl *ctrl);
    void nvmet_auth_sq_free(struct nvmet_sq *sq);
    int nvmet_setup_dhgroup(struct nvmet_ctrl *ctrl, u8 dhgroup_id);
    @@ -726,8 +726,9 @@ static inline int nvmet_setup_auth(struct nvmet_ctrl *ctrl)
    {
    return 0;
    }
    -static inline void nvmet_init_auth(struct nvmet_ctrl *ctrl,
    - struct nvmet_req *req) {};
    +static inline void nvmet_auth_sq_init(struct nvmet_sq *sq)
    +{
    +}
    static inline void nvmet_destroy_auth(struct nvmet_ctrl *ctrl) {};
    static inline void nvmet_auth_sq_free(struct nvmet_sq *sq) {};
    static inline bool nvmet_check_auth_status(struct nvmet_req *req)
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-10-19 11:21    [W:3.940 / U:0.520 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site