[S390] cio: introduce cio_update_schib
There is the chance that we get condition code 0 for a stsch but the resulting schib is not vaild. In the current code there are 2 cases: * we do a check for validity of the schib after stsch, but at this time we have already stored the invaild schib in the subchannel structure. This may lead to problems. * we don't do a check for validity, which is not that good either. The patch addresses both issues by introducing the stsch wrapper cio_update_schib which performs stsch on a local schib. This schib is only written back to the subchannel if it's valid. side note: For some functions (chp_events) the return codes are different now (-ENXIO vs -ENODEV) but this shouldn't do harm since the caller doesn't check for _specific_ errors. Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:

committed by
Martin Schwidefsky

parent
d6a30761d8
commit
cdb912a40d
@@ -195,7 +195,8 @@ static int set_schib(struct ccw_device *cdev, u32 mme, int mbfc,
|
||||
/* msch can silently fail, so do it again if necessary */
|
||||
for (retry = 0; retry < 3; retry++) {
|
||||
/* prepare schib */
|
||||
stsch(sch->schid, schib);
|
||||
if (cio_update_schib(sch))
|
||||
return -ENODEV;
|
||||
schib->pmcw.mme = mme;
|
||||
schib->pmcw.mbfc = mbfc;
|
||||
/* address can be either a block address or a block index */
|
||||
@@ -219,7 +220,8 @@ static int set_schib(struct ccw_device *cdev, u32 mme, int mbfc,
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
stsch(sch->schid, schib); /* restore the schib */
|
||||
if (cio_update_schib(sch))
|
||||
return -ENODEV;
|
||||
|
||||
if (ret)
|
||||
break;
|
||||
@@ -338,7 +340,7 @@ static int cmf_copy_block(struct ccw_device *cdev)
|
||||
|
||||
sch = to_subchannel(cdev->dev.parent);
|
||||
|
||||
if (stsch(sch->schid, &sch->schib))
|
||||
if (cio_update_schib(sch))
|
||||
return -ENODEV;
|
||||
|
||||
if (scsw_fctl(&sch->schib.scsw) & SCSW_FCTL_START_FUNC) {
|
||||
|
Reference in New Issue
Block a user