From 1d1a4fe42712c2a18a2c7ab1e9593af2a946739d Mon Sep 17 00:00:00 2001 From: Nathaniel Clark Date: Mon, 21 Jul 2014 09:31:11 -0400 Subject: [PATCH] LU-4334 utils: Only set a single property for nodes For servicenode, failnode and mgsnode only set a single property but concatenate data. ZFS can only set a single property for a given name so this prevents erroneously overwritting previous entries. Signed-off-by: Nathaniel Clark Change-Id: Ia0316e138b0d68dcda1d14811e43db3bbed64457 Reviewed-on: http://review.whamcloud.com/11161 Tested-by: Jenkins Reviewed-by: Isaac Huang Tested-by: Maloo Reviewed-by: Alex Zhuravlev Reviewed-by: Oleg Drokin --- lustre/utils/mkfs_lustre.c | 8 ++++---- lustre/utils/mount_utils.c | 37 +++++++++++++++++++++++++++++++++++++ lustre/utils/mount_utils.h | 1 + 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/lustre/utils/mkfs_lustre.c b/lustre/utils/mkfs_lustre.c index e585e8d..5bca28c 100644 --- a/lustre/utils/mkfs_lustre.c +++ b/lustre/utils/mkfs_lustre.c @@ -376,8 +376,8 @@ int parse_opts(int argc, char *const argv[], struct mkfs_opts *mop, nids = convert_hostnames(optarg); if (!nids) return 1; - rc = add_param(mop->mo_ldd.ldd_params, PARAM_FAILNODE, - nids); + rc = append_param(mop->mo_ldd.ldd_params, + PARAM_FAILNODE, nids, ':'); free(nids); if (rc) return rc; @@ -442,8 +442,8 @@ int parse_opts(int argc, char *const argv[], struct mkfs_opts *mop, char *nids = convert_hostnames(optarg); if (!nids) return 1; - rc = add_param(mop->mo_ldd.ldd_params, PARAM_MGSNODE, - nids); + rc = append_param(mop->mo_ldd.ldd_params, + PARAM_MGSNODE, nids, ':'); free(nids); if (rc) return rc; diff --git a/lustre/utils/mount_utils.c b/lustre/utils/mount_utils.c index 83a571f..f7a62ed 100644 --- a/lustre/utils/mount_utils.c +++ b/lustre/utils/mount_utils.c @@ -144,6 +144,43 @@ int get_param(char *buf, char *key, char **val) return ENOENT; } +int append_param(char *buf, char *key, char *val, char sep) +{ + int key_len, i, offset, old_val_len; + char *ptr = NULL, str[1024]; + + if (key) + ptr = strstr(buf, key); + + /* key doesn't exist yet, so just add it */ + if (ptr == NULL) + return add_param(buf, key, val); + + key_len = strlen(key); + + /* Copy previous values to str */ + for (i = 0; i < sizeof(str); ++i) { + if ((ptr[i+key_len] == ' ') || (ptr[i+key_len] == '\0')) + break; + str[i] = ptr[i+key_len]; + } + if (i == sizeof(str)) + return E2BIG; + old_val_len = i; + + offset = old_val_len+key_len; + + /* Move rest of buf to overwrite previous key and value */ + for (i = 0; ptr[i+offset] != '\0'; ++i) + ptr[i] = ptr[i+offset]; + + ptr[i] = '\0'; + + snprintf(str+old_val_len, sizeof(str)-old_val_len, "%c%s", sep, val); + + return add_param(buf, key, str); +} + char *strscat(char *dst, char *src, int buflen) { dst[buflen - 1] = 0; diff --git a/lustre/utils/mount_utils.h b/lustre/utils/mount_utils.h index 8a26c5e..4302255 100644 --- a/lustre/utils/mount_utils.h +++ b/lustre/utils/mount_utils.h @@ -113,6 +113,7 @@ void fatal(void); int run_command_err(char *cmd, int cmdsz, char *error_msg); int run_command(char *cmd, int cmdsz); int add_param(char *buf, char *key, char *val); +int append_param(char *buf, char *key, char *val, char sep); int get_param(char *buf, char *key, char **val); char *strscat(char *dst, char *src, int buflen); char *strscpy(char *dst, char *src, int buflen); -- 1.8.3.1