[stgt] [PATCH] Add support for modular backends

ronnie sahlberg ronniesahlberg at gmail.com
Fri Sep 20 02:20:18 CEST 2013


On Thu, Sep 19, 2013 at 4:28 PM, FUJITA Tomonori
<fujita.tomonori at lab.ntt.co.jp> wrote:
> On Thu, 19 Sep 2013 16:30:41 -0700
> Ronnie Sahlberg <ronniesahlberg at gmail.com> 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 at gmail.com>
>> ---
>>  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 at vger.kernel.org
>> 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 at vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html



More information about the stgt mailing list