Whamcloud - gitweb
b=23924 LBUG: ASSERTION(hs == exp->exp_lock_hash) failed
[fs/lustre-release.git] / lustre / obdclass / lprocfs_status.c
index ad145c8..6926153 100644 (file)
@@ -68,28 +68,36 @@ int lprocfs_seq_release(struct inode *inode, struct file *file)
 }
 EXPORT_SYMBOL(lprocfs_seq_release);
 
-struct proc_dir_entry *lprocfs_srch(struct proc_dir_entry *head,
-                                    const char *name)
+static struct proc_dir_entry *__lprocfs_srch(struct proc_dir_entry *head,
+                                             const char *name)
 {
         struct proc_dir_entry *temp;
 
         if (head == NULL)
                 return NULL;
-        LPROCFS_ENTRY();
 
         temp = head->subdir;
         while (temp != NULL) {
                 if (strcmp(temp->name, name) == 0) {
-                        LPROCFS_EXIT();
                         return temp;
                 }
 
                 temp = temp->next;
         }
-        LPROCFS_EXIT();
         return NULL;
 }
 
+struct proc_dir_entry *lprocfs_srch(struct proc_dir_entry *head,
+                                    const char *name)
+{
+        struct proc_dir_entry *temp;
+
+        LPROCFS_ENTRY();
+        temp = __lprocfs_srch(head, name);
+        LPROCFS_EXIT();
+        return temp;
+}
+
 /* lprocfs API calls */
 
 /* Function that emulates snprintf but also has the side effect of advancing
@@ -131,9 +139,11 @@ cfs_proc_dir_entry_t *lprocfs_add_simple(struct proc_dir_entry *root,
                 mode |= 0200;
         if (fops)
                 mode = 0644;
+        LPROCFS_WRITE_ENTRY();
         proc = create_proc_entry(name, mode, root);
         if (!proc) {
                 CERROR("LprocFS: No memory to create /proc entry %s", name);
+                LPROCFS_WRITE_EXIT();
                 return ERR_PTR(-ENOMEM);
         }
         proc->read_proc = read_proc;
@@ -141,6 +151,7 @@ cfs_proc_dir_entry_t *lprocfs_add_simple(struct proc_dir_entry *root,
         proc->data = data;
         if (fops)
                 proc->proc_fops = fops;
+        LPROCFS_WRITE_EXIT();
         return proc;
 }
 
@@ -288,9 +299,12 @@ EXPORT_SYMBOL(lprocfs_evict_client_fops);
 int lprocfs_add_vars(struct proc_dir_entry *root, struct lprocfs_vars *list,
                      void *data)
 {
+        int rc = 0;
+
         if (root == NULL || list == NULL)
                 return -EINVAL;
 
+        LPROCFS_WRITE_ENTRY();
         while (list->name != NULL) {
                 struct proc_dir_entry *cur_root, *proc;
                 char *pathcopy, *cur, *next, pathbuf[64];
@@ -303,7 +317,7 @@ int lprocfs_add_vars(struct proc_dir_entry *root, struct lprocfs_vars *list,
                 if (strlen(list->name) > sizeof(pathbuf) - 1) {
                         OBD_ALLOC(pathcopy, pathsize);
                         if (pathcopy == NULL)
-                                return -ENOMEM;
+                                GOTO(out, rc = -ENOMEM);
                 } else {
                         pathcopy = pathbuf;
                 }
@@ -315,7 +329,7 @@ int lprocfs_add_vars(struct proc_dir_entry *root, struct lprocfs_vars *list,
                         if (*cur =='\0') /* skip double/trailing "/" */
                                 continue;
 
-                        proc = lprocfs_srch(cur_root, cur);
+                        proc = __lprocfs_srch(cur_root, cur);
                         CDEBUG(D_OTHER, "cur_root=%s, cur=%s, next=%s, (%s)\n",
                                cur_root->name, cur, next,
                                (proc ? "exists" : "new"));
@@ -342,7 +356,7 @@ int lprocfs_add_vars(struct proc_dir_entry *root, struct lprocfs_vars *list,
                 if (cur_root == NULL || proc == NULL) {
                         CERROR("LprocFS: No memory to create /proc entry %s",
                                list->name);
-                        return -ENOMEM;
+                        GOTO(out, rc = -ENOMEM);
                 }
 
                 if (list->fops)
@@ -354,7 +368,9 @@ int lprocfs_add_vars(struct proc_dir_entry *root, struct lprocfs_vars *list,
                 proc->data = (list->data ? list->data : data);
                 list++;
         }
-        return 0;
+out:
+        LPROCFS_WRITE_EXIT();
+        return rc;
 }
 
 void lprocfs_remove(struct proc_dir_entry **rooth)
@@ -852,9 +868,12 @@ int lprocfs_rd_import(char *page, char **start, off_t off, int count,
                       cfs_atomic_read(&imp->imp_inval_count));
 
         lprocfs_stats_collect(obd->obd_svc_stats, PTLRPC_REQWAIT_CNTR, &ret);
