s390/chsc: sanitize fmt check for chp_desc determination
authorSebastian Ott <sebott@linux.vnet.ibm.com>
Tue, 21 Jun 2016 11:59:08 +0000 (13:59 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Fri, 15 Jul 2016 12:32:00 +0000 (14:32 +0200)
When fetching channel path descriptors we've only evaluated the rfmt
parameter which could lead us to trigger the chsc even though the
machine doesn't support the specific format or to not trigger the
chsc and report a failure to userspace even though the machine would've
supported it.

Improve these checks and change the parameters of the in-kernel
user to be less confusing.

Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Reviewed-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/cio/chsc.c

index 39bb2ea7b78fd112370d4921e85a197d7ed0520b..4fe9531fb1280e4b210f31aba19bed0830cc3428 100644 (file)
@@ -907,7 +907,8 @@ int chsc_determine_channel_path_desc(struct chp_id chpid, int fmt, int rfmt,
        struct chsc_scpd *scpd_area;
        int ccode, ret;
 
-       if ((rfmt == 1) && !css_general_characteristics.fcs)
+       if ((rfmt == 1 || rfmt == 0) && c == 1 &&
+           !css_general_characteristics.fcs)
                return -EINVAL;
        if ((rfmt == 2) && !css_general_characteristics.cib)
                return -EINVAL;
@@ -966,7 +967,7 @@ int chsc_determine_fmt1_channel_path_desc(struct chp_id chpid,
 
        spin_lock_irqsave(&chsc_page_lock, flags);
        scpd_area = chsc_page;
-       ret = chsc_determine_channel_path_desc(chpid, 0, 0, 1, 0, scpd_area);
+       ret = chsc_determine_channel_path_desc(chpid, 0, 1, 1, 0, scpd_area);
        if (ret)
                goto out;
        chsc_resp = (void *)&scpd_area->response;