lkml.org 
[lkml]   [2020]   [Dec]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 555/717] s390/dasd: fix hanging device offline processing
    Date
    From: Stefan Haberland <sth@linux.ibm.com>

    commit 658a337a606f48b7ebe451591f7681d383fa115e upstream.

    For an LCU update a read unit address configuration IO is required.
    This is started using sleep_on(), which has early exit paths in case the
    device is not usable for IO. For example when it is in offline processing.

    In those cases the LCU update should fail and not be retried.
    Therefore lcu_update_work checks if EOPNOTSUPP is returned or not.

    Commit 41995342b40c ("s390/dasd: fix endless loop after read unit address configuration")
    accidentally removed the EOPNOTSUPP return code from
    read_unit_address_configuration(), which in turn might lead to an endless
    loop of the LCU update in offline processing.

    Fix by returning EOPNOTSUPP again if the device is not able to perform the
    request.

    Fixes: 41995342b40c ("s390/dasd: fix endless loop after read unit address configuration")
    Cc: stable@vger.kernel.org #5.3
    Signed-off-by: Stefan Haberland <sth@linux.ibm.com>
    Reviewed-by: Jan Hoeppner <hoeppner@linux.ibm.com>
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/s390/block/dasd_alias.c | 10 +++++++++-
    1 file changed, 9 insertions(+), 1 deletion(-)

    --- a/drivers/s390/block/dasd_alias.c
    +++ b/drivers/s390/block/dasd_alias.c
    @@ -462,11 +462,19 @@ static int read_unit_address_configurati
    spin_unlock_irqrestore(&lcu->lock, flags);

    rc = dasd_sleep_on(cqr);
    - if (rc && !suborder_not_supported(cqr)) {
    + if (!rc)
    + goto out;
    +
    + if (suborder_not_supported(cqr)) {
    + /* suborder not supported or device unusable for IO */
    + rc = -EOPNOTSUPP;
    + } else {
    + /* IO failed but should be retried */
    spin_lock_irqsave(&lcu->lock, flags);
    lcu->flags |= NEED_UAC_UPDATE;
    spin_unlock_irqrestore(&lcu->lock, flags);
    }
    +out:
    dasd_sfree_request(cqr, cqr->memdev);
    return rc;
    }

    \
     
     \ /
      Last update: 2020-12-28 15:44    [W:3.122 / U:0.320 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site