Whamcloud - gitweb
LU-1399 config: check lustre_cfg_new() return
[fs/lustre-release.git] / lustre / obdclass / obd_config.c
index 645e5aa..05505c3 100644 (file)
  */
 
 #define DEBUG_SUBSYSTEM S_CLASS
-#ifdef __KERNEL__
 #include <obd_class.h>
 #include <linux/string.h>
 #include <lustre_disk.h>
-#else
-#include <liblustre.h>
-#include <string.h>
-#include <obd_class.h>
-#include <obd.h>
-#endif
 #include <lustre_ioctl.h>
 #include <lustre_log.h>
 #include <lprocfs_status.h>
@@ -388,11 +381,11 @@ int class_attach(struct lustre_cfg *lcfg)
        obd->obd_pool_limit = 0;
        obd->obd_pool_slv = 0;
 
-       CFS_INIT_LIST_HEAD(&obd->obd_exports);
-       CFS_INIT_LIST_HEAD(&obd->obd_unlinked_exports);
-       CFS_INIT_LIST_HEAD(&obd->obd_delayed_exports);
-       CFS_INIT_LIST_HEAD(&obd->obd_exports_timed);
-       CFS_INIT_LIST_HEAD(&obd->obd_nid_stats);
+       INIT_LIST_HEAD(&obd->obd_exports);
+       INIT_LIST_HEAD(&obd->obd_unlinked_exports);
+       INIT_LIST_HEAD(&obd->obd_delayed_exports);
+       INIT_LIST_HEAD(&obd->obd_exports_timed);
+       INIT_LIST_HEAD(&obd->obd_nid_stats);
        spin_lock_init(&obd->obd_nid_lock);
        spin_lock_init(&obd->obd_dev_lock);
        mutex_init(&obd->obd_dev_mutex);
@@ -408,10 +401,10 @@ int class_attach(struct lustre_cfg *lcfg)
        spin_lock_init(&obd->obd_recovery_task_lock);
        init_waitqueue_head(&obd->obd_next_transno_waitq);
        init_waitqueue_head(&obd->obd_evict_inprogress_waitq);
-       CFS_INIT_LIST_HEAD(&obd->obd_req_replay_queue);
-       CFS_INIT_LIST_HEAD(&obd->obd_lock_replay_queue);
-       CFS_INIT_LIST_HEAD(&obd->obd_final_req_queue);
-       CFS_INIT_LIST_HEAD(&obd->obd_evict_list);
+       INIT_LIST_HEAD(&obd->obd_req_replay_queue);
+       INIT_LIST_HEAD(&obd->obd_lock_replay_queue);
+       INIT_LIST_HEAD(&obd->obd_final_req_queue);
+       INIT_LIST_HEAD(&obd->obd_evict_list);
        INIT_LIST_HEAD(&obd->obd_lwp_list);
 
        llog_group_init(&obd->obd_olg);
@@ -528,7 +521,7 @@ int class_setup(struct obd_device *obd, struct lustre_cfg *lcfg)
                 GOTO(err_hash, err = PTR_ERR(exp));
 
         obd->obd_self_export = exp;
-        cfs_list_del_init(&exp->exp_obd_chain_timed);
+       list_del_init(&exp->exp_obd_chain_timed);
         class_export_put(exp);
 
         err = obd_setup(obd, lcfg);
@@ -624,16 +617,12 @@ int class_cleanup(struct obd_device *obd, struct lustre_cfg *lcfg)
        }
        /* Leave this on forever */
        obd->obd_stopping = 1;
+       spin_unlock(&obd->obd_dev_lock);
 
        /* wait for already-arrived-connections to finish. */
-       while (obd->obd_conn_inprogress > 0) {
-               spin_unlock(&obd->obd_dev_lock);
-
-               cond_resched();
-
-               spin_lock(&obd->obd_dev_lock);
-       }
-       spin_unlock(&obd->obd_dev_lock);
+       while (obd->obd_conn_inprogress > 0)
+               yield();
+       smp_rmb();
 
         if (lcfg->lcfg_bufcount >= 2 && LUSTRE_CFG_BUFLEN(lcfg, 1) > 0) {
                 for (flag = lustre_cfg_string(lcfg, 1); *flag != 0; flag++)
@@ -797,7 +786,7 @@ 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;
@@ -827,14 +816,15 @@ int class_del_conn(struct obd_device *obd, struct lustre_cfg *lcfg)
         RETURN(rc);
 }
 
