* 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/
*/
#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>
/* 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;
{
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
}
return rc;
}
-EXPORT_SYMBOL(class_match_nid);
int class_match_net(char *buf, char *key, __u32 net)
{
}
return rc;
}
-EXPORT_SYMBOL(class_match_net);
/********************** class fns **********************/
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);
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);
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);
RETURN(0);
}
-EXPORT_SYMBOL(class_cleanup);
struct obd_device *class_incref(struct obd_device *obd,
const char *scope, const void *source)
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;
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);
}
* 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;
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);
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:
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)
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)
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)
}
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) {
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);
}
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)
+ struct lustre_cfg *lcfg, void *data)
{
-#ifdef __KERNEL__
- struct lprocfs_seq_vars *var;
+ struct lprocfs_vars *var;
struct file fakefile;
struct seq_file fake_seqfile;
char *key, *sval;
/* 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;
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
}
}
-#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);
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",
}
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];
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",
* 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;
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);
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) {
}
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;
}
/*
* 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);
}
}
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);
}
* 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);
}
*/
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);
}