#if defined(LPROCFS)
+#define MAX_STRING_SIZE 128
+
/* for bug 10866, global variable */
DECLARE_RWSEM(_lprocfs_lock);
EXPORT_SYMBOL(_lprocfs_lock);
return 0;
}
-
-static ssize_t lprocfs_fops_read(struct file *f, char __user *buf, size_t size, loff_t *ppos)
+static ssize_t lprocfs_fops_read(struct file *f, char __user *buf,
+ size_t size, loff_t *ppos)
{
struct proc_dir_entry *dp = PDE(f->f_dentry->d_inode);
char *page, *start = NULL;
int rc = 0, eof = 1, count;
- if (*ppos >= PAGE_SIZE)
+ if (*ppos >= CFS_PAGE_SIZE)
return 0;
page = (char *)__get_free_page(GFP_KERNEL);
LPROCFS_ENTRY();
OBD_FAIL_TIMEOUT(OBD_FAIL_LPROC_REMOVE, 10);
if (!dp->deleted && dp->read_proc)
- rc = dp->read_proc(page, &start, *ppos, PAGE_SIZE,
+ rc = dp->read_proc(page, &start, *ppos, CFS_PAGE_SIZE,
&eof, dp->data);
LPROCFS_EXIT();
if (rc <= 0)
.write = lprocfs_fops_write,
};
+int lprocfs_evict_client_open(struct inode *inode, struct file *f)
+{
+ struct proc_dir_entry *dp = PDE(f->f_dentry->d_inode);
+ struct obd_device *obd = dp->data;
+
+ atomic_inc(&obd->obd_evict_inprogress);
+
+ return 0;
+}
+
+int lprocfs_evict_client_release(struct inode *inode, struct file *f)
+{
+ struct proc_dir_entry *dp = PDE(f->f_dentry->d_inode);
+ struct obd_device *obd = dp->data;
+
+ atomic_dec(&obd->obd_evict_inprogress);
+ wake_up(&obd->obd_evict_inprogress_waitq);
+
+ return 0;
+}
+
+struct file_operations lprocfs_evict_client_fops = {
+ .owner = THIS_MODULE,
+ .read = lprocfs_fops_read,
+ .write = lprocfs_fops_write,
+ .open = lprocfs_evict_client_open,
+ .release = lprocfs_evict_client_release,
+};
+EXPORT_SYMBOL(lprocfs_evict_client_fops);
int lprocfs_add_vars(struct proc_dir_entry *root, struct lprocfs_vars *list,
void *data)
return -ENOMEM;
}
- proc->proc_fops = &lprocfs_generic_fops;
+ if (list->fops)
+ proc->proc_fops = list->fops;
+ else
+ proc->proc_fops = &lprocfs_generic_fops;
proc->read_proc = list->read_fptr;
proc->write_proc = list->write_fptr;
proc->data = (list->data ? list->data : data);
}
/* Generic callbacks */
+int lprocfs_rd_uint(char *page, char **start, off_t off,
+ int count, int *eof, void *data)
+{
+ unsigned int *temp = (unsigned int *)data;
+ return snprintf(page, count, "%u\n", *temp);
+}
+
+int lprocfs_wr_uint(struct file *file, const char *buffer,
+ unsigned long count, void *data)
+{
+ unsigned *p = data;
+ char dummy[MAX_STRING_SIZE + 1], *end;
+ unsigned long tmp;
+
+ dummy[MAX_STRING_SIZE] = '\0';
+ if (copy_from_user(dummy, buffer, MAX_STRING_SIZE))
+ return -EFAULT;
+
+ tmp = simple_strtoul(dummy, &end, 0);
+ if (dummy == end)
+ return -EINVAL;
+
+ *p = (unsigned int)tmp;
+ return count;
+}
int lprocfs_rd_u64(char *page, char **start, off_t off,
int count, int *eof, void *data)
return snprintf(page, count, "%d\n", atomic_read(atom));
}
+int lprocfs_wr_atomic(struct file *file, const char *buffer,
+ unsigned long count, void *data)
+{
+ 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_rd_uuid(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
imp_state_name = ptlrpc_import_state_name(imp->imp_state);
*eof = 1;
rc = snprintf(page, count, "%s\t%s%s\n",
- obd2cli_tgt(obd), imp_state_name,
- imp->imp_deactive ? "\tDEACTIVATED" : "");
+ obd2cli_tgt(obd), imp_state_name,
+ imp->imp_deactive ? "\tDEACTIVATED" : "");
LPROCFS_CLIMP_EXIT(obd);
return rc;
struct ptlrpc_connection *conn;
int rc = 0;
- LASSERT(obd != NULL);
+ LASSERT(obd != NULL);
+
LPROCFS_CLIMP_CHECK(obd);
conn = obd->u.cli.cl_import->imp_connection;
LASSERT(conn != NULL);
*eof = 1;
- rc = snprintf(page, count, "%s\n", conn->c_remote_uuid.uuid);
+ if (obd->u.cli.cl_import) {
+ rc = snprintf(page, count, "%s\n",
+ conn->c_remote_uuid.uuid);
+ } else {
+ rc = snprintf(page, count, "%s\n", "<none>");
+ }
LPROCFS_CLIMP_EXIT(obd);
return rc;
"join_file",
"getattr_by_fid",
"no_oh_for_devices",
- "local_1.8_client",
- "remote_1.8_client",
+ "local_client",
+ "remote_client",
"max_byte_per_rpc",
"64bit_qdata",
- "fid_capability",
+ "mds_capability",
"oss_capability",
+ "early_lock_cancel",
+ "size_on_mds",
+ "adaptive_timeouts",
+ "lru_resize",
+ "mds_mds_connection",
+ "real_conn",
+ "change_qunit_size",
+ "alt_checksum_algorithm",
NULL
};
return 0;
}
-struct lprocfs_stats *lprocfs_alloc_stats(unsigned int num)
+struct lprocfs_stats *lprocfs_alloc_stats(unsigned int num,
+ enum lprocfs_stats_flags flags)
{
struct lprocfs_stats *stats;
struct lprocfs_percpu *percpu;
unsigned int percpusize;
unsigned int i;
+ unsigned int num_cpu;
if (num == 0)
return NULL;
- OBD_ALLOC(stats, offsetof(typeof(*stats), ls_percpu[num_online_cpus()]));
+ if (flags & LPROCFS_STATS_FLAG_NOPERCPU)
+ num_cpu = 1;
+ else
+ num_cpu = num_possible_cpus();
+
+ OBD_ALLOC(stats, offsetof(typeof(*stats), ls_percpu[num_cpu]));
if (stats == NULL)
return NULL;
- percpusize = L1_CACHE_ALIGN(offsetof(typeof(*percpu), lp_cntr[num]));
- stats->ls_percpu_size = num_online_cpus() * percpusize;
+ if (flags & LPROCFS_STATS_FLAG_NOPERCPU) {
+ stats->ls_flags = flags;
+ spin_lock_init(&stats->ls_lock);
+ /* Use this lock only if there are no percpu areas */
+ } else {
+ stats->ls_flags = 0;
+ }
+
+ percpusize = offsetof(typeof(*percpu), lp_cntr[num]);
+ if (num_cpu > 1)
+ percpusize = L1_CACHE_ALIGN(percpusize);
+
+ stats->ls_percpu_size = num_cpu * percpusize;
OBD_ALLOC(stats->ls_percpu[0], stats->ls_percpu_size);
if (stats->ls_percpu[0] == NULL) {
OBD_FREE(stats, offsetof(typeof(*stats),
- ls_percpu[num_online_cpus()]));
+ ls_percpu[num_cpu]));
return NULL;
}
stats->ls_num = num;
- for (i = 1; i < num_online_cpus(); i++)
+ for (i = 1; i < num_cpu; i++)
stats->ls_percpu[i] = (void *)(stats->ls_percpu[i - 1]) +
percpusize;
void lprocfs_free_stats(struct lprocfs_stats **statsh)
{
struct lprocfs_stats *stats = *statsh;
-
- if (!stats || (stats->ls_num == 0))
+ unsigned int num_cpu;
+
+ if (stats == NULL || stats->ls_num == 0)
return;
*statsh = NULL;
+ if (stats->ls_flags & LPROCFS_STATS_FLAG_NOPERCPU)
+ num_cpu = 1;
+ else
+ num_cpu = num_possible_cpus();
+
OBD_FREE(stats->ls_percpu[0], stats->ls_percpu_size);
- OBD_FREE(stats, offsetof(typeof(*stats), ls_percpu[num_online_cpus()]));
+ OBD_FREE(stats, offsetof(typeof(*stats), ls_percpu[num_cpu]));
}
void lprocfs_clear_stats(struct lprocfs_stats *stats)
{
struct lprocfs_counter *percpu_cntr;
int i,j;
+ unsigned int num_cpu;
- for (i = 0; i < num_online_cpus(); i++) {
+ num_cpu = lprocfs_stats_lock(stats, LPROCFS_GET_NUM_CPU);
+
+ for (i = 0; i < num_cpu; i++) {
for (j = 0; j < stats->ls_num; j++) {
percpu_cntr = &(stats->ls_percpu[i])->lp_cntr[j];
atomic_inc(&percpu_cntr->lc_cntl.la_entry);
atomic_inc(&percpu_cntr->lc_cntl.la_exit);
}
}
+
+ lprocfs_stats_unlock(stats);
}
static ssize_t lprocfs_stats_seq_write(struct file *file, const char *buf,
struct lprocfs_counter *cntr = v;
struct lprocfs_counter t, ret = { .lc_min = ~(__u64)0 };
int i, idx, rc;
+ unsigned int num_cpu;
if (cntr == &(stats->ls_percpu[0])->lp_cntr[0]) {
struct timeval now;
}
idx = cntr - &(stats->ls_percpu[0])->lp_cntr[0];
- for (i = 0; i < num_online_cpus(); i++) {
+ if (stats->ls_flags & LPROCFS_STATS_FLAG_NOPERCPU)
+ num_cpu = 1;
+ else
+ num_cpu = num_possible_cpus();
+
+ for (i = 0; i < num_cpu; i++) {
struct lprocfs_counter *percpu_cntr =
&(stats->ls_percpu[i])->lp_cntr[idx];
int centry;
LPROCFS_EXIT();
return rc;
}
-
seq = file->private_data;
seq->private = dp->data;
return 0;
{
struct lprocfs_counter *c;
int i;
+ unsigned int num_cpu;
LASSERT(stats != NULL);
- for (i = 0; i < num_online_cpus(); i++) {
+
+ num_cpu = lprocfs_stats_lock(stats, LPROCFS_GET_NUM_CPU);
+
+ for (i = 0; i < num_cpu; i++) {
c = &(stats->ls_percpu[i]->lp_cntr[index]);
c->lc_config = conf;
c->lc_count = 0;
c->lc_name = name;
c->lc_units = units;
}
+
+ lprocfs_stats_unlock(stats);
}
EXPORT_SYMBOL(lprocfs_counter_init);
LPROCFS_OBD_OP_INIT(num_private_stats, stats, connect);
LPROCFS_OBD_OP_INIT(num_private_stats, stats, reconnect);
LPROCFS_OBD_OP_INIT(num_private_stats, stats, disconnect);
+ LPROCFS_OBD_OP_INIT(num_private_stats, stats, fid_init);
+ LPROCFS_OBD_OP_INIT(num_private_stats, stats, fid_fini);
+ LPROCFS_OBD_OP_INIT(num_private_stats, stats, fid_alloc);
+ LPROCFS_OBD_OP_INIT(num_private_stats, stats, fid_delete);
LPROCFS_OBD_OP_INIT(num_private_stats, stats, statfs);
LPROCFS_OBD_OP_INIT(num_private_stats, stats, statfs_async);
LPROCFS_OBD_OP_INIT(num_private_stats, stats, packmd);
LPROCFS_OBD_OP_INIT(num_private_stats, stats, unpackmd);
LPROCFS_OBD_OP_INIT(num_private_stats, stats, checkmd);
LPROCFS_OBD_OP_INIT(num_private_stats, stats, preallocate);
+ LPROCFS_OBD_OP_INIT(num_private_stats, stats, precreate);
LPROCFS_OBD_OP_INIT(num_private_stats, stats, create);
LPROCFS_OBD_OP_INIT(num_private_stats, stats, destroy);
LPROCFS_OBD_OP_INIT(num_private_stats, stats, setattr);
LPROCFS_OBD_OP_INIT(num_private_stats, stats, destroy_export);
LPROCFS_OBD_OP_INIT(num_private_stats, stats, extent_calc);
LPROCFS_OBD_OP_INIT(num_private_stats, stats, llog_init);
+ LPROCFS_OBD_OP_INIT(num_private_stats, stats, llog_connect);
LPROCFS_OBD_OP_INIT(num_private_stats, stats, llog_finish);
LPROCFS_OBD_OP_INIT(num_private_stats, stats, pin);
LPROCFS_OBD_OP_INIT(num_private_stats, stats, unpin);
LASSERT(obd->obd_proc_entry != NULL);
LASSERT(obd->obd_cntr_base == 0);
- num_stats = ((int)sizeof(*obd->obd_type->typ_ops) / sizeof(void *)) +
+ num_stats = ((int)sizeof(*obd->obd_type->typ_dt_ops) / sizeof(void *)) +
num_private_stats - 1 /* o_owner */;
- stats = lprocfs_alloc_stats(num_stats);
+ stats = lprocfs_alloc_stats(num_stats, 0);
if (stats == NULL)
return -ENOMEM;
lprocfs_free_stats(&obd->obd_stats);
}
+#define LPROCFS_MD_OP_INIT(base, stats, op) \
+do { \
+ unsigned int coffset = base + MD_COUNTER_OFFSET(op); \
+ LASSERT(coffset < stats->ls_num); \
+ lprocfs_counter_init(stats, coffset, 0, #op, "reqs"); \
+} while (0)
+
+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(get_remote_perm) +
+ 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, close);
+ LPROCFS_MD_OP_INIT(num_private_stats, stats, create);
+ LPROCFS_MD_OP_INIT(num_private_stats, stats, done_writing);
+ LPROCFS_MD_OP_INIT(num_private_stats, stats, enqueue);
+ LPROCFS_MD_OP_INIT(num_private_stats, stats, getattr);
+ LPROCFS_MD_OP_INIT(num_private_stats, stats, getattr_name);
+ LPROCFS_MD_OP_INIT(num_private_stats, stats, intent_lock);
+ LPROCFS_MD_OP_INIT(num_private_stats, stats, link);
+ LPROCFS_MD_OP_INIT(num_private_stats, stats, rename);
+ LPROCFS_MD_OP_INIT(num_private_stats, stats, is_subdir);
+ LPROCFS_MD_OP_INIT(num_private_stats, stats, setattr);
+ LPROCFS_MD_OP_INIT(num_private_stats, stats, sync);
+ LPROCFS_MD_OP_INIT(num_private_stats, stats, readpage);
+ LPROCFS_MD_OP_INIT(num_private_stats, stats, unlink);
+ LPROCFS_MD_OP_INIT(num_private_stats, stats, setxattr);
+ LPROCFS_MD_OP_INIT(num_private_stats, stats, getxattr);
+ LPROCFS_MD_OP_INIT(num_private_stats, stats, init_ea_size);
+ LPROCFS_MD_OP_INIT(num_private_stats, stats, get_lustre_md);
+ LPROCFS_MD_OP_INIT(num_private_stats, stats, free_lustre_md);
+ LPROCFS_MD_OP_INIT(num_private_stats, stats, set_open_replay_data);
+ LPROCFS_MD_OP_INIT(num_private_stats, stats, clear_open_replay_data);
+ LPROCFS_MD_OP_INIT(num_private_stats, stats, set_lock_data);
+ LPROCFS_MD_OP_INIT(num_private_stats, stats, lock_match);
+ LPROCFS_MD_OP_INIT(num_private_stats, stats, cancel_unused);
+ LPROCFS_MD_OP_INIT(num_private_stats, stats, renew_capa);
+ LPROCFS_MD_OP_INIT(num_private_stats, stats, get_remote_perm);
+
+ for (i = num_private_stats; i < num_stats; i++) {
+ if (stats->ls_percpu[0]->lp_cntr[i].lc_name == NULL) {
+ CERROR("Missing md_stat initializer md_op "
+ "operation at offset %d. Aborting.\n",
+ i - num_private_stats);
+ LBUG();
+ }
+ }
+ rc = lprocfs_register_stats(obd->obd_proc_entry, "stats", stats);
+ if (rc < 0) {
+ lprocfs_free_stats(&stats);
+ } else {
+ obd->md_stats = stats;
+ obd->md_cntr_base = num_private_stats;
+ }
+ return rc;
+}
+
+void lprocfs_free_md_stats(struct obd_device *obd)
+{
+ struct lprocfs_stats *stats = obd->md_stats;
+
+ if (stats != NULL) {
+ obd->md_stats = NULL;
+ lprocfs_free_stats(&stats);
+ }
+}
+
int lprocfs_exp_rd_nid(char *page, char **start, off_t off, int count,
int *eof, void *data)
{
return snprintf(page, count, "%s\n",
obd_uuid2str(&exp->exp_client_uuid));
}
-
+
int lprocfs_exp_setup(struct obd_export *exp)
{
char name[sizeof (exp->exp_client_uuid.uuid) + 3];
int i = 1, rc;
ENTRY;
-
if (!exp || !exp->exp_obd || !exp->exp_obd->obd_proc_exports)
RETURN(-EINVAL);
-
mutex_down(&exp->exp_obd->obd_proc_exp_sem);
sprintf(name, "%s", (char *)exp->exp_client_uuid.uuid);
while (lprocfs_srch(exp->exp_obd->obd_proc_exports, name)) {
lprocfs_exp_rd_uuid, NULL, exp);
if (rc)
GOTO(out, rc);
-
/* Always add ldlm stats */
exp->exp_ldlm_stats = lprocfs_alloc_stats(LDLM_LAST_OPC
- - LDLM_FIRST_OPC);
+ - LDLM_FIRST_OPC, 0);
if (exp->exp_ldlm_stats == NULL) {
lprocfs_remove(&exp->exp_proc);
GOTO(out, rc = -ENOMEM);
units <<= 10;
}
/* Specified units override the multiplier */
- if (units)
+ if (units)
mult = mult < 0 ? -units : units;
frac *= mult;
EXPORT_SYMBOL(lprocfs_rd_u64);
EXPORT_SYMBOL(lprocfs_rd_atomic);
+EXPORT_SYMBOL(lprocfs_wr_atomic);
+EXPORT_SYMBOL(lprocfs_rd_uint);
+EXPORT_SYMBOL(lprocfs_wr_uint);
EXPORT_SYMBOL(lprocfs_rd_uuid);
EXPORT_SYMBOL(lprocfs_rd_name);
EXPORT_SYMBOL(lprocfs_rd_fstype);