Blob Blame History Raw
From: Lee Duncan
Date: Wed, 17 Jul 2019 09:11:08 +0530
Subject: SCSI: cxgbi: KABI: fix handle completion etc
Patch-mainline: never, kabi
References: jsc#SLE-4678 bsc#1136342

This patch fixes the kabi issuse for the patch

> patches.drivers/scsi-cxgb4i-add-wait_for_completion

Which adds a "completion" member to struct cxgbi_device, and
it also removes one argument each from the two methods
in struct cxgbi_sock.

Signed-off-by: Lee Duncan <lduncan@suse.com>
---
 drivers/scsi/cxgbi/cxgb3i/cxgb3i.c |   10 +--
 drivers/scsi/cxgbi/cxgb4i/cxgb4i.c |   10 +--
 drivers/scsi/cxgbi/libcxgbi.c      |  121 +++++++++++++++++++++++++++++--------
 drivers/scsi/cxgbi/libcxgbi.h      |   20 +++++-
 4 files changed, 124 insertions(+), 37 deletions(-)

--- a/drivers/scsi/cxgbi/cxgb3i/cxgb3i.c
+++ b/drivers/scsi/cxgbi/cxgb3i/cxgb3i.c
@@ -116,12 +116,12 @@ static struct iscsi_transport cxgb3i_isc
 	.get_session_param = iscsi_session_get_param,
 	/* connection management */
 	.create_conn	= cxgbi_create_conn,
-	.bind_conn	= cxgbi_bind_conn,
+	.bind_conn	= __cxgbi_bind_conn,
 	.destroy_conn	= iscsi_tcp_conn_teardown,
 	.start_conn	= iscsi_conn_start,
 	.stop_conn	= iscsi_conn_stop,
 	.get_conn_param	= iscsi_conn_get_param,
-	.set_param	= cxgbi_set_conn_param,
+	.set_param	= __cxgbi_set_conn_param,
 	.get_stats	= cxgbi_get_conn_stats,
 	/* pdu xmit req from user space */
 	.send_pdu	= iscsi_conn_send_pdu,
@@ -136,7 +136,7 @@ static struct iscsi_transport cxgb3i_isc
 	.parse_pdu_itt	= cxgbi_parse_pdu_itt,
 	/* TCP connect/disconnect */
 	.get_ep_param	= cxgbi_get_ep_param,
-	.ep_connect	= cxgbi_ep_connect,
+	.ep_connect	= __cxgbi_ep_connect,
 	.ep_poll	= cxgbi_ep_poll,
 	.ep_disconnect	= cxgbi_ep_disconnect,
 	/* Error recovery timeout call */
@@ -1258,8 +1258,8 @@ static int cxgb3i_ddp_init(struct cxgbi_
 		err = 0;
 	}
 
-	cdev->csk_ddp_setup_digest = ddp_setup_conn_digest;
-	cdev->csk_ddp_setup_pgidx = ddp_setup_conn_pgidx;
+	cdev->__csk_ddp_setup_digest = ddp_setup_conn_digest;
+	cdev->__csk_ddp_setup_pgidx = ddp_setup_conn_pgidx;
 	cdev->csk_ddp_set_map = ddp_set_map;
 	cdev->csk_ddp_clear_map = ddp_clear_map;
 	cdev->cdev2ppm = cdev2ppm;
--- a/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c
+++ b/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c
@@ -133,12 +133,12 @@ static struct iscsi_transport cxgb4i_isc
 	.get_session_param = iscsi_session_get_param,
 	/* connection management */
 	.create_conn	= cxgbi_create_conn,
-	.bind_conn		= cxgbi_bind_conn,
+	.bind_conn		= __cxgbi_bind_conn,
 	.destroy_conn	= iscsi_tcp_conn_teardown,
 	.start_conn		= iscsi_conn_start,
 	.stop_conn		= iscsi_conn_stop,
 	.get_conn_param	= iscsi_conn_get_param,
-	.set_param	= cxgbi_set_conn_param,
+	.set_param	= __cxgbi_set_conn_param,
 	.get_stats	= cxgbi_get_conn_stats,
 	/* pdu xmit req from user space */
 	.send_pdu	= iscsi_conn_send_pdu,
