Whamcloud - gitweb
LU-5928 obdclass: fix export of nodemap to procfs 75/13175/3
authorDmitry Eremin <dmitry.eremin@intel.com>
Tue, 23 Dec 2014 13:43:59 +0000 (16:43 +0300)
committerOleg Drokin <oleg.drokin@intel.com>
Sun, 4 Jan 2015 18:28:48 +0000 (18:28 +0000)
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 <dmitry.eremin@intel.com>
Change-Id: Ib3ddeabcb1c132eb1b91a0cf9583cc0f74a61e5d
Reviewed-on: http://review.whamcloud.com/13175
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: John L. Hammond <john.hammond@intel.com>
Reviewed-by: James Simmons <uja.ornl@gmail.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/include/lprocfs_status.h
lustre/mdt/mdt_fs.c
lustre/mgs/mgs_fs.c
lustre/obdclass/lprocfs_status_server.c
lustre/ofd/ofd_obd.c

index 92b0ef2..01193cb 100644 (file)
@@ -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)
index e26db56..a5b0df3 100644 (file)
@@ -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);
 }
index 2215b3f..532aaa6 100644 (file)
 #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);
 }
 
 /**
index 442ac5b..d54fd09 100644 (file)
@@ -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)
index 8a29649..5142680 100644 (file)
@@ -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);
 }
 
 /**