-        if (ret.lc_count != 0)
-                do_div(ret.lc_sum, ret.lc_count);
-        else
+        if (ret.lc_count != 0) {
+                /* first argument to do_div MUST be __u64 */
+                __u64 sum = ret.lc_sum;
+                do_div(sum, ret.lc_count);
+                ret.lc_sum = sum;
+        } else
                 ret.lc_sum = 0;
         i += snprintf(page + i, count - i,
                       "    rpcs:\n"
@@ -896,7 +915,10 @@ int lprocfs_rd_import(char *page, char **start, off_t off, int count,
                                       PTLRPC_LAST_CNTR + BRW_READ_BYTES + rw,
                                       &ret);
                 if (ret.lc_sum > 0 && ret.lc_count > 0) {
-                        do_div(ret.lc_sum, ret.lc_count);
+                        /* first argument to do_div MUST be __u64 */
+                        __u64 sum = ret.lc_sum;
+                        do_div(sum, ret.lc_count);
+                        ret.lc_sum = sum;
                         i += snprintf(page + i, count - i,
                                       "    %s_data_averages:\n"
                                       "       bytes_per_rpc: "LPU64"\n",
@@ -907,7 +929,10 @@ int lprocfs_rd_import(char *page, char **start, off_t off, int count,
                 j = opcode_offset(OST_READ + rw) + EXTRA_MAX_OPCODES;
                 lprocfs_stats_collect(obd->obd_svc_stats, j, &ret);
                 if (ret.lc_sum > 0 && ret.lc_count != 0) {
-                        do_div(ret.lc_sum, ret.lc_count);
+                        /* first argument to do_div MUST be __u64 */
+                        __u64 sum = ret.lc_sum;
+                        do_div(sum, ret.lc_count);
+                        ret.lc_sum = sum;
                         i += snprintf(page + i, count - i,
                                       "       %s_per_rpc: "LPU64"\n",
                                       ret.lc_units, ret.lc_sum);
@@ -1352,11 +1377,18 @@ int lprocfs_register_stats(struct proc_dir_entry *root, const char *name,
         struct proc_dir_entry *entry;
         LASSERT(root != NULL);
 
+        LPROCFS_WRITE_ENTRY();
         entry = create_proc_entry(name, 0644, root);
+        if (entry) {
+                entry->proc_fops = &lprocfs_stats_seq_fops;
+                entry->data = stats;
+        }
+
+        LPROCFS_WRITE_EXIT();
+
         if (entry == NULL)
                 return -ENOMEM;
-        entry->proc_fops = &lprocfs_stats_seq_fops;
-        entry->data = stats;
+
         return 0;
 }
 
@@ -1517,23 +1549,8 @@ do {                                                                    \
         lprocfs_counter_init(stats, coffset, 0, #op, "reqs");           \
 } while (0)
 
-int lprocfs_alloc_md_stats(struct obd_device *obd,
-                           unsigned num_private_stats)
+void lprocfs_init_mps_stats(int num_private_stats, struct lprocfs_stats *stats)
 {
-        struct lprocfs_stats *stats;
-        unsigned int num_stats;
-        int rc, i;
-
-        LASSERT(obd->md_stats == NULL);
-        LASSERT(obd->obd_proc_entry != NULL);
-        LASSERT(obd->md_cntr_base == 0);
-
-        num_stats = 1 + MD_COUNTER_OFFSET(revalidate_lock) +
-                    num_private_stats;
-        stats = lprocfs_alloc_stats(num_stats, 0);
-        if (stats == NULL)
-                return -ENOMEM;
-
         LPROCFS_MD_OP_INIT(num_private_stats, stats, getstatus);
         LPROCFS_MD_OP_INIT(num_private_stats, stats, change_cbdata);
         LPROCFS_MD_OP_INIT(num_private_stats, stats, find_cbdata);
@@ -1566,6 +1583,26 @@ int lprocfs_alloc_md_stats(struct obd_device *obd,
         LPROCFS_MD_OP_INIT(num_private_stats, stats, get_remote_perm);
         LPROCFS_MD_OP_INIT(num_private_stats, stats, intent_getattr_async);
         LPROCFS_MD_OP_INIT(num_private_stats, stats, revalidate_lock);
+}
+
+int lprocfs_alloc_md_stats(struct obd_device *obd,
+                           unsigned num_private_stats)
+{
+        struct lprocfs_stats *stats;
+        unsigned int num_stats;
+        int rc, i;
+
+        LASSERT(obd->md_stats == NULL);
+        LASSERT(obd->obd_proc_entry != NULL);
+        LASSERT(obd->md_cntr_base == 0);
+
+        num_stats = 1 + MD_COUNTER_OFFSET(revalidate_lock) +
+                    num_private_stats;
+        stats = lprocfs_alloc_stats(num_stats, 0);
+        if (stats == NULL)
+                return -ENOMEM;
+
+        lprocfs_init_mps_stats(num_private_stats, stats);
 
         for (i = num_private_stats; i < num_stats; i++) {
                 if (stats->ls_percpu[0]->lp_cntr[i].lc_name == NULL) {
@@ -1644,15 +1681,18 @@ lprocfs_exp_rd_cb_data_init(struct exp_uuid_cb_data *cb_data, char *page,
         cb_data->len = len;
 }
 
-void lprocfs_exp_print_uuid(void *obj, void *cb_data)
+int lprocfs_exp_print_uuid(cfs_hash_t *hs, cfs_hash_bd_t *bd,
+                           cfs_hlist_node_t *hnode, void *cb_data)
+
 {
-        struct obd_export *exp = (struct obd_export *)obj;
+        struct obd_export *exp = cfs_hash_object(hs, hnode);
         struct exp_uuid_cb_data *data = (struct exp_uuid_cb_data *)cb_data;
 
         if (exp->exp_nid_stats)
                 *data->len += snprintf((data->page + *data->len),
                                        data->count, "%s\n",
                                        obd_uuid2str(&exp->exp_client_uuid));
+        return 0;
 }
 
 int lprocfs_exp_rd_uuid(char *page, char **start, off_t off, int count,
@@ -1671,21 +1711,23 @@ int lprocfs_exp_rd_uuid(char *page, char **start, off_t off, int count,
         return (*cb_data.len);
 }
 
-void lprocfs_exp_print_hash(void *obj, void *cb_data)
+int lprocfs_exp_print_hash(cfs_hash_t *hs, cfs_hash_bd_t *bd,
+                           cfs_hlist_node_t *hnode, void *cb_data)
+
 {
         struct exp_uuid_cb_data *data = cb_data;
-        struct obd_export       *exp = obj;
-        cfs_hash_t              *hs;
+        struct obd_export       *exp = cfs_hash_object(hs, hnode);
 
-        hs = exp->exp_lock_hash;
-        if (hs) {
-                if (!*data->len)
+        if (exp->exp_lock_hash != NULL) {
+                if (!*data->len) {
                         *data->len += cfs_hash_debug_header(data->page,
                                                             data->count);
-
+                }
                 *data->len += cfs_hash_debug_str(hs, data->page + *data->len,
                                                  data->count);
         }
+
+        return 0;
 }
 
 int lprocfs_exp_rd_hash(char *page, char **start, off_t off, int count,
@@ -1720,10 +1762,10 @@ int lprocfs_nid_stats_clear_write_cb(void *obj, void *data)
         struct nid_stat *stat = obj;
         int i;
         ENTRY;
-        /* object has only hash + iterate_all references.
-         * add/delete blocked by hash bucket lock */
+
         CDEBUG(D_INFO,"refcnt %d\n", cfs_atomic_read(&stat->nid_exp_ref_count));
-        if (cfs_atomic_read(&stat->nid_exp_ref_count) == 2) {
+        if (cfs_atomic_read(&stat->nid_exp_ref_count) == 1) {
+                /* object has only hash references. */
                 cfs_spin_lock(&stat->nid_obd->obd_nid_lock);
                 cfs_list_move(&stat->nid_list, data);
                 cfs_spin_unlock(&stat->nid_obd->obd_nid_lock);
@@ -1741,7 +1783,7 @@ int lprocfs_nid_stats_clear_write_cb(void *obj, void *data)
 }
 
 int lprocfs_nid_stats_clear_write(struct file *file, const char *buffer,
-                                         unsigned long count, void *data)
+                                  unsigned long count, void *data)
 {
         struct obd_device *obd = (struct obd_device *)data;
         struct nid_stat *client_stat;
@@ -2054,11 +2096,16 @@ int lprocfs_seq_create(cfs_proc_dir_entry_t *parent, char *name, mode_t mode,
         struct proc_dir_entry *entry;
         ENTRY;
 
+        LPROCFS_WRITE_ENTRY();
         entry = create_proc_entry(name, mode, parent);
+        if (entry) {
+                entry->proc_fops = seq_fops;
+                entry->data = data;
+        }
+        LPROCFS_WRITE_EXIT();
+
         if (entry == NULL)
                 RETURN(-ENOMEM);
-        entry->proc_fops = seq_fops;
-        entry->data = data;
 
         RETURN(0);
 }
@@ -2334,6 +2381,7 @@ EXPORT_SYMBOL(lprocfs_free_stats);
 EXPORT_SYMBOL(lprocfs_clear_stats);
 EXPORT_SYMBOL(lprocfs_register_stats);
 EXPORT_SYMBOL(lprocfs_init_ops_stats);
+EXPORT_SYMBOL(lprocfs_init_mps_stats);
 EXPORT_SYMBOL(lprocfs_init_ldlm_stats);
 EXPORT_SYMBOL(lprocfs_alloc_obd_stats);
 EXPORT_SYMBOL(lprocfs_alloc_md_stats);