[stgt] [PATCH] Make the backing-store modules shared objects that are loaded at runtime
ronnie sahlberg
ronniesahlberg at gmail.com
Tue Sep 17 04:27:30 CEST 2013
Tomo,
What about this patch?
I think we have a bunch of backend developers and distribution
packagers that all seem to
want to add something like this to STGT.
I think having bs.c being the official "API" for what backends can
link to and having
backends compiled as separate modules would be great for TGTD.
regards
ronnie sahlberg
On Wed, Sep 4, 2013 at 8:40 AM, Dan Mick <dan.mick at inktank.com> wrote:
> Tomo: are we waiting for anything in particular about this patch? I'd love
> to see it applied. Can I help test or verify something?
>
> On 8/27/2013 2:08 PM, ronnie sahlberg wrote:
>>
>> ping?
>>
>> this is version 2 of the patch
>>
>> On Tue, Aug 20, 2013 at 7:46 PM, Ronnie Sahlberg
>> <ronniesahlberg at gmail.com> wrote:
>>>
>>> Dynamically loaded bs_*.so files can only bind to and use functions from
>>> other shared objects and not from the main executable.
>>> Since all bs_*.c backends use helper functions from bs.c
>>> turn it into a shared library libtgt_bs.so
>>> Additionally move some additional functions that the backend modules need
>>> to libtgt_bs.so
>>>
>>> Change five backing stores bs_aio/null/rbd/rdwr/ssc into shared objec
>>> and install them under $(PREFIX)/lib/tgtd/backing-store.
>>>
>>> Leave the sixth backend bs_sg.c as a built in module. The reason is
>>> because
>>> this backend does not need additional dependencies and also since it
>>> would require most of spc.c to become part of the shared library and by
>>> extension this would then pull in almost all of TGTD into the shared
>>> library.
>>>
>>> When tgtd is starting, have it traverse the directory for backing stores
>>> and
>>> automatically load and initialize all backing stores files that are
>>> found.
>>>
>>> This allows for example to distribute bs_aio.so as a separate package
>>> since it has additional dependencies (libaio) that tgtd itself does not
>>> have
>>> Similarly for bs_rbd.so.
>>> This means that core TGTD can be distributed with minimal dependencies
>>> and backends that add additional dependencies can be distributed
>>> separately.
>>>
>>> Signed-off-by: Ronnie Sahlberg <ronniesahlberg at gmail.com>
>>> ---
>>> usr/Makefile | 39 ++++++++++++----
>>> usr/bs.c | 139
>>> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>>> usr/bs.h | 16 +++++++
>>> usr/bs_aio.c | 11 +++--
>>> usr/bs_null.c | 2 +-
>>> usr/bs_rbd.c | 9 ++--
>>> usr/bs_rdwr.c | 13 +++---
>>> usr/bs_sg.c | 45 ++++++++++++++++--
>>> usr/bs_ssc.c | 86 ++++++++++++++++++-----------------
>>> usr/mmc.c | 75 ++++++++++++++++---------------
>>> usr/sbc.c | 21 +++++----
>>> usr/scsi.c | 31 +++----------
>>> usr/smc.c | 9 ++--
>>> usr/spc.c | 65 +++++++++++----------------
>>> usr/spc.h | 2 -
>>> usr/ssc.c | 3 +-
>>> usr/target.c | 43 ------------------
>>> usr/tgtd.c | 1 +
>>> usr/tgtd.h | 10 +----
>>> usr/util.c | 47 -------------------
>>> usr/util.h | 3 +-
>>> 21 files changed, 380 insertions(+), 290 deletions(-)
>>> create mode 100644 usr/bs.h
>>>
>>> diff --git a/usr/Makefile b/usr/Makefile
>>> index 453eb1a..dc19f26 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
>>> @@ -14,14 +15,12 @@ TGTD_OBJS += $(addprefix iscsi/, conn.o param.o
>>> session.o \
>>> TGTD_OBJS += bs_rdwr.o
>>>
>>> ifneq ($(CEPH_RBD),)
>>> -TGTD_OBJS += bs_rbd.o
>>> -LIBS += -lrados -lrbd
>>> +BS_OBJS += 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
>>> +BS_OBJS += bs_aio.so
>>> endif
>>>
>>> ifneq ($(ISCSI_RDMA),)
>>> @@ -40,25 +39,31 @@ 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
>>>
>>> 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 \
>>> - bs_null.o bs_sg.o bs.o libcrc32c.o
>>> + ssc.o bs_sg.o libcrc32c.o
>>> +LIBTGT_OBJS = bs.o
>>> +
>>> +BS_OBJS += bs_null.so bs_rdwr.so bs_ssc.so
>>>
>>> TGTD_DEP = $(TGTD_OBJS:.o=.d)
>>>
>>> .PHONY:all
>>> -all: $(PROGRAMS)
>>> +all: libtgt_bs.so $(PROGRAMS) $(BS_OBJS)
>>>
>>> tgtd: $(TGTD_OBJS)
>>> - $(CC) $^ -o $@ $(LIBS)
>>> + $(CC) $^ -o $@ $(LIBS) libtgt_bs.so
>>>
>>> -include $(TGTD_DEP)
>>>
>>> +libtgt_bs.so: $(LIBTGT_OBJS)
>>> + $(CC) -shared -fPIC -DPIC $^ -o $@ -ldl
>>> +
>>> TGTADM_OBJS = tgtadm.o concat_buf.o
>>> TGTADM_DEP = $(TGTADM_OBJS:.o=.d)
>>>
>>> @@ -79,11 +84,27 @@ 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
>>> +
>>> +bs_ssc.so: bs_ssc.c
>>> + $(CC) -shared $(CFLAGS) bs_ssc.c -o bs_ssc.so libssc.o
>>> libcrc32c.o
>>> +
>>> .PHONY: install
>>> install: $(PROGRAMS)
>>> install -d -m 755 $(DESTDIR)$(sbindir)
>>> install -m 755 $(PROGRAMS) $(DESTDIR)$(sbindir)
>>> + install -d -m 755 $(DESTDIR)$(libdir)/backing-store
>>> + install -m 755 $(BS_OBJS) $(DESTDIR)$(libdir)/backing-store
>>> + install -m 755 libtgt_bs.so $(DESTDIR)$(libdir)
>>> + ldconfig $(DESTDIR)$(libdir)
>>>
>>> .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..279c6f0 100644
>>> --- a/usr/bs.c
>>> +++ b/usr/bs.c
>>> @@ -19,6 +19,9 @@
>>> * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
>>> * 02110-1301 USA
>>> */
>>> +#define _GNU_SOURCE
>>> +#include <dirent.h>
>>> +#include <dlfcn.h>
>>> #include <errno.h>
>>> #include <string.h>
>>> #include <inttypes.h>
>>> @@ -27,11 +30,17 @@
>>> #include <stdlib.h>
>>> #include <unistd.h>
>>> #include <fcntl.h>
>>> +#include <linux/fs.h>
>>> #include <signal.h>
>>> +#include <stdio.h>
>>> #include <syscall.h>
>>> -#include <sys/types.h>
>>> #include <sys/epoll.h>
>>> +#include <sys/ioctl.h>
>>> +#include <sys/stat.h>
>>> +#include <sys/types.h>
>>> #include <linux/types.h>
>>> +#include <unistd.h>
>>> +
>>>
>>> #include "list.h"
>>> #include "tgtd.h"
>>> @@ -309,8 +318,51 @@ destroy_cond_mutex:
>>>
>>> int bs_init(void)
>>> {
>>> + DIR *dir;
>>> int ret;
>>>
>>> + 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);
>>> + }
>>> ret = bs_init_signalfd();
>>> if (!ret) {
>>> eprintf("use signalfd notification\n");
>>> @@ -412,3 +464,88 @@ int bs_thread_cmd_submit(struct scsi_cmd *cmd)
>>>
>>> return 0;
>>> }
>>> +
>>> +void bs_update_lbppbe(struct scsi_lu *lu, int blksize)
>>> +{
>>> + lu->attrs.lbppbe = 0;
>>> + while (blksize > (1U << lu->blk_shift)) {
>>> + lu->attrs.lbppbe++;
>>> + blksize >>= 1;
>>> + }
>>> +}
>>> +
>>> +int bs_backed_file_open(char *path, int oflag, uint64_t *size,
>>> + uint32_t *blksize)
>>> +{
>>> + int fd, err;
>>> + struct stat64 st;
>>> +
>>> + fd = open(path, oflag);
>>> + if (fd < 0) {
>>> + eprintf("Could not open %s, %m\n", path);
>>> + return fd;
>>> + }
>>> +
>>> + err = fstat64(fd, &st);
>>> + if (err < 0) {
>>> + eprintf("Cannot get stat %d, %m\n", fd);
>>> + goto close_fd;
>>> + }
>>> +
>>> + if (S_ISREG(st.st_mode)) {
>>> + *size = st.st_size;
>>> + if (blksize)
>>> + *blksize = st.st_blksize;
>>> + } else if (S_ISBLK(st.st_mode)) {
>>> + err = ioctl(fd, BLKGETSIZE64, size);
>>> + if (err < 0) {
>>> + eprintf("Cannot get size, %m\n");
>>> + goto close_fd;
>>> + }
>>> + } else {
>>> + eprintf("Cannot use this mode %x\n", st.st_mode);
>>> + err = -EINVAL;
>>> + goto close_fd;
>>> + }
>>> +
>>> + return fd;
>>> +
>>> +close_fd:
>>> + close(fd);
>>> + return err;
>>> +}
>>> +
>>> +struct mode_pg *bs_find_mode_page(struct scsi_lu *lu, uint8_t pcode,
>>> + uint8_t subpcode)
>>> +{
>>> + struct mode_pg *pg;
>>> +
>>> + list_for_each_entry(pg, &lu->mode_pages, mode_pg_siblings) {
>>> + if (pg->pcode == pcode && pg->subpcode == subpcode)
>>> + return pg;
>>> + }
>>> + return NULL;
>>> +}
>>> +
>>> +void bs_sense_data_build(struct scsi_cmd *cmd, uint8_t key, uint16_t
>>> asc)
>>> +{
>>> +
>>> + if (cmd->dev->attrs.sense_format) {
>>> + /* descriptor format */
>>> + cmd->sense_buffer[0] = 0x72; /* current, not deferred */
>>> + cmd->sense_buffer[1] = key;
>>> + cmd->sense_buffer[2] = (asc >> 8) & 0xff;
>>> + cmd->sense_buffer[3] = asc & 0xff;
>>> + cmd->sense_len = 8;
>>> + } else {
>>> + /* fixed format */
>>> + int len = 0xa;
>>> + cmd->sense_buffer[0] = 0x70; /* current, not deferred */
>>> + cmd->sense_buffer[2] = key;
>>> + cmd->sense_buffer[7] = len;
>>> + cmd->sense_buffer[12] = (asc >> 8) & 0xff;
>>> + cmd->sense_buffer[13] = asc & 0xff;
>>> + cmd->sense_len = len + 8;
>>> + }
>>> +}
>>> +
>>> diff --git a/usr/bs.h b/usr/bs.h
>>> new file mode 100644
>>> index 0000000..e266c2c
>>> --- /dev/null
>>> +++ b/usr/bs.h
>>> @@ -0,0 +1,16 @@
>>> +#ifndef __BS_H
>>> +#define __BS_H
>>> +
>>> +#include <inttypes.h>
>>> +
>>> +extern int bs_init(void);
>>> +
>>> +extern int bs_backed_file_open(char *path, int oflag, uint64_t *size,
>>> + uint32_t *blksize);
>>> +extern struct mode_pg *bs_find_mode_page(struct scsi_lu *lu,
>>> + uint8_t pcode, uint8_t
>>> subpcode);
>>> +extern void bs_sense_data_build(struct scsi_cmd *cmd, uint8_t key,
>>> + uint16_t asc);
>>> +extern void bs_update_lbppbe(struct scsi_lu *lu, int blksize);
>>> +
>>> +#endif
>>> diff --git a/usr/bs_aio.c b/usr/bs_aio.c
>>> index c0cbadd..fb3eb2d 100644
>>> --- a/usr/bs_aio.c
>>> +++ b/usr/bs_aio.c
>>> @@ -38,6 +38,7 @@
>>> #include "tgtd.h"
>>> #include "target.h"
>>> #include "scsi.h"
>>> +#include "bs.h"
>>>
>>> #ifndef O_DIRECT
>>> #define O_DIRECT 040000
>>> @@ -254,7 +255,7 @@ static void bs_aio_complete_one(struct io_event *ep)
>>> if (likely(ep->res == length))
>>> result = SAM_STAT_GOOD;
>>> else {
>>> - sense_data_build(cmd, MEDIUM_ERROR, 0);
>>> + bs_sense_data_build(cmd, MEDIUM_ERROR, 0);
>>> result = SAM_STAT_CHECK_CONDITION;
>>> }
>>> dprintf("cmd: %p\n", cmd);
>>> @@ -341,13 +342,13 @@ static int bs_aio_open(struct scsi_lu *lu, char
>>> *path, int *fd, uint64_t *size)
>>>
>>> eprintf("open %s, RW, O_DIRECT for tgt:%d lun:%"PRId64 "\n",
>>> path, info->lu->tgt->tid, info->lu->lun);
>>> - *fd = backed_file_open(path, O_RDWR|O_LARGEFILE|O_DIRECT, size,
>>> + *fd = bs_backed_file_open(path, O_RDWR|O_LARGEFILE|O_DIRECT,
>>> size,
>>> &blksize);
>>> /* If we get access denied, try opening the file in readonly
>>> mode */
>>> if (*fd == -1 && (errno == EACCES || errno == EROFS)) {
>>> eprintf("open %s, READONLY, O_DIRECT for tgt:%d
>>> lun:%"PRId64 "\n",
>>> path, info->lu->tgt->tid, info->lu->lun);
>>> - *fd = backed_file_open(path,
>>> O_RDONLY|O_LARGEFILE|O_DIRECT,
>>> + *fd = bs_backed_file_open(path,
>>> O_RDONLY|O_LARGEFILE|O_DIRECT,
>>> size, &blksize);
>>> lu->attrs.readonly = 1;
>>> }
>>> @@ -362,7 +363,7 @@ static int bs_aio_open(struct scsi_lu *lu, char
>>> *path, int *fd, uint64_t *size)
>>> path, info->lu->tgt->tid, info->lu->lun);
>>>
>>> if (!lu->attrs.no_auto_lbppbe)
>>> - update_lbppbe(lu, blksize);
>>> + bs_update_lbppbe(lu, blksize);
>>>
>>> return 0;
>>>
>>> @@ -414,7 +415,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_null.c b/usr/bs_null.c
>>> index d463f18..4dbe144 100644
>>> --- a/usr/bs_null.c
>>> +++ b/usr/bs_null.c
>>> @@ -56,7 +56,7 @@ static struct backingstore_template null_bst = {
>>> .bs_cmd_submit = bs_null_cmd_submit,
>>> };
>>>
>>> -__attribute__((constructor)) static void bs_null_constructor(void)
>>> +void register_bs_module(void)
>>> {
>>> register_backingstore_template(&null_bst);
>>> }
>>> diff --git a/usr/bs_rbd.c b/usr/bs_rbd.c
>>> index b09090b..496f0a9 100644
>>> --- a/usr/bs_rbd.c
>>> +++ b/usr/bs_rbd.c
>>> @@ -35,6 +35,7 @@
>>> #include <linux/fs.h>
>>> #include <sys/epoll.h>
>>>
>>> +#include "bs.h"
>>> #include "list.h"
>>> #include "util.h"
>>> #include "tgtd.h"
>>> @@ -250,7 +251,7 @@ write:
>>> * it would be better not to access to pg
>>> * directy.
>>> */
>>> - pg = find_mode_page(cmd->dev, 0x08, 0);
>>> + pg = bs_find_mode_page(cmd->dev, 0x08, 0);
>>> if (pg == NULL) {
>>> result = SAM_STAT_CHECK_CONDITION;
>>> key = ILLEGAL_REQUEST;
>>> @@ -407,7 +408,7 @@ verify:
>>> if (result != SAM_STAT_GOOD) {
>>> eprintf("io error %p %x %d %d %" PRIu64 ", %m\n",
>>> cmd, cmd->scb[0], ret, length, offset);
>>> - sense_data_build(cmd, key, asc);
>>> + bs_sense_data_build(cmd, key, asc);
>>> }
>>> }
>>>
>>> @@ -460,7 +461,7 @@ static int bs_rbd_open(struct scsi_lu *lu, char
>>> *path, int *fd, uint64_t *size)
>>> blksize = inf.obj_size;
>>>
>>> if (!lu->attrs.no_auto_lbppbe)
>>> - update_lbppbe(lu, blksize);
>>> + bs_update_lbppbe(lu, blksize);
>>>
>>> return 0;
>>> }
>>> @@ -529,7 +530,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);
>>> }
>>> diff --git a/usr/bs_rdwr.c b/usr/bs_rdwr.c
>>> index 47d2d99..723ce64 100644
>>> --- a/usr/bs_rdwr.c
>>> +++ b/usr/bs_rdwr.c
>>> @@ -40,6 +40,7 @@
>>> #include "scsi.h"
>>> #include "spc.h"
>>> #include "bs_thread.h"
>>> +#include "bs.h"
>>>
>>> static void set_medium_error(int *result, uint8_t *key, uint16_t *asc)
>>> {
>>> @@ -197,7 +198,7 @@ write:
>>> * it would be better not to access to pg
>>> * directy.
>>> */
>>> - pg = find_mode_page(cmd->dev, 0x08, 0);
>>> + pg = bs_find_mode_page(cmd->dev, 0x08, 0);
>>> if (pg == NULL) {
>>> result = SAM_STAT_CHECK_CONDITION;
>>> key = ILLEGAL_REQUEST;
>>> @@ -368,7 +369,7 @@ verify:
>>> if (result != SAM_STAT_GOOD) {
>>> eprintf("io error %p %x %d %d %" PRIu64 ", %m\n",
>>> cmd, cmd->scb[0], ret, length, offset);
>>> - sense_data_build(cmd, key, asc);
>>> + bs_sense_data_build(cmd, key, asc);
>>> }
>>> }
>>>
>>> @@ -376,11 +377,11 @@ static int bs_rdwr_open(struct scsi_lu *lu, char
>>> *path, int *fd, uint64_t *size)
>>> {
>>> uint32_t blksize = 0;
>>>
>>> - *fd = backed_file_open(path, O_RDWR|O_LARGEFILE|lu->bsoflags,
>>> size,
>>> + *fd = bs_backed_file_open(path, O_RDWR|O_LARGEFILE|lu->bsoflags,
>>> size,
>>> &blksize);
>>> /* If we get access denied, try opening the file in readonly
>>> mode */
>>> if (*fd == -1 && (errno == EACCES || errno == EROFS)) {
>>> - *fd = backed_file_open(path,
>>> O_RDONLY|O_LARGEFILE|lu->bsoflags,
>>> + *fd = bs_backed_file_open(path,
>>> O_RDONLY|O_LARGEFILE|lu->bsoflags,
>>> size, &blksize);
>>> lu->attrs.readonly = 1;
>>> }
>>> @@ -388,7 +389,7 @@ static int bs_rdwr_open(struct scsi_lu *lu, char
>>> *path, int *fd, uint64_t *size)
>>> return *fd;
>>>
>>> if (!lu->attrs.no_auto_lbppbe)
>>> - update_lbppbe(lu, blksize);
>>> + bs_update_lbppbe(lu, blksize);
>>>
>>> return 0;
>>> }
>>> @@ -423,7 +424,7 @@ static struct backingstore_template rdwr_bst = {
>>> .bs_oflags_supported = O_SYNC | O_DIRECT,
>>> };
>>>
>>> -__attribute__((constructor)) static void bs_rdwr_constructor(void)
>>> +void register_bs_module(void)
>>> {
>>> register_backingstore_template(&rdwr_bst);
>>> }
>>> diff --git a/usr/bs_sg.c b/usr/bs_sg.c
>>> index 5f1e687..cecf45c 100644
>>> --- a/usr/bs_sg.c
>>> +++ b/usr/bs_sg.c
>>> @@ -44,6 +44,7 @@
>>> #include "scsi.h"
>>> #include "spc.h"
>>> #include "tgtadm_error.h"
>>> +#include "bs.h"
>>>
>>> #define BS_SG_RESVD_SZ (512 * 1024)
>>>
>>> @@ -106,7 +107,7 @@ static int bs_sg_rw(int host_no, struct scsi_cmd
>>> *cmd)
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> scsi_set_out_resid_by_actual(cmd, 0);
>>>
>>> - sense_data_build(cmd, key, asc);
>>> + bs_sense_data_build(cmd, key, asc);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -117,7 +118,7 @@ static int set_cmd_failed(struct scsi_cmd *cmd)
>>> uint8_t key = MEDIUM_ERROR;
>>>
>>> scsi_set_result(cmd, result);
>>> - sense_data_build(cmd, key, asc);
>>> + bs_sense_data_build(cmd, key, asc);
>>>
>>> return result;
>>> }
>>> @@ -420,19 +421,53 @@ static int init_sg_device(int fd)
>>> return 0;
>>> }
>>>
>>> +/*
>>> + * Used by bs_sg for CDB passthrough to STGT LUNs
>>> + */
>>> +static int sg_cmd_perform_passthrough(int tid, struct scsi_cmd *cmd)
>>> +{
>>> + int result;
>>> +
>>> + dprintf("%p %x %" PRIx64 " PT\n", cmd, cmd->scb[0], cmd->dev_id);
>>> +
>>> + result = cmd->dev->dev_type_template.cmd_passthrough(tid, cmd);
>>> +
>>> + dprintf("%" PRIx64 " %x %p %p %" PRIu64 " %u %u %d %d\n",
>>> + cmd->tag, cmd->scb[0], scsi_get_out_buffer(cmd),
>>> + scsi_get_in_buffer(cmd), cmd->offset,
>>> + scsi_get_out_length(cmd), scsi_get_in_length(cmd),
>>> + result, cmd_async(cmd));
>>> +
>>> + set_cmd_processed(cmd);
>>> + if (!cmd_async(cmd))
>>> + target_cmd_io_done(cmd, result);
>>> +
>>> + return 0;
>>> +}
>>> +
>>> +/*
>>> + * Used by struct scsi_lu->cmd_done() for bs_sg (passthrough) completion
>>> + */
>>> +static void sg_cmd_done_passthrough(struct target *target, struct
>>> scsi_cmd *cmd)
>>> +{
>>> + dprintf("%p %p %u %u\n", scsi_get_out_buffer(cmd),
>>> + scsi_get_in_buffer(cmd), scsi_get_out_length(cmd),
>>> + scsi_get_in_length(cmd));
>>> +}
>>> +
>>> static tgtadm_err bs_sg_init(struct scsi_lu *lu)
>>> {
>>> /*
>>> * Setup struct scsi_lu->cmd_perform() passthrough pointer
>>> * (if available) for the underlying device type.
>>> */
>>> - lu->cmd_perform = &target_cmd_perform_passthrough;
>>> + lu->cmd_perform = &sg_cmd_perform_passthrough;
>>>
>>> /*
>>> * Setup struct scsi_lu->cmd_done() passthrough pointer using
>>> - * usr/target.c:__cmd_done_passthrough().
>>> + * sg_cmd_done_passthrough().
>>> */
>>> - lu->cmd_done = &__cmd_done_passthrough;
>>> + lu->cmd_done = &sg_cmd_done_passthrough;
>>> return TGTADM_SUCCESS;
>>> }
>>>
>>> diff --git a/usr/bs_ssc.c b/usr/bs_ssc.c
>>> index 117e274..67cf128 100644
>>> --- a/usr/bs_ssc.c
>>> +++ b/usr/bs_ssc.c
>>> @@ -39,6 +39,7 @@
>>> #include "bs_ssc.h"
>>> #include "ssc.h"
>>> #include "libssc.h"
>>> +#include "bs.h"
>>>
>>> #define SENSE_FILEMARK 0x80
>>> #define SENSE_EOM 0x40
>>> @@ -49,7 +50,7 @@ static void ssc_sense_data_build(struct scsi_cmd *cmd,
>>> uint8_t key,
>>> {
>>> /* TODO: support descriptor format */
>>>
>>> - sense_data_build(cmd, key, asc);
>>> + bs_sense_data_build(cmd, key, asc);
>>> if (info_len) {
>>> memcpy(cmd->sense_buffer + 3, info, 4);
>>> cmd->sense_buffer[0] |= 0x80;
>>> @@ -166,14 +167,14 @@ static int append_blk(struct scsi_cmd *cmd, uint8_t
>>> *data,
>>> ret = ssc_write_blkhdr(fd, curr, curr->curr);
>>> if (ret) {
>>> eprintf("Rewrite of blk header failed: %m\n");
>>> - sense_data_build(cmd, MEDIUM_ERROR, ASC_WRITE_ERROR);
>>> + bs_sense_data_build(cmd, MEDIUM_ERROR, ASC_WRITE_ERROR);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>> /* Write new EOD blk header */
>>> ret = ssc_write_blkhdr(fd, eod, eod->curr);
>>> if (ret) {
>>> eprintf("Write of EOD blk header failed: %m\n");
>>> - sense_data_build(cmd, MEDIUM_ERROR, ASC_WRITE_ERROR);
>>> + bs_sense_data_build(cmd, MEDIUM_ERROR, ASC_WRITE_ERROR);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -183,7 +184,7 @@ static int append_blk(struct scsi_cmd *cmd, uint8_t
>>> *data,
>>> curr->curr + SSC_BLK_HDR_SIZE);
>>> if (ret != size) {
>>> eprintf("Write of data failed: %m\n");
>>> - sense_data_build(cmd, MEDIUM_ERROR,
>>> ASC_WRITE_ERROR);
>>> + bs_sense_data_build(cmd, MEDIUM_ERROR,
>>> ASC_WRITE_ERROR);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>> }
>>> @@ -201,7 +202,7 @@ static int space_filemark_reverse(struct scsi_cmd
>>> *cmd, int32_t count)
>>>
>>> again:
>>> if (!h->prev) {
>>> - sense_data_build(cmd, NO_SENSE, ASC_BOM);
>>> + bs_sense_data_build(cmd, NO_SENSE, ASC_BOM);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -209,8 +210,8 @@ again:
>>> count--;
>>>
>>> if (skip_prev_header(cmd->dev)) {
>>> - sense_data_build(cmd, MEDIUM_ERROR,
>>> - ASC_MEDIUM_FORMAT_CORRUPT);
>>> + bs_sense_data_build(cmd, MEDIUM_ERROR,
>>> + ASC_MEDIUM_FORMAT_CORRUPT);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -227,7 +228,7 @@ static int space_filemark_forward(struct scsi_cmd
>>> *cmd, int32_t count)
>>>
>>> again:
>>> if (h->blk_type == BLK_EOD) {
>>> - sense_data_build(cmd, NO_SENSE, ASC_END_OF_DATA);
>>> + bs_sense_data_build(cmd, NO_SENSE, ASC_END_OF_DATA);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -235,8 +236,8 @@ again:
>>> count--;
>>>
>>> if (skip_next_header(cmd->dev)) {
>>> - sense_data_build(cmd, MEDIUM_ERROR,
>>> - ASC_MEDIUM_FORMAT_CORRUPT);
>>> + bs_sense_data_build(cmd, MEDIUM_ERROR,
>>> + ASC_MEDIUM_FORMAT_CORRUPT);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -276,27 +277,27 @@ static int space_blocks(struct scsi_cmd *cmd,
>>> int32_t count)
>>> while (count != 0) {
>>> if (count > 0) {
>>> if (skip_next_header(cmd->dev)) {
>>> - sense_data_build(cmd, MEDIUM_ERROR,
>>> -
>>> ASC_MEDIUM_FORMAT_CORRUPT);
>>> + bs_sense_data_build(cmd, MEDIUM_ERROR,
>>> +
>>> ASC_MEDIUM_FORMAT_CORRUPT);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>> if (h->blk_type == BLK_EOD) {
>>> - sense_data_build(cmd, NO_SENSE,
>>> - ASC_END_OF_DATA);
>>> + bs_sense_data_build(cmd, NO_SENSE,
>>> + ASC_END_OF_DATA);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>> count--;
>>> } else {
>>> if (skip_prev_header(cmd->dev)) {
>>> - sense_data_build(cmd, MEDIUM_ERROR,
>>> -
>>> ASC_MEDIUM_FORMAT_CORRUPT);
>>> + bs_sense_data_build(cmd, MEDIUM_ERROR,
>>> +
>>> ASC_MEDIUM_FORMAT_CORRUPT);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>> if (h->blk_type == BLK_BOT) {
>>> /* Can't leave at BOT */
>>> skip_next_header(cmd->dev);
>>>
>>> - sense_data_build(cmd, NO_SENSE, ASC_BOM);
>>> + bs_sense_data_build(cmd, NO_SENSE,
>>> ASC_BOM);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>> count++;
>>> @@ -323,8 +324,8 @@ static int resp_var_read(struct scsi_cmd *cmd,
>>> uint8_t *buf, uint32_t length,
>>> put_unaligned_be32(val, info);
>>>
>>> if (h->blk_type == BLK_EOD)
>>> - sense_data_build(cmd, 0x40 | BLANK_CHECK,
>>> - NO_ADDITIONAL_SENSE);
>>> + bs_sense_data_build(cmd, 0x40 | BLANK_CHECK,
>>> + NO_ADDITIONAL_SENSE);
>>> else if (h->blk_type == BLK_FILEMARK)
>>> ssc_sense_data_build(cmd, NO_SENSE |
>>> SENSE_FILEMARK,
>>> ASC_MARK, info,
>>> sizeof(info));
>>> @@ -351,7 +352,7 @@ static int resp_var_read(struct scsi_cmd *cmd,
>>> uint8_t *buf, uint32_t length,
>>>
>>> ret = pread64(cmd->dev->fd, buf, length, h->curr +
>>> SSC_BLK_HDR_SIZE);
>>> if (ret != length) {
>>> - sense_data_build(cmd, MEDIUM_ERROR, ASC_READ_ERROR);
>>> + bs_sense_data_build(cmd, MEDIUM_ERROR, ASC_READ_ERROR);
>>> result = SAM_STAT_CHECK_CONDITION;
>>> goto out;
>>> }
>>> @@ -360,7 +361,7 @@ static int resp_var_read(struct scsi_cmd *cmd,
>>> uint8_t *buf, uint32_t length,
>>> skip_and_out:
>>> ret = skip_next_header(cmd->dev);
>>> if (ret) {
>>> - sense_data_build(cmd, MEDIUM_ERROR,
>>> ASC_MEDIUM_FORMAT_CORRUPT);
>>> + bs_sense_data_build(cmd, MEDIUM_ERROR,
>>> ASC_MEDIUM_FORMAT_CORRUPT);
>>> result = SAM_STAT_CHECK_CONDITION;
>>> }
>>> out:
>>> @@ -398,7 +399,7 @@ static int resp_fixed_read(struct scsi_cmd *cmd,
>>> uint8_t *buf, uint32_t length,
>>> if (block_length != h->blk_sz) {
>>> eprintf("block size mismatch %d vs %d\n",
>>> block_length, h->blk_sz);
>>> - sense_data_build(cmd, MEDIUM_ERROR,
>>> + bs_sense_data_build(cmd, MEDIUM_ERROR,
>>>
>>> ASC_MEDIUM_FORMAT_CORRUPT);
>>> result = SAM_STAT_CHECK_CONDITION;
>>> goto out;
>>> @@ -409,7 +410,7 @@ static int resp_fixed_read(struct scsi_cmd *cmd,
>>> uint8_t *buf, uint32_t length,
>>> if (block_length != residue) {
>>> eprintf("Could only read %d bytes, not %d\n",
>>> (int)residue, block_length);
>>> - sense_data_build(cmd, MEDIUM_ERROR,
>>> ASC_READ_ERROR);
>>> + bs_sense_data_build(cmd, MEDIUM_ERROR,
>>> ASC_READ_ERROR);
>>> result = SAM_STAT_CHECK_CONDITION;
>>> goto out;
>>> }
>>> @@ -418,7 +419,7 @@ static int resp_fixed_read(struct scsi_cmd *cmd,
>>> uint8_t *buf, uint32_t length,
>>>
>>> if (skip_next_header(cmd->dev)) {
>>> eprintf("Could not read next header\n");
>>> - sense_data_build(cmd, MEDIUM_ERROR,
>>> + bs_sense_data_build(cmd, MEDIUM_ERROR,
>>>
>>> ASC_MEDIUM_FORMAT_CORRUPT);
>>> result = SAM_STAT_CHECK_CONDITION;
>>> goto out;
>>> @@ -455,8 +456,9 @@ static void tape_rdwr_request(struct scsi_cmd *cmd)
>>> case REZERO_UNIT:
>>> dprintf("**** Rewind ****\n");
>>> if (resp_rewind(cmd->dev)) {
>>> - sense_data_build(cmd,
>>> - MEDIUM_ERROR,
>>> ASC_SEQUENTIAL_POSITION_ERR);
>>> + bs_sense_data_build(cmd,
>>> + MEDIUM_ERROR,
>>> + ASC_SEQUENTIAL_POSITION_ERR);
>>> result = SAM_STAT_CHECK_CONDITION;
>>> }
>>> break;
>>> @@ -478,8 +480,8 @@ static void tape_rdwr_request(struct scsi_cmd *cmd)
>>> sti = cmd->scb[1] & 2;
>>>
>>> if (fixed && sti) {
>>> - sense_data_build(cmd, ILLEGAL_REQUEST,
>>> -
>>> ASC_INVALID_FIELD_IN_CDB);
>>> + bs_sense_data_build(cmd, ILLEGAL_REQUEST,
>>> + ASC_INVALID_FIELD_IN_CDB);
>>> result = SAM_STAT_CHECK_CONDITION;
>>> break;
>>> }
>>> @@ -515,8 +517,8 @@ static void tape_rdwr_request(struct scsi_cmd *cmd)
>>> for (i = 0, ret = 0; i < count; i++) {
>>> if (append_blk(cmd, buf, block_length,
>>> block_length,
>>> BLK_UNCOMPRESS_DATA)) {
>>> - sense_data_build(cmd, MEDIUM_ERROR,
>>> - ASC_WRITE_ERROR);
>>> + bs_sense_data_build(cmd, MEDIUM_ERROR,
>>> + ASC_WRITE_ERROR);
>>> result = SAM_STAT_CHECK_CONDITION;
>>> break;
>>> }
>>> @@ -531,14 +533,14 @@ static void tape_rdwr_request(struct scsi_cmd *cmd)
>>>
>>> /* Check for end of media */
>>> if (current_size(cmd) > ssc->mam.max_capacity) {
>>> - sense_data_build(cmd, NO_SENSE|SENSE_EOM,
>>> - NO_ADDITIONAL_SENSE);
>>> + bs_sense_data_build(cmd, NO_SENSE|SENSE_EOM,
>>> + NO_ADDITIONAL_SENSE);
>>> result = SAM_STAT_CHECK_CONDITION;
>>> break;
>>> }
>>>
>>> if (ret != length) {
>>> - sense_data_build(cmd, MEDIUM_ERROR,
>>> ASC_WRITE_ERROR);
>>> + bs_sense_data_build(cmd, MEDIUM_ERROR,
>>> ASC_WRITE_ERROR);
>>> result = SAM_STAT_CHECK_CONDITION;
>>> }
>>> break;
>>> @@ -556,14 +558,14 @@ static void tape_rdwr_request(struct scsi_cmd *cmd)
>>> } else if (code == 3) { /* End of data */
>>> while (h->blk_type != BLK_EOD)
>>> if (skip_next_header(cmd->dev)) {
>>> - sense_data_build(cmd,
>>> MEDIUM_ERROR,
>>> -
>>> ASC_MEDIUM_FORMAT_CORRUPT);
>>> + bs_sense_data_build(cmd,
>>> MEDIUM_ERROR,
>>> + ASC_MEDIUM_FORMAT_CORRUPT);
>>> result =
>>> SAM_STAT_CHECK_CONDITION;
>>> break;
>>> }
>>> } else { /* Unsupported */
>>> - sense_data_build(cmd, ILLEGAL_REQUEST,
>>> -
>>> ASC_INVALID_FIELD_IN_CDB);
>>> + bs_sense_data_build(cmd, ILLEGAL_REQUEST,
>>> + ASC_INVALID_FIELD_IN_CDB);
>>> result = SAM_STAT_CHECK_CONDITION;
>>> }
>>> break;
>>> @@ -588,15 +590,15 @@ static void tape_rdwr_request(struct scsi_cmd *cmd)
>>> memset(data, 0, 32);
>>> data[0] = 32;
>>> } else {
>>> - sense_data_build(cmd, ILLEGAL_REQUEST,
>>> -
>>> ASC_INVALID_FIELD_IN_CDB);
>>> + bs_sense_data_build(cmd, ILLEGAL_REQUEST,
>>> + ASC_INVALID_FIELD_IN_CDB);
>>> result = SAM_STAT_CHECK_CONDITION;
>>> }
>>> break;
>>> }
>>> default:
>>> eprintf("Unknown op code - should never see this\n");
>>> - sense_data_build(cmd, ILLEGAL_REQUEST,
>>> ASC_INVALID_OP_CODE);
>>> + bs_sense_data_build(cmd, ILLEGAL_REQUEST,
>>> ASC_INVALID_OP_CODE);
>>> result = SAM_STAT_CHECK_CONDITION;
>>> break;
>>> }
>>> @@ -626,7 +628,7 @@ static int bs_ssc_open(struct scsi_lu *lu, char
>>> *path, int *fd, uint64_t *size)
>>>
>>> ssc = dtype_priv(lu);
>>>
>>> - *fd = backed_file_open(path, O_RDWR | O_LARGEFILE, size, NULL);
>>> + *fd = bs_backed_file_open(path, O_RDWR | O_LARGEFILE, size,
>>> NULL);
>>> if (*fd < 0) {
>>> eprintf("Could not open %s %m\n", path);
>>> return *fd;
>>> @@ -702,7 +704,7 @@ static struct backingstore_template ssc_bst = {
>>> .bs_cmd_submit = bs_thread_cmd_submit,
>>> };
>>>
>>> -__attribute__((constructor)) static void bs_ssc_constructor(void)
>>> +void register_bs_module(void)
>>> {
>>> register_backingstore_template(&ssc_bst);
>>> }
>>> diff --git a/usr/mmc.c b/usr/mmc.c
>>> index 768fe91..75ddce8 100644
>>> --- a/usr/mmc.c
>>> +++ b/usr/mmc.c
>>> @@ -45,6 +45,7 @@
>>> #include "scsi.h"
>>> #include "spc.h"
>>> #include "tgtadm_error.h"
>>> +#include "bs.h"
>>>
>>> #define MMC_BLK_SHIFT 11
>>>
>>> @@ -66,7 +67,7 @@ static int mmc_rw(int host_no, struct scsi_cmd *cmd)
>>>
>>> if (mmc->current_profile == PROFILE_NO_PROFILE) {
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, NOT_READY, ASC_MEDIUM_NOT_PRESENT);
>>> + bs_sense_data_build(cmd, NOT_READY,
>>> ASC_MEDIUM_NOT_PRESENT);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -78,8 +79,8 @@ static int mmc_rw(int host_no, struct scsi_cmd *cmd)
>>> case WRITE_12:
>>> case WRITE_16:
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, ILLEGAL_REQUEST,
>>> - ASC_INCOMPATIBLE_FORMAT);
>>> + bs_sense_data_build(cmd, ILLEGAL_REQUEST,
>>> + ASC_INCOMPATIBLE_FORMAT);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>> break;
>>> @@ -90,8 +91,8 @@ static int mmc_rw(int host_no, struct scsi_cmd *cmd)
>>> case READ_12:
>>> case READ_16:
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, ILLEGAL_REQUEST,
>>> - ASC_LBA_OUT_OF_RANGE);
>>> + bs_sense_data_build(cmd, ILLEGAL_REQUEST,
>>> + ASC_LBA_OUT_OF_RANGE);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>> break;
>>> @@ -115,7 +116,8 @@ static int mmc_rw(int host_no, struct scsi_cmd *cmd)
>>> else
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>>
>>> - sense_data_build(cmd, ILLEGAL_REQUEST,
>>> ASC_LUN_NOT_SUPPORTED);
>>> + bs_sense_data_build(cmd, ILLEGAL_REQUEST,
>>> + ASC_LUN_NOT_SUPPORTED);
>>> return SAM_STAT_CHECK_CONDITION;
>>> } else {
>>> if ((mmc->current_profile == PROFILE_DVD_PLUS_R) &&
>>> @@ -136,7 +138,7 @@ static int mmc_read_capacity(int host_no, struct
>>> scsi_cmd *cmd)
>>>
>>> if (mmc->current_profile == PROFILE_NO_PROFILE) {
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, NOT_READY, ASC_MEDIUM_NOT_PRESENT);
>>> + bs_sense_data_build(cmd, NOT_READY,
>>> ASC_MEDIUM_NOT_PRESENT);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -168,14 +170,14 @@ static int mmc_read_toc(int host_no, struct
>>> scsi_cmd *cmd)
>>>
>>> if (!cmd->dev->attrs.online) {
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, NOT_READY, ASC_MEDIUM_NOT_PRESENT);
>>> + bs_sense_data_build(cmd, NOT_READY,
>>> ASC_MEDIUM_NOT_PRESENT);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> if (mmc->current_profile == PROFILE_NO_PROFILE) {
>>> /* a blank disk has no tracks */
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, NOT_READY,
>>> ASC_INVALID_FIELD_IN_CDB);
>>> + bs_sense_data_build(cmd, NOT_READY,
>>> ASC_INVALID_FIELD_IN_CDB);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -198,8 +200,8 @@ static int mmc_read_toc(int host_no, struct scsi_cmd
>>> *cmd)
>>> track 1.
>>> */
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, NOT_READY,
>>> - ASC_INVALID_FIELD_IN_CDB);
>>> + bs_sense_data_build(cmd, NOT_READY,
>>> + ASC_INVALID_FIELD_IN_CDB);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -270,7 +272,7 @@ static int mmc_read_toc(int host_no, struct scsi_cmd
>>> *cmd)
>>> eprintf("read_toc: format %x not implemented\n",
>>> toc_format);
>>>
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, NOT_READY,
>>> ASC_INVALID_FIELD_IN_CDB);
>>> + bs_sense_data_build(cmd, NOT_READY,
>>> ASC_INVALID_FIELD_IN_CDB);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -299,7 +301,7 @@ static int mmc_read_disc_information(int host_no,
>>> struct scsi_cmd *cmd)
>>>
>>> if (mmc->current_profile == PROFILE_NO_PROFILE) {
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, NOT_READY, ASC_MEDIUM_NOT_PRESENT);
>>> + bs_sense_data_build(cmd, NOT_READY,
>>> ASC_MEDIUM_NOT_PRESENT);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -451,7 +453,7 @@ static int mmc_read_disc_information(int host_no,
>>> struct scsi_cmd *cmd)
>>> default:
>>> /* we do not understand/support this command for this
>>> profile */
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, NOT_READY,
>>> ASC_INVALID_FIELD_IN_CDB);
>>> + bs_sense_data_build(cmd, NOT_READY,
>>> ASC_INVALID_FIELD_IN_CDB);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -1165,7 +1167,7 @@ static unsigned char *track_type_lba(struct
>>> scsi_cmd *cmd, unsigned char *data,
>>>
>>> /* we do not understand/support this profile */
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, NOT_READY, ASC_INVALID_FIELD_IN_CDB);
>>> + bs_sense_data_build(cmd, NOT_READY, ASC_INVALID_FIELD_IN_CDB);
>>> return NULL;
>>> }
>>>
>>> @@ -1179,8 +1181,8 @@ static unsigned char *track_type_track(struct
>>> scsi_cmd *cmd,
>>> case PROFILE_DVD_PLUS_R:
>>> if (!lba) {
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, NOT_READY,
>>> - ASC_INVALID_FIELD_IN_CDB);
>>> + bs_sense_data_build(cmd, NOT_READY,
>>> + ASC_INVALID_FIELD_IN_CDB);
>>> return NULL;
>>> }
>>>
>>> @@ -1258,8 +1260,8 @@ static unsigned char *track_type_track(struct
>>> scsi_cmd *cmd,
>>> /* we only have one track */
>>> if (lba != 1) {
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, NOT_READY,
>>> - ASC_INVALID_FIELD_IN_CDB);
>>> + bs_sense_data_build(cmd, NOT_READY,
>>> + ASC_INVALID_FIELD_IN_CDB);
>>> return NULL;
>>> }
>>>
>>> @@ -1333,7 +1335,7 @@ static unsigned char *track_type_track(struct
>>> scsi_cmd *cmd,
>>>
>>> /* we do not understand/support this profile */
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, NOT_READY, ASC_INVALID_FIELD_IN_CDB);
>>> + bs_sense_data_build(cmd, NOT_READY, ASC_INVALID_FIELD_IN_CDB);
>>> return NULL;
>>> }
>>>
>>> @@ -1363,7 +1365,7 @@ static int mmc_read_track_information(int host_no,
>>> struct scsi_cmd *cmd)
>>>
>>> if (mmc->current_profile == PROFILE_NO_PROFILE) {
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, NOT_READY, ASC_MEDIUM_NOT_PRESENT);
>>> + bs_sense_data_build(cmd, NOT_READY,
>>> ASC_MEDIUM_NOT_PRESENT);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -1398,7 +1400,7 @@ static int mmc_read_track_information(int host_no,
>>> struct scsi_cmd *cmd)
>>>
>>> /* we do not understand this track type */
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, NOT_READY, ASC_INVALID_FIELD_IN_CDB);
>>> + bs_sense_data_build(cmd, NOT_READY, ASC_INVALID_FIELD_IN_CDB);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -1415,11 +1417,12 @@ static int mmc_read_buffer_capacity(int host_no,
>>> struct scsi_cmd *cmd)
>>> switch (mmc->current_profile) {
>>> case PROFILE_NO_PROFILE:
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, NOT_READY, ASC_MEDIUM_NOT_PRESENT);
>>> + bs_sense_data_build(cmd, NOT_READY,
>>> ASC_MEDIUM_NOT_PRESENT);
>>> return SAM_STAT_CHECK_CONDITION;
>>> case PROFILE_DVD_ROM:
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, ILLEGAL_REQUEST,
>>> ASC_IMCOMPATIBLE_FORMAT);
>>> + bs_sense_data_build(cmd, ILLEGAL_REQUEST,
>>> + ASC_IMCOMPATIBLE_FORMAT);
>>> return SAM_STAT_CHECK_CONDITION;
>>> case PROFILE_DVD_PLUS_R:
>>> /* data length */
>>> @@ -1453,7 +1456,7 @@ static int mmc_read_buffer_capacity(int host_no,
>>> struct scsi_cmd *cmd)
>>> }
>>>
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, MEDIUM_ERROR, ASC_INVALID_FIELD_IN_CDB);
>>> + bs_sense_data_build(cmd, MEDIUM_ERROR, ASC_INVALID_FIELD_IN_CDB);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -1463,7 +1466,7 @@ static int mmc_synchronize_cache(int host_no,
>>> struct scsi_cmd *cmd)
>>>
>>> if (mmc->current_profile == PROFILE_NO_PROFILE) {
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, NOT_READY, ASC_MEDIUM_NOT_PRESENT);
>>> + bs_sense_data_build(cmd, NOT_READY,
>>> ASC_MEDIUM_NOT_PRESENT);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -1621,7 +1624,7 @@ static unsigned char *perf_type_write_speed(struct
>>> scsi_cmd *cmd,
>>>
>>> /* we do not understand/support this command */
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, NOT_READY, ASC_INVALID_FIELD_IN_CDB);
>>> + bs_sense_data_build(cmd, NOT_READY, ASC_INVALID_FIELD_IN_CDB);
>>> return NULL;
>>> }
>>>
>>> @@ -1643,7 +1646,7 @@ static unsigned char *perf_type_perf_data(struct
>>> scsi_cmd *cmd,
>>> /* all other values for tolerance are reserved */
>>> if (tolerance != 0x02) {
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, NOT_READY,
>>> ASC_INVALID_FIELD_IN_CDB);
>>> + bs_sense_data_build(cmd, NOT_READY,
>>> ASC_INVALID_FIELD_IN_CDB);
>>> return NULL;
>>> }
>>>
>>> @@ -1661,7 +1664,7 @@ static unsigned char *perf_type_perf_data(struct
>>> scsi_cmd *cmd,
>>> case 3:
>>> /* reserved */
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, NOT_READY,
>>> ASC_INVALID_FIELD_IN_CDB);
>>> + bs_sense_data_build(cmd, NOT_READY,
>>> ASC_INVALID_FIELD_IN_CDB);
>>> return NULL;
>>> }
>>>
>>> @@ -1769,7 +1772,7 @@ static int mmc_get_performance(int host_no, struct
>>> scsi_cmd *cmd)
>>> }
>>> /* we do not understand/support this command */
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, NOT_READY, ASC_INVALID_FIELD_IN_CDB);
>>> + bs_sense_data_build(cmd, NOT_READY, ASC_INVALID_FIELD_IN_CDB);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -1802,7 +1805,7 @@ static unsigned char *dvd_format_phys_info(struct
>>> scsi_cmd *cmd,
>>> if (layer) {
>>> /* we only support single layer disks */
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, NOT_READY,
>>> ASC_INVALID_FIELD_IN_CDB);
>>> + bs_sense_data_build(cmd, NOT_READY,
>>> ASC_INVALID_FIELD_IN_CDB);
>>> return NULL;
>>> }
>>>
>>> @@ -1928,7 +1931,7 @@ static unsigned char *dvd_format_phys_info(struct
>>> scsi_cmd *cmd,
>>> break;
>>> default:
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, NOT_READY, ASC_MEDIUM_NOT_PRESENT);
>>> + bs_sense_data_build(cmd, NOT_READY,
>>> ASC_MEDIUM_NOT_PRESENT);
>>> return NULL;
>>> }
>>>
>>> @@ -1960,7 +1963,7 @@ static unsigned char *dvd_format_adip_info(struct
>>> scsi_cmd *cmd,
>>> break;
>>> default:
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, NOT_READY, ASC_MEDIUM_NOT_PRESENT);
>>> + bs_sense_data_build(cmd, NOT_READY,
>>> ASC_MEDIUM_NOT_PRESENT);
>>> return NULL;
>>> }
>>>
>>> @@ -2050,7 +2053,7 @@ static unsigned char
>>> *dvd_format_copyright_info(struct scsi_cmd *cmd,
>>> if (layer) {
>>> /* we only support single layer disks */
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, NOT_READY,
>>> ASC_INVALID_FIELD_IN_CDB);
>>> + bs_sense_data_build(cmd, NOT_READY,
>>> ASC_INVALID_FIELD_IN_CDB);
>>> return NULL;
>>> }
>>>
>>> @@ -2118,7 +2121,7 @@ static int mmc_read_dvd_structure(int host_no,
>>> struct scsi_cmd *cmd)
>>>
>>> if (mmc->current_profile == PROFILE_NO_PROFILE) {
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, NOT_READY, ASC_MEDIUM_NOT_PRESENT);
>>> + bs_sense_data_build(cmd, NOT_READY,
>>> ASC_MEDIUM_NOT_PRESENT);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -2155,7 +2158,7 @@ static int mmc_read_dvd_structure(int host_no,
>>> struct scsi_cmd *cmd)
>>>
>>> /* we do not understand this format */
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, NOT_READY, ASC_INVALID_FIELD_IN_CDB);
>>> + bs_sense_data_build(cmd, NOT_READY, ASC_INVALID_FIELD_IN_CDB);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> diff --git a/usr/sbc.c b/usr/sbc.c
>>> index c4f012c..24625fd 100644
>>> --- a/usr/sbc.c
>>> +++ b/usr/sbc.c
>>> @@ -44,6 +44,7 @@
>>> #include "scsi.h"
>>> #include "spc.h"
>>> #include "tgtadm_error.h"
>>> +#include "bs.h"
>>>
>>> #define DEFAULT_BLK_SHIFT 9
>>>
>>> @@ -76,7 +77,7 @@ static int sbc_mode_page_update(struct scsi_cmd *cmd,
>>> uint8_t *data, int *change
>>> if (data[0] & 0x40)
>>> subpcode = data[1];
>>>
>>> - pg = find_mode_page(cmd->dev, pcode, subpcode);
>>> + pg = bs_find_mode_page(cmd->dev, pcode, subpcode);
>>> if (pg == NULL)
>>> return 1;
>>>
>>> @@ -181,7 +182,7 @@ static int sbc_format_unit(int host_no, struct
>>> scsi_cmd *cmd)
>>> return SAM_STAT_GOOD;
>>>
>>> sense:
>>> - sense_data_build(cmd, key, asc);
>>> + bs_sense_data_build(cmd, key, asc);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -235,7 +236,7 @@ sense:
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> scsi_set_out_resid_by_actual(cmd, 0);
>>>
>>> - sense_data_build(cmd, key, asc);
>>> + bs_sense_data_build(cmd, key, asc);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -395,7 +396,7 @@ sense:
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> scsi_set_out_resid_by_actual(cmd, 0);
>>>
>>> - sense_data_build(cmd, key, asc);
>>> + bs_sense_data_build(cmd, key, asc);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -453,7 +454,7 @@ overflow:
>>> return SAM_STAT_GOOD;
>>> sense:
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, key, asc);
>>> + bs_sense_data_build(cmd, key, asc);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -519,7 +520,7 @@ static int sbc_verify(int host_no, struct scsi_cmd
>>> *cmd)
>>>
>>> sense:
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, key, asc);
>>> + bs_sense_data_build(cmd, key, asc);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -566,7 +567,7 @@ static int sbc_readcapacity16(int host_no, struct
>>> scsi_cmd *cmd)
>>> return SAM_STAT_GOOD;
>>>
>>> sense:
>>> - sense_data_build(cmd, key, asc);
>>> + bs_sense_data_build(cmd, key, asc);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -643,7 +644,7 @@ static int sbc_getlbastatus(int host_no, struct
>>> scsi_cmd *cmd)
>>> return SAM_STAT_GOOD;
>>>
>>> sense:
>>> - sense_data_build(cmd, key, asc);
>>> + bs_sense_data_build(cmd, key, asc);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -667,7 +668,7 @@ static int sbc_service_action(int host_no, struct
>>> scsi_cmd *cmd)
>>>
>>> if (!service_action) {
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, ILLEGAL_REQUEST,
>>> + bs_sense_data_build(cmd, ILLEGAL_REQUEST,
>>> ASC_INVALID_FIELD_IN_CDB);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>> @@ -710,7 +711,7 @@ static int sbc_sync_cache(int host_no, struct
>>> scsi_cmd *cmd)
>>> }
>>>
>>> sense:
>>> - sense_data_build(cmd, key, asc);
>>> + bs_sense_data_build(cmd, key, asc);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> diff --git a/usr/scsi.c b/usr/scsi.c
>>> index 2636a5c..5606b5b 100644
>>> --- a/usr/scsi.c
>>> +++ b/usr/scsi.c
>>> @@ -37,6 +37,7 @@
>>> #include "driver.h"
>>> #include "scsi.h"
>>> #include "spc.h"
>>> +#include "bs.h"
>>>
>>> static unsigned char scsi_command_size[8] = {6, 10, 10, 12, 16, 12, 10,
>>> 10};
>>>
>>> @@ -275,28 +276,6 @@ const unsigned char
>>> *get_scsi_cdb_usage_data(unsigned char op, unsigned char sa)
>>> return usage;
>>> }
>>>
>>> -void sense_data_build(struct scsi_cmd *cmd, uint8_t key, uint16_t asc)
>>> -{
>>> -
>>> - if (cmd->dev->attrs.sense_format) {
>>> - /* descriptor format */
>>> - cmd->sense_buffer[0] = 0x72; /* current, not deferred */
>>> - cmd->sense_buffer[1] = key;
>>> - cmd->sense_buffer[2] = (asc >> 8) & 0xff;
>>> - cmd->sense_buffer[3] = asc & 0xff;
>>> - cmd->sense_len = 8;
>>> - } else {
>>> - /* fixed format */
>>> - int len = 0xa;
>>> - cmd->sense_buffer[0] = 0x70; /* current, not deferred */
>>> - cmd->sense_buffer[2] = key;
>>> - cmd->sense_buffer[7] = len;
>>> - cmd->sense_buffer[12] = (asc >> 8) & 0xff;
>>> - cmd->sense_buffer[13] = asc & 0xff;
>>> - cmd->sense_len = len + 8;
>>> - }
>>> -}
>>> -
>>> #define TGT_INVALID_DEV_ID ~0ULL
>>>
>>> static uint64_t __scsi_get_devid(uint8_t *p)
>>> @@ -448,7 +427,7 @@ int scsi_cmd_perform(int host_no, struct scsi_cmd
>>> *cmd)
>>> * We don't support ACA. SAM-3 and SAM-4 say that a
>>> * logical unit MAY support ACA.
>>> */
>>> - sense_data_build(cmd,
>>> + bs_sense_data_build(cmd,
>>> ILLEGAL_REQUEST,
>>> ASC_INVALID_FIELD_IN_CDB);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>> @@ -458,10 +437,12 @@ int scsi_cmd_perform(int host_no, struct scsi_cmd
>>> *cmd)
>>> case INQUIRY:
>>> break;
>>> case REQUEST_SENSE:
>>> - sense_data_build(cmd, ILLEGAL_REQUEST,
>>> ASC_LUN_NOT_SUPPORTED);
>>> + bs_sense_data_build(cmd, ILLEGAL_REQUEST,
>>> + ASC_LUN_NOT_SUPPORTED);
>>> return SAM_STAT_GOOD;
>>> default:
>>> - sense_data_build(cmd, ILLEGAL_REQUEST,
>>> ASC_LUN_NOT_SUPPORTED);
>>> + bs_sense_data_build(cmd, ILLEGAL_REQUEST,
>>> + ASC_LUN_NOT_SUPPORTED);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>> }
>>> diff --git a/usr/smc.c b/usr/smc.c
>>> index 910b532..ca5e054 100644
>>> --- a/usr/smc.c
>>> +++ b/usr/smc.c
>>> @@ -47,6 +47,7 @@
>>> #include "parser.h"
>>> #include "smc.h"
>>> #include "media.h"
>>> +#include "bs.h"
>>>
>>> static int check_slot_removable(struct slot *s)
>>> {
>>> @@ -396,7 +397,7 @@ sense:
>>> if (data)
>>> free(data);
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, key, asc);
>>> + bs_sense_data_build(cmd, key, asc);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -487,7 +488,7 @@ static int smc_move_medium(int host_no, struct
>>> scsi_cmd *cmd)
>>>
>>> sense:
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, key, asc);
>>> + bs_sense_data_build(cmd, key, asc);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -627,7 +628,7 @@ static tgtadm_err add_slt(struct scsi_lu *lu, struct
>>> tmp_param *tmp)
>>> int qnty_save;
>>> int i;
>>>
>>> - pg = find_mode_page(lu, 0x1d, 0);
>>> + pg = bs_find_mode_page(lu, 0x1d, 0);
>>> if (!pg) {
>>> dprintf("Failed to find Element Address Assignment mode
>>> pg\n");
>>> return TGTADM_UNKNOWN_ERR;
>>> @@ -694,7 +695,7 @@ static tgtadm_err config_slot(struct scsi_lu *lu,
>>> struct tmp_param *tmp)
>>> switch(tmp->element_type) {
>>> case ELEMENT_MEDIUM_TRANSPORT:
>>> /* If medium has more than one side, set the 'rotate'
>>> bit */
>>> - m = find_mode_page(lu, 0x1e, 0);
>>> + m = bs_find_mode_page(lu, 0x1e, 0);
>>> if (m) {
>>> m->mode_data[0] = (tmp->sides > 1) ? 1 : 0;
>>> adm_err = TGTADM_SUCCESS;
>>> diff --git a/usr/spc.c b/usr/spc.c
>>> index 15077ca..c8dc937 100644
>>> --- a/usr/spc.c
>>> +++ b/usr/spc.c
>>> @@ -35,6 +35,7 @@
>>> #include "tgtadm_error.h"
>>> #include "scsi.h"
>>> #include "spc.h"
>>> +#include "bs.h"
>>>
>>> #define INQUIRY_EVPD 0x01
>>>
>>> @@ -317,7 +318,7 @@ int spc_inquiry(int host_no, struct scsi_cmd *cmd)
>>> return SAM_STAT_GOOD;
>>> sense:
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, key, asc);
>>> + bs_sense_data_build(cmd, key, asc);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -364,7 +365,7 @@ int spc_report_luns(int host_no, struct scsi_cmd
>>> *cmd)
>>> return SAM_STAT_GOOD;
>>> sense:
>>> scsi_set_in_resid_by_actual(cmd, 0);
>>> - sense_data_build(cmd, key, asc);
>>> + bs_sense_data_build(cmd, key, asc);
>>> return SAM_STAT_CHECK_CONDITION;
>>> }
>>>
>>> @@ -389,11 +390,11 @@ int spc_start_stop(int host_no, struct scsi_cmd
>>> *cmd)
>>> if (lu_prevent_removal(cmd->dev)) {
>>> if (cmd->dev->attrs.online) {
>>> /* online == media is present */
>>> - sense_data_build(cmd, ILLEGAL_REQUEST,
>>> + bs_sense_data_build(cmd, ILLEGAL_REQUEST,
>>> ASC_MEDIUM_REMOVAL_PREVENTED);
>>> } else {
>>> /* !online == media is not present */
>>> - sense_data_build(cmd, NOT_READY,
>>> + bs_sense_data_build(cmd, NOT_READY,
>>> ASC_MEDIUM_REMOVAL_PREVENTED);
>>> }
>>> return SAM_STAT_CHECK_CONDITION;
>>> @@ -415,9 +416,9 @@ int spc_test_unit(int host_no, struct scsi_cmd *cmd)
>>> if (cmd->dev->attrs.online)
>>> return SAM_STAT_GOOD;
>>> if (cmd->dev->attrs.removable)
>>> - sense_data_build(cmd, NOT_READY, ASC_MEDIUM_NOT_PRESENT);
--
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