-CFS_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)
 {
         struct lustre_profile *lprof;
 
         ENTRY;
-        cfs_list_for_each_entry(lprof, &lustre_profile_list, lp_list) {
+       list_for_each_entry(lprof, &lustre_profile_list, lp_list) {
                 if (!strcmp(lprof->lp_profile, prof)) {
                         RETURN(lprof);
                 }
@@ -847,8 +837,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;
@@ -859,7 +849,7 @@ int class_add_profile(int proflen, char *prof, int osclen, char *osc,
         OBD_ALLOC(lprof, sizeof(*lprof));
         if (lprof == NULL)
                 RETURN(-ENOMEM);
-        CFS_INIT_LIST_HEAD(&lprof->lp_list);
+       INIT_LIST_HEAD(&lprof->lp_list);
 
         LASSERT(proflen == (strlen(prof) + 1));
         OBD_ALLOC(lprof->lp_profile, proflen);
@@ -881,7 +871,7 @@ int class_add_profile(int proflen, char *prof, int osclen, char *osc,
                 memcpy(lprof->lp_md, mdc, mdclen);
         }
 
-        cfs_list_add(&lprof->lp_list, &lustre_profile_list);
+       list_add(&lprof->lp_list, &lustre_profile_list);
         RETURN(err);
 
 out:
@@ -904,7 +894,7 @@ void class_del_profile(const char *prof)
 
         lprof = class_get_profile(prof);
         if (lprof) {
-                cfs_list_del(&lprof->lp_list);
+               list_del(&lprof->lp_list);
                 OBD_FREE(lprof->lp_profile, strlen(lprof->lp_profile) + 1);
                 OBD_FREE(lprof->lp_dt, strlen(lprof->lp_dt) + 1);
                 if (lprof->lp_md)
@@ -921,8 +911,8 @@ void class_del_profiles(void)
         struct lustre_profile *lprof, *n;
         ENTRY;
 
-        cfs_list_for_each_entry_safe(lprof, n, &lustre_profile_list, lp_list) {
-                cfs_list_del(&lprof->lp_list);
+       list_for_each_entry_safe(lprof, n, &lustre_profile_list, lp_list) {
+               list_del(&lprof->lp_list);
                 OBD_FREE(lprof->lp_profile, strlen(lprof->lp_profile) + 1);
                 OBD_FREE(lprof->lp_dt, strlen(lprof->lp_dt) + 1);
                 if (lprof->lp_md)
@@ -1026,7 +1016,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)
@@ -1270,101 +1259,9 @@ 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)
-{
-#ifdef __KERNEL__
-        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);
-#else
-        CDEBUG(D_CONFIG, "liblustre can't process params.\n");
-        /* Don't throw config error */
-        RETURN(0);
-#endif
-}
-EXPORT_SYMBOL(class_process_proc_param);
-#endif
-
-int class_process_proc_seq_param(char *prefix, struct lprocfs_seq_vars *lvars,
-                                struct lustre_cfg *lcfg, void *data)
+int class_process_proc_param(char *prefix, struct lprocfs_seq_vars *lvars,
+                            struct lustre_cfg *lcfg, void *data)
 {
-#ifdef __KERNEL__
        struct lprocfs_seq_vars *var;
        struct file fakefile;
        struct seq_file fake_seqfile;
@@ -1447,19 +1344,8 @@ int class_process_proc_seq_param(char *prefix, struct lprocfs_seq_vars *lvars,
        if (!rc && skip)
                rc = skip;
        RETURN(rc);
-#else
-       CDEBUG(D_CONFIG, "liblustre can't process params.\n");
-       /* Don't throw config error */
-       RETURN(0);
-#endif
 }
-EXPORT_SYMBOL(class_process_proc_seq_param);
-
-#ifdef __KERNEL__
-extern int lustre_check_exclusion(struct super_block *sb, char *svname);
-#else
-#define lustre_check_exclusion(a,b)  0
-#endif
+EXPORT_SYMBOL(class_process_proc_param);
 
 /*
  * Supplemental functions for config logs, it allocates lustre_cfg
@@ -1602,7 +1488,7 @@ int class_config_llog_handler(const struct lu_env *env,
                         }
                 }
 
-#if defined(HAVE_SERVER_SUPPORT) && defined(__KERNEL__)
+#ifdef HAVE_SERVER_SUPPORT
                /* newer MDS replaces LOV/OSC with LOD/OSP */
                {
                        char *typename = lustre_cfg_string(lcfg, 1);
@@ -1626,7 +1512,7 @@ int class_config_llog_handler(const struct lu_env *env,
                                strcpy(typename, LUSTRE_OSP_NAME);
                        }
                }
-#endif
+#endif /* HAVE_SERVER_SUPPORT */
 
                if (clli->cfg_flags & CFG_F_EXCLUDE) {
                        CDEBUG(D_CONFIG, "cmd: %x marked EXCLUDED\n",
@@ -1766,7 +1652,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];
@@ -1879,7 +1765,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;
@@ -2002,11 +1888,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) {
@@ -2037,13 +1923,13 @@ uuid_hash(cfs_hash_t *hs, const void *key, unsigned mask)
 }
 
 static void *
-uuid_key(cfs_hlist_node_t *hnode)
+uuid_key(struct hlist_node *hnode)
 {
-        struct obd_export *exp;
+       struct obd_export *exp;
 
-        exp = cfs_hlist_entry(hnode, struct obd_export, exp_uuid_hash);
+       exp = hlist_entry(hnode, struct obd_export, exp_uuid_hash);
 
-        return &exp->exp_client_uuid;
+       return &exp->exp_client_uuid;
 }
 
 /*
@@ -2051,38 +1937,38 @@ uuid_key(cfs_hlist_node_t *hnode)
  *       state with this function
  */
 static int
-uuid_keycmp(const void *key, cfs_hlist_node_t *hnode)
+uuid_keycmp(const void *key, struct hlist_node *hnode)
 {
         struct obd_export *exp;
 
         LASSERT(key);
-        exp = cfs_hlist_entry(hnode, struct obd_export, exp_uuid_hash);
+       exp = hlist_entry(hnode, struct obd_export, exp_uuid_hash);
 
         return obd_uuid_equals(key, &exp->exp_client_uuid) &&
                !exp->exp_failed;
 }
 
 static void *
-uuid_export_object(cfs_hlist_node_t *hnode)
+uuid_export_object(struct hlist_node *hnode)
 {
-        return cfs_hlist_entry(hnode, struct obd_export, exp_uuid_hash);
+       return hlist_entry(hnode, struct obd_export, exp_uuid_hash);
 }
 
 static void
-uuid_export_get(cfs_hash_t *hs, cfs_hlist_node_t *hnode)
+uuid_export_get(cfs_hash_t *hs, struct hlist_node *hnode)
 {
         struct obd_export *exp;
 
-        exp = cfs_hlist_entry(hnode, struct obd_export, exp_uuid_hash);
+       exp = hlist_entry(hnode, struct obd_export, exp_uuid_hash);
         class_export_get(exp);
 }
 
 static void
-uuid_export_put_locked(cfs_hash_t *hs, cfs_hlist_node_t *hnode)
+uuid_export_put_locked(cfs_hash_t *hs, struct hlist_node *hnode)
 {
         struct obd_export *exp;
 
-        exp = cfs_hlist_entry(hnode, struct obd_export, exp_uuid_hash);
+       exp = hlist_entry(hnode, struct obd_export, exp_uuid_hash);
         class_export_put(exp);
 }
 
@@ -2107,11 +1993,11 @@ nid_hash(cfs_hash_t *hs, const void *key, unsigned mask)
 }
 
 static void *
-nid_key(cfs_hlist_node_t *hnode)
+nid_key(struct hlist_node *hnode)
 {
         struct obd_export *exp;
 
-        exp = cfs_hlist_entry(hnode, struct obd_export, exp_nid_hash);
+       exp = hlist_entry(hnode, struct obd_export, exp_nid_hash);
 
         RETURN(&exp->exp_connection->c_peer.nid);
 }
@@ -2121,38 +2007,38 @@ nid_key(cfs_hlist_node_t *hnode)
  *       state with this function
  */
 static int
-nid_kepcmp(const void *key, cfs_hlist_node_t *hnode)
+nid_kepcmp(const void *key, struct hlist_node *hnode)
 {
         struct obd_export *exp;
 
         LASSERT(key);
-        exp = cfs_hlist_entry(hnode, struct obd_export, exp_nid_hash);
+       exp = hlist_entry(hnode, struct obd_export, exp_nid_hash);
 
         RETURN(exp->exp_connection->c_peer.nid == *(lnet_nid_t *)key &&
                !exp->exp_failed);
 }
 
 static void *
-nid_export_object(cfs_hlist_node_t *hnode)
+nid_export_object(struct hlist_node *hnode)
 {
-        return cfs_hlist_entry(hnode, struct obd_export, exp_nid_hash);
+       return hlist_entry(hnode, struct obd_export, exp_nid_hash);
 }
 
 static void
-nid_export_get(cfs_hash_t *hs, cfs_hlist_node_t *hnode)
+nid_export_get(cfs_hash_t *hs, struct hlist_node *hnode)
 {
         struct obd_export *exp;
 
-        exp = cfs_hlist_entry(hnode, struct obd_export, exp_nid_hash);
+       exp = hlist_entry(hnode, struct obd_export, exp_nid_hash);
         class_export_get(exp);
 }
 
 static void
-nid_export_put_locked(cfs_hash_t *hs, cfs_hlist_node_t *hnode)
+nid_export_put_locked(cfs_hash_t *hs, struct hlist_node *hnode)
 {
         struct obd_export *exp;
 
-        exp = cfs_hlist_entry(hnode, struct obd_export, exp_nid_hash);
+       exp = hlist_entry(hnode, struct obd_export, exp_nid_hash);
         class_export_put(exp);
 }
 
@@ -2171,42 +2057,42 @@ static cfs_hash_ops_t nid_hash_ops = {
  */
 
 static void *
-nidstats_key(cfs_hlist_node_t *hnode)
+nidstats_key(struct hlist_node *hnode)
 {
         struct nid_stat *ns;
 
-        ns = cfs_hlist_entry(hnode, struct nid_stat, nid_hash);
+       ns = hlist_entry(hnode, struct nid_stat, nid_hash);
 
         return &ns->nid;
 }
 
 static int
-nidstats_keycmp(const void *key, cfs_hlist_node_t *hnode)
+nidstats_keycmp(const void *key, struct hlist_node *hnode)
 {
         return *(lnet_nid_t *)nidstats_key(hnode) == *(lnet_nid_t *)key;
 }
 
 static void *
-nidstats_object(cfs_hlist_node_t *hnode)
+nidstats_object(struct hlist_node *hnode)
 {
-        return cfs_hlist_entry(hnode, struct nid_stat, nid_hash);
+       return hlist_entry(hnode, struct nid_stat, nid_hash);
 }
 
 static void
-nidstats_get(cfs_hash_t *hs, cfs_hlist_node_t *hnode)
+nidstats_get(cfs_hash_t *hs, struct hlist_node *hnode)
 {
         struct nid_stat *ns;
 
-        ns = cfs_hlist_entry(hnode, struct nid_stat, nid_hash);
+       ns = hlist_entry(hnode, struct nid_stat, nid_hash);
         nidstat_getref(ns);
 }
 
 static void
-nidstats_put_locked(cfs_hash_t *hs, cfs_hlist_node_t *hnode)
+nidstats_put_locked(cfs_hash_t *hs, struct hlist_node *hnode)
 {
         struct nid_stat *ns;
 
-        ns = cfs_hlist_entry(hnode, struct nid_stat, nid_hash);
+       ns = hlist_entry(hnode, struct nid_stat, nid_hash);
         nidstat_putref(ns);
 }