[scsi-target-utils] fix dynamic patch

Andy Grover grover at fedoraproject.org
Tue Feb 22 23:18:02 UTC 2011


commit 14f9b2359ed3bc3cdaf38f08dfc7769ebc552c0d
Author: Andy Grover <agrover at redhat.com>
Date:   Tue Feb 22 12:18:54 2011 -0800

    fix dynamic patch

 scsi-target-utils-dynamic-link-iser.patch |  313 +++++++----------------------
 1 files changed, 69 insertions(+), 244 deletions(-)
---
diff --git a/scsi-target-utils-dynamic-link-iser.patch b/scsi-target-utils-dynamic-link-iser.patch
index 7349a0f..fd07a60 100644
--- a/scsi-target-utils-dynamic-link-iser.patch
+++ b/scsi-target-utils-dynamic-link-iser.patch
@@ -1,27 +1,26 @@
 diff --git a/usr/Makefile b/usr/Makefile
-index 2dcae2a..fc88d47 100644
+index 3a75df4..10a2386 100644
 --- a/usr/Makefile
 +++ b/usr/Makefile
-@@ -17,10 +17,11 @@ TGTD_OBJS += $(addprefix iscsi/, conn.o param.o session.o \
+@@ -19,9 +19,11 @@ TGTD_OBJS += $(addprefix iscsi/, conn.o param.o session.o \
  		isns.o)
  TGTD_OBJS += bs_rdwr.o bs_aio.o
  
 -ifneq ($(ISCSI_RDMA),)
--CFLAGS += -DISCSI_RDMA
 +ifneq ($(findstring verbs.h,$(wildcard /usr/include/infiniband/*.h)), )
 +ifneq ($(findstring rdma_cma.h,$(wildcard /usr/include/rdma/*.h)), )
- TGTD_OBJS += iscsi/iscsi_rdma.o
+ TGTD_OBJS += iscsi/iser.o iscsi/iser_text.o
 -LIBS += -libverbs -lrdmacm
 +LIBS += -libverbs -lrdmacm -ldl
 +endif
  endif
- endif
  
-diff --git a/usr/iscsi/iscsi_rdma.c b/usr/iscsi/iscsi_rdma.c
-index 6cf5677..72e4eaf 100644
---- a/usr/iscsi/iscsi_rdma.c
-+++ b/usr/iscsi/iscsi_rdma.c
-@@ -30,6 +30,8 @@
+ ifneq ($(FCP),)
+diff --git a/usr/iscsi/iser.c b/usr/iscsi/iser.c
+index 926832b..f032a6e 100644
+--- a/usr/iscsi/iser.c
++++ b/usr/iscsi/iser.c
+@@ -32,6 +32,8 @@
  #include <sys/epoll.h>
  #include <infiniband/verbs.h>
  #include <rdma/rdma_cma.h>
@@ -30,45 +29,44 @@ index 6cf5677..72e4eaf 100644
  
  #include "util.h"
  #include "iscsid.h"
-@@ -283,6 +285,67 @@ static void iser_sched_poll_cq(struct event_data *tev);
- static void iser_sched_consume_cq(struct event_data *tev);
- static void iser_sched_tx(struct event_data *evt);
+@@ -92,6 +94,86 @@ struct iscsi_sense_data {
+ 	uint8_t data[0];
+ } __packed;
  
-+
++/* handle dynamic loading of ib libs */
 +static void *pverbs;
 +static void *prdma;
 +typedef void (*ibv_ack_cq_events_t)(struct ibv_cq *cq, unsigned int nevents);
 +typedef struct ibv_pd *(*ibv_alloc_pd_t)(struct ibv_context *context);
 +typedef struct ibv_comp_channel *(*ibv_create_comp_channel_t)(struct ibv_context *context);
 +typedef struct ibv_cq *(*ibv_create_cq_t)(struct ibv_context *context, int cqe,
-+                              void *cq_context,
-+                              struct ibv_comp_channel *channel,
-+                              int comp_vector);
++					  void *cq_context,
++					  struct ibv_comp_channel *channel,
++					  int comp_vector);
 +typedef int (*ibv_dereg_mr_t)(struct ibv_mr *mr);
 +typedef int (*ibv_destroy_qp_t)(struct ibv_qp *qp);
 +typedef int (*ibv_get_cq_event_t)(struct ibv_comp_channel *channel,
-+                      struct ibv_cq **cq, void **cq_context);
++				  struct ibv_cq **cq, void **cq_context);
 +typedef int (*ibv_query_device_t)(struct ibv_context *context,
-+                      struct ibv_device_attr *device_attr);
++				  struct ibv_device_attr *device_attr);
 +typedef struct ibv_mr *(*ibv_reg_mr_t)(struct ibv_pd *pd, void *addr,
-+                          size_t length, enum ibv_access_flags access);
++				       size_t length, enum ibv_access_flags access);
 +typedef int (*rdma_ack_cm_event_t)(struct rdma_cm_event *event);
 +typedef int (*rdma_bind_addr_t)(struct rdma_cm_id *id, struct sockaddr *addr);
 +typedef struct rdma_event_channel *(*rdma_create_event_channel_t)(void);
 +typedef int (*rdma_create_id_t)(struct rdma_event_channel *channel,
-+                   struct rdma_cm_id **id, void *context,
-+                   enum rdma_port_space ps);
++				struct rdma_cm_id **id, void *context,
++				enum rdma_port_space ps);
 +typedef int (*rdma_create_qp_t)(struct rdma_cm_id *id, struct ibv_pd *pd,
-+                   struct ibv_qp_init_attr *qp_init_attr);
++				struct ibv_qp_init_attr *qp_init_attr);
 +typedef int (*rdma_destroy_id_t)(struct rdma_cm_id *id);
 +typedef int (*rdma_disconnect_t)(struct rdma_cm_id *id);
 +typedef int (*rdma_get_cm_event_t)(struct rdma_event_channel *channel,
-+                      struct rdma_cm_event **event);
++				   struct rdma_cm_event **event);
 +typedef int (*rdma_listen_t)(struct rdma_cm_id *id, int backlog);
 +typedef int (*rdma_accept_t)(struct rdma_cm_id *id, struct rdma_conn_param *conn_param);
 +typedef int (*rdma_reject_t)(struct rdma_cm_id *id, const void *private_data,
-+                uint8_t private_data_len);
-+
++			     uint8_t private_data_len);
 +typedef struct {
 +	ibv_ack_cq_events_t ibv_ack_cq_events;
 +	ibv_alloc_pd_t ibv_alloc_pd;
@@ -94,217 +92,35 @@ index 6cf5677..72e4eaf 100644
 +
 +static tgt_fptr_t tgt_fptr;
 +
++#define ibv_ack_cq_events(x...) tgt_fptr.ibv_ack_cq_events(x)
++#define ibv_alloc_pd(x...) tgt_fptr.ibv_alloc_pd(x)
++#define ibv_create_comp_channel(x...) tgt_fptr.ibv_create_comp_channel(x)
++#define ibv_create_cq(x...) tgt_fptr.ibv_create_cq(x)
++#define ibv_dereg_mr(x...) tgt_fptr.ibv_dereg_mr(x)
++#define ibv_destroy_qp(x...) tgt_fptr.ibv_destroy_qp(x)
++#define ibv_get_cq_event(x...) tgt_fptr.ibv_get_cq_event(x)
++#define ibv_query_device(x...) tgt_fptr.ibv_query_device(x)
++#define ibv_reg_mr(x...) tgt_fptr.ibv_reg_mr(x)
++#define rdma_ack_cm_event(x...) tgt_fptr.rdma_ack_cm_event(x)
++#define rdma_bind_addr(x...) tgt_fptr.rdma_bind_addr(x)
++#define rdma_create_event_channel(x...) tgt_fptr.rdma_create_event_channel(x)
++#define rdma_create_id(x...) tgt_fptr.rdma_create_id(x)
++#define rdma_create_qp(x...) tgt_fptr.rdma_create_qp(x)
++#define rdma_destroy_id(x...) tgt_fptr.rdma_destroy_id(x)
++#define rdma_disconnect(x...) tgt_fptr.rdma_disconnect(x)
++#define rdma_get_cm_event(x...) tgt_fptr.rdma_get_cm_event(x)
++#define rdma_listen(x...) tgt_fptr.rdma_listen(x)
++#define rdma_accept(x...) tgt_fptr.rdma_accept(x)
++#define rdma_reject(x...) tgt_fptr.rdma_reject(x)
 +
  /*
-  * Called when ready for full feature, builds resources.
-  */
-@@ -308,7 +371,7 @@ static int iser_init_comm(struct conn_info *conn)
- 		goto out;
- 	}
- 
--	conn->srmr = ibv_reg_mr(conn->dev->pd, conn->srbuf, size,
-+	conn->srmr = tgt_fptr.ibv_reg_mr(conn->dev->pd, conn->srbuf, size,
- 				IBV_ACCESS_LOCAL_WRITE);
- 	if (!conn->srmr) {
- 		eprintf("register srbuf\n");
-@@ -415,7 +478,7 @@ static int iser_init_comm_login(struct conn_info *conn)
- 		goto out;
- 	}
- 
--	conn->srmr_login = ibv_reg_mr(conn->dev->pd, conn->srbuf_login, size,
-+	conn->srmr_login = tgt_fptr.ibv_reg_mr(conn->dev->pd, conn->srbuf_login, size,
- 				      IBV_ACCESS_LOCAL_WRITE);
- 	if (!conn->srmr_login) {
- 		eprintf("ibv_reg_mr srbuf failed\n");
-@@ -495,7 +558,7 @@ static void iser_free_comm(struct conn_info *ci)
- 
- 	/* release mr and free the lists */
- 	dprintf("dereg mr %p\n", ci->srmr);
--	ret = ibv_dereg_mr(ci->srmr);
-+	ret = tgt_fptr.ibv_dereg_mr(ci->srmr);
- 	if (ret)
- 		eprintf("ibv_dereg_mr\n");
- 	free(ci->srbuf);
-@@ -515,7 +578,7 @@ static void iser_free_comm_login(struct conn_info *ci)
- 	dprintf("freeing, login phase %d\n", ci->login_phase);
- 
- 	/* release mr and free the lists */
--	ret = ibv_dereg_mr(ci->srmr_login);
-+	ret = tgt_fptr.ibv_dereg_mr(ci->srmr_login);
- 	if (ret)
- 		eprintf("ibv_dereg_mr\n");
- 	free(ci->srbuf_login);
-@@ -546,7 +609,7 @@ static int iser_init_mempool(struct iser_device *dev)
- 		return -ENOMEM;
- 	}
- 
--	dev->mempool_mr = ibv_reg_mr(dev->pd, regbuf,
-+	dev->mempool_mr = tgt_fptr.ibv_reg_mr(dev->pd, regbuf,
- 				     mempool_num * mempool_size,
- 				     IBV_ACCESS_LOCAL_WRITE);
- 	if (!dev->mempool_mr) {
-@@ -583,7 +646,7 @@ static int iser_device_init(struct iser_device *dev)
- 	int ret = -1;
- 
- 	dprintf("dev %p\n", dev);
--	dev->pd = ibv_alloc_pd(dev->ibv_hndl);
-+	dev->pd = tgt_fptr.ibv_alloc_pd(dev->ibv_hndl);
- 	if (dev->pd == NULL) {
- 		eprintf("ibv_alloc_pd failed\n");
- 		goto out;
-@@ -595,7 +658,7 @@ static int iser_device_init(struct iser_device *dev)
- 		goto out;
- 	}
- 
--	ret = ibv_query_device(dev->ibv_hndl, &device_attr);
-+	ret = tgt_fptr.ibv_query_device(dev->ibv_hndl, &device_attr);
- 	if (ret < 0) {
- 		eprintf("ibv_query_device: %m\n");
- 		goto out;
-@@ -604,13 +667,13 @@ static int iser_device_init(struct iser_device *dev)
- 	dprintf("max %d CQEs\n", cqe_num);
- 
- 	ret = -1;
--	dev->cq_channel = ibv_create_comp_channel(dev->ibv_hndl);
-+	dev->cq_channel = tgt_fptr.ibv_create_comp_channel(dev->ibv_hndl);
- 	if (dev->cq_channel == NULL) {
- 		eprintf("ibv_create_comp_channel failed: %m\n");
- 		goto out;
- 	}
- 
--	dev->cq = ibv_create_cq(dev->ibv_hndl, cqe_num, NULL,
-+	dev->cq = tgt_fptr.ibv_create_cq(dev->ibv_hndl, cqe_num, NULL,
- 				dev->cq_channel, 0);
- 	if (dev->cq == NULL) {
- 		eprintf("ibv_create_cq failed: %m\n");
-@@ -729,7 +792,7 @@ static void iser_accept_connection(struct rdma_cm_event *event)
- 	/* only generate completion queue entries if requested */
- 	qp_init_attr.sq_sig_all = 0;
- 
--	ret = rdma_create_qp(ci->cma_id, dev->pd, &qp_init_attr);
-+	ret = tgt_fptr.rdma_create_qp(ci->cma_id, dev->pd, &qp_init_attr);
- 	if (ret) {
- 		eprintf("create qp failed\n");
- 		goto free_conn;
-@@ -759,7 +822,7 @@ static void iser_accept_connection(struct rdma_cm_event *event)
- 	}
- 
- 	/* now we can actually accept the connection */
--	ret = rdma_accept(ci->cma_id, &conn_param);
-+	ret = tgt_fptr.rdma_accept(ci->cma_id, &conn_param);
- 	if (ret) {
- 		eprintf("rdma_accept failed\n");
- 		iser_free_comm_login(ci);
-@@ -772,7 +835,7 @@ free_conn:
- 	conn_exit(conn);
- 	free(ci);
- reject:
--	ret = rdma_reject(event->id, NULL, 0);
-+	ret = tgt_fptr.rdma_reject(event->id, NULL, 0);
- 	if (ret)
- 		eprintf("rdma_reject failed: %s\n", strerror(-ret));
+  * Number of allocatable data buffers, each of this size.  Do at least 128
+  * for linux iser.  The membuf size is rounded up at initialization time
+@@ -3318,10 +3400,94 @@ static void iser_nop_work_handler(void *data)
+ 	add_work(&nop_work, ISER_TIMER_INT_SEC);
  }
-@@ -836,7 +899,7 @@ static void iser_handle_rdmacm(int fd __attribute__((unused)),
- 	struct rdma_cm_id *destroy_cm_id = NULL;
  
- 	dprintf("entry\n");
--	ret = rdma_get_cm_event(rdma_evt_channel, &event);
-+	ret = tgt_fptr.rdma_get_cm_event(rdma_evt_channel, &event);
- 	if (ret) {
- 		eprintf("rdma_get_cm_event failed\n");
- 		return;
-@@ -859,14 +922,14 @@ static void iser_handle_rdmacm(int fd __attribute__((unused)),
- 		break;
- 	}
- 
--	ret = rdma_ack_cm_event(event);
-+	ret = tgt_fptr.rdma_ack_cm_event(event);
- 	if (ret) {
- 		eprintf("ack cm event failed\n");
- 		return;
- 	}
- 
- 	if (destroy_cm_id) {
--		ret = rdma_destroy_id(destroy_cm_id);
-+		ret = tgt_fptr.rdma_destroy_id(destroy_cm_id);
- 		if (ret)
- 			eprintf("rdma_destroy_id failed\n");
- 	}
-@@ -1089,13 +1152,13 @@ static void iser_cqe_handler(int fd __attribute__((unused)),
- 	void *cq_context;
- 	int ret;
- 
--	ret = ibv_get_cq_event(dev->cq_channel, &dev->cq, &cq_context);
-+	ret = tgt_fptr.ibv_get_cq_event(dev->cq_channel, &dev->cq, &cq_context);
- 	if (ret != 0) {
- 		eprintf("notification, but no CQ event\n");
- 		exit(1);
- 	}
- 
--	ibv_ack_cq_events(dev->cq, 1);
-+    tgt_fptr.ibv_ack_cq_events(dev->cq, 1);
- 
- 	/* if a poll was previosuly scheduled, remove it,
- 	   as it will be scheduled when necessary */
-@@ -1148,14 +1211,14 @@ static int iscsi_rdma_init(void)
- 	struct sockaddr_in sock_addr;
- 	short int port = iscsi_listen_port;
- 
--	rdma_evt_channel = rdma_create_event_channel();
-+	rdma_evt_channel = tgt_fptr.rdma_create_event_channel();
- 
- 	if (!rdma_evt_channel) {
- 		eprintf("cannot initialize RDMA; load kernel modules?\n");
- 		return -1;
- 	}
- 
--	ret = rdma_create_id(rdma_evt_channel, &cma_listen_id, NULL,
-+	ret = tgt_fptr.rdma_create_id(rdma_evt_channel, &cma_listen_id, NULL,
- 			     RDMA_PS_TCP);
- 	if (ret) {
- 		eprintf("rdma_create_id: %s\n", strerror(ret));
-@@ -1166,7 +1229,7 @@ static int iscsi_rdma_init(void)
- 	sock_addr.sin_family = AF_INET;
- 	sock_addr.sin_port = htons(port);
- 	sock_addr.sin_addr.s_addr = INADDR_ANY;
--	ret = rdma_bind_addr(cma_listen_id, (struct sockaddr *) &sock_addr);
-+	ret = tgt_fptr.rdma_bind_addr(cma_listen_id, (struct sockaddr *) &sock_addr);
- 	if (ret) {
- 		if (ret == -1)
- 			eprintf("rdma_bind_addr -1: %m\n");
-@@ -1176,7 +1239,7 @@ static int iscsi_rdma_init(void)
- 	}
- 
- 	/* 0 == maximum backlog */
--	ret = rdma_listen(cma_listen_id, 0);
-+	ret = tgt_fptr.rdma_listen(cma_listen_id, 0);
- 	if (ret) {
- 		if (ret == -1)
- 			eprintf("rdma_listen -1: %m\n");
-@@ -1574,7 +1637,7 @@ static size_t iscsi_rdma_close(struct iscsi_connection *conn)
- 	struct conn_info *ci = RDMA_CONN(conn);
- 	int ret;
- 
--	ret = rdma_disconnect(ci->cma_id);
-+	ret = tgt_fptr.rdma_disconnect(ci->cma_id);
- 	if (ret)
- 		eprintf("rdma_disconnect: %s\n", strerror(-ret));
- 	dprintf("did rdma_disconnect\n");
-@@ -1607,7 +1670,7 @@ static void iscsi_rdma_release(struct iscsi_connection *conn)
- 		iser_free_comm(ci);
- 
- 	/* finally destory QP */
--	ret = ibv_destroy_qp(ci->qp_hndl);
-+	ret = tgt_fptr.ibv_destroy_qp(ci->qp_hndl);
- 	if (ret)
- 		eprintf("ibv_destroy_qp: %s\n", strerror(-ret));
- 
-@@ -1744,7 +1807,112 @@ static struct iscsi_transport iscsi_iser = {
- 	.ep_getpeername		= iscsi_rdma_getpeername,
- };
- 
-+
-+int is_dlerror(const char *symbol)
++static int is_dlerror(const char *symbol)
 +{
 +	char *error;
 +
@@ -315,10 +131,10 @@ index 6cf5677..72e4eaf 100644
 +	return 0;
 +}
 +
-+
-+
- __attribute__((constructor)) static void iser_transport_init(void)
+ static int iser_init(int index, char *args)
  {
+ 	int err;
+ 
 +	pverbs = dlopen("libibverbs.so",RTLD_LAZY);
 +	if (!pverbs) {
 +		goto Exit; /* do not register iser transport */
@@ -391,9 +207,14 @@ index 6cf5677..72e4eaf 100644
 +	if (is_dlerror("rdma_reject"))
 +		goto Exit;
 +
-+	syslog(LOG_INFO, "iser transport register");
- 	iscsi_transport_register(&iscsi_iser);
-+	return;
++
+ 	err = iser_ib_init();
+ 	if (err)
+ 		return err;
+@@ -3334,12 +3500,25 @@ static int iser_init(int index, char *args)
+ 	}
+ 
+ 	return 0;
 +
 +Exit:
 +	syslog(LOG_ERR, "%s - iser transport not used", dlerror());
@@ -401,14 +222,18 @@ index 6cf5677..72e4eaf 100644
 +		dlclose(pverbs);
 +	if (prdma)
 +		dlclose(prdma);
++	return -ENOTSUP;
  }
+ 
+ static void iser_exit(void)
+ {
+ 	if (iser_send_nop)
+ 		del_work(&nop_work);
 +
-+__attribute__((destructor)) static void iser_transport_close(void)
-+{
-+	syslog(LOG_INFO, "iser transport register");
 +	if (pverbs)
 +		dlclose(pverbs);
 +	if (prdma)
 +		dlclose(prdma);
-+}
-+
+ }
+ 
+ static int iser_target_create(struct target *t)


More information about the scm-commits mailing list