Whamcloud - gitweb
LU-4334 utils: Only set a single property for nodes 61/11161/7
authorNathaniel Clark <nathaniel.l.clark@intel.com>
Mon, 21 Jul 2014 13:31:11 +0000 (09:31 -0400)
committerOleg Drokin <oleg.drokin@intel.com>
Thu, 11 Sep 2014 19:29:31 +0000 (19:29 +0000)
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 <nathaniel.l.clark@intel.com>
Change-Id: Ia0316e138b0d68dcda1d14811e43db3bbed64457
Reviewed-on: http://review.whamcloud.com/11161
Tested-by: Jenkins
Reviewed-by: Isaac Huang <he.huang@intel.com>
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/utils/mkfs_lustre.c
lustre/utils/mount_utils.c
lustre/utils/mount_utils.h

index e585e8d..5bca28c 100644 (file)
@@ -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;
index 83a571f..f7a62ed 100644 (file)
@@ -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;
index 8a26c5e..4302255 100644 (file)
@@ -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);