diff options
author | Sebastian Ott <sebott@linux.vnet.ibm.com> | 2013-01-28 22:31:50 +0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2013-02-14 18:55:07 +0400 |
commit | e6a0b7c90f9f2663f470bbfaf83afcf52f8459e8 (patch) | |
tree | 4856e350b7dee7878d6ea3fb68b54976abbbbae7 /drivers/s390 | |
parent | 69f5576f6c8c9d0f0b3670ee7c807a194b4c40f4 (diff) | |
download | linux-e6a0b7c90f9f2663f470bbfaf83afcf52f8459e8.tar.xz |
s390/cio: skip broken paths
Omit known to be broken paths (those set in path_noirq_mask) for the
sense/set PGID and nop IO commands.
Note: path_noirq_mask will be reset in ccw_device_verify_start (the
paths could be healthy again). However if we restart a path
verification via verify_start this mask will not be reset (there is
no need to let the wait for an interrupt time out again - plus we
do not want to loop once we deal with the paths in unknown path group
state).
Reviewed-by: Peter Oberparleiter <peter.oberparleiter@de.ibm.com>
Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390')
-rw-r--r-- | drivers/s390/cio/device_pgid.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/drivers/s390/cio/device_pgid.c b/drivers/s390/cio/device_pgid.c index 6f2987d8da99..f12beb72f263 100644 --- a/drivers/s390/cio/device_pgid.c +++ b/drivers/s390/cio/device_pgid.c @@ -70,8 +70,8 @@ static void nop_do(struct ccw_device *cdev) struct subchannel *sch = to_subchannel(cdev->dev.parent); struct ccw_request *req = &cdev->private->req; - /* Adjust lpm. */ - req->lpm = lpm_adjust(req->lpm, sch->schib.pmcw.pam & sch->opm); + req->lpm = lpm_adjust(req->lpm, sch->schib.pmcw.pam & sch->opm & + ~cdev->private->path_noirq_mask); if (!req->lpm) goto out_nopath; nop_build_cp(cdev); @@ -345,8 +345,9 @@ static void snid_done(struct ccw_device *cdev, int rc) else { donepm = pgid_to_donepm(cdev); sch->vpm = donepm & sch->opm; - cdev->private->pgid_todo_mask &= ~donepm; cdev->private->pgid_reset_mask |= reset; + cdev->private->pgid_todo_mask &= + ~(donepm | cdev->private->path_noirq_mask); pgid_fill(cdev, pgid); } out: @@ -400,8 +401,8 @@ static void snid_do(struct ccw_device *cdev) struct subchannel *sch = to_subchannel(cdev->dev.parent); struct ccw_request *req = &cdev->private->req; - /* Adjust lpm if paths are not set in pam. */ - req->lpm = lpm_adjust(req->lpm, sch->schib.pmcw.pam); + req->lpm = lpm_adjust(req->lpm, sch->schib.pmcw.pam & + ~cdev->private->path_noirq_mask); if (!req->lpm) goto out_nopath; snid_build_cp(cdev); |