extern int lprocfs_add_clear_entry(struct obd_device * obd,
struct proc_dir_entry *entry);
#ifdef HAVE_SERVER_SUPPORT
-extern int lprocfs_exp_setup(struct obd_export *exp,
- lnet_nid_t *peer_nid, int *newnid);
+extern int lprocfs_exp_setup(struct obd_export *exp, lnet_nid_t *peer_nid);
extern int lprocfs_exp_cleanup(struct obd_export *exp);
#else
static inline int lprocfs_exp_cleanup(struct obd_export *exp)
static inline
int lprocfs_nid_stats_clear_seq_show(struct seq_file *m, void *data)
{return 0;}
-static inline int lprocfs_exp_setup(struct obd_export *exp,lnet_nid_t *peer_nid,
- int *newnid)
+static inline int lprocfs_exp_setup(struct obd_export *exp,lnet_nid_t *peer_nid)
{ return 0; }
#endif
static inline int lprocfs_exp_cleanup(struct obd_export *exp)
.release = seq_release,
};
-int mdt_export_stats_init(struct obd_device *obd,
- struct obd_export *exp,
- void *localdata)
+/**
+ * Initialize MDT per-export statistics.
+ *
+ * This function sets up procfs entries for various MDT export counters. These
+ * counters are for per-client statistics tracked on the server.
+ *
+ * \param[in] obd OBD device
+ * \param[in] exp OBD export
+ * \param[in] localdata NID of client
+ *
+ * \retval 0 if successful
+ * \retval negative value on error
+ */
+int mdt_export_stats_init(struct obd_device *obd, struct obd_export *exp,
+ void *localdata)
{
- lnet_nid_t *client_nid = localdata;
- int rc, newnid;
- ENTRY;
+ lnet_nid_t *client_nid = localdata;
+ struct nid_stat *stats;
+ int rc;
+ ENTRY;
LASSERT(!obd->obd_uses_nid_stats);
- rc = lprocfs_exp_setup(exp, client_nid, &newnid);
- if (rc) {
- /* Mask error for already created
- * /proc entries */
- if (rc == -EALREADY)
- rc = 0;
- RETURN(rc);
- }
- if (newnid) {
- struct nid_stat *tmp = exp->exp_nid_stats;
+ rc = lprocfs_exp_setup(exp, client_nid);
+ if (rc != 0)
+ /* Mask error for already created /proc entries */
+ RETURN(rc == -EALREADY ? 0 : rc);
- tmp->nid_stats = lprocfs_alloc_stats(LPROC_MDT_LAST,
+ stats = exp->exp_nid_stats;
+ stats->nid_stats = lprocfs_alloc_stats(LPROC_MDT_LAST,
LPROCFS_STATS_FLAG_NOPERCPU);
- if (tmp->nid_stats == NULL)
- RETURN(-ENOMEM);
- mdt_stats_counter_init(tmp->nid_stats);
- rc = lprocfs_register_stats(tmp->nid_proc, "stats",
- tmp->nid_stats);
- if (rc)
- GOTO(clean, rc);
- rc = lprocfs_nid_ldlm_stats_init(tmp);
- if (rc)
- GOTO(clean, rc);
+ if (stats->nid_stats == NULL)
+ RETURN(-ENOMEM);
+
+ mdt_stats_counter_init(stats->nid_stats);
+
+ rc = lprocfs_register_stats(stats->nid_proc, "stats", stats->nid_stats);
+ if (rc != 0) {
+ lprocfs_free_stats(&stats->nid_stats);
+ GOTO(out, rc);
+ }
+
+ rc = lprocfs_nid_ldlm_stats_init(stats);
+ if (rc != 0)
+ GOTO(out, rc);
- rc = lprocfs_seq_create(tmp->nid_proc, "open_files",
- 0444, &mdt_open_files_seq_fops, tmp);
- if (rc) {
- CWARN("%s: error adding the open_files file: rc = %d\n",
- obd->obd_name, rc);
- GOTO(clean, rc);
- }
+ rc = lprocfs_seq_create(stats->nid_proc, "open_files",
+ 0444, &mdt_open_files_seq_fops, stats);
+ if (rc != 0) {
+ CWARN("%s: error adding the open_files file: rc = %d\n",
+ obd->obd_name, rc);
+ GOTO(out, rc);
}
- RETURN(0);
- clean:
- return rc;
+out:
+ RETURN(rc);
}
#include <lustre_fid.h>
#include "mgs_internal.h"
+/**
+ * Initialize MGS per-export statistics.
+ *
+ * This function sets up procfs entries for various MGS export counters. These
+ * counters are for per-client statistics tracked on the server.
+ *
+ * \param[in] obd OBD device
+ * \param[in] exp OBD export
+ * \param[in] localdata NID of client
+ *
+ * \retval 0 if successful
+ * \retval negative value on error
+ */
int mgs_export_stats_init(struct obd_device *obd, struct obd_export *exp,
void *localdata)
{
lnet_nid_t *client_nid = localdata;
- struct nid_stat *tmp;
- int rc, is_new_nid;
+ struct nid_stat *stats;
+ int rc;
ENTRY;
- rc = lprocfs_exp_setup(exp, client_nid, &is_new_nid);
- if (rc != 0) {
- /* Mask error for already created /proc entries */
- if (rc == -EALREADY)
- rc = 0;
- GOTO(out, rc = 0);
- }
-
- if (!is_new_nid)
- GOTO(out, rc = 0);
-
- tmp = exp->exp_nid_stats;
- tmp->nid_stats = lprocfs_alloc_stats(NUM_OBD_STATS + LPROC_MGS_LAST,
- LPROCFS_STATS_FLAG_NOPERCPU);
- if (tmp->nid_stats == NULL)
- GOTO(out, rc = -ENOMEM);
-
- lprocfs_init_ops_stats(LPROC_MGS_LAST, tmp->nid_stats);
- mgs_stats_counter_init(tmp->nid_stats);
- rc = lprocfs_register_stats(tmp->nid_proc, "stats", tmp->nid_stats);
+ rc = lprocfs_exp_setup(exp, client_nid);
if (rc != 0)
+ /* Mask error for already created /proc entries */
+ RETURN(rc == -EALREADY ? 0 : rc);
+
+ stats = exp->exp_nid_stats;
+ stats->nid_stats = lprocfs_alloc_stats(NUM_OBD_STATS + LPROC_MGS_LAST,
+ LPROCFS_STATS_FLAG_NOPERCPU);
+ if (stats->nid_stats == NULL)
+ RETURN(-ENOMEM);
+
+ lprocfs_init_ops_stats(LPROC_MGS_LAST, stats->nid_stats);
+
+ mgs_stats_counter_init(stats->nid_stats);
+
+ rc = lprocfs_register_stats(stats->nid_proc, "stats", stats->nid_stats);
+ if (rc != 0) {
+ lprocfs_free_stats(&stats->nid_stats);
GOTO(out, rc);
+ }
- rc = lprocfs_nid_ldlm_stats_init(tmp);
+ rc = lprocfs_nid_ldlm_stats_init(stats);
if (rc != 0)
GOTO(out, rc);
- RETURN(0);
out:
- return rc;
+ RETURN(rc);
}
/**
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;
}
+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 obd_export *exp = m->private;
- if (exp->exp_target_data.ted_nodemap)
- return seq_printf(m, "%s\n",
- exp->exp_target_data.ted_nodemap->nm_name);
- return seq_printf(m, "null\n");
+ 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);
}
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",
- exp, &lprocfs_exp_nodemap_fops);
+ 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);
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)
{
struct obd_device *obd = ofd_obd(ofd);
struct nid_stat *stats;
- int num_stats;
- int rc, newnid = 0;
-
+ int rc;
ENTRY;
LASSERT(obd->obd_uses_nid_stats);
/* Self-export gets no proc entry */
RETURN(0);
- rc = lprocfs_exp_setup(exp, client_nid, &newnid);
- if (rc) {
- /* Mask error for already created
- * /proc entries */
- if (rc == -EALREADY)
- rc = 0;
- RETURN(rc);
- }
-
- if (newnid == 0)
- RETURN(0);
+ rc = lprocfs_exp_setup(exp, client_nid);
+ if (rc != 0)
+ /* Mask error for already created /proc entries */
+ RETURN(rc == -EALREADY ? 0 : rc);
stats = exp->exp_nid_stats;
- LASSERT(stats != NULL);
-
- num_stats = NUM_OBD_STATS + LPROC_OFD_STATS_LAST;
-
- stats->nid_stats = lprocfs_alloc_stats(num_stats,
- LPROCFS_STATS_FLAG_NOPERCPU);
+ stats->nid_stats = lprocfs_alloc_stats(NUM_OBD_STATS +
+ LPROC_OFD_STATS_LAST,
+ LPROCFS_STATS_FLAG_NOPERCPU);
if (stats->nid_stats == NULL)
- return -ENOMEM;
+ RETURN(-ENOMEM);
lprocfs_init_ops_stats(LPROC_OFD_STATS_LAST, stats->nid_stats);
+
ofd_stats_counter_init(stats->nid_stats);
- rc = lprocfs_register_stats(stats->nid_proc, "stats",
- stats->nid_stats);
- if (rc)
- GOTO(clean, rc);
- rc = lprocfs_nid_ldlm_stats_init(stats);
- if (rc) {
+ rc = lprocfs_register_stats(stats->nid_proc, "stats", stats->nid_stats);
+ if (rc != 0) {
lprocfs_free_stats(&stats->nid_stats);
- GOTO(clean, rc);
+ GOTO(out, rc);
}
- RETURN(0);
-clean:
- return rc;
+ rc = lprocfs_nid_ldlm_stats_init(stats);
+ if (rc != 0)
+ GOTO(out, rc);
+
+out:
+ RETURN(rc);
}
/**