lkml.org 
[lkml]   [2016]   [Sep]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.12 021/119] s390/dasd: fix hanging device after clear subchannel
    Date
    From: Stefan Haberland <sth@linux.vnet.ibm.com>

    3.12-stable review patch. If anyone has any objections, please let me know.

    ===============

    commit 9ba333dc55cbb9523553df973adb3024d223e905 upstream.

    When a device is in a status where CIO has killed all I/O by itself the
    interrupt for a clear request may not contain an irb to determine the
    clear function. Instead it contains an error pointer -EIO.
    This was ignored by the DASD int_handler leading to a hanging device
    waiting for a clear interrupt.

    Handle -EIO error pointer correctly for requests that are clear pending and
    treat the clear as successful.

    Signed-off-by: Stefan Haberland <sth@linux.vnet.ibm.com>
    Reviewed-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
    Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
    Signed-off-by: Jiri Slaby <jslaby@suse.cz>
    ---
    drivers/s390/block/dasd.c | 10 +++++++++-
    1 file changed, 9 insertions(+), 1 deletion(-)

    diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c
    index 846d5c6609d8..df2fd363734e 100644
    --- a/drivers/s390/block/dasd.c
    +++ b/drivers/s390/block/dasd.c
    @@ -1612,9 +1612,18 @@ void dasd_int_handler(struct ccw_device *cdev, unsigned long intparm,
    unsigned long long now;
    int expires;

    + cqr = (struct dasd_ccw_req *) intparm;
    if (IS_ERR(irb)) {
    switch (PTR_ERR(irb)) {
    case -EIO:
    + if (cqr && cqr->status == DASD_CQR_CLEAR_PENDING) {
    + device = (struct dasd_device *) cqr->startdev;
    + cqr->status = DASD_CQR_CLEARED;
    + dasd_device_clear_timer(device);
    + wake_up(&dasd_flush_wq);
    + dasd_schedule_device_bh(device);
    + return;
    + }
    break;
    case -ETIMEDOUT:
    DBF_EVENT_DEVID(DBF_WARNING, cdev, "%s: "
    @@ -1630,7 +1639,6 @@ void dasd_int_handler(struct ccw_device *cdev, unsigned long intparm,
    }

    now = get_tod_clock();
    - cqr = (struct dasd_ccw_req *) intparm;
    /* check for conditions that should be handled immediately */
    if (!cqr ||
    !(scsw_dstat(&irb->scsw) == (DEV_STAT_CHN_END | DEV_STAT_DEV_END) &&
    --
    2.10.0
    \
     
     \ /
      Last update: 2016-09-29 12:51    [W:4.074 / U:0.176 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site