[stgt] [PATCH] Add bsopts flag
Dan Mick
dan.mick at inktank.com
Mon Oct 28 19:17:28 CET 2013
tgtadm: accept and pass bsopts
spc.c: permit bsopts as a legal option
target.c: accept bsopts=
tgtd.h: add char *bsopts to bs_init signature
bs_*.c: add char *bsopts as second arg to bs_init function
tgt-admin: process bsopts
doc/tgtadm.8.xml: add doc for bsopts and example
Signed-off-by: Dan Mick <dan.mick at inktank.com>
---
doc/tgtadm.8.xml | 20 +++++++++++++++++---
scripts/tgt-admin | 13 ++++++++++++-
usr/bs_aio.c | 2 +-
usr/bs_rbd.c | 3 ++-
usr/bs_rdwr.c | 2 +-
usr/bs_sg.c | 2 +-
usr/bs_sheepdog.c | 2 +-
usr/bs_ssc.c | 2 +-
usr/spc.c | 3 ++-
usr/target.c | 12 +++++++++---
usr/tgtadm.c | 18 +++++++++++++-----
usr/tgtd.h | 2 +-
12 files changed, 61 insertions(+), 20 deletions(-)
diff --git a/doc/tgtadm.8.xml b/doc/tgtadm.8.xml
index 28a5ede..ffff3a7 100644
--- a/doc/tgtadm.8.xml
+++ b/doc/tgtadm.8.xml
@@ -26,6 +26,7 @@
<arg choice="opt">-l --lun <lun></arg>
<arg choice="opt">-b --backing-store <path></arg>
<arg choice="opt">-f --bsoflags {direct|sync}</arg>
+ <arg choice="opt">-S --bsopts {backing-store opt string}</arg>
<arg choice="opt">-E --bstype <type></arg>
<arg choice="opt">-I --initiator-address <address></arg>
<arg choice="opt">-Q --initiator-name <name></arg>
@@ -153,16 +154,28 @@ Possible backend types are:
</listitem>
</varlistentry>
- <varlistentry><term><option>--lld <driver> --op new --mode logicalunit --tid <id> --lun <lun> --backing-store <path></option></term>
+ <varlistentry><term><option>--lld <driver> --op new --mode logicalunit --tid <id> --lun <lun> --backing-store <path> --bsopts=<backing store options></option></term>
<listitem>
<para>
Add a new logical unit with <lun> to specific target with <id>. The
logical unit is offered to the initiators. <path> must be block device
files (including LVM and RAID devices) or regular files, or an RBD image or
- snapshot name for --driver rbd. lun0 is reserved for a special device
+ snapshot name for --bstype rbd. lun0 is reserved for a special device
automatically created.
</para>
- </listitem>
+ <screen format="linespecific">
+Example:
+If tgt is compiled with the bs_rbd backing store for
+Ceph RBD images (see tgtadm --mode system --op show to
+verify), set up a target mapping the rbd image named
+"rbdimage", and pass options to bs_rbd:
+
+tgtadm --lld iscsi --op new --mode logicalunit --tid 1 \
+--lun 1 --bstype=rbd --backing-store=rbdimage \
+--bsopts="conf=/etc/ceph/ceph.conf;id=tgt"
+
+ </screen>
+ </listitem>
</varlistentry>
<varlistentry><term><option>--lld <driver> --op delete --mode logicalunit --tid <id> --lun <lun></option></term>
@@ -607,6 +620,7 @@ Example:
Open the backing file with O_SYNC.
tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 --bsoflags="sync" --backing-store=/data/100m_image.raw
+
</screen>
</refsect1>
diff --git a/scripts/tgt-admin b/scripts/tgt-admin
index 8dfc01d..5486507 100755
--- a/scripts/tgt-admin
+++ b/scripts/tgt-admin
@@ -492,6 +492,7 @@ sub add_backing_direct {
my @exec_commands;
my $device_type;
my $bs_type;
+ my $bsopts;
my $block_size;
my %luns;
my @added_luns;
@@ -543,6 +544,10 @@ sub add_backing_direct {
$bs_type = $result;
$params_added{$store_option} = 1;
}
+ if ($store_option eq "bsopts") {
+ $bsopts = $result;
+ $params_added{$store_option} = 1;
+ }
if ($store_option eq "block-size") {
$block_size = $result;
$params_added{$store_option} = 1;
@@ -694,6 +699,11 @@ sub add_backing_direct {
check_if_hash_array($$target_options_ref{"bs-type"}, "bs-type");
$bs_type = $$target_options_ref{"bs-type"};
}
+ # bsopts
+ if ($params_added{"bsopts"} ne 1) {
+ check_if_hash_array($$target_options_ref{"bsopts"}, "bsopts");
+ $bsopts = $$target_options_ref{"bsopts"};
+ }
} else {
print "If you got here, this means your config file is not supported.\n";
print "Please report it to stgt mailing list and attach your config files.\n";
@@ -702,8 +712,9 @@ sub add_backing_direct {
# Execute commands for a given LUN
if (length $device_type) { $device_type = "--device-type $device_type" };
if (length $bs_type) { $bs_type = "--bstype $bs_type" };
+ if (length $bsopts) { $bsopts = "--bsopts $bsopts" };
if (length $block_size) { $block_size = "--blocksize $block_size" };
- execute("tgtadm -C $control_port --lld $driver --op new --mode logicalunit --tid $next_tid --lun $lun -b $backing_store $device_type $bs_type $block_size");
+ execute("tgtadm -C $control_port --lld $driver --op new --mode logicalunit --tid $next_tid --lun $lun -b $backing_store $device_type $bs_type $bsopts $block_size");
# Commands should be executed in order
my @execute_last;
diff --git a/usr/bs_aio.c b/usr/bs_aio.c
index cc59cf6..32ceec5 100644
--- a/usr/bs_aio.c
+++ b/usr/bs_aio.c
@@ -380,7 +380,7 @@ static void bs_aio_close(struct scsi_lu *lu)
close(lu->fd);
}
-static tgtadm_err bs_aio_init(struct scsi_lu *lu)
+static tgtadm_err bs_aio_init(struct scsi_lu *lu, char *bsopts)
{
struct bs_aio_info *info = BS_AIO_I(lu);
int i;
diff --git a/usr/bs_rbd.c b/usr/bs_rbd.c
index 82c516f..77b27f7 100644
--- a/usr/bs_rbd.c
+++ b/usr/bs_rbd.c
@@ -466,7 +466,7 @@ static void bs_rbd_close(struct scsi_lu *lu)
}
}
-static tgtadm_err bs_rbd_init(struct scsi_lu *lu)
+static tgtadm_err bs_rbd_init(struct scsi_lu *lu, char *bsopts)
{
tgtadm_err ret = TGTADM_UNKNOWN_ERR;
int rados_ret;
@@ -474,6 +474,7 @@ static tgtadm_err bs_rbd_init(struct scsi_lu *lu)
struct active_rbd *rbd = RBDP(lu);
rados_ret = rados_create(&rbd->cluster, NULL);
+ eprintf("bs_rbd_init bsopts=%s\n", bsopts);
if (rados_ret < 0) {
eprintf("bs_rbd_init: rados_create: %d\n", rados_ret);
return ret;
diff --git a/usr/bs_rdwr.c b/usr/bs_rdwr.c
index 47d2d99..ff009eb 100644
--- a/usr/bs_rdwr.c
+++ b/usr/bs_rdwr.c
@@ -398,7 +398,7 @@ static void bs_rdwr_close(struct scsi_lu *lu)
close(lu->fd);
}
-static tgtadm_err bs_rdwr_init(struct scsi_lu *lu)
+static tgtadm_err bs_rdwr_init(struct scsi_lu *lu, char *bsopts)
{
struct bs_thread_info *info = BS_THREAD_I(lu);
diff --git a/usr/bs_sg.c b/usr/bs_sg.c
index 5f1e687..66f4a3b 100644
--- a/usr/bs_sg.c
+++ b/usr/bs_sg.c
@@ -420,7 +420,7 @@ static int init_sg_device(int fd)
return 0;
}
-static tgtadm_err bs_sg_init(struct scsi_lu *lu)
+static tgtadm_err bs_sg_init(struct scsi_lu *lu, char *bsopts)
{
/*
* Setup struct scsi_lu->cmd_perform() passthrough pointer
diff --git a/usr/bs_sheepdog.c b/usr/bs_sheepdog.c
index 1eb09c0..cfe1046 100644
--- a/usr/bs_sheepdog.c
+++ b/usr/bs_sheepdog.c
@@ -1245,7 +1245,7 @@ static void bs_sheepdog_close(struct scsi_lu *lu)
sd_close(ai);
}
-static tgtadm_err bs_sheepdog_init(struct scsi_lu *lu)
+static tgtadm_err bs_sheepdog_init(struct scsi_lu *lu, char *bsopts)
{
struct bs_thread_info *info = BS_THREAD_I(lu);
struct sheepdog_access_info *ai =
diff --git a/usr/bs_ssc.c b/usr/bs_ssc.c
index 117e274..a7e062d 100644
--- a/usr/bs_ssc.c
+++ b/usr/bs_ssc.c
@@ -610,7 +610,7 @@ static void tape_rdwr_request(struct scsi_cmd *cmd)
cmd, cmd->scb[0], ret, length, cmd->offset);
}
-static tgtadm_err bs_ssc_init(struct scsi_lu *lu)
+static tgtadm_err bs_ssc_init(struct scsi_lu *lu, char *bsopts)
{
struct bs_thread_info *info = BS_THREAD_I(lu);
return bs_thread_open(info, tape_rdwr_request, 1);
diff --git a/usr/spc.c b/usr/spc.c
index 00e0dd7..88fdf7d 100644
--- a/usr/spc.c
+++ b/usr/spc.c
@@ -1869,7 +1869,7 @@ enum {
Opt_optimal_xfer_gran, Opt_optimal_xfer_len,
Opt_removable, Opt_readonly, Opt_online,
Opt_mode_page,
- Opt_path,
+ Opt_path, Opt_bsopts,
Opt_bsoflags, Opt_thinprovisioning,
Opt_err,
};
@@ -1890,6 +1890,7 @@ static match_table_t tokens = {
{Opt_online, "online=%s"},
{Opt_mode_page, "mode_page=%s"},
{Opt_path, "path=%s"},
+ {Opt_bsopts, "bsopts=%s"},
{Opt_bsoflags, "bsoflags=%s"},
{Opt_thinprovisioning, "thin_provisioning=%s"},
{Opt_err, NULL},
diff --git a/usr/target.c b/usr/target.c
index b1729b3..257135d 100644
--- a/usr/target.c
+++ b/usr/target.c
@@ -457,12 +457,13 @@ __device_lookup(int tid, uint64_t lun, struct target **t)
}
enum {
- Opt_path, Opt_bstype, Opt_bsoflags, Opt_blocksize, Opt_err,
+ Opt_path, Opt_bstype, Opt_bsopts, Opt_bsoflags, Opt_blocksize, Opt_err,
};
static match_table_t device_tokens = {
{Opt_path, "path=%s"},
{Opt_bstype, "bstype=%s"},
+ {Opt_bsopts, "bsopts=%s"},
{Opt_bsoflags, "bsoflags=%s"},
{Opt_blocksize, "blocksize=%s"},
{Opt_err, NULL},
@@ -473,7 +474,7 @@ static void __cmd_done(struct target *, struct scsi_cmd *);
tgtadm_err tgt_device_create(int tid, int dev_type, uint64_t lun, char *params,
int backing)
{
- char *p, *path = NULL, *bstype = NULL;
+ char *p, *path = NULL, *bstype = NULL, *bsopts = NULL;
char *bsoflags = NULL, *blocksize = NULL;
int lu_bsoflags = 0;
tgtadm_err adm_err = TGTADM_SUCCESS;
@@ -500,6 +501,9 @@ tgtadm_err tgt_device_create(int tid, int dev_type, uint64_t lun, char *params,
case Opt_bstype:
bstype = match_strdup(&args[0]);
break;
+ case Opt_bsopts:
+ bsopts = match_strdup(&args[0]);
+ break;
case Opt_bsoflags:
bsoflags = match_strdup(&args[0]);
break;
@@ -618,7 +622,9 @@ tgtadm_err tgt_device_create(int tid, int dev_type, uint64_t lun, char *params,
}
if (lu->bst->bs_init) {
- adm_err = lu->bst->bs_init(lu);
+ if (bsopts)
+ dprintf("bsopts=%s\n", bsopts);
+ adm_err = lu->bst->bs_init(lu, bsopts);
if (adm_err)
goto fail_lu_init;
}
diff --git a/usr/tgtadm.c b/usr/tgtadm.c
index 7c6deae..91e46c9 100644
--- a/usr/tgtadm.c
+++ b/usr/tgtadm.c
@@ -112,6 +112,7 @@ struct option const long_options[] = {
{"value", required_argument, NULL, 'v'},
{"backing-store", required_argument, NULL, 'b'},
{"bstype", required_argument, NULL, 'E'},
+ {"bsopts", required_argument, NULL, 'S'},
{"bsoflags", required_argument, NULL, 'f'},
{"blocksize", required_argument, NULL, 'y'},
{"targetname", required_argument, NULL, 'T'},
@@ -130,7 +131,7 @@ struct option const long_options[] = {
};
static char *short_options =
- "dhVL:o:m:t:s:c:l:n:v:b:E:f:y:T:I:Q:u:p:H:F:P:B:Y:O:C:";
+ "dhVL:o:m:t:s:c:l:n:v:b:E:f:y:T:I:Q:u:p:H:F:P:B:Y:O:C:S:";
static void usage(int status)
{
@@ -161,12 +162,13 @@ static void usage(int status)
"--lld <driver> --mode target --op unbind --tid <id> --initiator-name <name>\n"
"\tdisable the specific permitted initiators.\n"
"--lld <driver> --mode logicalunit --op new --tid <id> --lun <lun>\n"
- " --backing-store <path> --bstype <type> --bsoflags <options>\n"
+ " --backing-store <path> --bstype <type> --bsopts <bs options> --bsoflags <options>\n"
"\tadd a new logical unit with <lun> to the specific\n"
"\ttarget with <id>. The logical unit is offered\n"
"\tto the initiators. <path> must be block device files\n"
"\t(including LVM and RAID devices) or regular files.\n"
"\tbstype option is optional.\n"
+ "\tbsopts are specific to the bstype.\n"
"\tbsoflags supported options are sync and direct\n"
"\t(sync:direct for both).\n"
"--lld <driver> --mode logicalunit --op delete --tid <id> --lun <lun>\n"
@@ -484,7 +486,7 @@ int main(int argc, char **argv)
uint32_t cid, hostno;
uint64_t sid, lun, force;
char *name, *value, *path, *targetname, *address, *iqnname, *targetOps;
- char *portalOps, *bstype;
+ char *portalOps, *bstype, *bsopts;
char *bsoflags;
char *blocksize;
char *user, *password;
@@ -499,7 +501,7 @@ int main(int argc, char **argv)
dev_type = TYPE_DISK;
ac_dir = ACCOUNT_TYPE_INCOMING;
name = value = path = targetname = address = iqnname = NULL;
- targetOps = portalOps = bstype = NULL;
+ targetOps = portalOps = bstype = bsopts = NULL;
bsoflags = blocksize = user = password = NULL;
force = 0;
@@ -587,6 +589,9 @@ int main(int argc, char **argv)
case 'E':
bstype = optarg;
break;
+ case 'S':
+ bsopts = optarg;
+ break;
case 'Y':
dev_type = str_to_device_type(optarg);
break;
@@ -809,7 +814,7 @@ int main(int argc, char **argv)
}
switch (op) {
case OP_NEW:
- rc = verify_mode_params(argc, argv, "LmofytlbEYC");
+ rc = verify_mode_params(argc, argv, "LmofytlbEYCS");
if (rc) {
eprintf("target mode: option '-%c' is not "
"allowed/supported\n", rc);
@@ -935,6 +940,9 @@ int main(int argc, char **argv)
else if (bstype)
concat_printf(&b, "%sbstype=%s", concat_delim(&b, ","),
bstype);
+ if (bsopts)
+ concat_printf(&b, "%sbsopts=%s", concat_delim(&b, ","),
+ bsopts);
if (bsoflags)
concat_printf(&b, "%sbsoflags=%s", concat_delim(&b, ","),
bsoflags);
diff --git a/usr/tgtd.h b/usr/tgtd.h
index 484e6e9..b0528b4 100644
--- a/usr/tgtd.h
+++ b/usr/tgtd.h
@@ -161,7 +161,7 @@ struct backingstore_template {
int bs_datasize;
int (*bs_open)(struct scsi_lu *dev, char *path, int *fd, uint64_t *size);
void (*bs_close)(struct scsi_lu *dev);
- tgtadm_err (*bs_init)(struct scsi_lu *dev);
+ tgtadm_err (*bs_init)(struct scsi_lu *dev, char *bsopts);
void (*bs_exit)(struct scsi_lu *dev);
int (*bs_cmd_submit)(struct scsi_cmd *cmd);
int bs_oflags_supported;
--
1.7.10.4
--
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