[stgt] [PATCH 1/1] tgtd: Patch to add bsoflags options o tgtd.
FUJITA Tomonori
fujita.tomonori at lab.ntt.co.jp
Mon May 17 12:48:52 CEST 2010
On Fri, 14 May 2010 11:34:10 -0300
Daniel Henrique Debonzi <debonzi at linux.vnet.ibm.com> wrote:
> Hi all,
>
> This patch makes possible to add sync and/or direct options to the backing store open flags.
> The command format is like that:
>
> tgtadm --lld iscsi --mode logicalunit --op new --tid 1 --lun 1 --bsoflags="async direct" -b /home/debonzi/develop/iscsi-disk1
> for creating and
Hmm, "async" option doesn't look supported in this patch. Note that we
can't use "async" for bd_sync.c
If you want to use async and direct, then you can just specify
bs_aio.c.
I also think that we open a file with "sync", then we need to modify
WCE bit too.
What open options are you interested in using?
> tgtadm --op update --mode logicalunit --tid 1 --lun 1 --params "bsoflags=sync direct"
> for updating.
>
> It is the first time I am sending a patch to this list,
> so if I missed something please let me know.
>
> Regards,
> Daniel Debonzi
>
>
> Date: Thu, 29 Apr 2010 17:27:52 -0300
> Subject: [PATCH 1/1] tgtd: Patch to add bsoflags options o tgtd.
>
> From: Daniel Henrique Debonzi <debonzi at linux.vnet.ibm.com>
>
> This patch make possible to set bsoflags using tgtadm to be passed to the backstore open
> function. Supported bsoflags options are sync and direct.
>
> Signed-off-by: Daniel Henrique Debonzi <debonzi at linux.vnet.ibm.com>
> ---
> usr/bs_rdwr.c | 2 +-
> usr/spc.c | 17 ++++++++++++++++-
> usr/target.c | 27 +++++++++++++++++++++------
> usr/tgtadm.c | 23 +++++++++++++++++------
> usr/tgtd.h | 1 +
> usr/util.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
> usr/util.h | 2 ++
> 7 files changed, 103 insertions(+), 14 deletions(-)
>
> diff --git a/usr/tgtd.h b/usr/tgtd.h
> index 3323a9b..1b22f9a 100644
> --- a/usr/tgtd.h
> +++ b/usr/tgtd.h
> @@ -150,6 +150,7 @@ struct scsi_lu {
> uint64_t size;
> uint64_t lun;
> char *path;
> + int bsoflags;
>
> /* the list of devices belonging to a target */
> struct list_head device_siblings;
> diff --git a/usr/util.c b/usr/util.c
> index e91453d..ab3ba8c 100644
> diff --git a/usr/util.h b/usr/util.h
> index 6e1fd6f..24a5eb7 100644
> --- a/usr/util.h
> +++ b/usr/util.h
> @@ -57,6 +57,8 @@
> extern int chrdev_open(char *modname, char *devpath, uint8_t minor, int *fd);
> extern int backed_file_open(char *path, int oflag, uint64_t *size);
> extern int set_non_blocking(int fd);
> +extern int str_to_open_flags(char *buf);
> +extern char *open_flags_to_str(char *dest, int flags);
>
> #define zalloc(size) \
> ({ \
> --- a/usr/util.c
> +++ b/usr/util.c
> @@ -136,3 +136,48 @@ int set_non_blocking(int fd)
> }
> return err;
> }
> +
> +int str_to_open_flags(char *buf)
> +{
> + char *bsoflags_tok = NULL;
> + int open_flags = 0;
> +
> + bsoflags_tok = strtok(buf, " \0");
> + while (bsoflags_tok != NULL) {
> + while (*bsoflags_tok == ' ')
> + bsoflags_tok++;
> + if (!strncmp(bsoflags_tok, "sync", 4))
> + open_flags |= O_SYNC;
> + else if (!strncmp(bsoflags_tok, "direct", 6))
> + open_flags |= O_DIRECT;
> + else if (!strncmp(bsoflags_tok, "none", 4)) {
> + open_flags = 0;
> + break;
> + }
> + else {
> + eprintf("bsoflag option %s not supported\n",
> + bsoflags_tok);
> + return -1;
> + }
> +
> + bsoflags_tok = strtok(NULL, " ");
> + }
> +
> + return open_flags;
> +}
> +
> +char *open_flags_to_str(char *dest, int flags)
> +{
> + *dest = '\0';
> +
> + if (flags == 0)
> + strcat(dest, "none");
> + if (flags & O_SYNC)
> + strcat(dest, "sync");
> + if (flags & O_DIRECT) {
> + if (*dest)
> + strcat(dest, " ");
> + strcat(dest, "direct");
> + }
> + return dest;
> +}
> diff --git a/usr/bs_rdwr.c b/usr/bs_rdwr.c
> index 6068479..7b593c8 100644
> --- a/usr/bs_rdwr.c
> +++ b/usr/bs_rdwr.c
> @@ -130,7 +130,7 @@ static void bs_rdwr_request(struct scsi_cmd *cmd)
>
> static int bs_rdwr_open(struct scsi_lu *lu, char *path, int *fd, uint64_t *size)
> {
> - *fd = backed_file_open(path, O_RDWR| O_LARGEFILE, size);
> + *fd = backed_file_open(path, O_RDWR | O_LARGEFILE | lu->bsoflags, size);
> if (*fd < 0)
> return *fd;
>
> diff --git a/usr/spc.c b/usr/spc.c
> index 14a3ee1..4535c80 100644
> --- a/usr/spc.c
> +++ b/usr/spc.c
> @@ -1581,6 +1581,7 @@ enum {
> Opt_removable, Opt_online,
> Opt_mode_page,
> Opt_path,
> + Opt_bsoflags,
> Opt_err,
> };
>
> @@ -1595,6 +1596,7 @@ static match_table_t tokens = {
> {Opt_online, "online=%s"},
> {Opt_mode_page, "mode_page=%s"},
> {Opt_path, "path=%s"},
> + {Opt_bsoflags, "bsoflags=%s"},
> {Opt_err, NULL},
> };
>
> @@ -1626,7 +1628,8 @@ int lu_config(struct scsi_lu *lu, char *params, match_fn_t *fn)
>
> while ((p = strsep(¶ms, ",")) != NULL) {
> substring_t args[MAX_OPT_ARGS];
> - int token;
> + int token, lu_bsoflags = 0;
> +
> if (!*p)
> continue;
> token = match_token(p, tokens, args);
> @@ -1676,6 +1679,18 @@ int lu_config(struct scsi_lu *lu, char *params, match_fn_t *fn)
> match_strncpy(buf, &args[0], sizeof(buf));
> err = tgt_device_path_update(lu->tgt, lu, buf);
> break;
> + case Opt_bsoflags:
> + match_strncpy(buf, &args[0], sizeof(buf));
> + lu_bsoflags = str_to_open_flags(buf);
> + if (lu_bsoflags == -1) {
> + err = TGTADM_INVALID_REQUEST;
> + break;
> + }
> + lu->bsoflags = lu_bsoflags;
> + /* Keep the same path and update only the flags. */
> + strcpy(buf, lu->path);
> + err = tgt_device_path_update(lu->tgt, lu, buf);
> + break;
> default:
> err |= fn ? fn(lu, p) : TGTADM_INVALID_REQUEST;
> }
> diff --git a/usr/target.c b/usr/target.c
> index c848757..17f8a04 100644
> --- a/usr/target.c
> +++ b/usr/target.c
> @@ -416,20 +416,21 @@ __device_lookup(int tid, uint64_t lun, struct target **t)
> }
>
> enum {
> - Opt_path, Opt_bstype, Opt_err,
> + Opt_path, Opt_bstype, Opt_bsoflags, Opt_err,
> };
>
> static match_table_t device_tokens = {
> {Opt_path, "path=%s"},
> {Opt_bstype, "bstype=%s"},
> + {Opt_bsoflags, "bsoflags=%s"},
> {Opt_err, NULL},
> };
>
> int tgt_device_create(int tid, int dev_type, uint64_t lun, char *params,
> int backing)
> {
> - char *p, *path = NULL, *bstype = NULL;
> - int ret = 0;
> + char *p, *path = NULL, *bstype = NULL, *bsoflags = NULL;
> + int ret = 0, lu_bsoflags;
> struct target *target;
> struct scsi_lu *lu, *pos;
> struct device_type_template *t;
> @@ -452,6 +453,8 @@ int tgt_device_create(int tid, int dev_type, uint64_t lun, char *params,
> case Opt_bstype:
> bstype = match_strdup(&args[0]);
> break;
> + case Opt_bsoflags:
> + bsoflags = match_strdup(&args[0]);
> default:
> break;
> }
> @@ -482,6 +485,12 @@ int tgt_device_create(int tid, int dev_type, uint64_t lun, char *params,
> }
> }
>
> + lu_bsoflags = str_to_open_flags(bsoflags);
> + if (lu_bsoflags == -1) {
> + ret = TGTADM_INVALID_REQUEST;
> + goto out;
> + }
> +
> t = device_type_lookup(dev_type);
> if (!t) {
> eprintf("Unknown device type %d\n", dev_type);
> @@ -499,6 +508,8 @@ int tgt_device_create(int tid, int dev_type, uint64_t lun, char *params,
> lu->bst = bst;
> lu->tgt = target;
> lu->lun = lun;
> + lu->bsoflags = lu_bsoflags;
> +
> tgt_cmd_queue_init(&lu->cmd_queue);
> INIT_LIST_HEAD(&lu->registration_list);
> lu->prgeneration = 0;
> @@ -565,6 +576,8 @@ out:
> free(bstype);
> if (path)
> free(path);
> + if (bsoflags)
> + free(bsoflags);
> return ret;
> fail_bs_init:
> if (lu->bst->bs_exit)
> @@ -1582,10 +1595,10 @@ static char *print_type(int type)
> return name;
> }
>
> -
> int tgt_target_show_all(char *buf, int rest)
> {
> int total = 0, max = rest;
> + char strflags[128];
> struct target *target;
> struct scsi_lu *lu;
> struct acl_entry *acl;
> @@ -1622,7 +1635,8 @@ int tgt_target_show_all(char *buf, int rest)
> _TAB3 "Online: %s\n"
> _TAB3 "Removable media: %s\n"
> _TAB3 "Backing store type: %s\n"
> - _TAB3 "Backing store path: %s\n",
> + _TAB3 "Backing store path: %s\n"
> + _TAB3 "Backing store flags: %s\n",
> lu->lun,
> print_type(lu->attrs.device_type),
> lu->attrs.scsi_id,
> @@ -1633,7 +1647,8 @@ int tgt_target_show_all(char *buf, int rest)
> lu->bst ?
> (lu->bst->bs_name ? : "Unknown") :
> "None",
> - lu->path ? : "None");
> + lu->path ? : "None",
> + open_flags_to_str(strflags, lu->bsoflags));
>
> if (!strcmp(tgt_drivers[target->lid]->name, "iscsi")) {
> int i, aid;
> diff --git a/usr/tgtadm.c b/usr/tgtadm.c
> index 695c1c6..5dbdeaa 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'},
> + {"bsoflags", required_argument, NULL, 'f'},
> {"targetname", required_argument, NULL, 'T'},
> {"initiator-address", required_argument, NULL, 'I'},
> {"user", required_argument, NULL, 'u'},
> @@ -126,7 +127,7 @@ struct option const long_options[] = {
> {NULL, 0, NULL, 0},
> };
>
> -static char *short_options = "dhL:o:m:t:s:c:l:n:v:b:E:T:I:u:p:H:P:B:Y:O:C:";
> +static char *short_options = "dhL:o:m:t:s:c:l:n:v:b:E:f:T:I:u:p:H:P:B:Y:O:C:";
>
> static void usage(int status)
> {
> @@ -153,12 +154,15 @@ Linux SCSI Target Framework Administration Utility, version %s\n\
> enable the target to accept the specific initiators.\n\
> --lld [driver] --mode target --op unbind --tid=[id] --initiator-address=[src]\n\
> disable the specific permitted initiators.\n\
> - --lld [driver] --mode logicalunit --op new --tid=[id] --lun=[lun] --backing-store=[path] --bstype=[type]\n\
> + --lld [driver] --mode logicalunit --op new --tid=[id] --lun=[lun] \\\n\
> + --backing-store=[path] --bstype=[type] --bsoflags=[options]\n\
> add a new logical unit with [lun] to the specific\n\
> target with [id]. The logical unit is offered\n\
> to the initiators. [path] must be block device files\n\
> (including LVM and RAID devices) or regular files.\n\
> bstype option is optional.\n\
> + bsoflags supported options are sync and direct. \n\
> + Use \"none\" to update with no flags. It is optional.\n \
> --lld [driver] --mode logicalunit --op delete --tid=[id] --lun=[lun]\n\
> delete the specific logical unit with [lun] that\n\
> the target with [id] has.\n\
> @@ -431,6 +435,7 @@ int main(int argc, char **argv)
> uint64_t sid, lun;
> char *name, *value, *path, *targetname, *params, *address, *targetOps;
> char *bstype;
> + char *bsoflags;
> char *user, *password;
> char *buf;
> size_t bufsz = BUFSIZE + sizeof(struct tgtadm_req);
> @@ -445,7 +450,7 @@ int main(int argc, char **argv)
> ac_dir = ACCOUNT_TYPE_INCOMING;
> rest = BUFSIZE;
> name = value = path = targetname = address = targetOps = bstype = NULL;
> - user = password = NULL;
> + bsoflags = user = password = NULL;
>
> buf = valloc(bufsz);
> if (!buf) {
> @@ -516,6 +521,9 @@ int main(int argc, char **argv)
> case 'H':
> hostno = strtol(optarg, NULL, 10);
> break;
> + case 'f':
> + bsoflags = optarg;
> + break;
> case 'E':
> bstype = optarg;
> break;
> @@ -619,7 +627,7 @@ int main(int argc, char **argv)
> if (mode == MODE_ACCOUNT) {
> switch (op) {
> case OP_NEW:
> - rc = verify_mode_params(argc, argv, "LmoupC");
> + rc = verify_mode_params(argc, argv, "LmoupfC");
> if (rc) {
> eprintf("logicalunit mode: option '-%c' is not "
> "allowed/supported\n", rc);
> @@ -696,7 +704,7 @@ int main(int argc, char **argv)
> }
> switch (op) {
> case OP_NEW:
> - rc = verify_mode_params(argc, argv, "LmotlbEYC");
> + rc = verify_mode_params(argc, argv, "LmoftlbEYC");
> if (rc) {
> eprintf("target mode: option '-%c' is not "
> "allowed/supported\n", rc);
> @@ -717,7 +725,7 @@ int main(int argc, char **argv)
> }
> break;
> case OP_UPDATE:
> - rc = verify_mode_params(argc, argv, "LmotlPC");
> + rc = verify_mode_params(argc, argv, "LmoftlPC");
> if (rc) {
> eprintf("option '-%c' not supported in "
> "logicalunit mode\n", rc);
> @@ -756,7 +764,9 @@ int main(int argc, char **argv)
> else if (bstype)
> shprintf(total, params, rest, "%sbstype=%s",
> rest == BUFSIZE ? "" : ",", bstype);
> + if (bsoflags)
> + shprintf(total, params, rest, "%sbsoflags=%s",
> + rest == BUFSIZE ? "" : ",", bsoflags);
> if (targetname)
> shprintf(total, params, rest, "%stargetname=%s",
> rest == BUFSIZE ? "" : ",", targetname);
> --
> 1.6.3.3
>
> --
> 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