/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
* vim:expandtab:shiftwidth=8:tabstop=8:
*
- * Copyright (C) 2002, 2003 Cluster File Systems, Inc.
- * Author: Hariharan Thantry <thantry@users.sourceforge.net>
+ * GPL HEADER START
*
- * This file is part of the Lustre file system, http://www.lustre.org
- * Lustre is a trademark of Cluster File Systems, Inc.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
- * You may have signed or agreed to another license before downloading
- * this software. If so, you are bound by the terms and conditions
- * of that agreement, and the following does not apply to you. See the
- * LICENSE file included with this distribution for more information.
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 only,
+ * as published by the Free Software Foundation.
*
- * If you did not agree to a different license, then this copy of Lustre
- * is open source software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License version 2 for more details (a copy is included
+ * in the LICENSE file that accompanied this code).
*
- * In either case, Lustre is distributed in the hope that it will be
- * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * license text for more details.
+ * You should have received a copy of the GNU General Public License
+ * version 2 along with this program; If not, see
+ * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ * GPL HEADER END
+ */
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved
+ * Use is subject to license terms.
+ */
+/*
+ * This file is part of Lustre, http://www.lustre.org/
+ * Lustre is a trademark of Sun Microsystems, Inc.
+ *
+ * lustre/obdclass/lprocfs_status.c
+ *
+ * Author: Hariharan Thantry <thantry@users.sourceforge.net>
*/
#ifndef EXPORT_SYMTAB
temp = head->subdir;
while (temp != NULL) {
- if (strcmp(temp->name, name) == 0)
+ if (strcmp(temp->name, name) == 0) {
+ LPROCFS_EXIT();
return temp;
+ }
temp = temp->next;
}
{
struct proc_dir_entry *proc;
mode_t mode = 0;
-
+
if (root == NULL || name == NULL)
return -EINVAL;
if (read_proc)
LPROCFS_ENTRY();
OBD_FAIL_TIMEOUT(OBD_FAIL_LPROC_REMOVE, 10);
if (!dp->deleted && dp->read_proc)
- rc = dp->read_proc(page, &start, *ppos, CFS_PAGE_SIZE,
+ rc = dp->read_proc(page, &start, *ppos, CFS_PAGE_SIZE,
&eof, dp->data);
LPROCFS_EXIT();
if (rc <= 0)
};
EXPORT_SYMBOL(lprocfs_evict_client_fops);
+/**
+ * Add /proc entrys.
+ *
+ * \param root [in] The parent proc entry on which new entry will be added.
+ * \param list [in] Array of proc entries to be added.
+ * \param data [in] The argument to be passed when entries read/write routines
+ * are called through /proc file.
+ *
+ * \retval 0 on success
+ * < 0 on error
+ */
int lprocfs_add_vars(struct proc_dir_entry *root, struct lprocfs_vars *list,
void *data)
{
proc_mkdir(cur, cur_root));
} else if (proc == NULL) {
mode_t mode = 0;
- if (list->read_fptr)
- mode = 0444;
- if (list->write_fptr)
- mode |= 0200;
+ if (list->proc_mode != 0000) {
+ mode = list->proc_mode;
+ } else {
+ if (list->read_fptr)
+ mode = 0444;
+ if (list->write_fptr)
+ mode |= 0200;
+ }
proc = create_proc_entry(cur, mode, cur_root);
}
}
parent = root->parent;
LASSERT(parent != NULL);
- LPROCFS_ENTRY(); /* search vs remove race */
+ LPROCFS_WRITE_ENTRY(); /* search vs remove race */
while (1) {
while (temp->subdir != NULL)
"0x%p %s/%s len %d\n", rm_entry, temp->name,
rm_entry->name, (int)strlen(rm_entry->name));
- /* Now, the rm_entry->deleted flags is protected
+ /* Now, the rm_entry->deleted flags is protected
* by _lprocfs_lock. */
- down_write(&_lprocfs_lock);
rm_entry->data = NULL;
remove_proc_entry(rm_entry->name, temp);
- up_write(&_lprocfs_lock);
if (temp == parent)
break;
}
- LPROCFS_EXIT();
+ LPROCFS_WRITE_EXIT();
}
void lprocfs_remove_proc_entry(const char *name, struct proc_dir_entry *parent)
atomic_t *atm = data;
int val = 0;
int rc;
-
+
rc = lprocfs_write_helper(buffer, count, &val);
if (rc < 0)
return rc;
if (val <= 0)
return -ERANGE;
-
+
atomic_set(atm, val);
return count;
}
int lprocfs_obd_cleanup(struct obd_device *obd)
{
- if (!obd)
+ if (!obd)
return -EINVAL;
if (obd->obd_proc_exports_entry) {
/* Should be no exports left */
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);
+ LPROCFS_OBD_OP_INIT(num_private_stats, stats, get_uuid);
LPROCFS_OBD_OP_INIT(num_private_stats, stats, quotacheck);
LPROCFS_OBD_OP_INIT(num_private_stats, stats, quotactl);
LPROCFS_OBD_OP_INIT(num_private_stats, stats, ping);
void lprocfs_free_obd_stats(struct obd_device *obd)
{
- if (obd->obd_stats)
+ if (obd->obd_stats)
lprocfs_free_stats(&obd->obd_stats);
}
cb_data.count = count;
cb_data.eof = eof;
cb_data.len = &len;
- lustre_hash_bucket_iterate(obd->obd_nid_hash_body,
- &stats->nid, lprocfs_exp_print_uuid,
- &cb_data);
+ lustre_hash_for_each_key(obd->obd_nid_hash, &stats->nid,
+ lprocfs_exp_print_uuid, &cb_data);
return (*cb_data.len);
}
struct nid_stat *client_stat;
CFS_LIST_HEAD(free_list);
- lustre_hash_iterate_all(obd->obd_nid_stats_hash_body,
- lprocfs_nid_stats_clear_write_cb, &free_list);
+ lustre_hash_for_each(obd->obd_nid_stats_hash,
+ lprocfs_nid_stats_clear_write_cb, &free_list);
while (!list_empty(&free_list)) {
client_stat = list_entry(free_list.next, struct nid_stat, nid_list);
*newnid = 0;
if (!exp || !exp->exp_obd || !exp->exp_obd->obd_proc_exports_entry ||
- !exp->exp_obd->obd_nid_stats_hash_body)
+ !exp->exp_obd->obd_nid_stats_hash)
RETURN(-EINVAL);
/* not test against zero because eric say:
obd = exp->exp_obd;
- CDEBUG(D_CONFIG, "using hash %p\n", obd->obd_nid_stats_hash_body);
+ CDEBUG(D_CONFIG, "using hash %p\n", obd->obd_nid_stats_hash);
OBD_ALLOC(tmp, sizeof(struct nid_stat));
if (tmp == NULL)
list_add(&tmp->nid_list, &obd->obd_nid_stats);
spin_unlock(&obd->obd_nid_lock);
- tmp1= lustre_hash_findadd_unique(obd->obd_nid_stats_hash_body, nid,
- &tmp->nid_hash);
+ tmp1 = lustre_hash_findadd_unique(obd->obd_nid_stats_hash,
+ nid, &tmp->nid_hash);
CDEBUG(D_INFO, "Found stats %p for nid %s - ref %d\n",
tmp1, libcfs_nid2str(*nid), tmp->nid_exp_ref_count);
if (!tmp->nid_proc) {
CERROR("Error making export directory for"
" nid %s\n", libcfs_nid2str(*nid));
- lustre_hash_delitem(obd->obd_nid_stats_hash_body, nid,
- &tmp->nid_hash);
+ lustre_hash_del(obd->obd_nid_stats_hash, nid, &tmp->nid_hash);
GOTO(destroy_new, rc = -ENOMEM);
}
2. #echo x.0x > /proc/xxx output result : x.0x
3. #echo x.x0 > /proc/xxx output result : x.x
4. #echo x.xx > /proc/xxx output result : x.xx
- Only reserved 2bits fraction.
+ Only reserved 2bits fraction.
*/
for (i = 0; i < (5 - prtn); i++)
temp_mult *= 10;
units <<= 10;
}
/* Specified units override the multiplier */
- if (units)
+ if (units)
mult = mult < 0 ? -units : units;
frac *= mult;
return 0;
}
-int lprocfs_seq_create(cfs_proc_dir_entry_t *parent,
+int lprocfs_seq_create(cfs_proc_dir_entry_t *parent,
char *name, mode_t mode,
struct file_operations *seq_fops, void *data)
{
struct file_operations *seq_fops,
void *data)
{
- return (lprocfs_seq_create(dev->obd_proc_entry, name,
+ return (lprocfs_seq_create(dev->obd_proc_entry, name,
mode, seq_fops, data));
}
EXPORT_SYMBOL(lprocfs_obd_seq_create);
}
EXPORT_SYMBOL(lprocfs_oh_clear);
+int lprocfs_obd_rd_hash(char *page, char **start, off_t off,
+ int count, int *eof, void *data)
+{
+ struct obd_device *obd = data;
+ int c = 0;
+
+ if (obd == NULL)
+ return 0;
+
+ c += lustre_hash_debug_header(page, count);
+ c += lustre_hash_debug_str(obd->obd_uuid_hash, page + c, count - c);
+ c += lustre_hash_debug_str(obd->obd_nid_hash, page + c, count - c);
+ c += lustre_hash_debug_str(obd->obd_nid_stats_hash, page+c, count-c);
+
+ return c;
+}
+EXPORT_SYMBOL(lprocfs_obd_rd_hash);
+
int lprocfs_obd_rd_recovery_status(char *page, char **start, off_t off,
int count, int *eof, void *data)
{
obd->obd_requests_queued_for_recovery) <= 0)
goto out;
- if (lprocfs_obd_snprintf(&page, size, &len, "next_transno: "LPD64"\n",
+ if (lprocfs_obd_snprintf(&page, size, &len, "next_transno: "LPD64"\n",
obd->obd_next_recovery_transno) <= 0)
goto out;
struct obd_device *obd = (struct obd_device *)data;
LASSERT(obd != NULL);
- return snprintf(page, count, "%lu\n",
+ return snprintf(page, count, "%lu\n",
obd->obd_recovery_max_time);
}
EXPORT_SYMBOL(lprocfs_obd_rd_recovery_maxtime);