[scsi-target-utils] wip

Andy Grover grover at fedoraproject.org
Thu Nov 3 21:24:12 UTC 2011


commit e75e883e76343790b9511674d88817ee20c2f33c
Author: Andy Grover <agrover at redhat.com>
Date:   Thu Nov 3 13:35:58 2011 -0700

    wip

 scsi-target-utils-dynamic-link-iser.patch |  315 +++++++++--------------------
 scsi-target-utils.spec                    |    6 +-
 2 files changed, 96 insertions(+), 225 deletions(-)
---
diff --git a/scsi-target-utils-dynamic-link-iser.patch b/scsi-target-utils-dynamic-link-iser.patch
index cee586a..6da85b5 100644
--- a/scsi-target-utils-dynamic-link-iser.patch
+++ b/scsi-target-utils-dynamic-link-iser.patch
@@ -1,245 +1,116 @@
-commit 07182f43ec721096cded79e43a76ceea5858df5c
+commit 1aa20610d4a3afc22e9a0b24efa4bbb7b02dfab2
 Author: Andy Grover <agrover at redhat.com>
-Date:   Tue Oct 4 11:33:18 2011 -0700
+Date:   Wed Sep 28 11:21:38 2011 -0700
 
-    dynamic-link-iser
+    Compile iser driver as a loadable module
+    
+    Drivers are already modularized in the code, so it is straightforward to
+    change the build to target a separate loadable module. Also, modify
+    get_driver_index to try to load a module when lld is unknown.
+    
+    This will allow packaging of base tgtd and iser module separately, so
+    the majority of users will not have to install dependencies they don't
+    need.
+    
+    Signed-off-by: Andy Grover <agrover at redhat.com>
 
 diff --git a/usr/Makefile b/usr/Makefile
-index e15ff6a..0cc7126 100644
+index e15ff6a..b8ab805 100644
 --- a/usr/Makefile
 +++ b/usr/Makefile