@@ -153,7 +153,7 @@ static struct iscsi_transport cxgb4i_isc
 	.parse_pdu_itt	= cxgbi_parse_pdu_itt,
 	/* TCP connect/disconnect */
 	.get_ep_param	= cxgbi_get_ep_param,
-	.ep_connect	= cxgbi_ep_connect,
+	.ep_connect	= __cxgbi_ep_connect,
 	.ep_poll	= cxgbi_ep_poll,
 	.ep_disconnect	= cxgbi_ep_disconnect,
 	/* Error recovery timeout call */
@@ -2088,8 +2088,8 @@ static int cxgb4i_ddp_init(struct cxgbi_
 	cxgbi_ddp_ppm_setup(lldi->iscsi_ppm, cdev, &tformat, ppmax,
 			    lldi->iscsi_llimit, lldi->vr->iscsi.start, 2);
 
-	cdev->csk_ddp_setup_digest = ddp_setup_conn_digest;
-	cdev->csk_ddp_setup_pgidx = ddp_setup_conn_pgidx;
+	cdev->__csk_ddp_setup_digest = ddp_setup_conn_digest;
+	cdev->__csk_ddp_setup_pgidx = ddp_setup_conn_pgidx;
 	cdev->csk_ddp_set_map = ddp_set_map;
 	cdev->tx_max_size = min_t(unsigned int, ULP2_MAX_PDU_PAYLOAD,
 				  lldi->iscsi_iolen - ISCSI_PDU_NONPAYLOAD_LEN);
--- a/drivers/scsi/cxgbi/libcxgbi.c
+++ b/drivers/scsi/cxgbi/libcxgbi.c
@@ -551,7 +551,7 @@ void cxgbi_sock_free_cpl_skbs(struct cxg
 }
 EXPORT_SYMBOL_GPL(cxgbi_sock_free_cpl_skbs);
 
-static struct cxgbi_sock *cxgbi_sock_create(struct cxgbi_device *cdev)
+static struct cxgbi_sock *cxgbi_sock_create(struct cxgbi_device *cdev, bool kabi_supports_completion)
 {
 	struct cxgbi_sock *csk = kzalloc(sizeof(*csk), GFP_NOIO);
 
@@ -571,7 +571,8 @@ static struct cxgbi_sock *cxgbi_sock_cre
 	skb_queue_head_init(&csk->receive_queue);
 	skb_queue_head_init(&csk->write_queue);
 	timer_setup(&csk->retry_timer, NULL, 0);
-	init_completion(&csk->cmpl);
+	if (kabi_supports_completion)
+		init_completion(&csk->cmpl);
 	rwlock_init(&csk->callback_lock);
 	csk->cdev = cdev;
 	csk->flags = 0;
@@ -598,7 +599,7 @@ static struct rtable *find_route_ipv4(st
 }
 
 static struct cxgbi_sock *
-cxgbi_check_route(struct sockaddr *dst_addr, int ifindex)
+cxgbi_check_route(struct sockaddr *dst_addr, int ifindex, bool kabi_supports_completion)
 {
 	struct sockaddr_in *daddr = (struct sockaddr_in *)dst_addr;
 	struct dst_entry *dst;
@@ -664,7 +665,7 @@ cxgbi_check_route(struct sockaddr *dst_a
 		&daddr->sin_addr.s_addr, ntohs(daddr->sin_port),
 			   port, ndev->name, cdev);
 
-	csk = cxgbi_sock_create(cdev);
+	csk = cxgbi_sock_create(cdev, kabi_supports_completion);
 	if (!csk) {
 		err = -ENOMEM;
 		goto rel_neigh;
@@ -710,7 +711,7 @@ static struct rt6_info *find_route_ipv6(
 }
 
 static struct cxgbi_sock *
-cxgbi_check_route6(struct sockaddr *dst_addr, int ifindex)
+cxgbi_check_route6(struct sockaddr *dst_addr, int ifindex, bool kabi_supports_completion)
 {
 	struct sockaddr_in6 *daddr6 = (struct sockaddr_in6 *)dst_addr;
 	struct dst_entry *dst;
@@ -775,7 +776,7 @@ cxgbi_check_route6(struct sockaddr *dst_
 		  daddr6->sin6_addr.s6_addr, ntohs(daddr6->sin6_port), port,
 		  ndev->name, cdev);
 
-	csk = cxgbi_sock_create(cdev);
+	csk = cxgbi_sock_create(cdev, kabi_supports_completion);
 	if (!csk) {
 		err = -ENOMEM;
 		goto rel_rt;
@@ -2234,8 +2235,9 @@ static int cxgbi_conn_max_recv_dlength(s
 	return 0;
 }
 
-int cxgbi_set_conn_param(struct iscsi_cls_conn *cls_conn,
-			enum iscsi_param param, char *buf, int buflen)
+static int cxgbi_set_conn_param_internal(struct iscsi_cls_conn *cls_conn,
+			enum iscsi_param param, char *buf, int buflen,
+			bool does_not_need_reply_arg)
 {
 	struct iscsi_conn *conn = cls_conn->dd_data;
 	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
@@ -2250,17 +2252,29 @@ int cxgbi_set_conn_param(struct iscsi_cl
 	switch (param) {
 	case ISCSI_PARAM_HDRDGST_EN:
 		err = iscsi_set_param(cls_conn, param, buf, buflen);
-		if (!err && conn->hdrdgst_en)
-			err = csk->cdev->csk_ddp_setup_digest(csk, csk->tid,
-							conn->hdrdgst_en,
-							conn->datadgst_en);
+		if (!err && conn->hdrdgst_en) {
+			if (does_not_need_reply_arg)
+				err = csk->cdev->__csk_ddp_setup_digest(csk, csk->tid,
+								conn->hdrdgst_en,
+								conn->datadgst_en);
+			else
+				err = csk->cdev->csk_ddp_setup_digest(csk, csk->tid,
+								conn->hdrdgst_en,
+								conn->datadgst_en, 0);
+		}
 		break;
 	case ISCSI_PARAM_DATADGST_EN:
 		err = iscsi_set_param(cls_conn, param, buf, buflen);
-		if (!err && conn->datadgst_en)
-			err = csk->cdev->csk_ddp_setup_digest(csk, csk->tid,
-							conn->hdrdgst_en,
-							conn->datadgst_en);
+		if (!err && conn->datadgst_en) {
+			if (does_not_need_reply_arg)
+				err = csk->cdev->__csk_ddp_setup_digest(csk, csk->tid,
+								conn->hdrdgst_en,
+								conn->datadgst_en);
+			else
+				err = csk->cdev->csk_ddp_setup_digest(csk, csk->tid,
+								conn->hdrdgst_en,
+								conn->datadgst_en, 0);
+		}
 		break;
 	case ISCSI_PARAM_MAX_R2T:
 		return iscsi_tcp_set_max_r2t(conn, buf);
@@ -2279,8 +2293,21 @@ int cxgbi_set_conn_param(struct iscsi_cl
 	}
 	return err;
 }
+
+int cxgbi_set_conn_param(struct iscsi_cls_conn *cls_conn,
+			enum iscsi_param param, char *buf, int buflen)
+{
+	return cxgbi_set_conn_param_internal(cls_conn, param, buf, buflen, 0);
+}
 EXPORT_SYMBOL_GPL(cxgbi_set_conn_param);
 
+int __cxgbi_set_conn_param(struct iscsi_cls_conn *cls_conn,
+			enum iscsi_param param, char *buf, int buflen)
+{
+	return cxgbi_set_conn_param_internal(cls_conn, param, buf, buflen, 1);
+}
+EXPORT_SYMBOL_GPL(__cxgbi_set_conn_param);
+
 static inline int csk_print_port(struct cxgbi_sock *csk, char *buf)
 {
 	int len;
@@ -2362,9 +2389,10 @@ cxgbi_create_conn(struct iscsi_cls_sessi
 }
 EXPORT_SYMBOL_GPL(cxgbi_create_conn);
 
-int cxgbi_bind_conn(struct iscsi_cls_session *cls_session,
+int cxgbi_bind_conn_internal(struct iscsi_cls_session *cls_session,
 				struct iscsi_cls_conn *cls_conn,
-				u64 transport_eph, int is_leading)
+				u64 transport_eph, int is_leading,
+				bool does_not_need_reply_arg)
 {
 	struct iscsi_conn *conn = cls_conn->dd_data;
 	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
@@ -2384,8 +2412,12 @@ int cxgbi_bind_conn(struct iscsi_cls_ses
 	csk = cep->csk;
 
 	ppm = csk->cdev->cdev2ppm(csk->cdev);
-	err = csk->cdev->csk_ddp_setup_pgidx(csk, csk->tid,
-					     ppm->tformat.pgsz_idx_dflt);
+	if (does_not_need_reply_arg)
+		err = csk->cdev->__csk_ddp_setup_pgidx(csk, csk->tid,
+						     ppm->tformat.pgsz_idx_dflt);
+	else
+		err = csk->cdev->csk_ddp_setup_pgidx(csk, csk->tid,
+						     ppm->tformat.pgsz_idx_dflt, 0);
 	if (err < 0)
 		return err;
 
@@ -2414,8 +2446,25 @@ int cxgbi_bind_conn(struct iscsi_cls_ses
 
 	return 0;
 }
+
+int cxgbi_bind_conn(struct iscsi_cls_session *cls_session,
+				struct iscsi_cls_conn *cls_conn,
+				u64 transport_eph, int is_leading)
+{
+	return cxgbi_bind_conn_internal(cls_session, cls_conn, transport_eph,
+			is_leading, 0);
+}
 EXPORT_SYMBOL_GPL(cxgbi_bind_conn);
 
+int __cxgbi_bind_conn(struct iscsi_cls_session *cls_session,
+				struct iscsi_cls_conn *cls_conn,
+				u64 transport_eph, int is_leading)
+{
+	return cxgbi_bind_conn_internal(cls_session, cls_conn, transport_eph,
+			is_leading, 1);
+}
+EXPORT_SYMBOL_GPL(__cxgbi_bind_conn);
+
 struct iscsi_cls_session *cxgbi_create_session(struct iscsi_endpoint *ep,
 						u16 cmds_max, u16 qdepth,
 						u32 initial_cmdsn)
@@ -2545,9 +2594,9 @@ int cxgbi_get_host_param(struct Scsi_Hos
 }
 EXPORT_SYMBOL_GPL(cxgbi_get_host_param);
 
-struct iscsi_endpoint *cxgbi_ep_connect(struct Scsi_Host *shost,
+static struct iscsi_endpoint *cxgbi_ep_connect_internal(struct Scsi_Host *shost,
 					struct sockaddr *dst_addr,
-					int non_blocking)
+					int non_blocking, bool kabi_supports_completion)
 {
 	struct iscsi_endpoint *ep;
 	struct cxgbi_endpoint *cep;
@@ -2570,10 +2619,10 @@ struct iscsi_endpoint *cxgbi_ep_connect(
 
 check_route:
 	if (dst_addr->sa_family == AF_INET) {
-		csk = cxgbi_check_route(dst_addr, ifindex);
+		csk = cxgbi_check_route(dst_addr, ifindex, kabi_supports_completion);
 #if IS_ENABLED(CONFIG_IPV6)
 	} else if (dst_addr->sa_family == AF_INET6) {
-		csk = cxgbi_check_route6(dst_addr, ifindex);
+		csk = cxgbi_check_route6(dst_addr, ifindex, kabi_supports_completion);
 #endif
 	} else {
 		pr_info("address family 0x%x NOT supported.\n",
@@ -2641,8 +2690,32 @@ release_conn:
 err_out:
 	return ERR_PTR(err);
 }
+
+
+struct iscsi_endpoint *cxgbi_ep_connect(struct Scsi_Host *shost,
+					struct sockaddr *dst_addr,
+					int non_blocking)
+{
+	/*
+	 * this uses the original KABI, which uses NOT completion, and
+	 * for external drivers expecting the original KABI
+	 */
+	return cxgbi_ep_connect_internal(shost, dst_addr, non_blocking, false);
+}
 EXPORT_SYMBOL_GPL(cxgbi_ep_connect);
 
+struct iscsi_endpoint *__cxgbi_ep_connect(struct Scsi_Host *shost,
+					struct sockaddr *dst_addr,
+					int non_blocking)
+{
+	/*
+	 * this uses the new KABI, which uses completion, and is
+	 * used by our updated cxgb3i and cxgb4i drivers
+	 */
+	return cxgbi_ep_connect_internal(shost, dst_addr, non_blocking, true);
+}
+EXPORT_SYMBOL_GPL(__cxgbi_ep_connect);
+
 int cxgbi_ep_poll(struct iscsi_endpoint *ep, int timeout_ms)
 {
 	struct cxgbi_endpoint *cep = ep->dd_data;
--- a/drivers/scsi/cxgbi/libcxgbi.h
+++ b/drivers/scsi/cxgbi/libcxgbi.h
@@ -149,7 +149,6 @@ struct cxgbi_sock {
 	struct sk_buff_head receive_queue;
 	struct sk_buff_head write_queue;
 	struct timer_list retry_timer;
-	struct completion cmpl;
 	int err;
 	rwlock_t callback_lock;
 	void *user_data;
@@ -162,6 +161,9 @@ struct cxgbi_sock {
 	u32 write_seq;
 	u32 snd_win;
 	u32 rcv_win;
+#ifndef	__GENKSYMS__
+	struct completion cmpl;
+#endif
 };
 
 /*
@@ -491,9 +493,9 @@ struct cxgbi_device {
 				  struct cxgbi_ppm *,
 				  struct cxgbi_task_tag_info *);
 	int (*csk_ddp_setup_digest)(struct cxgbi_sock *,
-				    unsigned int, int, int);
+				unsigned int, int, int, int);
 	int (*csk_ddp_setup_pgidx)(struct cxgbi_sock *,
-				   unsigned int, int);
+				unsigned int, int, bool);
 
 	void (*csk_release_offload_resources)(struct cxgbi_sock *);
 	int (*csk_rx_pdu_ready)(struct cxgbi_sock *, struct sk_buff *);
@@ -505,6 +507,12 @@ struct cxgbi_device {
 	int (*csk_init_act_open)(struct cxgbi_sock *);
 
 	void *dd_data;
+#ifndef	__GENKSYMS__
+	int (*__csk_ddp_setup_digest)(struct cxgbi_sock *,
+				    unsigned int, int, int);
+	int (*__csk_ddp_setup_pgidx)(struct cxgbi_sock *,
+				   unsigned int, int);
+#endif
 };
 #define cxgbi_cdev_priv(cdev)	((cdev)->dd_data)
 
@@ -590,10 +598,14 @@ umode_t cxgbi_attr_is_visible(int param_
 void cxgbi_get_conn_stats(struct iscsi_cls_conn *, struct iscsi_stats *);
 int cxgbi_set_conn_param(struct iscsi_cls_conn *,
 			enum iscsi_param, char *, int);
+int __cxgbi_set_conn_param(struct iscsi_cls_conn *,
+			enum iscsi_param, char *, int);
 int cxgbi_get_ep_param(struct iscsi_endpoint *ep, enum iscsi_param, char *);
 struct iscsi_cls_conn *cxgbi_create_conn(struct iscsi_cls_session *, u32);
 int cxgbi_bind_conn(struct iscsi_cls_session *,
 			struct iscsi_cls_conn *, u64, int);
+int __cxgbi_bind_conn(struct iscsi_cls_session *,
+			struct iscsi_cls_conn *, u64, int);
 void cxgbi_destroy_session(struct iscsi_cls_session *);
 struct iscsi_cls_session *cxgbi_create_session(struct iscsi_endpoint *,
 			u16, u16, u32);
@@ -602,6 +614,8 @@ int cxgbi_set_host_param(struct Scsi_Hos
 int cxgbi_get_host_param(struct Scsi_Host *, enum iscsi_host_param, char *);
 struct iscsi_endpoint *cxgbi_ep_connect(struct Scsi_Host *,
 			struct sockaddr *, int);
+struct iscsi_endpoint *__cxgbi_ep_connect(struct Scsi_Host *,
+			struct sockaddr *, int);
 int cxgbi_ep_poll(struct iscsi_endpoint *, int);
 void cxgbi_ep_disconnect(struct iscsi_endpoint *);