lkml.org 
[lkml]   [2018]   [Mar]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 50/65] s390/qeth: fix SETIP command handling
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Julian Wiedmann <jwi@linux.vnet.ibm.com>


    [ Upstream commit 1c5b2216fbb973a9410e0b06389740b5c1289171 ]

    send_control_data() applies some special handling to SETIP v4 IPA
    commands. But current code parses *all* command types for the SETIP
    command code. Limit the command code check to IPA commands.

    Fixes: 5b54e16f1a54 ("qeth: do not spin for SETIP ip assist command")
    Signed-off-by: Julian Wiedmann <jwi@linux.vnet.ibm.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/s390/net/qeth_core.h | 5 +++++
    drivers/s390/net/qeth_core_main.c | 14 ++++++++------
    2 files changed, 13 insertions(+), 6 deletions(-)

    --- a/drivers/s390/net/qeth_core.h
    +++ b/drivers/s390/net/qeth_core.h
    @@ -592,6 +592,11 @@ struct qeth_cmd_buffer {
    void (*callback) (struct qeth_channel *, struct qeth_cmd_buffer *);
    };

    +static inline struct qeth_ipa_cmd *__ipa_cmd(struct qeth_cmd_buffer *iob)
    +{
    + return (struct qeth_ipa_cmd *)(iob->data + IPA_PDU_HEADER_SIZE);
    +}
    +
    /**
    * definition of a qeth channel, used for read and write
    */
    --- a/drivers/s390/net/qeth_core_main.c
    +++ b/drivers/s390/net/qeth_core_main.c
    @@ -2050,7 +2050,7 @@ int qeth_send_control_data(struct qeth_c
    unsigned long flags;
    struct qeth_reply *reply = NULL;
    unsigned long timeout, event_timeout;
    - struct qeth_ipa_cmd *cmd;
    + struct qeth_ipa_cmd *cmd = NULL;

    QETH_CARD_TEXT(card, 2, "sendctl");

    @@ -2077,10 +2077,13 @@ int qeth_send_control_data(struct qeth_c
    while (atomic_cmpxchg(&card->write.irq_pending, 0, 1)) ;
    qeth_prepare_control_data(card, len, iob);

    - if (IS_IPA(iob->data))
    + if (IS_IPA(iob->data)) {
    + cmd = __ipa_cmd(iob);
    event_timeout = QETH_IPA_TIMEOUT;
    - else
    + } else {
    event_timeout = QETH_TIMEOUT;
    + }
    +
    timeout = jiffies + event_timeout;

    QETH_CARD_TEXT(card, 6, "noirqpnd");
    @@ -2105,9 +2108,8 @@ int qeth_send_control_data(struct qeth_c

    /* we have only one long running ipassist, since we can ensure
    process context of this command we can sleep */
    - cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
    - if ((cmd->hdr.command == IPA_CMD_SETIP) &&
    - (cmd->hdr.prot_version == QETH_PROT_IPV4)) {
    + if (cmd && cmd->hdr.command == IPA_CMD_SETIP &&
    + cmd->hdr.prot_version == QETH_PROT_IPV4) {
    if (!wait_event_timeout(reply->wait_q,
    atomic_read(&reply->received), event_timeout))
    goto time_err;

    \
     
     \ /
      Last update: 2018-03-10 01:33    [W:4.189 / U:0.436 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site