On Thu, Sep 19, 2013 at 4:28 PM, FUJITA Tomonori <fujita.tomonori@xxxxxxxxxxxxx> wrote: > On Thu, 19 Sep 2013 16:30:41 -0700 > Ronnie Sahlberg <ronniesahlberg@xxxxxxxxx> wrote: > >> Link tgtd with -E so all symbols are available for runtime linking >> by dynamically loaded objects. >> Build some modules, such as bs_{aio|ssc|rdwr|rbd} as shared objects and >> install them under /usr/lib/tgtd/backing-store >> Add support so that when tgtd is started and initializes the backends >> it will traverse /usr/lib/tgtd/backing-store and dynamically load >> all object files. > > s/tgtd/tgt/ ? Sure. I will send a new patch. > >> This allows to build and distribute backends as separate packages than tgtd. >> TGTD can be shipped with only base dependencies and basic backend support >> and then those backends that include extra dependencies can be shipped >> and installed separately. >> >> Signed-off-by: Ronnie Sahlberg <ronniesahlberg@xxxxxxxxx> >> --- >> usr/Makefile | 35 ++++++++++++++++++++++++----------- >> usr/bs.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ >> usr/bs_aio.c | 2 +- >> usr/bs_rbd.c | 2 +- >> 4 files changed, 78 insertions(+), 13 deletions(-) >> >> diff --git a/usr/Makefile b/usr/Makefile >> index 453eb1a..35f11fd 100644 >> --- a/usr/Makefile >> +++ b/usr/Makefile >> @@ -1,4 +1,5 @@ >> sbindir ?= $(PREFIX)/sbin >> +libdir ?= $(PREFIX)/lib/tgtd >> >> ifneq ($(shell test -e /usr/include/linux/signalfd.h && echo 1),) >> CFLAGS += -DUSE_SIGNALFD >> @@ -11,17 +12,14 @@ endif >> TGTD_OBJS += $(addprefix iscsi/, conn.o param.o session.o \ >> iscsid.o target.o chap.o sha1.o md5.o transport.o iscsi_tcp.o \ >> isns.o) >> -TGTD_OBJS += bs_rdwr.o >> >> ifneq ($(CEPH_RBD),) >> -TGTD_OBJS += bs_rbd.o >> -LIBS += -lrados -lrbd >> +MODULES += bs_rbd.so >> endif >> >> ifneq ($(shell test -e /usr/include/sys/eventfd.h && test -e /usr/include/libaio.h && echo 1),) >> CFLAGS += -DUSE_EVENTFD >> -TGTD_OBJS += bs_aio.o >> -LIBS += -laio >> +MODULES += bs_aio.o >> endif >> >> ifneq ($(ISCSI_RDMA),) >> @@ -40,22 +38,26 @@ CFLAGS += -g -O2 -fno-strict-aliasing >> endif >> CFLAGS += -Wall -Wstrict-prototypes -fPIC >> CFLAGS += -DTGT_VERSION=\"$(VERSION)$(EXTRAVERSION)\" >> +CFLAGS += -DBSDIR=\"$(DESTDIR)$(libdir)/backing-store\" >> >> -LIBS += -lpthread >> +LIBS += -lpthread -ldl >> >> PROGRAMS += tgtd tgtadm tgtimg >> TGTD_OBJS += tgtd.o mgmt.o target.o scsi.o log.o driver.o util.o work.o \ >> concat_buf.o parser.o spc.o sbc.o mmc.o osd.o scc.o smc.o \ >> - ssc.o bs_ssc.o libssc.o \ >> + ssc.o libssc.o bs_rdwr.o bs_ssc.o \ >> bs_null.o bs_sg.o bs.o libcrc32c.o >> >> TGTD_DEP = $(TGTD_OBJS:.o=.d) >> >> +LDFLAGS = -Wl,-E,-rpath=$(libdir) >> + >> .PHONY:all >> -all: $(PROGRAMS) >> +all: $(PROGRAMS) $(MODULES) >> >> tgtd: $(TGTD_OBJS) >> - $(CC) $^ -o $@ $(LIBS) >> + echo $(CC) $^ -o $@ $(LIBS) >> + $(CC) $^ -o $@ $(LDFLAGS) $(LIBS) >> >> -include $(TGTD_DEP) >> >> @@ -79,11 +81,22 @@ tgtimg: $(TGTIMG_OBJS) >> $(CC) -c $(CFLAGS) $*.c -o $*.o >> @$(CC) -MM $(CFLAGS) -MF $*.d -MT $*.o $*.c >> >> +%.so: %.c >> + $(CC) -shared $(CFLAGS) $*.c -o $*.so >> + >> +bs_aio.so: bs_aio.c >> + $(CC) -shared $(CFLAGS) bs_aio.c -o bs_aio.so -laio >> + >> +bs_rbd.so: bs_rbd.c >> + $(CC) -shared $(CFLAGS) bs_rbd.c -o bs_rbd.so -lrados -lrbd >> + >> .PHONY: install >> -install: $(PROGRAMS) >> +install: $(PROGRAMS) $(MODULES) >> install -d -m 755 $(DESTDIR)$(sbindir) >> install -m 755 $(PROGRAMS) $(DESTDIR)$(sbindir) >> + install -d -m 755 $(DESTDIR)$(libdir)/backing-store >> + install -m 755 $(MODULES) $(DESTDIR)$(libdir)/backing-store >> >> .PHONY: clean >> clean: >> - rm -f *.[od] $(PROGRAMS) iscsi/*.[od] ibmvio/*.[od] fc/*.[od] >> + rm -f *.[od] *.so $(PROGRAMS) iscsi/*.[od] ibmvio/*.[od] fc/*.[od] >> diff --git a/usr/bs.c b/usr/bs.c >> index 65c332e..739ab81 100644 >> --- a/usr/bs.c >> +++ b/usr/bs.c >> @@ -19,6 +19,12 @@ >> * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA >> * 02110-1301 USA >> */ >> +#define _GNU_SOURCE >> +#include <dirent.h> >> +#include <dlfcn.h> >> +#include <linux/fs.h> >> +#include <sys/ioctl.h> >> +#include <stdio.h> >> #include <errno.h> >> #include <string.h> >> #include <inttypes.h> >> @@ -31,7 +37,9 @@ >> #include <syscall.h> >> #include <sys/types.h> >> #include <sys/epoll.h> >> +#include <sys/stat.h> >> #include <linux/types.h> >> +#include <unistd.h> >> >> #include "list.h" >> #include "tgtd.h" >> @@ -233,6 +241,50 @@ static int bs_init_signalfd(void) >> { >> sigset_t mask; >> int ret; >> + DIR *dir; >> + >> + dir = opendir(BSDIR); >> + if (dir == NULL) { >> + eprintf("could not open backing-store module directory %s\n", >> + BSDIR); >> + } else { >> + struct dirent *dirent; >> + void *handle; >> + while ((dirent = readdir(dir))) { >> + char *soname; >> + void (*register_bs_module)(void); >> + >> + if (dirent->d_name[0] == '.') { >> + continue; >> + } >> + >> + ret = asprintf(&soname, "%s/%s", BSDIR, >> + dirent->d_name); >> + if (ret == -1) { >> + eprintf("out of memory\n"); >> + continue; >> + } >> + handle = dlopen(soname, RTLD_NOW|RTLD_LOCAL); >> + if (handle == NULL) { >> + eprintf("failed to dlopen backing-store " >> + "module %s error %s \n", >> + soname, dlerror()); >> + free(soname); >> + continue; >> + } >> + register_bs_module = dlsym(handle, "register_bs_module"); >> + if (register_bs_module == NULL) { >> + eprintf("could not find register_bs_module " >> + "symbol in module %s\n", >> + soname); >> + free(soname); >> + continue; >> + } >> + register_bs_module(); >> + free(soname); >> + } >> + closedir(dir); >> + } >> >> pthread_mutex_init(&finished_lock, NULL); >> >> diff --git a/usr/bs_aio.c b/usr/bs_aio.c >> index c0cbadd..cc59cf6 100644 >> --- a/usr/bs_aio.c >> +++ b/usr/bs_aio.c >> @@ -414,7 +414,7 @@ static struct backingstore_template aio_bst = { >> .bs_cmd_submit = bs_aio_cmd_submit, >> }; >> >> -__attribute__((constructor)) static void bs_rdwr_constructor(void) >> +void register_bs_module(void) >> { >> register_backingstore_template(&aio_bst); >> } >> diff --git a/usr/bs_rbd.c b/usr/bs_rbd.c >> index b09090b..f1dd77d 100644 >> --- a/usr/bs_rbd.c >> +++ b/usr/bs_rbd.c >> @@ -529,7 +529,7 @@ static struct backingstore_template rbd_bst = { >> .bs_oflags_supported = O_SYNC | O_DIRECT, >> }; >> >> -static __attribute__((constructor)) void bs_rbd_constructor(void) >> +void register_bs_module(void) >> { >> register_backingstore_template(&rbd_bst); >> } >> -- >> 1.7.3.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 -- 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