From: Dmitry Eremin Date: Tue, 23 Dec 2014 13:43:59 +0000 (+0300) Subject: LU-5928 obdclass: fix export of nodemap to procfs X-Git-Tag: 2.6.93~94 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=d68d56c00e7788a445f94b6e099f7f8b9e259bae;p=fs%2Flustre-release.git LU-5928 obdclass: fix export of nodemap to procfs Rewrite export code of nodemaps to use nid_stats instead of exp directly like is done for other members. Clean up redundant code. Signed-off-by: Dmitry Eremin Change-Id: Ib3ddeabcb1c132eb1b91a0cf9583cc0f74a61e5d Reviewed-on: http://review.whamcloud.com/13175 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: John L. Hammond Reviewed-by: James Simmons Reviewed-by: Oleg Drokin --- diff --git a/lustre/include/lprocfs_status.h b/lustre/include/lprocfs_status.h index 92b0ef2..01193cb 100644 --- a/lustre/include/lprocfs_status.h +++ b/lustre/include/lprocfs_status.h @@ -590,8 +590,7 @@ struct nid_stat; 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) @@ -993,8 +992,7 @@ ssize_t lprocfs_nid_stats_seq_write(struct file *file, const char *buffer, 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) diff --git a/lustre/mdt/mdt_fs.c b/lustre/mdt/mdt_fs.c index e26db56..a5b0df3 100644 --- a/lustre/mdt/mdt_fs.c +++ b/lustre/mdt/mdt_fs.c @@ -50,49 +50,59 @@ static const struct file_operations mdt_open_files_seq_fops = { .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); } diff --git a/lustre/mgs/mgs_fs.c b/lustre/mgs/mgs_fs.c index 2215b3f..532aaa6 100644 --- a/lustre/mgs/mgs_fs.c +++ b/lustre/mgs/mgs_fs.c @@ -46,44 +46,54 @@ #include #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); } /** diff --git a/lustre/obdclass/lprocfs_status_server.c b/lustre/obdclass/lprocfs_status_server.c index 442ac5b..d54fd09 100644 --- a/lustre/obdclass/lprocfs_status_server.c +++ b/lustre/obdclass/lprocfs_status_server.c @@ -165,21 +165,34 @@ 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; } +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); @@ -269,7 +282,7 @@ lprocfs_nid_stats_clear_seq_write(struct file *file, const char *buffer, } 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; @@ -278,8 +291,6 @@ int lprocfs_exp_setup(struct obd_export *exp, lnet_nid_t *nid, int *newnid) 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); @@ -287,8 +298,8 @@ int lprocfs_exp_setup(struct obd_export *exp, lnet_nid_t *nid, int *newnid) /* 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) { @@ -305,8 +316,8 @@ int lprocfs_exp_setup(struct obd_export *exp, lnet_nid_t *nid, int *newnid) 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); @@ -353,8 +364,8 @@ int lprocfs_exp_setup(struct obd_export *exp, lnet_nid_t *nid, int *newnid) 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); @@ -380,13 +391,13 @@ int lprocfs_exp_setup(struct obd_export *exp, lnet_nid_t *nid, int *newnid) 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) diff --git a/lustre/ofd/ofd_obd.c b/lustre/ofd/ofd_obd.c index 8a29649..5142680 100644 --- a/lustre/ofd/ofd_obd.c +++ b/lustre/ofd/ofd_obd.c @@ -70,9 +70,7 @@ static int ofd_export_stats_init(struct ofd_device *ofd, { 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); @@ -81,44 +79,34 @@ static int ofd_export_stats_init(struct ofd_device *ofd, /* 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); } /**