Whamcloud - gitweb
LU-6070 libcfs: provide separate buffers for libcfs_*2str()
[fs/lustre-release.git] / lustre / obdclass / obd_config.c
index be27f65..b386331 100644 (file)
@@ -27,7 +27,7 @@
  * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2013, Intel Corporation.
+ * Copyright (c) 2011, 2014, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -183,7 +183,7 @@ EXPORT_SYMBOL(class_get_next_param);
 
 /* returns 0 if this is the first key in the buffer, else 1.
    valp points to first char after key. */
-int class_match_param(char *buf, char *key, char **valp)
+int class_match_param(char *buf, const char *key, char **valp)
 {
         if (!buf)
                 return 1;
@@ -284,7 +284,6 @@ int class_parse_net(char *buf, __u32 *net, char **endh)
 {
        return class_parse_value(buf, CLASS_PARSE_NET, (void *)net, endh, 0);
 }
-EXPORT_SYMBOL(class_parse_net);
 
 /* 1 param contains key and match
  * 0 param contains key and not match
@@ -306,7 +305,6 @@ int class_match_nid(char *buf, char *key, lnet_nid_t nid)
         }
         return rc;
 }
-EXPORT_SYMBOL(class_match_nid);
 
 int class_match_net(char *buf, char *key, __u32 net)
 {
@@ -324,7 +322,6 @@ int class_match_net(char *buf, char *key, __u32 net)
         }
         return rc;
 }
-EXPORT_SYMBOL(class_match_net);
 
 /********************** class fns **********************/
 
@@ -690,7 +687,6 @@ int class_cleanup(struct obd_device *obd, struct lustre_cfg *lcfg)
 
         RETURN(0);
 }
-EXPORT_SYMBOL(class_cleanup);
 
 struct obd_device *class_incref(struct obd_device *obd,
                                 const char *scope, const void *source)
@@ -782,11 +778,10 @@ int class_add_conn(struct obd_device *obd, struct lustre_cfg *lcfg)
 
         RETURN(rc);
 }
-EXPORT_SYMBOL(class_add_conn);
 
 /** Remove a failover nid location.
  */
-int class_del_conn(struct obd_device *obd, struct lustre_cfg *lcfg)
+static int class_del_conn(struct obd_device *obd, struct lustre_cfg *lcfg)
 {
         struct obd_import *imp;
         struct obd_uuid uuid;
@@ -816,7 +811,7 @@ int class_del_conn(struct obd_device *obd, struct lustre_cfg *lcfg)
         RETURN(rc);
 }
 
-struct list_head lustre_profile_list =
+static struct list_head lustre_profile_list =
        LIST_HEAD_INIT(lustre_profile_list);
 
 struct lustre_profile *class_get_profile(const char * prof)
@@ -837,8 +832,8 @@ EXPORT_SYMBOL(class_get_profile);
  * This defines the mdc and osc names to use for a client.
  * This also is used to define the lov to be used by a mdt.
  */
-int class_add_profile(int proflen, char *prof, int osclen, char *osc,
-                      int mdclen, char *mdc)
+static int class_add_profile(int proflen, char *prof, int osclen, char *osc,
+                            int mdclen, char *mdc)
 {
         struct lustre_profile *lprof;
         int err = 0;
@@ -1016,7 +1011,6 @@ struct lustre_cfg *lustre_cfg_rename(struct lustre_cfg *cfg,
        lustre_cfg_bufs_set_string(bufs, 1, new_param);
 
        new_cfg = lustre_cfg_new(cfg->lcfg_command, bufs);
-
        OBD_FREE(new_param, new_len);
        OBD_FREE_PTR(bufs);
        if (new_cfg == NULL)
@@ -1053,7 +1047,7 @@ static int process_param2_config(struct lustre_cfg *lcfg)
        }
 
        do_gettimeofday(&start);
-       rc = call_usermodehelper(argv[0], argv, NULL, 0);
+       rc = call_usermodehelper(argv[0], argv, NULL, UMH_WAIT_PROC);
        do_gettimeofday(&end);
 
        if (rc < 0) {
@@ -1163,7 +1157,7 @@ int class_process_config(struct lustre_cfg *lcfg)
                 char *tmp;
                 /* llite has no obd */
                 if ((class_match_param(lustre_cfg_string(lcfg, 1),
-                                       PARAM_LLITE, 0) == 0) &&
+                                      PARAM_LLITE, NULL) == 0) &&
                     client_process_config) {
                         err = (*client_process_config)(lcfg);
                         GOTO(out, err);
@@ -1260,95 +1254,10 @@ out:
 }
 EXPORT_SYMBOL(class_process_config);
 
