Skip to content

Commit

Permalink
s390/cio: ensure consistent measurement state
Browse files Browse the repository at this point in the history
Make sure that in all cases where we could not obtain measurement
characteristics the associated fields are set to invalid values.

Note: without this change the "shared" capability of a channel path
for which we could not obtain the measurement characteristics was
incorrectly displayed as 0 (not shared). We will now correctly
report "unknown" in this case.

Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Reviewed-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
  • Loading branch information
Sebastian Ott authored and Martin Schwidefsky committed Jan 26, 2016
1 parent 0d9bfe9 commit 61f0bfc
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 12 deletions.
13 changes: 5 additions & 8 deletions drivers/s390/cio/chp.c
Original file line number Diff line number Diff line change
Expand Up @@ -466,14 +466,11 @@ int chp_new(struct chp_id chpid)
ret = -ENODEV;
goto out_free;
}
/* Get channel-measurement characteristics. */
if (css_chsc_characteristics.scmc && css_chsc_characteristics.secm) {
ret = chsc_get_channel_measurement_chars(chp);
if (ret)
goto out_free;
} else {
chp->cmg = -1;
}

ret = chsc_get_channel_measurement_chars(chp);
if (ret)
goto out_free;

dev_set_name(&chp->dev, "chp%x.%02x", chpid.cssid, chpid.id);

/* make it known to the system */
Expand Down
12 changes: 8 additions & 4 deletions drivers/s390/cio/chsc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1003,6 +1003,12 @@ int chsc_get_channel_measurement_chars(struct channel_path *chp)
u32 data[NR_MEASUREMENT_CHARS];
} __attribute__ ((packed)) *scmc_area;

chp->shared = -1;
chp->cmg = -1;

if (!css_chsc_characteristics.scmc || !css_chsc_characteristics.secm)
return 0;

spin_lock_irq(&chsc_page_lock);
memset(chsc_page, 0, PAGE_SIZE);
scmc_area = chsc_page;
Expand All @@ -1023,11 +1029,9 @@ int chsc_get_channel_measurement_chars(struct channel_path *chp)
scmc_area->response.code);
goto out;
}
if (scmc_area->not_valid) {
chp->cmg = -1;
chp->shared = -1;
if (scmc_area->not_valid)
goto out;
}

chp->cmg = scmc_area->cmg;
chp->shared = scmc_area->shared;
if (chp->cmg != 2 && chp->cmg != 3) {
Expand Down

0 comments on commit 61f0bfc

Please sign in to comment.