lkml.org 
[lkml]   [2022]   [Jul]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.18 072/102] nvmet-tcp: fix regression in data_digest calculation
    Date
    From: Sagi Grimberg <sagi@grimberg.me>

    commit ed0691cf55140ce0f3fb100225645d902cce904b upstream.

    Data digest calculation iterates over command mapped iovec. However
    since commit bac04454ef9f we unmap the iovec before we handle the data
    digest, and since commit 69b85e1f1d1d we clear nr_mapped when we unmap
    the iov.

    Instead of open-coding the command iov traversal, simply call
    crypto_ahash_digest with the command sg that is already allocated (we
    already do that for the send path). Rename nvmet_tcp_send_ddgst to
    nvmet_tcp_calc_ddgst and call it from send and recv paths.

    Fixes: 69b85e1f1d1d ("nvmet-tcp: add an helper to free the cmd buffers")
    Fixes: bac04454ef9f ("nvmet-tcp: fix kmap leak when data digest in use")
    Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/nvme/target/tcp.c | 23 +++--------------------
    1 file changed, 3 insertions(+), 20 deletions(-)

    --- a/drivers/nvme/target/tcp.c
    +++ b/drivers/nvme/target/tcp.c
    @@ -405,7 +405,7 @@ err:
    return NVME_SC_INTERNAL;
    }

    -static void nvmet_tcp_send_ddgst(struct ahash_request *hash,
    +static void nvmet_tcp_calc_ddgst(struct ahash_request *hash,
    struct nvmet_tcp_cmd *cmd)
    {
    ahash_request_set_crypt(hash, cmd->req.sg,
    @@ -413,23 +413,6 @@ static void nvmet_tcp_send_ddgst(struct
    crypto_ahash_digest(hash);
    }

    -static void nvmet_tcp_recv_ddgst(struct ahash_request *hash,
    - struct nvmet_tcp_cmd *cmd)
    -{
    - struct scatterlist sg;
    - struct kvec *iov;
    - int i;
    -
    - crypto_ahash_init(hash);
    - for (i = 0, iov = cmd->iov; i < cmd->nr_mapped; i++, iov++) {
    - sg_init_one(&sg, iov->iov_base, iov->iov_len);
    - ahash_request_set_crypt(hash, &sg, NULL, iov->iov_len);
    - crypto_ahash_update(hash);
    - }
    - ahash_request_set_crypt(hash, NULL, (void *)&cmd->exp_ddgst, 0);
    - crypto_ahash_final(hash);
    -}
    -
    static void nvmet_setup_c2h_data_pdu(struct nvmet_tcp_cmd *cmd)
    {
    struct nvme_tcp_data_pdu *pdu = cmd->data_pdu;
    @@ -454,7 +437,7 @@ static void nvmet_setup_c2h_data_pdu(str

    if (queue->data_digest) {
    pdu->hdr.flags |= NVME_TCP_F_DDGST;
    - nvmet_tcp_send_ddgst(queue->snd_hash, cmd);
    + nvmet_tcp_calc_ddgst(queue->snd_hash, cmd);
    }

    if (cmd->queue->hdr_digest) {
    @@ -1137,7 +1120,7 @@ static void nvmet_tcp_prep_recv_ddgst(st
    {
    struct nvmet_tcp_queue *queue = cmd->queue;

    - nvmet_tcp_recv_ddgst(queue->rcv_hash, cmd);
    + nvmet_tcp_calc_ddgst(queue->rcv_hash, cmd);
    queue->offset = 0;
    queue->left = NVME_TCP_DIGEST_LENGTH;
    queue->rcv_state = NVMET_TCP_RECV_DDGST;

    \
     
     \ /
      Last update: 2022-07-05 14:36    [W:4.100 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site