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>
This commit is contained in:
parent
69f5576f6c
commit
e6a0b7c90f
|
@ -70,8 +70,8 @@ static void nop_do(struct ccw_device *cdev)
|
||||||
struct subchannel *sch = to_subchannel(cdev->dev.parent);
|
struct subchannel *sch = to_subchannel(cdev->dev.parent);
|
||||||
struct ccw_request *req = &cdev->private->req;
|
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)
|
if (!req->lpm)
|
||||||
goto out_nopath;
|
goto out_nopath;
|
||||||
nop_build_cp(cdev);
|
nop_build_cp(cdev);
|
||||||
|
@ -345,8 +345,9 @@ static void snid_done(struct ccw_device *cdev, int rc)
|
||||||
else {
|
else {
|
||||||
donepm = pgid_to_donepm(cdev);
|
donepm = pgid_to_donepm(cdev);
|
||||||
sch->vpm = donepm & sch->opm;
|
sch->vpm = donepm & sch->opm;
|
||||||
cdev->private->pgid_todo_mask &= ~donepm;
|
|
||||||
cdev->private->pgid_reset_mask |= reset;
|
cdev->private->pgid_reset_mask |= reset;
|
||||||
|
cdev->private->pgid_todo_mask &=
|
||||||
|
~(donepm | cdev->private->path_noirq_mask);
|
||||||
pgid_fill(cdev, pgid);
|
pgid_fill(cdev, pgid);
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
|
@ -400,8 +401,8 @@ static void snid_do(struct ccw_device *cdev)
|
||||||
struct subchannel *sch = to_subchannel(cdev->dev.parent);
|
struct subchannel *sch = to_subchannel(cdev->dev.parent);
|
||||||
struct ccw_request *req = &cdev->private->req;
|
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)
|
if (!req->lpm)
|
||||||
goto out_nopath;
|
goto out_nopath;
|
||||||
snid_build_cp(cdev);
|
snid_build_cp(cdev);
|
||||||
|
|
Loading…
Reference in New Issue