lkml.org 
[lkml]   [2019]   [Dec]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 230/321] net/smc: fix byte_order for rx_curs_confirmed
    Date
    From: Ursula Braun <ubraun@linux.ibm.com>

    [ Upstream commit ccc8ca9b90acb45a3309f922b2591b07b4e070ec ]

    The recent change in the rx_curs_confirmed assignment disregards
    byte order, which causes problems on little endian architectures.
    This patch fixes it.

    Fixes: b8649efad879 ("net/smc: fix sender_free computation") (net-tree)
    Signed-off-by: Ursula Braun <ubraun@linux.ibm.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    net/smc/smc_cdc.c | 4 +---
    net/smc/smc_cdc.h | 19 ++++++++++---------
    2 files changed, 11 insertions(+), 12 deletions(-)

    diff --git a/net/smc/smc_cdc.c b/net/smc/smc_cdc.c
    index 8f691b5a44ddf..333e4353498f8 100644
    --- a/net/smc/smc_cdc.c
    +++ b/net/smc/smc_cdc.c
    @@ -106,9 +106,7 @@ int smc_cdc_msg_send(struct smc_connection *conn,

    conn->tx_cdc_seq++;
    conn->local_tx_ctrl.seqno = conn->tx_cdc_seq;
    - smc_host_msg_to_cdc((struct smc_cdc_msg *)wr_buf,
    - &conn->local_tx_ctrl, conn);
    - smc_curs_copy(&cfed, &((struct smc_host_cdc_msg *)wr_buf)->cons, conn);
    + smc_host_msg_to_cdc((struct smc_cdc_msg *)wr_buf, conn, &cfed);
    rc = smc_wr_tx_send(link, (struct smc_wr_tx_pend_priv *)pend);
    if (!rc)
    smc_curs_copy(&conn->rx_curs_confirmed, &cfed, conn);
    diff --git a/net/smc/smc_cdc.h b/net/smc/smc_cdc.h
    index 2377a51772d51..34d2e1450320a 100644
    --- a/net/smc/smc_cdc.h
    +++ b/net/smc/smc_cdc.h
    @@ -186,26 +186,27 @@ static inline int smc_curs_diff_large(unsigned int size,

    static inline void smc_host_cursor_to_cdc(union smc_cdc_cursor *peer,
    union smc_host_cursor *local,
    + union smc_host_cursor *save,
    struct smc_connection *conn)
    {
    - union smc_host_cursor temp;
    -
    - smc_curs_copy(&temp, local, conn);
    - peer->count = htonl(temp.count);
    - peer->wrap = htons(temp.wrap);
    + smc_curs_copy(save, local, conn);
    + peer->count = htonl(save->count);
    + peer->wrap = htons(save->wrap);
    /* peer->reserved = htons(0); must be ensured by caller */
    }

    static inline void smc_host_msg_to_cdc(struct smc_cdc_msg *peer,
    - struct smc_host_cdc_msg *local,
    - struct smc_connection *conn)
    + struct smc_connection *conn,
    + union smc_host_cursor *save)
    {
    + struct smc_host_cdc_msg *local = &conn->local_tx_ctrl;
    +
    peer->common.type = local->common.type;
    peer->len = local->len;
    peer->seqno = htons(local->seqno);
    peer->token = htonl(local->token);
    - smc_host_cursor_to_cdc(&peer->prod, &local->prod, conn);
    - smc_host_cursor_to_cdc(&peer->cons, &local->cons, conn);
    + smc_host_cursor_to_cdc(&peer->prod, &local->prod, save, conn);
    + smc_host_cursor_to_cdc(&peer->cons, &local->cons, save, conn);
    peer->prod_flags = local->prod_flags;
    peer->conn_state_flags = local->conn_state_flags;
    }
    --
    2.20.1


    \
     
     \ /
      Last update: 2019-12-04 00:02    [W:2.563 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site