-#ifndef HAVE_ONLY_PROCFS_SEQ
 int class_process_proc_param(char *prefix, struct lprocfs_vars *lvars,
-                             struct lustre_cfg *lcfg, void *data)
-{
-        struct lprocfs_vars *var;
-        char *key, *sval;
-        int i, keylen, vallen;
-        int matched = 0, j = 0;
-        int rc = 0;
-        int skip = 0;
-        ENTRY;
-
-        if (lcfg->lcfg_command != LCFG_PARAM) {
-                CERROR("Unknown command: %d\n", lcfg->lcfg_command);
-                RETURN(-EINVAL);
-        }
-
-        /* e.g. tunefs.lustre --param mdt.group_upcall=foo /r/tmp/lustre-mdt
-           or   lctl conf_param lustre-MDT0000.mdt.group_upcall=bar
-           or   lctl conf_param lustre-OST0000.osc.max_dirty_mb=36 */
-        for (i = 1; i < lcfg->lcfg_bufcount; i++) {
-                key = lustre_cfg_buf(lcfg, i);
-                /* Strip off prefix */
-               if (class_match_param(key, prefix, &key))
-                       /* If the prefix doesn't match, return error so we
-                        * can pass it down the stack */
-                       RETURN(-ENOSYS);
-                sval = strchr(key, '=');
-                if (!sval || (*(sval + 1) == 0)) {
-                        CERROR("Can't parse param %s (missing '=')\n", key);
-                        /* rc = -EINVAL;        continue parsing other params */
-                        continue;
-                }
-                keylen = sval - key;
-                sval++;
-                vallen = strlen(sval);
-                matched = 0;
-                j = 0;
-                /* Search proc entries */
-                while (lvars[j].name) {
-                        var = &lvars[j];
-                        if (class_match_param(key, (char *)var->name, 0) == 0 &&
-                            keylen == strlen(var->name)) {
-                                matched++;
-                                rc = -EROFS;
-
-                               if (var->write_fptr) {
-                                       mm_segment_t oldfs;
-                                       oldfs = get_fs();
-                                       set_fs(KERNEL_DS);
-                                       rc = (var->write_fptr)(NULL, sval,
-                                                               vallen, data);
-                                       set_fs(oldfs);
-                               }
-                               break;
-                        }
-                        j++;
-                }
-               if (!matched) {
-                       CERROR("%.*s: %s unknown param %s\n",
-                              (int)strlen(prefix) - 1, prefix,
-                              (char *)lustre_cfg_string(lcfg, 0), key);
-                       /* rc = -EINVAL;        continue parsing other params */
-                       skip++;
-               } else if (rc < 0) {
-                       CERROR("%s: error writing proc entry '%s': rc = %d\n",
-                              prefix, var->name, rc);
-                       rc = 0;
-               } else {
-                       CDEBUG(D_CONFIG, "%s.%.*s: Set parameter %.*s=%s\n",
-                                        lustre_cfg_string(lcfg, 0),
-                                        (int)strlen(prefix) - 1, prefix,
-                                        (int)(sval - key - 1), key, sval);
-               }
-        }
-
-        if (rc > 0)
-                rc = 0;
-        if (!rc && skip)
-                rc = skip;
-        RETURN(rc);
-}
-EXPORT_SYMBOL(class_process_proc_param);
-#endif /* !HAVE_ONLY_PROCFS_SEQ */
-
-int class_process_proc_seq_param(char *prefix, struct lprocfs_seq_vars *lvars,
-                                struct lustre_cfg *lcfg, void *data)
+                            struct lustre_cfg *lcfg, void *data)
 {
-       struct lprocfs_seq_vars *var;
+       struct lprocfs_vars *var;
        struct file fakefile;
        struct seq_file fake_seqfile;
        char *key, *sval;
@@ -1390,7 +1299,7 @@ int class_process_proc_seq_param(char *prefix, struct lprocfs_seq_vars *lvars,
                /* Search proc entries */
                while (lvars[j].name) {
                        var = &lvars[j];
-                       if (class_match_param(key, (char *)var->name, 0) == 0 &&
+                       if (class_match_param(key, var->name, NULL) == 0 &&
                            keylen == strlen(var->name)) {
                                matched++;
                                rc = -EROFS;
@@ -1431,9 +1340,7 @@ int class_process_proc_seq_param(char *prefix, struct lprocfs_seq_vars *lvars,
                rc = skip;
        RETURN(rc);
 }
-EXPORT_SYMBOL(class_process_proc_seq_param);
-
-extern int lustre_check_exclusion(struct super_block *sb, char *svname);
+EXPORT_SYMBOL(class_process_proc_param);
 
 /*
  * Supplemental functions for config logs, it allocates lustre_cfg
@@ -1740,7 +1647,7 @@ parse_out:
 }
 EXPORT_SYMBOL(class_config_parse_llog);
 
-struct lcfg_type_data {
+static struct lcfg_type_data {
        __u32    ltd_type;
        char    *ltd_name;
        char    *ltd_bufs[4];
@@ -1826,10 +1733,13 @@ int class_config_yaml_output(struct llog_rec_hdr *rec, char *buf, int size)
        if (lcfg->lcfg_num)
                ptr += snprintf(ptr, end - ptr, ", num: %#08x",
                                lcfg->lcfg_num);
-       if (lcfg->lcfg_nid)
+       if (lcfg->lcfg_nid) {
+               char nidstr[LNET_NIDSTR_SIZE];
+
+               libcfs_nid2str_r(lcfg->lcfg_nid, nidstr, sizeof(nidstr));
                ptr += snprintf(ptr, end - ptr, ", nid: %s("LPX64")",
-                               libcfs_nid2str(lcfg->lcfg_nid),
-                               lcfg->lcfg_nid);
+                               nidstr, lcfg->lcfg_nid);
+       }
 
        if (LUSTRE_CFG_BUFLEN(lcfg, 0) > 0)
                ptr += snprintf(ptr, end - ptr, ", device: %s",
@@ -1853,7 +1763,7 @@ int class_config_yaml_output(struct llog_rec_hdr *rec, char *buf, int size)
  * This is separated from class_config_dump_handler() to use
  * for ioctl needs as well
  */
-int class_config_parse_rec(struct llog_rec_hdr *rec, char *buf, int size)
+static int class_config_parse_rec(struct llog_rec_hdr *rec, char *buf, int size)
 {
        struct lustre_cfg       *lcfg = (struct lustre_cfg *)(rec + 1);
        char                    *ptr = buf;
@@ -1875,10 +1785,13 @@ int class_config_parse_rec(struct llog_rec_hdr *rec, char *buf, int size)
        if (lcfg->lcfg_num)
                ptr += snprintf(ptr, end-ptr, "num=%#08x ", lcfg->lcfg_num);
 
-       if (lcfg->lcfg_nid)
+       if (lcfg->lcfg_nid) {
+               char nidstr[LNET_NIDSTR_SIZE];
+
+               libcfs_nid2str_r(lcfg->lcfg_nid, nidstr, sizeof(nidstr));
                ptr += snprintf(ptr, end-ptr, "nid=%s("LPX64")\n     ",
-                               libcfs_nid2str(lcfg->lcfg_nid),
-                               lcfg->lcfg_nid);
+                               nidstr, lcfg->lcfg_nid);
+       }
 
        if (lcfg->lcfg_command == LCFG_MARKER) {
                struct cfg_marker *marker = lustre_cfg_buf(lcfg, 1);
@@ -1976,11 +1889,11 @@ int class_manual_cleanup(struct obd_device *obd)
         CDEBUG(D_CONFIG, "Manual cleanup of %s (flags='%s')\n",
                obd->obd_name, flags);
 
-        lustre_cfg_bufs_reset(&bufs, obd->obd_name);
-        lustre_cfg_bufs_set_string(&bufs, 1, flags);
-        lcfg = lustre_cfg_new(LCFG_CLEANUP, &bufs);
-        if (!lcfg)
-                RETURN(-ENOMEM);
+       lustre_cfg_bufs_reset(&bufs, obd->obd_name);
+       lustre_cfg_bufs_set_string(&bufs, 1, flags);
+       lcfg = lustre_cfg_new(LCFG_CLEANUP, &bufs);
+       if (lcfg == NULL)
+               RETURN(-ENOMEM);
 
         rc = class_process_config(lcfg);
         if (rc) {