[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