dorons@xxxxxxxxxxxx wrote on Sun, 12 Oct 2008 11:55 +0200: > This is the current patch (with your comment about the libdir). > The real problem is how to fix the symboling issue while not > making the rpm to be depended on userspace IB. What you sent did not include your file rename and new file to do the dlopen. But I didn't need them anyway. Here is the approach you should follow. 1. Do not rename iscsi_rdma.c, it just adds confusion. 2. Compile just iscsi_rdma.c -> iscsi_rdma.so. 3. Add a small file to dlopen() iscsi_rdma.so. If it works, that transport is now available; if not, no problem. The patch below does these steps, and is nice and small. It uses RDMA if it finds iscsi/iscsi_rdma.so and librdmacm.so and libibverbs.so. If any of these is missing, it complains, but continues to operate fine with just TCP. The dependencies are just what they are supposed to be: only the rdma so pulls libibverbs. ib26$ ldd tgtd linux-vdso.so.1 => (0x00007fffab7fe000) libcrypto.so.7 => /lib64/libcrypto.so.7 (0x00000030ea400000) libpthread.so.0 => /lib64/libpthread.so.0 (0x000000316a400000) libc.so.6 => /lib64/libc.so.6 (0x00000030de400000) libdl.so.2 => /lib64/libdl.so.2 (0x00000030dec00000) libz.so.1 => /lib64/libz.so.1 (0x00000030df400000) /lib64/ld-linux-x86-64.so.2 (0x00000030de000000) ib26$ ldd iscsi/iscsi_rdma.so linux-vdso.so.1 => (0x00007fff1d7fe000) libibverbs.so.1 => /usr/lib64/libibverbs.so.1 (0x00002b928d533000) librdmacm.so.1 => /usr/lib64/librdmacm.so.1 (0x00002b928d740000) libc.so.6 => /lib64/libc.so.6 (0x00002b928d945000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b928dcb1000) libdl.so.2 => /lib64/libdl.so.2 (0x00002b928decd000) /lib64/ld-linux-x86-64.so.2 (0x00000030de000000) If you're having RPM dependency problems, that's a different issue, and we can figure it out separately. After doing this, I now believe that this patch should not be part of tgt. People who want RDMA will compile it in on purpose. For your RPM, the patch is small enough that you can carry it there. You need so much more machinery to make a proper RPM, like all the install paths and shlib versioning. I explicitly left out the /usr/lib64 bit you had added, because there is no way to get that right without a autoconf-like setup. This is also part of the job for the spec file. -- Pete From: Pete Wyckoff <pw@xxxxxxxx> Date: Wed, 15 Oct 2008 07:08:47 -0400 Subject: [PATCH] iser shlib Compile iscsi_rdma as a separate object that can be dynamically loaded, if the system has the libraries to support it. Signed-off-by: Pete Wyckoff <pw@xxxxxxxx> --- usr/Makefile | 17 +++++++++++------ usr/iscsi/iscsi_rdma_load.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 usr/iscsi/iscsi_rdma_load.c diff --git a/usr/Makefile b/usr/Makefile index fba86c0..c82eced 100644 --- a/usr/Makefile +++ b/usr/Makefile @@ -15,9 +15,11 @@ TGTD_OBJS += bs_rdwr.o bs_aio.o LIBS += -lcrypto ifneq ($(ISCSI_RDMA),) -CFLAGS += -DISCSI_RDMA -TGTD_OBJS += iscsi/iscsi_rdma.o -LIBS += -libverbs -lrdmacm +ISER_SO := iscsi/iscsi_rdma.so +ISER_OBJS += iscsi/iscsi_rdma.o +ISER_LIBS += -libverbs -lrdmacm +TGTD_OBJS += iscsi/iscsi_rdma_load.o +TGTD_LDOPTS += -Wl,--export-dynamic endif endif @@ -66,10 +68,13 @@ MANPAGES = ../doc/manpages/tgtadm.8 ../doc/manpages/tgt-admin.8 \ TGTD_DEP = $(TGTD_OBJS:.o=.d) .PHONY:all -all: $(PROGRAMS) +all: $(PROGRAMS) $(ISER_SO) tgtd: $(TGTD_OBJS) - $(CC) $^ -o $@ $(LIBS) + $(CC) $(TGTD_LDOPTS) $^ -o $@ $(LIBS) + +$(ISER_SO): $(ISER_OBJS) + $(CC) -shared -o $@ $^ $(ISER_LIBS) -include $(TGTD_DEP) @@ -103,4 +108,4 @@ install_doc: $(MANPAGES) .PHONY: clean clean: - rm -f *.[od] $(PROGRAMS) iscsi/*.[od] ibmvio/*.[od] fc/*.[od] fcoe/*.[od] + rm -f *.[od] $(PROGRAMS) iscsi/*.[od] ibmvio/*.[od] fc/*.[od] fcoe/*.[od] $(ISER_SO) $(ISER_OBJS) diff --git a/usr/iscsi/iscsi_rdma_load.c b/usr/iscsi/iscsi_rdma_load.c new file mode 100644 index 0000000..581f4f1 --- /dev/null +++ b/usr/iscsi/iscsi_rdma_load.c @@ -0,0 +1,33 @@ +/* + * Try to load RDMA transport, if libraries are available + * + * Copyright (C) 2008 Pete Wyckoff <pw@xxxxxxxx> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, version 2 of the + * License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + */ +#include <stdio.h> +#include <dlfcn.h> + + +__attribute__((constructor)) static void iser_rdma_load(void) +{ + void *h; + + h = dlopen("iscsi/iscsi_rdma.so", RTLD_NOW); + if (!h) + fprintf(stderr, "%s: dlopen: %s\n", __func__, dlerror()); +} + -- 1.5.5.1 -- To unsubscribe from this list: send the line "unsubscribe stgt" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html