* Copyright (c) 2002, 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/
#include <obd_class.h>
#include <lprocfs_status.h>
#include <lustre/lustre_idl.h>
+#include <lustre_nodemap.h>
#if defined(LPROCFS)
return seq_printf(m, "%s\n", obd_export_nid2str(exp));
}
-int lprocfs_exp_print_uuid_seq(cfs_hash_t *hs, cfs_hash_bd_t *bd,
- struct hlist_node *hnode, void *cb_data)
+static int lprocfs_exp_print_uuid_seq(cfs_hash_t *hs, cfs_hash_bd_t *bd,
+ struct hlist_node *hnode, void *cb_data)
{
- struct obd_export *exp = cfs_hash_object(hs, hnode);
struct seq_file *m = cb_data;
+ struct obd_export *exp = cfs_hash_object(hs, hnode);
- if (exp->exp_nid_stats)
+ if (exp->exp_nid_stats != NULL)
seq_printf(m, "%s\n", obd_uuid2str(&exp->exp_client_uuid));
return 0;
}
-int lprocfs_exp_uuid_seq_show(struct seq_file *m, void *data)
+static int lprocfs_exp_print_nodemap_seq(cfs_hash_t *hs, cfs_hash_bd_t *bd,
+ struct hlist_node *hnode, void *cb_data)
+{
+ struct seq_file *m = cb_data;
+ struct obd_export *exp = cfs_hash_object(hs, hnode);
+ struct lu_nodemap *nodemap = exp->exp_target_data.ted_nodemap;
+
+ if (nodemap != NULL)
+ seq_printf(m, "%s\n", nodemap->nm_name);
+ return 0;
+}
+
+static int lprocfs_exp_nodemap_seq_show(struct seq_file *m, void *data)
+{
+ struct nid_stat *stats = m->private;
+ struct obd_device *obd = stats->nid_obd;
+
+ cfs_hash_for_each_key(obd->obd_nid_hash, &stats->nid,
+ lprocfs_exp_print_nodemap_seq, m);
+ return 0;
+}
+LPROC_SEQ_FOPS_RO(lprocfs_exp_nodemap);
+
+static int lprocfs_exp_uuid_seq_show(struct seq_file *m, void *data)
{
struct nid_stat *stats = m->private;
struct obd_device *obd = stats->nid_obd;
}
LPROC_SEQ_FOPS_RO(lprocfs_exp_uuid);
-int lprocfs_exp_print_hash_seq(cfs_hash_t *hs, cfs_hash_bd_t *bd,
- struct hlist_node *hnode, void *cb_data)
+static int lprocfs_exp_print_hash_seq(cfs_hash_t *hs, cfs_hash_bd_t *bd,
+ struct hlist_node *hnode, void *cb_data)
{
struct seq_file *m = cb_data;
struct obd_export *exp = cfs_hash_object(hs, hnode);
if (exp->exp_lock_hash != NULL) {
- cfs_hash_debug_header_seq(m);
- cfs_hash_debug_str_seq(hs, m);
+ cfs_hash_debug_header(m);
+ cfs_hash_debug_str(hs, m);
}
return 0;
}
-int lprocfs_exp_hash_seq_show(struct seq_file *m, void *data)
+static int lprocfs_exp_hash_seq_show(struct seq_file *m, void *data)
{
struct nid_stat *stats = m->private;
struct obd_device *obd = stats->nid_obd;
}
EXPORT_SYMBOL(lprocfs_nid_stats_clear_seq_write);
-int lprocfs_exp_setup(struct obd_export *exp, lnet_nid_t *nid, int *newnid)
+int lprocfs_exp_setup(struct obd_export *exp, lnet_nid_t *nid)
{
struct nid_stat *new_stat, *old_stat;
struct obd_device *obd = NULL;
int rc = 0;
ENTRY;
- *newnid = 0;
-
if (!exp || !exp->exp_obd || !exp->exp_obd->obd_proc_exports_entry ||
!exp->exp_obd->obd_nid_stats_hash)
RETURN(-EINVAL);
/* not test against zero because eric say:
* You may only test nid against another nid, or LNET_NID_ANY.
* Anything else is nonsense.*/
- if (!nid || *nid == LNET_NID_ANY)
- RETURN(0);
+ if (nid == NULL || *nid == LNET_NID_ANY)
+ RETURN(-EALREADY);
spin_lock(&exp->exp_lock);
if (exp->exp_nid_stats != NULL) {
if (new_stat == NULL)
RETURN(-ENOMEM);
- new_stat->nid = *nid;
- new_stat->nid_obd = exp->exp_obd;
+ new_stat->nid = *nid;
+ new_stat->nid_obd = exp->exp_obd;
/* we need set default refcount to 1 to balance obd_disconnect */
atomic_set(&new_stat->nid_exp_ref_count, 1);
GOTO(destroy_new_ns, rc);
}
+ entry = lprocfs_add_simple(new_stat->nid_proc, "nodemap", new_stat,
+ &lprocfs_exp_nodemap_fops);
+ if (IS_ERR(entry)) {
+ rc = PTR_ERR(entry);
+ CWARN("Error adding the nodemap file: rc = %d\n", rc);
+ GOTO(destroy_new_ns, rc);
+ }
+
entry = lprocfs_add_simple(new_stat->nid_proc, "uuid", new_stat,
&lprocfs_exp_uuid_fops);
if (IS_ERR(entry)) {
- CWARN("Error adding the NID stats file\n");
rc = PTR_ERR(entry);
+ CWARN("Error adding the NID stats file: rc = %d\n", rc);
GOTO(destroy_new_ns, rc);
}
entry = lprocfs_add_simple(new_stat->nid_proc, "hash", new_stat,
&lprocfs_exp_hash_fops);
if (IS_ERR(entry)) {
- CWARN("Error adding the hash file\n");
rc = PTR_ERR(entry);
+ CWARN("Error adding the hash file: rc = %d\n", rc);
GOTO(destroy_new_ns, rc);
}
spin_lock(&exp->exp_lock);
exp->exp_nid_stats = new_stat;
spin_unlock(&exp->exp_lock);
- *newnid = 1;
+
/* protect competitive add to list, not need locking on destroy */
spin_lock(&obd->obd_nid_lock);
list_add(&new_stat->nid_list, &obd->obd_nid_stats);
spin_unlock(&obd->obd_nid_lock);
- RETURN(rc);
+ RETURN(0);
destroy_new_ns:
if (new_stat->nid_proc != NULL)
LPROCFS_OBD_OP_INIT(num_private_stats, stats, find_cbdata);
LPROCFS_OBD_OP_INIT(num_private_stats, stats, init_export);
LPROCFS_OBD_OP_INIT(num_private_stats, stats, destroy_export);
- LPROCFS_OBD_OP_INIT(num_private_stats, stats, llog_init);
- LPROCFS_OBD_OP_INIT(num_private_stats, stats, llog_finish);
LPROCFS_OBD_OP_INIT(num_private_stats, stats, import_event);
LPROCFS_OBD_OP_INIT(num_private_stats, stats, notify);
LPROCFS_OBD_OP_INIT(num_private_stats, stats, health_check);
if (obd == NULL)
return 0;
- c += cfs_hash_debug_header_seq(m);
- c += cfs_hash_debug_str_seq(obd->obd_uuid_hash, m);
- c += cfs_hash_debug_str_seq(obd->obd_nid_hash, m);
- c += cfs_hash_debug_str_seq(obd->obd_nid_stats_hash, m);
+ c += cfs_hash_debug_header(m);
+ c += cfs_hash_debug_str(obd->obd_uuid_hash, m);
+ c += cfs_hash_debug_str(obd->obd_nid_hash, m);
+ c += cfs_hash_debug_str(obd->obd_nid_stats_hash, m);
return c;
}
EXPORT_SYMBOL(lprocfs_hash_seq_show);