s390/chsc: improve channel path descriptor determination
authorSebastian Ott <sebott@linux.vnet.ibm.com>
Tue, 21 Jun 2016 14:26:25 +0000 (16:26 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Fri, 15 Jul 2016 12:32:01 +0000 (14:32 +0200)
When we fetch channel path descriptors via chsc we use a suboptimal
struct chsc_scpd and adjust that by casting the response to a generic
chsc_response_struct. Simplify the code by improving struct chsc_scpd.

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

index 4fe9531..940e725 100644 (file)
@@ -940,7 +940,6 @@ EXPORT_SYMBOL_GPL(chsc_determine_channel_path_desc);
 int chsc_determine_base_channel_path_desc(struct chp_id chpid,
                                          struct channel_path_desc *desc)
 {
-       struct chsc_response_struct *chsc_resp;
        struct chsc_scpd *scpd_area;
        unsigned long flags;
        int ret;
@@ -950,8 +949,8 @@ int chsc_determine_base_channel_path_desc(struct chp_id chpid,
        ret = chsc_determine_channel_path_desc(chpid, 0, 0, 0, 0, scpd_area);
        if (ret)
                goto out;
-       chsc_resp = (void *)&scpd_area->response;
-       memcpy(desc, &chsc_resp->data, sizeof(*desc));
+
+       memcpy(desc, scpd_area->data, sizeof(*desc));
 out:
        spin_unlock_irqrestore(&chsc_page_lock, flags);
        return ret;
@@ -960,7 +959,6 @@ out:
 int chsc_determine_fmt1_channel_path_desc(struct chp_id chpid,
                                          struct channel_path_desc_fmt1 *desc)
 {
-       struct chsc_response_struct *chsc_resp;
        struct chsc_scpd *scpd_area;
        unsigned long flags;
        int ret;
@@ -970,8 +968,8 @@ int chsc_determine_fmt1_channel_path_desc(struct chp_id chpid,
        ret = chsc_determine_channel_path_desc(chpid, 0, 1, 1, 0, scpd_area);
        if (ret)
                goto out;
-       chsc_resp = (void *)&scpd_area->response;
-       memcpy(desc, &chsc_resp->data, sizeof(*desc));
+
+       memcpy(desc, scpd_area->data, sizeof(*desc));
 out:
        spin_unlock_irqrestore(&chsc_page_lock, flags);
        return ret;
index 0de134c..67c87b6 100644 (file)
@@ -112,8 +112,9 @@ struct chsc_scpd {
        u32 last_chpid:8;
        u32 zeroes1;
        struct chsc_header response;
-       u8 data[PAGE_SIZE - 20];
-} __attribute__ ((packed));
+       u32:32;
+       u8 data[0];
+} __packed;
 
 struct chsc_sda_area {
        struct chsc_header request;