提交 e6a0b7c9 编写于 作者: S Sebastian Ott 提交者: Martin Schwidefsky

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: NPeter Oberparleiter <peter.oberparleiter@de.ibm.com>
Signed-off-by: NSebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: NMartin Schwidefsky <schwidefsky@de.ibm.com>
上级 69f5576f
...@@ -70,8 +70,8 @@ static void nop_do(struct ccw_device *cdev) ...@@ -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) ...@@ -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) ...@@ -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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册