Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e6a0b7c9 authored by Sebastian Ott's avatar Sebastian Ott Committed by Martin Schwidefsky
Browse files

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: default avatarPeter Oberparleiter <peter.oberparleiter@de.ibm.com>
Signed-off-by: default avatarSebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 69f5576f
Loading
Loading
Loading
Loading
+6 −5
Original line number Original line Diff line number Diff line
@@ -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);