--- /dev/null
+From: Gerald Schaefer <geraldsc@de.ibm.com>
+Subject: zfcp: fix memory alignment for GPN_FT requests.
+References: bnc#466462
+
+Symptom: An unexpected adapter reopen can be triggered in case
+ of a wrongly aligned GPN_FT nameserver request.
+Problem: A request which is stored across a page is not allowed.
+ The standard memory allocation does not guarantee to have
+ all requested memory within one page.
+Solution: Make sure the requested memory is always within one page.
+
+Acked-by: John Jolly <jjolly@suse.de>
+
+---
+ drivers/s390/scsi/zfcp_aux.c | 7 +++++++
+ drivers/s390/scsi/zfcp_def.h | 9 +++++++++
+ drivers/s390/scsi/zfcp_fc.c | 13 +++----------
+ 3 files changed, 19 insertions(+), 10 deletions(-)
+
+Index: linux-sles11/drivers/s390/scsi/zfcp_aux.c
+===================================================================
+--- linux-sles11.orig/drivers/s390/scsi/zfcp_aux.c
++++ linux-sles11/drivers/s390/scsi/zfcp_aux.c
+@@ -175,6 +175,11 @@ static int __init zfcp_module_init(void)
+ if (!zfcp_data.gid_pn_cache)
+ goto out_gid_cache;
+
++ zfcp_data.gpn_ft_cache = zfcp_cache_create(
++ sizeof(struct ct_iu_gpn_ft_req), "zfcp_gpn");
++ if (!zfcp_data.gpn_ft_cache)
++ goto out_gpn_cache;
++
+ zfcp_data.work_queue = create_singlethread_workqueue("zfcp_wq");
+
+ INIT_LIST_HEAD(&zfcp_data.adapter_list_head);
+@@ -209,6 +214,8 @@ out_ccw_register:
+ out_misc:
+ fc_release_transport(zfcp_data.scsi_transport_template);
+ out_transport:
++ kmem_cache_destroy(zfcp_data.gpn_ft_cache);
++out_gpn_cache:
+ kmem_cache_destroy(zfcp_data.gid_pn_cache);
+ out_gid_cache:
+ kmem_cache_destroy(zfcp_data.sr_buffer_cache);
+Index: linux-sles11/drivers/s390/scsi/zfcp_def.h
+===================================================================
+--- linux-sles11.orig/drivers/s390/scsi/zfcp_def.h
++++ linux-sles11/drivers/s390/scsi/zfcp_def.h
+@@ -333,6 +333,14 @@ struct ct_iu_gid_pn_resp {
+ u32 d_id;
+ } __attribute__ ((packed));
+
++struct ct_iu_gpn_ft_req {
++ struct ct_hdr header;
++ u8 flags;
++ u8 domain_id_scope;
++ u8 area_id_scope;
++ u8 fc4_type;
++} __attribute__ ((packed));
++
+ /**
+ * struct zfcp_send_ct - used to pass parameters to function zfcp_fsf_send_ct
+ * @wka_port: port where the request is sent to
+@@ -595,6 +603,7 @@ struct zfcp_data {
+ struct kmem_cache *fsf_req_qtcb_cache;
+ struct kmem_cache *sr_buffer_cache;
+ struct kmem_cache *gid_pn_cache;
++ struct kmem_cache *gpn_ft_cache;
+ struct workqueue_struct *work_queue;
+ };
+
+Index: linux-sles11/drivers/s390/scsi/zfcp_fc.c
+===================================================================
+--- linux-sles11.orig/drivers/s390/scsi/zfcp_fc.c
++++ linux-sles11/drivers/s390/scsi/zfcp_fc.c
+@@ -10,14 +10,6 @@
+
+ #include "zfcp_ext.h"
+
+-struct ct_iu_gpn_ft_req {
+- struct ct_hdr header;
+- u8 flags;
+- u8 domain_id_scope;
+- u8 area_id_scope;
+- u8 fc4_type;
+-} __attribute__ ((packed));
+-
+ struct gpn_ft_resp_acc {
+ u8 control;
+ u8 port_id[3];
+@@ -450,7 +442,8 @@ static void zfcp_free_sg_env(struct zfcp
+ {
+ struct scatterlist *sg = &gpn_ft->sg_req;
+
+- kfree(sg_virt(sg)); /* free request buffer */
++ /* free request buffer */
++ kmem_cache_free(zfcp_data.gpn_ft_cache, sg_virt(sg));
+ zfcp_sg_free_table(gpn_ft->sg_resp, buf_num);
+
+ kfree(gpn_ft);
+@@ -465,7 +458,7 @@ static struct zfcp_gpn_ft *zfcp_alloc_sg
+ if (!gpn_ft)
+ return NULL;
+
+- req = kzalloc(sizeof(struct ct_iu_gpn_ft_req), GFP_KERNEL);
++ req = kmem_cache_alloc(zfcp_data.gpn_ft_cache, GFP_KERNEL);
+ if (!req) {
+ kfree(gpn_ft);
+ gpn_ft = NULL;