-@@ -13,9 +13,11 @@ TGTD_OBJS += $(addprefix iscsi/, conn.o param.o session.o \
+@@ -1,4 +1,5 @@
+ sbindir ?= $(PREFIX)/sbin
++libdir ?= $(PREFIX)/lib/tgt
+ 
+ ifneq ($(shell test -e /usr/include/linux/signalfd.h && echo 1),)
+ CFLAGS += -DUSE_SIGNALFD
+@@ -13,11 +14,6 @@ TGTD_OBJS += $(addprefix iscsi/, conn.o param.o session.o \
  		isns.o)
  TGTD_OBJS += bs_rdwr.o bs_aio.o
  
 -ifneq ($(ISCSI_RDMA),)
-+ifneq ($(findstring verbs.h,$(wildcard /usr/include/infiniband/*.h)), )
-+ifneq ($(findstring rdma_cma.h,$(wildcard /usr/include/rdma/*.h)), )
- TGTD_OBJS += iscsi/iser.o iscsi/iser_text.o
+-TGTD_OBJS += iscsi/iser.o iscsi/iser_text.o
 -LIBS += -libverbs -lrdmacm
-+LIBS += -libverbs -lrdmacm -ldl
-+endif
- endif
- 
+-endif
+-
  INCLUDES += -I.
-diff --git a/usr/iscsi/iser.c b/usr/iscsi/iser.c
-index 7c263f5..ce96130 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>
-+#include <dlfcn.h>
-+#include <syslog.h>
  
- #include "util.h"
- #include "iscsid.h"
-@@ -92,6 +94,86 @@ struct iscsi_sense_data {
- 	uint8_t data[0];
- } __packed;
+ CFLAGS += -D_GNU_SOURCE
+@@ -30,9 +26,13 @@ endif
+ CFLAGS += -Wall -Wstrict-prototypes -fPIC
+ CFLAGS += -DTGT_VERSION=\"$(VERSION)$(EXTRAVERSION)\"
  
-+/* 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);
-+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);
-+typedef int (*ibv_query_device_t)(struct ibv_context *context,
-+				  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);
-+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);
-+typedef int (*rdma_create_qp_t)(struct rdma_cm_id *id, struct ibv_pd *pd,
-+				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);
-+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);
-+typedef struct {
-+	ibv_ack_cq_events_t ibv_ack_cq_events;
-+	ibv_alloc_pd_t ibv_alloc_pd;
-+	ibv_create_comp_channel_t ibv_create_comp_channel;
-+	ibv_create_cq_t ibv_create_cq;
-+	ibv_dereg_mr_t ibv_dereg_mr;
-+	ibv_destroy_qp_t ibv_destroy_qp;
-+	ibv_get_cq_event_t ibv_get_cq_event;
-+	ibv_query_device_t ibv_query_device;
-+	ibv_reg_mr_t ibv_reg_mr;
-+	rdma_ack_cm_event_t rdma_ack_cm_event;
-+	rdma_bind_addr_t rdma_bind_addr;
-+	rdma_create_event_channel_t rdma_create_event_channel;
-+	rdma_create_id_t rdma_create_id;
-+	rdma_create_qp_t rdma_create_qp;
-+	rdma_destroy_id_t rdma_destroy_id;
-+	rdma_disconnect_t rdma_disconnect;
-+	rdma_get_cm_event_t rdma_get_cm_event;
-+	rdma_listen_t rdma_listen;
-+	rdma_accept_t rdma_accept;
-+	rdma_reject_t rdma_reject;
-+} tgt_fptr_t;
-+
-+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)
-+
- /*
-  * 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
-@@ -3331,10 +3413,94 @@ static void iser_nop_work_handler(void *data)
- 	add_work(&nop_work, ISER_TIMER_INT_SEC);
- }
+-LIBS += -lpthread
++LIBS += -lpthread -ldl
  
-+static int is_dlerror(const char *symbol)
-+{
-+	char *error;
-+
-+	if ((error = dlerror()) != NULL) {
-+		syslog(LOG_ERR, "symbol %s not found - %s", symbol, error);
-+		return 1;
-+	}
-+	return 0;
-+}
+ PROGRAMS += tgtd tgtadm tgtimg
++ifneq ($(ISCSI_RDMA),)
++DRIVERS += tgt-iser.so
++endif
 +
- static int iser_init(int index, char *args)
- {
- 	int err;
+ TGTD_OBJS += tgtd.o mgmt.o target.o scsi.o log.o driver.o util.o work.o \
+ 		parser.o spc.o sbc.o mmc.o osd.o scc.o smc.o \
+ 		ssc.o bs_ssc.o libssc.o \
+@@ -41,10 +41,12 @@ TGTD_OBJS += tgtd.o mgmt.o target.o scsi.o log.o driver.o util.o work.o \
+ TGTD_DEP = $(TGTD_OBJS:.o=.d)
  
-+	pverbs = dlopen("libibverbs.so",RTLD_LAZY);
-+	if (!pverbs) {
-+		goto Exit; /* do not register iser transport */
-+	}
-+
-+	prdma = dlopen("librdmacm.so",RTLD_LAZY);
-+	if (!prdma) {
-+		goto Exit; /* do not register iser transport */
-+	}
-+
-+	/* initialize function pointers */
-+	tgt_fptr.ibv_ack_cq_events = dlsym(pverbs, "ibv_ack_cq_events");
-+	if (is_dlerror("ibv_ack_cq_events"))
-+		goto Exit;
-+	tgt_fptr.ibv_alloc_pd = dlsym(pverbs, "ibv_alloc_pd");
-+	if (is_dlerror("ibv_alloc_pd"))
-+		goto Exit;
-+	tgt_fptr.ibv_create_comp_channel = dlsym(pverbs, "ibv_create_comp_channel");
-+	if (is_dlerror("ibv_create_comp_channel"))
-+		goto Exit;
-+	tgt_fptr.ibv_create_cq = dlsym(pverbs, "ibv_create_cq");
-+	if (is_dlerror("ibv_create_cq"))
-+		goto Exit;
-+	tgt_fptr.ibv_dereg_mr = dlsym(pverbs, "ibv_dereg_mr");
-+	if (is_dlerror("ibv_dereg_mr"))
-+		goto Exit;
-+	tgt_fptr.ibv_destroy_qp = dlsym(pverbs, "ibv_destroy_qp");
-+	if (is_dlerror("ibv_destroy_qp"))
-+		goto Exit;
-+	tgt_fptr.ibv_get_cq_event = dlsym(pverbs, "ibv_get_cq_event");
-+	if (is_dlerror("ibv_get_cq_event"))
-+		goto Exit;
-+	tgt_fptr.ibv_query_device = dlsym(pverbs, "ibv_query_device");
-+	if (is_dlerror("ibv_query_device"))
-+		goto Exit;
-+	tgt_fptr.ibv_reg_mr = dlsym(pverbs, "ibv_reg_mr");
-+	if (is_dlerror("ibv_reg_mr"))
-+		goto Exit;
-+	tgt_fptr.rdma_ack_cm_event = dlsym(prdma, "rdma_ack_cm_event");
-+	if (is_dlerror("rdma_ack_cm_event"))
-+		goto Exit;
-+	tgt_fptr.rdma_bind_addr = dlsym(prdma, "rdma_bind_addr");
-+	if (is_dlerror("rdma_bind_addr"))
-+		goto Exit;
-+	tgt_fptr.rdma_create_event_channel = dlsym(prdma, "rdma_create_event_channel");
-+	if (is_dlerror("rdma_create_event_channel"))
-+		goto Exit;
-+	tgt_fptr.rdma_create_id = dlsym(prdma, "rdma_create_id");
-+	if (is_dlerror("rdma_create_id"))
-+		goto Exit;
-+	tgt_fptr.rdma_create_qp = dlsym(prdma, "rdma_create_qp");
-+	if (is_dlerror("rdma_create_qp"))
-+		goto Exit;
-+	tgt_fptr.rdma_destroy_id = dlsym(prdma, "rdma_destroy_id");
-+	if (is_dlerror("rdma_destroy_id"))
-+		goto Exit;
-+	tgt_fptr.rdma_disconnect = dlsym(prdma, "rdma_disconnect");
-+	if (is_dlerror("rdma_disconnect"))
-+		goto Exit;
-+	tgt_fptr.rdma_get_cm_event = dlsym(prdma, "rdma_get_cm_event");
-+	if (is_dlerror("rdma_get_cm_event"))
-+		goto Exit;
-+	tgt_fptr.rdma_listen = dlsym(prdma, "rdma_listen");
-+	if (is_dlerror("rdma_listen"))
-+		goto Exit;
-+	tgt_fptr.rdma_accept = dlsym(prdma, "rdma_accept");
-+	if (is_dlerror("rdma_accept"))
-+		goto Exit;
-+	tgt_fptr.rdma_reject = dlsym(prdma, "rdma_reject");
-+	if (is_dlerror("rdma_reject"))
-+		goto Exit;
+ .PHONY:all
+-all: $(PROGRAMS)
++all: $(PROGRAMS) $(DRIVERS)
 +
-+
- 	err = iser_ib_init();
- 	if (err) {
- 		iser_send_nop = 0;
-@@ -3349,12 +3515,25 @@ static int iser_init(int index, char *args)
- 	}
++LDFLAGS = -Wl,-E,-rpath=$(libdir)
+ 
+ tgtd: $(TGTD_OBJS)
+-	$(CC) $^ -o $@ $(LIBS)
++	$(CC) $^ -o $@ $(LDFLAGS) $(LIBS)
+ 
+ -include $(TGTD_DEP)
  
- 	return 0;
+@@ -58,15 +60,23 @@ tgtimg: tgtimg.o libssc.o libcrc32c.o
+ 
+ -include tgtimg.d libssc.d
+ 
++tgt-iser.so: CFLAGS += -shared -libverbs -lrdmacm
++tgt-iser.so: iscsi/iser.o iscsi/iser_text.o
++	$(CC) $(CFLAGS) -o $@ $^
 +
-+Exit:
-+	syslog(LOG_ERR, "%s - iser transport not used", dlerror());
-+	if (pverbs)
-+		dlclose(pverbs);
-+	if (prdma)
-+		dlclose(prdma);
-+	return -ENOTSUP;
- }
+ %.o: %.c
+ 	$(CC) -c $(CFLAGS) $*.c -o $*.o
+ 	@$(CC) -MM $(CFLAGS) -MF $*.d -MT $*.o $*.c
+ 
+ .PHONY: install
+-install: $(PROGRAMS)
++install: $(PROGRAMS) $(DRIVERS)
+ 	install -d -m 755 $(DESTDIR)$(sbindir)
+ 	install -m 755 $(PROGRAMS) $(DESTDIR)$(sbindir)
++ifneq ($(DRIVERS),)
++	install -d -m 755 $(DESTDIR)$(libdir)
++	install -m 755 $(DRIVERS) $(DESTDIR)$(libdir)
++endif
+ 
+ .PHONY: clean
+ clean:
+-	rm -f *.[od] $(PROGRAMS) iscsi/*.[od] ibmvio/*.[od] fc/*.[od]
++	rm -f *.[od] $(PROGRAMS) *.so iscsi/*.[od] ibmvio/*.[od] fc/*.[od]
+diff --git a/usr/tgtd.c b/usr/tgtd.c
+index 30d5e9d..a9b2027 100644
+--- a/usr/tgtd.c
++++ b/usr/tgtd.c
+@@ -35,6 +35,7 @@
+ #include <sys/epoll.h>
+ #include <sys/types.h>
+ #include <sys/wait.h>
++#include <dlfcn.h>
  
- static void iser_exit(void)
+ #include "list.h"
+ #include "tgtd.h"
+@@ -411,6 +412,9 @@ static int lld_init(char *args)
  {
- 	if (iser_send_nop)
- 		del_work(&nop_work);
-+
-+	if (pverbs)
-+		dlclose(pverbs);
-+	if (prdma)
-+		dlclose(prdma);
- }
+ 	int i, err, nr;
  
- static int iser_target_create(struct target *t)
++	/* iser is modular, try to load it */
++	dlopen("tgt-iser.so", RTLD_LAZY);
++
+ 	for (i = nr = 0; tgt_drivers[i]; i++) {
+ 		if (tgt_drivers[i]->init) {
+ 			err = tgt_drivers[i]->init(i, args);
diff --git a/scsi-target-utils.spec b/scsi-target-utils.spec
index f5869f6..7c43a08 100644
--- a/scsi-target-utils.spec
+++ b/scsi-target-utils.spec
@@ -11,9 +11,9 @@ Source1:        tgtd.init
 Source2:        sysconfig.tgtd
 Source3:        targets.conf
 Patch0:         scsi-target-utils-redhatify-docs.patch
-Patch1:         scsi-target-utils-dynamic-link-iser.patch
-Patch2:         scsi-target-utils-hack-check-for-eventfd.patch
-Patch3:         scsi-target-utils-remove-xsltproc-check.patch
+Patch1:         scsi-target-utils-hack-check-for-eventfd.patch
+Patch2:         scsi-target-utils-remove-xsltproc-check.patch
+Patch3:         scsi-target-utils-dynamic-link-iser.patch
 
 BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 


More information about the scm-commits mailing list