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@xxxxxxxxxxx> --- 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 d374172..a0a7d26 100755 --- a/scripts/tgt-admin +++ b/scripts/tgt-admin @@ -490,6 +490,7 @@ sub add_backing_direct { my @exec_commands; my $device_type; my $bs_type; + my $bsopts; my $block_size; my %luns; my @added_luns; @@ -541,6 +542,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; @@ -692,6 +697,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"; @@ -700,8 +710,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 f1dd77d..9e34e73 100644 --- a/usr/bs_rbd.c +++ b/usr/bs_rbd.c @@ -476,13 +476,14 @@ 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; struct bs_thread_info *info = BS_THREAD_I(lu); rados_ret = rados_create(&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 4b5a951..3f6647b 100644 --- a/usr/bs_sheepdog.c +++ b/usr/bs_sheepdog.c @@ -987,7 +987,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@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html