[stgt] [PATCH] tgt-admin: add option to restart llds
ronnie sahlberg
ronniesahlberg at gmail.com
Sun Jun 3 08:56:31 CEST 2012
Can you also create a patch to describe this and an example use-case
in the manpage ?
On Sun, Jun 3, 2012 at 4:52 PM, Roi Dayan <roid at mellanox.com> wrote:
> This patch allows to stop and start lld without restarting tgtd.
> Example:
> tgtadm --mode lld --lld iser --op start
>
> Signed-off-by: Roi Dayan <roid at mellanox.com>
> ---
> Hi Tomo,
>
> The patch adds option to stop and start lld without restarting the tgtd process.
> Then for example if tgtd was started before the rdma modules were loaded then we
> can later load the modules and call iser init() with:
> tgtadm --mode lld --lld iser --op start
>
> Thanks,
> Roi
>
>
> usr/mgmt.c | 45 ++++++++++++++++++++++++++++++++++++++++++++-
> usr/target.c | 13 +++++++++++++
> usr/tgtadm.c | 25 +++++++++++++++++++++++++
> usr/tgtadm.h | 3 +++
> usr/tgtd.c | 35 ++++++++++++++++++++++-------------
> usr/tgtd.h | 3 +++
> 6 files changed, 110 insertions(+), 14 deletions(-)
>
> diff --git a/usr/mgmt.c b/usr/mgmt.c
> index ef1b265..1a86333 100644
> --- a/usr/mgmt.c
> +++ b/usr/mgmt.c
> @@ -371,6 +371,43 @@ static tgtadm_err connection_mgmt(int lld_no, struct mgmt_task *mtask)
> return adm_err;
> }
>
> +static tgtadm_err lld_mgmt(int lld_no, struct mgmt_task *mtask)
> +{
> + struct tgtadm_req *req = &mtask->req;
> + tgtadm_err adm_err = TGTADM_INVALID_REQUEST;
> +
> + switch (req->op) {
> + case OP_START:
> + if (tgt_drivers[lld_no]->drv_state != DRIVER_INIT) {
> + if (lld_init_one(lld_no))
> + adm_err = TGTADM_NO_DRIVER;
> + else
> + adm_err = TGTADM_SUCCESS;
> + } else {
> + adm_err = TGTADM_SUCCESS;
> + }
> + break;
> + case OP_STOP:
> + if (tgt_drivers[lld_no]->drv_state == DRIVER_INIT) {
> + if (tgt_drivers[lld_no]->exit) {
> + tgt_drivers[lld_no]->exit();
> + tgt_drivers[lld_no]->drv_state = DRIVER_EXIT;
> + }
> + }
> + adm_err = TGTADM_SUCCESS;
> + break;
> + case OP_SHOW:
> + concat_buf_init(&mtask->rsp_concat);
> + adm_err = lld_show(&mtask->rsp_concat);
> + concat_buf_finish(&mtask->rsp_concat);
> + break;
> + default:
> + break;
> + }
> +
> + return adm_err;
> +}
> +
> static tgtadm_err mtask_execute(struct mgmt_task *mtask)
> {
> struct tgtadm_req *req = &mtask->req;
> @@ -381,7 +418,10 @@ static tgtadm_err mtask_execute(struct mgmt_task *mtask)
> lld_no = 0;
> else {
> lld_no = get_driver_index(req->lld);
> - if (lld_no < 0 || tgt_drivers[lld_no]->drv_state != DRIVER_INIT) {
> + if (lld_no < 0 ||
> + (tgt_drivers[lld_no]->drv_state != DRIVER_INIT &&
> + req->mode != MODE_LLD))
> + {
> if (lld_no < 0)
> eprintf("can't find the driver %s\n", req->lld);
> else
> @@ -414,6 +454,9 @@ static tgtadm_err mtask_execute(struct mgmt_task *mtask)
> case MODE_CONNECTION:
> adm_err = connection_mgmt(lld_no, mtask);
> break;
> + case MODE_LLD:
> + adm_err = lld_mgmt(lld_no, mtask);
> + break;
> default:
> if (req->op == OP_SHOW && tgt_drivers[lld_no]->show) {
> concat_buf_init(&mtask->rsp_concat);
> diff --git a/usr/target.c b/usr/target.c
> index 68222a0..470ea44 100644
> --- a/usr/target.c
> +++ b/usr/target.c
> @@ -2213,6 +2213,19 @@ tgtadm_err system_show(int mode, struct concat_buf *b)
> return TGTADM_SUCCESS;
> }
>
> +tgtadm_err lld_show(struct concat_buf *b)
> +{
> + int i;
> +
> + concat_printf(b, "LLDs:\n");
> + for (i = 0; tgt_drivers[i]; i++) {
> + concat_printf(b, _TAB1 "%s: %s\n", tgt_drivers[i]->name,
> + driver_state_name(tgt_drivers[i]));
> + }
> +
> + return TGTADM_SUCCESS;
> +}
> +
> void update_lbppbe(struct scsi_lu *lu, int blksize)
> {
> lu->attrs.lbppbe = 0;
> diff --git a/usr/tgtadm.c b/usr/tgtadm.c
> index 92f2dc7..93b92a8 100644
> --- a/usr/tgtadm.c
> +++ b/usr/tgtadm.c
> @@ -407,6 +407,8 @@ static int str_to_mode(char *str)
> return MODE_ACCOUNT;
> else if (!strcmp("stats", str))
> return MODE_STATS;
> + else if (!strcmp("lld", str))
> + return MODE_LLD;
> else {
> eprintf("unknown mode: %s\n", str);
> exit(1);
> @@ -427,6 +429,10 @@ static int str_to_op(char *str)
> return OP_SHOW;
> else if (!strcmp("update", str))
> return OP_UPDATE;
> + else if (!strcmp("start", str))
> + return OP_START;
> + else if (!strcmp("stop", str))
> + return OP_STOP;
> else {
> eprintf("unknown operation: %s\n", str);
> exit(1);
> @@ -861,6 +867,25 @@ int main(int argc, char **argv)
> }
> }
>
> + if (mode == MODE_LLD) {
> + switch (op) {
> + case OP_START:
> + case OP_STOP:
> + case OP_SHOW:
> + rc = verify_mode_params(argc, argv, "LmoC");
> + if (rc) {
> + eprintf("system mode: option '-%c' is not "
> + "allowed/supported\n", rc);
> + exit(EINVAL);
> + }
> + break;
> + default:
> + eprintf("option %d not supported in lld mode\n", op);
> + exit(EINVAL);
> + break;
> + }
> + }
> +
> req->op = op;
> req->tid = tid;
> req->sid = sid;
> diff --git a/usr/tgtadm.h b/usr/tgtadm.h
> index eedcf60..8a80a24 100644
> --- a/usr/tgtadm.h
> +++ b/usr/tgtadm.h
> @@ -15,6 +15,8 @@ enum tgtadm_op {
> OP_BIND,
> OP_UNBIND,
> OP_UPDATE,
> + OP_START,
> + OP_STOP,
> };
>
> enum tgtadm_mode {
> @@ -22,6 +24,7 @@ enum tgtadm_mode {
> MODE_TARGET,
> MODE_DEVICE,
> MODE_PORTAL,
> + MODE_LLD,
>
> MODE_SESSION,
> MODE_CONNECTION,
> diff --git a/usr/tgtd.c b/usr/tgtd.c
> index cba2b66..3111215 100644
> --- a/usr/tgtd.c
> +++ b/usr/tgtd.c
> @@ -63,6 +63,8 @@ static struct option const long_options[] =
>
> static char *short_options = "fC:d:t:Vh";
>
> +static char *spare_args;
> +
> static void usage(int status)
> {
> if (status)
> @@ -416,20 +418,28 @@ retry:
> goto retry;
> }
>
> -static int lld_init(char *args)
> +int lld_init_one(int lld_index)
> {
> - int i, err, nr;
> + int err;
>
> - for (i = nr = 0; tgt_drivers[i]; i++) {
> - if (tgt_drivers[i]->init) {
> - err = tgt_drivers[i]->init(i, args);
> - if (err) {
> - tgt_drivers[i]->drv_state = DRIVER_ERR;
> - continue;
> - }
> - tgt_drivers[i]->drv_state = DRIVER_INIT;
> + if (tgt_drivers[lld_index]->init) {
> + err = tgt_drivers[lld_index]->init(lld_index, spare_args);
> + if (err) {
> + tgt_drivers[lld_index]->drv_state = DRIVER_ERR;
> + return err;
> }
> - nr++;
> + tgt_drivers[lld_index]->drv_state = DRIVER_INIT;
> + }
> + return 0;
> +}
> +
> +static int lld_init(void)
> +{
> + int i, nr;
> +
> + for (i = nr = 0; tgt_drivers[i]; i++) {
> + if (!lld_init_one(i))
> + nr++;
> }
> return nr;
> }
> @@ -487,7 +497,6 @@ int main(int argc, char **argv)
> {
> struct sigaction sa_old;
> struct sigaction sa_new;
> - char *spare_args;
> int err, ch, longindex, nr_lld = 0;
> int is_daemon = 1, is_debug = 0;
> int ret;
> @@ -552,7 +561,7 @@ int main(int argc, char **argv)
>
> spare_args = optind < argc ? argv[optind] : NULL;
>
> - nr_lld = lld_init(spare_args);
> + nr_lld = lld_init();
> if (!nr_lld) {
> fprintf(stderr, "No available low level driver!\n");
> exit(1);
> diff --git a/usr/tgtd.h b/usr/tgtd.h
> index b303e21..13a8c88 100644
> --- a/usr/tgtd.h
> +++ b/usr/tgtd.h
> @@ -245,6 +245,7 @@ extern char *tgt_targetname(int tid);
> extern tgtadm_err tgt_target_show_all(struct concat_buf *b);
> tgtadm_err system_set_state(char *str);
> tgtadm_err system_show(int mode, struct concat_buf *b);
> +tgtadm_err lld_show(struct concat_buf *b);
> int is_system_available(void);
> int is_system_inactive(void);
>
> @@ -330,6 +331,8 @@ extern tgtadm_err dtd_check_removable(int tid, uint64_t lun);
> extern int register_backingstore_template(struct backingstore_template *bst);
> extern struct backingstore_template *get_backingstore_template(const char *name);
>
> +extern int lld_init_one(int lld_index);
> +
> extern int setup_param(char *name, int (*parser)(char *));
>
> extern int bs_init(void);
> --
> 1.7.8.2
>
> --
> 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