Commit 52db45c3 authored by Stefan Weinhuber's avatar Stefan Weinhuber Committed by Martin Schwidefsky

[S390] dasd: fix idaw boundary checking for track based ccw

A ccw command that reads or writes several records at once will
usually transfer more data then fits into one page and needs to
address memory areas using a list of indirect data address words
(idaw). All but the first of these areas must start on a 4KB or 2KB
block boundary (depending on the idaw format).
A check for this restriction was missing and has been added with
this patch.
Signed-off-by: default avatarStefan Weinhuber <wein@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent f3445a1a
...@@ -2019,15 +2019,23 @@ static struct dasd_ccw_req *dasd_eckd_build_cp_cmd_track( ...@@ -2019,15 +2019,23 @@ static struct dasd_ccw_req *dasd_eckd_build_cp_cmd_track(
ccw++; ccw++;
recid += count; recid += count;
new_track = 0; new_track = 0;
/* first idaw for a ccw may start anywhere */
if (!idaw_dst)
idaw_dst = dst;
} }
/* If we start a new idaw, everything is fine and the /* If we start a new idaw, we must make sure that it
* start of the new idaw is the start of this segment. * starts on an IDA_BLOCK_SIZE boundary.
* If we continue an idaw, we must make sure that the * If we continue an idaw, we must make sure that the
* current segment begins where the so far accumulated * current segment begins where the so far accumulated
* idaw ends * idaw ends
*/ */
if (!idaw_dst) if (!idaw_dst) {
idaw_dst = dst; if (__pa(dst) & (IDA_BLOCK_SIZE-1)) {
dasd_sfree_request(cqr, startdev);
return ERR_PTR(-ERANGE);
} else
idaw_dst = dst;
}
if ((idaw_dst + idaw_len) != dst) { if ((idaw_dst + idaw_len) != dst) {
dasd_sfree_request(cqr, startdev); dasd_sfree_request(cqr, startdev);
return ERR_PTR(-ERANGE); return ERR_PTR(-ERANGE);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment