X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Finclude%2Flprocfs_status.h;h=abac33c4c5f4f95d1d738109d0c9fd4e8901c543;hb=92f7ed4a92abf85b9b1cdfb0cae06e50a5f8319d;hp=da1dc16eac602c758e5302760ee302e33f283a44;hpb=113303973ec9f8484eb2355a1a6ef3c4c7fd6a56;p=fs%2Flustre-release.git diff --git a/lustre/include/lprocfs_status.h b/lustre/include/lprocfs_status.h index da1dc16..abac33c 100644 --- a/lustre/include/lprocfs_status.h +++ b/lustre/include/lprocfs_status.h @@ -1,29 +1,48 @@ /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- * vim:expandtab:shiftwidth=8:tabstop=8: * - * Copyright (C) 2002 Cluster File Systems, Inc. + * GPL HEADER START * - * This file is part of Lustre, http://www.lustre.org. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * - * Lustre is free 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 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. * - * 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 - * GNU General Public License for more details. + * 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). * - * You should have received a copy of the GNU General Public License - * along with Lustre; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * 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 * - * Top level header file for LProc SNMP - * Author: Hariharan Thantry thantry@users.sourceforge.net + * 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/include/lprocfs_status.h + * + * Top level header file for LProc SNMP + * + * Author: Hariharan Thantry thantry@users.sourceforge.net */ #ifndef _LPROCFS_SNMP_H #define _LPROCFS_SNMP_H +#include #if defined(__linux__) #include #elif defined(__APPLE__) @@ -44,6 +63,11 @@ struct lprocfs_vars { cfs_read_proc_t *read_fptr; cfs_write_proc_t *write_fptr; void *data; + struct file_operations *fops; + /** + * /proc file mode. + */ + mode_t proc_mode; }; struct lprocfs_static_vars { @@ -119,14 +143,16 @@ struct lprocfs_atomic { atomic_t la_exit; }; +#define LC_MIN_INIT ((~(__u64)0) >> 1) + struct lprocfs_counter { struct lprocfs_atomic lc_cntl; /* may need to move to per set */ unsigned int lc_config; - __u64 lc_count; - __u64 lc_sum; - __u64 lc_min; - __u64 lc_max; - __u64 lc_sumsquare; + __s64 lc_count; + __s64 lc_sum; + __s64 lc_min; + __s64 lc_max; + __s64 lc_sumsquare; const char *lc_name; /* must be static */ const char *lc_units; /* must be static */ }; @@ -135,14 +161,162 @@ struct lprocfs_percpu { struct lprocfs_counter lp_cntr[0]; }; +#define LPROCFS_GET_NUM_CPU 0x0001 +#define LPROCFS_GET_SMP_ID 0x0002 + +enum lprocfs_stats_flags { + LPROCFS_STATS_FLAG_NONE = 0x0000, /* per cpu counter */ + LPROCFS_STATS_FLAG_NOPERCPU = 0x0001, /* stats have no percpu + * area and need locking */ + LPROCFS_STATS_GET_SMP_ID = 0x0002, /* just record locking with + * LPROCFS_GET_SMP_ID flag */ +}; + +enum lprocfs_fields_flags { + LPROCFS_FIELDS_FLAGS_CONFIG = 0x0001, + LPROCFS_FIELDS_FLAGS_SUM = 0x0002, + LPROCFS_FIELDS_FLAGS_MIN = 0x0003, + LPROCFS_FIELDS_FLAGS_MAX = 0x0004, + LPROCFS_FIELDS_FLAGS_AVG = 0x0005, + LPROCFS_FIELDS_FLAGS_SUMSQUARE = 0x0006, + LPROCFS_FIELDS_FLAGS_COUNT = 0x0007, +}; struct lprocfs_stats { unsigned int ls_num; /* # of counters */ - unsigned int ls_percpu_size; + int ls_flags; /* See LPROCFS_STATS_FLAG_* */ + spinlock_t ls_lock; /* Lock used only when there are + * no percpu stats areas */ struct lprocfs_percpu *ls_percpu[0]; }; +static inline int opcode_offset(__u32 opc) { + if (opc < OST_LAST_OPC) { + /* OST opcode */ + return (opc - OST_FIRST_OPC); + } else if (opc < MDS_LAST_OPC) { + /* MDS opcode */ + return (opc - MDS_FIRST_OPC + + (OST_LAST_OPC - OST_FIRST_OPC)); + } else if (opc < LDLM_LAST_OPC) { + /* LDLM Opcode */ + return (opc - LDLM_FIRST_OPC + + (MDS_LAST_OPC - MDS_FIRST_OPC) + + (OST_LAST_OPC - OST_FIRST_OPC)); + } else if (opc < MGS_LAST_OPC) { + /* MGS Opcode */ + return (opc - MGS_FIRST_OPC + + (LDLM_LAST_OPC - LDLM_FIRST_OPC) + + (MDS_LAST_OPC - MDS_FIRST_OPC) + + (OST_LAST_OPC - OST_FIRST_OPC)); + } else if (opc < OBD_LAST_OPC) { + /* OBD Ping */ + return (opc - OBD_FIRST_OPC + + (MGS_LAST_OPC - MGS_FIRST_OPC) + + (LDLM_LAST_OPC - LDLM_FIRST_OPC) + + (MDS_LAST_OPC - MDS_FIRST_OPC) + + (OST_LAST_OPC - OST_FIRST_OPC)); + } else if (opc < LLOG_LAST_OPC) { + /* LLOG Opcode */ + return (opc - LLOG_FIRST_OPC + + (OBD_LAST_OPC - OBD_FIRST_OPC) + + (MGS_LAST_OPC - MGS_FIRST_OPC) + + (LDLM_LAST_OPC - LDLM_FIRST_OPC) + + (MDS_LAST_OPC - MDS_FIRST_OPC) + + (OST_LAST_OPC - OST_FIRST_OPC)); + } else if (opc < QUOTA_LAST_OPC) { + /* LQUOTA Opcode */ + return (opc - QUOTA_FIRST_OPC + + (LLOG_LAST_OPC - LLOG_FIRST_OPC) + + (OBD_LAST_OPC - OBD_FIRST_OPC) + + (MGS_LAST_OPC - MGS_FIRST_OPC) + + (LDLM_LAST_OPC - LDLM_FIRST_OPC) + + (MDS_LAST_OPC - MDS_FIRST_OPC) + + (OST_LAST_OPC - OST_FIRST_OPC)); + } else if (opc < SEQ_LAST_OPC) { + /* SEQ opcode */ + return (opc - SEQ_FIRST_OPC + + (QUOTA_LAST_OPC- QUOTA_FIRST_OPC) + + (LLOG_LAST_OPC - LLOG_FIRST_OPC) + + (OBD_LAST_OPC - OBD_FIRST_OPC) + + (MGS_LAST_OPC - MGS_FIRST_OPC) + + (LDLM_LAST_OPC - LDLM_FIRST_OPC) + + (MDS_LAST_OPC - MDS_FIRST_OPC) + + (OST_LAST_OPC - OST_FIRST_OPC)); + } else if (opc < SEC_LAST_OPC) { + /* SEC opcode */ + return (opc - SEC_FIRST_OPC + + (SEQ_LAST_OPC - SEQ_FIRST_OPC) + + (QUOTA_LAST_OPC- QUOTA_FIRST_OPC) + + (LLOG_LAST_OPC - LLOG_FIRST_OPC) + + (OBD_LAST_OPC - OBD_FIRST_OPC) + + (MGS_LAST_OPC - MGS_FIRST_OPC) + + (LDLM_LAST_OPC - LDLM_FIRST_OPC) + + (MDS_LAST_OPC - MDS_FIRST_OPC) + + (OST_LAST_OPC - OST_FIRST_OPC)); + } else if (opc < FLD_LAST_OPC) { + /* FLD opcode */ + return (opc - FLD_FIRST_OPC + + (SEC_LAST_OPC - SEC_FIRST_OPC) + + (SEQ_LAST_OPC - SEQ_FIRST_OPC) + + (QUOTA_LAST_OPC- QUOTA_FIRST_OPC) + + (LLOG_LAST_OPC - LLOG_FIRST_OPC) + + (OBD_LAST_OPC - OBD_FIRST_OPC) + + (MGS_LAST_OPC - MGS_FIRST_OPC) + + (LDLM_LAST_OPC - LDLM_FIRST_OPC) + + (MDS_LAST_OPC - MDS_FIRST_OPC) + + (OST_LAST_OPC - OST_FIRST_OPC)); + } else { + /* Unknown Opcode */ + return -1; + } +} + + +#define LUSTRE_MAX_OPCODES ((OST_LAST_OPC - OST_FIRST_OPC) + \ + (MDS_LAST_OPC - MDS_FIRST_OPC) + \ + (LDLM_LAST_OPC - LDLM_FIRST_OPC) + \ + (MGS_LAST_OPC - MGS_FIRST_OPC) + \ + (OBD_LAST_OPC - OBD_FIRST_OPC) + \ + (LLOG_LAST_OPC - LLOG_FIRST_OPC) + \ + (QUOTA_LAST_OPC - QUOTA_FIRST_OPC) + \ + (SEQ_LAST_OPC - SEQ_FIRST_OPC) + \ + (SEC_LAST_OPC - SEC_FIRST_OPC) + \ + (FLD_LAST_OPC - FLD_FIRST_OPC)) + +#define EXTRA_MAX_OPCODES ((PTLRPC_LAST_CNTR - PTLRPC_FIRST_CNTR) + \ + (EXTRA_LAST_OPC - EXTRA_FIRST_OPC)) + +enum { + PTLRPC_REQWAIT_CNTR = 0, + PTLRPC_REQQDEPTH_CNTR, + PTLRPC_REQACTIVE_CNTR, + PTLRPC_TIMEOUT, + PTLRPC_REQBUF_AVAIL_CNTR, + PTLRPC_LAST_CNTR +}; + +#define PTLRPC_FIRST_CNTR PTLRPC_REQWAIT_CNTR +enum { + LDLM_GLIMPSE_ENQUEUE = 0, + LDLM_PLAIN_ENQUEUE, + LDLM_EXTENT_ENQUEUE, + LDLM_FLOCK_ENQUEUE, + LDLM_IBITS_ENQUEUE, + MDS_REINT_SETATTR, + MDS_REINT_CREATE, + MDS_REINT_LINK, + MDS_REINT_UNLINK, + MDS_REINT_RENAME, + MDS_REINT_OPEN, + MDS_REINT_SETXATTR, + BRW_READ_BYTES, + BRW_WRITE_BYTES, + EXTRA_LAST_OPC +}; + +#define EXTRA_FIRST_OPC LDLM_GLIMPSE_ENQUEUE /* class_obd.c */ extern cfs_proc_dir_entry_t *proc_lustre_root; @@ -150,8 +324,54 @@ struct obd_device; struct file; struct obd_histogram; +/* Days / hours / mins / seconds format */ +struct dhms { + int d,h,m,s; +}; +static inline void s2dhms(struct dhms *ts, time_t secs) +{ + ts->d = secs / 86400; + secs = secs % 86400; + ts->h = secs / 3600; + secs = secs % 3600; + ts->m = secs / 60; + ts->s = secs % 60; +} +#define DHMS_FMT "%dd%dh%02dm%02ds" +#define DHMS_VARS(x) (x)->d, (x)->h, (x)->m, (x)->s + + #ifdef LPROCFS +static inline int lprocfs_stats_lock(struct lprocfs_stats *stats, int type) +{ + int rc = 0; + + if (stats->ls_flags & LPROCFS_STATS_FLAG_NOPERCPU) { + if (type & LPROCFS_GET_NUM_CPU) + rc = 1; + if (type & LPROCFS_GET_SMP_ID) + rc = 0; + spin_lock(&stats->ls_lock); + } else { + if (type & LPROCFS_GET_NUM_CPU) + rc = num_possible_cpus(); + if (type & LPROCFS_GET_SMP_ID) { + stats->ls_flags |= LPROCFS_STATS_GET_SMP_ID; + rc = cfs_get_cpu(); + } + } + return rc; +} + +static inline void lprocfs_stats_unlock(struct lprocfs_stats *stats) +{ + if (stats->ls_flags & LPROCFS_STATS_FLAG_NOPERCPU) + spin_unlock(&stats->ls_lock); + else if (stats->ls_flags & LPROCFS_STATS_GET_SMP_ID) + cfs_put_cpu(); +} + /* Two optimized LPROCFS counter increment functions are provided: * lprocfs_counter_incr(cntr, value) - optimized for by-one counters * lprocfs_counter_add(cntr) - use for multi-valued counters @@ -159,71 +379,71 @@ struct obd_histogram; * count itself to reside within a single cache line. */ -static inline void lprocfs_counter_add(struct lprocfs_stats *stats, int idx, - long amount) +extern void lprocfs_counter_add(struct lprocfs_stats *stats, int idx, + long amount); +extern void lprocfs_counter_sub(struct lprocfs_stats *stats, int idx, + long amount); + +#define lprocfs_counter_incr(stats, idx) \ + lprocfs_counter_add(stats, idx, 1) +#define lprocfs_counter_decr(stats, idx) \ + lprocfs_counter_sub(stats, idx, 1) + +extern __s64 lprocfs_read_helper(struct lprocfs_counter *lc, + enum lprocfs_fields_flags field); +static inline __u64 lprocfs_stats_collector(struct lprocfs_stats *stats, + int idx, + enum lprocfs_fields_flags field) { - struct lprocfs_counter *percpu_cntr; - - if (!stats) - return; - percpu_cntr = &(stats->ls_percpu[smp_processor_id()]->lp_cntr[idx]); - atomic_inc(&percpu_cntr->lc_cntl.la_entry); - percpu_cntr->lc_count++; - - if (percpu_cntr->lc_config & LPROCFS_CNTR_AVGMINMAX) { - percpu_cntr->lc_sum += amount; - if (percpu_cntr->lc_config & LPROCFS_CNTR_STDDEV) - percpu_cntr->lc_sumsquare += (__u64)amount * amount; - if (amount < percpu_cntr->lc_min) - percpu_cntr->lc_min = amount; - if (amount > percpu_cntr->lc_max) - percpu_cntr->lc_max = amount; - } - atomic_inc(&percpu_cntr->lc_cntl.la_exit); + __u64 ret = 0; + int i; + + LASSERT(stats != NULL); + for (i = 0; i < num_possible_cpus(); i++) + ret += lprocfs_read_helper(&(stats->ls_percpu[i]->lp_cntr[idx]), + field); + return ret; } -static inline void lprocfs_counter_incr(struct lprocfs_stats *stats, int idx) -{ - struct lprocfs_counter *percpu_cntr; - - if (!stats) - return; - percpu_cntr = &(stats->ls_percpu[smp_processor_id()]->lp_cntr[idx]); - atomic_inc(&percpu_cntr->lc_cntl.la_entry); - percpu_cntr->lc_count++; - atomic_inc(&percpu_cntr->lc_cntl.la_exit); -} - -extern struct lprocfs_stats *lprocfs_alloc_stats(unsigned int num); +extern struct lprocfs_stats *lprocfs_alloc_stats(unsigned int num, + enum lprocfs_stats_flags flags); extern void lprocfs_clear_stats(struct lprocfs_stats *stats); extern void lprocfs_free_stats(struct lprocfs_stats **stats); -extern void lprocfs_init_ops_stats(int num_private_stats, +extern void lprocfs_init_ops_stats(int num_private_stats, struct lprocfs_stats *stats); +extern void lprocfs_init_ldlm_stats(struct lprocfs_stats *ldlm_stats); extern int lprocfs_alloc_obd_stats(struct obd_device *obddev, unsigned int num_private_stats); +extern int lprocfs_alloc_md_stats(struct obd_device *obddev, + unsigned int num_private_stats); extern void lprocfs_counter_init(struct lprocfs_stats *stats, int index, unsigned conf, const char *name, const char *units); extern void lprocfs_free_obd_stats(struct obd_device *obddev); struct obd_export; -extern int lprocfs_exp_setup(struct obd_export *exp); +struct nid_stat; +extern int lprocfs_add_clear_entry(struct obd_device * obd, + cfs_proc_dir_entry_t *entry); +extern int lprocfs_exp_setup(struct obd_export *exp, + lnet_nid_t *peer_nid, int *newnid); extern int lprocfs_exp_cleanup(struct obd_export *exp); +extern cfs_proc_dir_entry_t *lprocfs_add_simple(struct proc_dir_entry *root, + char *name, + cfs_read_proc_t *read_proc, + cfs_write_proc_t *write_proc, + void *data, + struct file_operations *fops); +extern struct proc_dir_entry *lprocfs_add_symlink(const char *name, + struct proc_dir_entry *parent, const char *dest); +extern void lprocfs_free_per_client_stats(struct obd_device *obd); +extern int lprocfs_nid_stats_clear_write(struct file *file, const char *buffer, + unsigned long count, void *data); +extern int lprocfs_nid_stats_clear_read(char *page, char **start, off_t off, + int count, int *eof, void *data); + extern int lprocfs_register_stats(cfs_proc_dir_entry_t *root, const char *name, struct lprocfs_stats *stats); -#define LPROCFS_INIT_VARS(name, vclass, vinstance) \ -void lprocfs_##name##_init_vars(struct lprocfs_static_vars *x) \ -{ \ - x->module_vars = vclass; \ - x->obd_vars = vinstance; \ -} \ - -#define lprocfs_init_vars(NAME, VAR) \ -do { \ - extern void lprocfs_##NAME##_init_vars(struct lprocfs_static_vars *); \ - lprocfs_##NAME##_init_vars(VAR); \ -} while (0) - /* lprocfs_status.c */ extern int lprocfs_add_vars(cfs_proc_dir_entry_t *root, struct lprocfs_vars *var, @@ -235,14 +455,18 @@ extern cfs_proc_dir_entry_t *lprocfs_register(const char *name, void *data); extern void lprocfs_remove(cfs_proc_dir_entry_t **root); +extern void lprocfs_remove_proc_entry(const char *name, + struct proc_dir_entry *parent); extern cfs_proc_dir_entry_t *lprocfs_srch(cfs_proc_dir_entry_t *root, const char *name); extern int lprocfs_obd_setup(struct obd_device *obd, struct lprocfs_vars *list); extern int lprocfs_obd_cleanup(struct obd_device *obd); +extern void lprocfs_free_per_client_stats(struct obd_device *obd); +extern struct file_operations lprocfs_evict_client_fops; -extern int lprocfs_seq_create(cfs_proc_dir_entry_t *parent, char *name, +extern int lprocfs_seq_create(cfs_proc_dir_entry_t *parent, char *name, mode_t mode, struct file_operations *seq_fops, void *data); extern int lprocfs_obd_seq_create(struct obd_device *dev, char *name, @@ -254,7 +478,13 @@ extern int lprocfs_obd_seq_create(struct obd_device *dev, char *name, extern int lprocfs_rd_u64(char *page, char **start, off_t off, int count, int *eof, void *data); extern int lprocfs_rd_atomic(char *page, char **start, off_t off, - int count, int *eof, void *data); + int count, int *eof, void *data); +extern int lprocfs_wr_atomic(struct file *file, const char *buffer, + unsigned long count, void *data); +extern int lprocfs_rd_uint(char *page, char **start, off_t off, + int count, int *eof, void *data); +extern int lprocfs_wr_uint(struct file *file, const char *buffer, + unsigned long count, void *data); extern int lprocfs_rd_uuid(char *page, char **start, off_t off, int count, int *eof, void *data); extern int lprocfs_rd_name(char *page, char **start, off_t off, @@ -265,12 +495,23 @@ extern int lprocfs_rd_server_uuid(char *page, char **start, off_t off, int count, int *eof, void *data); extern int lprocfs_rd_conn_uuid(char *page, char **start, off_t off, int count, int *eof, void *data); +extern int lprocfs_rd_import(char *page, char **start, off_t off, int count, + int *eof, void *data); +extern int lprocfs_rd_state(char *page, char **start, off_t off, int count, + int *eof, void *data); extern int lprocfs_rd_connect_flags(char *page, char **start, off_t off, int count, int *eof, void *data); extern int lprocfs_rd_num_exports(char *page, char **start, off_t off, int count, int *eof, void *data); extern int lprocfs_rd_numrefs(char *page, char **start, off_t off, int count, int *eof, void *data); +struct adaptive_timeout; +extern int lprocfs_at_hist_helper(char *page, int count, int rc, + struct adaptive_timeout *at); +extern int lprocfs_rd_timeouts(char *page, char **start, off_t off, + int count, int *eof, void *data); +extern int lprocfs_wr_timeouts(struct file *file, const char *buffer, + unsigned long count, void *data); extern int lprocfs_wr_evict_client(struct file *file, const char *buffer, unsigned long count, void *data); extern int lprocfs_wr_ping(struct file *file, const char *buffer, @@ -296,7 +537,7 @@ extern int lprocfs_write_helper(const char *buffer, unsigned long count, int *val); extern int lprocfs_write_frac_helper(const char *buffer, unsigned long count, int *val, int mult); -extern int lprocfs_read_frac_helper(char *buffer, unsigned long count, +extern int lprocfs_read_frac_helper(char *buffer, unsigned long count, long val, int mult); extern int lprocfs_write_u64_helper(const char *buffer, unsigned long count, __u64 *val); @@ -307,16 +548,18 @@ void lprocfs_oh_tally_log2(struct obd_histogram *oh, unsigned int value); void lprocfs_oh_clear(struct obd_histogram *oh); unsigned long lprocfs_oh_sum(struct obd_histogram *oh); -/* lprocfs_status.c: counter read/write functions */ -extern int lprocfs_counter_read(char *page, char **start, off_t off, - int count, int *eof, void *data); -extern int lprocfs_counter_write(struct file *file, const char *buffer, - unsigned long count, void *data); +void lprocfs_stats_collect(struct lprocfs_stats *stats, int idx, + struct lprocfs_counter *cnt); + /* lprocfs_status.c: recovery status */ int lprocfs_obd_rd_recovery_status(char *page, char **start, off_t off, int count, int *eof, void *data); +/* lprocfs_statuc.c: hash statistics */ +int lprocfs_obd_rd_hash(char *page, char **start, off_t off, + int count, int *eof, void *data); + extern int lprocfs_seq_release(struct inode *, struct file *); /* in lprocfs_stat.c, to protect the private data for proc entries */ @@ -335,23 +578,29 @@ extern struct rw_semaphore _lprocfs_lock; return -ENODEV; \ } \ } while(0) +#define LPROCFS_WRITE_ENTRY() do { \ + down_write(&_lprocfs_lock); \ +} while(0) +#define LPROCFS_WRITE_EXIT() do { \ + up_write(&_lprocfs_lock); \ +} while(0) -/* You must use these macros when you want to refer to +/* You must use these macros when you want to refer to * the import in a client obd_device for a lprocfs entry */ #define LPROCFS_CLIMP_CHECK(obd) do { \ typecheck(struct obd_device *, obd); \ - mutex_down(&(obd)->u.cli.cl_sem); \ + down_read(&(obd)->u.cli.cl_sem); \ if ((obd)->u.cli.cl_import == NULL) { \ - mutex_up(&(obd)->u.cli.cl_sem); \ + up_read(&(obd)->u.cli.cl_sem); \ return -ENODEV; \ } \ } while(0) #define LPROCFS_CLIMP_EXIT(obd) \ - mutex_up(&(obd)->u.cli.cl_sem); + up_read(&(obd)->u.cli.cl_sem); -/* write the name##_seq_show function, call LPROC_SEQ_FOPS_RO for read-only - proc entries; otherwise, you will define name##_seq_write function also for +/* write the name##_seq_show function, call LPROC_SEQ_FOPS_RO for read-only + proc entries; otherwise, you will define name##_seq_write function also for a read-write proc entry, and then call LPROC_SEQ_SEQ instead. Finally, call lprocfs_obd_seq_create(obd, filename, 0444, &name#_fops, data); */ #define __LPROC_SEQ_FOPS(name, custom_seq_write) \ @@ -378,18 +627,111 @@ struct file_operations name##_fops = { \ #define LPROC_SEQ_FOPS_RO(name) __LPROC_SEQ_FOPS(name, NULL) #define LPROC_SEQ_FOPS(name) __LPROC_SEQ_FOPS(name, name##_seq_write) +/* lproc_ptlrpc.c */ +struct ptlrpc_request; +extern void target_print_req(void *seq_file, struct ptlrpc_request *req); + +/* lprocfs_status.c: read recovery max time bz13079 */ +int lprocfs_obd_rd_recovery_maxtime(char *page, char **start, off_t off, + int count, int *eof, void *data); + +/* lprocfs_status.c: write recovery max time bz13079 */ +int lprocfs_obd_wr_recovery_maxtime(struct file *file, const char *buffer, + unsigned long count, void *data); + +/* all quota proc functions */ +extern int lprocfs_quota_rd_bunit(char *page, char **start, off_t off, int count, + int *eof, void *data); +extern int lprocfs_quota_wr_bunit(struct file *file, const char *buffer, + unsigned long count, void *data); +extern int lprocfs_quota_rd_btune(char *page, char **start, off_t off, int count, + int *eof, void *data); +extern int lprocfs_quota_wr_btune(struct file *file, const char *buffer, + unsigned long count, void *data); +extern int lprocfs_quota_rd_iunit(char *page, char **start, off_t off, int count, + int *eof, void *data); +extern int lprocfs_quota_wr_iunit(struct file *file, const char *buffer, + unsigned long count, void *data); +extern int lprocfs_quota_rd_itune(char *page, char **start, off_t off, int count, + int *eof, void *data); +extern int lprocfs_quota_wr_itune(struct file *file, const char *buffer, + unsigned long count, void *data); +extern int lprocfs_quota_rd_type(char *page, char **start, off_t off, int count, + int *eof, void *data); +extern int lprocfs_quota_wr_type(struct file *file, const char *buffer, + unsigned long count, void *data); +extern int lprocfs_quota_rd_switch_seconds(char *page, char **start, off_t off, + int count, int *eof, void *data); +extern int lprocfs_quota_wr_switch_seconds(struct file *file, const char *buffer, + unsigned long count, void *data); +extern int lprocfs_quota_rd_sync_blk(char *page, char **start, off_t off, + int count, int *eof, void *data); +extern int lprocfs_quota_wr_sync_blk(struct file *file, const char *buffer, + unsigned long count, void *data); +extern int lprocfs_quota_rd_switch_qs(char *page, char **start, off_t off, + int count, int *eof, void *data); +extern int lprocfs_quota_wr_switch_qs(struct file *file, const char *buffer, + unsigned long count, void *data); +extern int lprocfs_quota_rd_boundary_factor(char *page, char **start, off_t off, + int count, int *eof, void *data); +extern int lprocfs_quota_wr_boundary_factor(struct file *file, const char *buffer, + unsigned long count, void *data); +extern int lprocfs_quota_rd_least_bunit(char *page, char **start, off_t off, + int count, int *eof, void *data); +extern int lprocfs_quota_wr_least_bunit(struct file *file, const char *buffer, + unsigned long count, void *data); +extern int lprocfs_quota_rd_least_iunit(char *page, char **start, off_t off, + int count, int *eof, void *data); +extern int lprocfs_quota_wr_least_iunit(struct file *file, const char *buffer, + unsigned long count, void *data); +extern int lprocfs_quota_rd_qs_factor(char *page, char **start, off_t off, + int count, int *eof, void *data); +extern int lprocfs_quota_wr_qs_factor(struct file *file, const char *buffer, + unsigned long count, void *data); + +/** struct for holding changelog data for seq_file processing */ +struct changelog_seq_iter { + void *csi_dev; + struct llog_ctxt *csi_ctxt; + struct llog_handle *csi_llh; + __u64 csi_startrec; + __u64 csi_endrec; + loff_t csi_pos; + int csi_wrote; + int csi_startcat; + int csi_startidx; + int csi_fill:1; + int csi_done:1; +}; +int changelog_seq_open(struct inode *inode, struct file *file, + struct changelog_seq_iter **csih); +int changelog_seq_release(struct inode *inode, struct file *file); +loff_t changelog_seq_lseek(struct file *file, loff_t offset, int origin); + + + #else /* LPROCFS is not defined */ + + + static inline void lprocfs_counter_add(struct lprocfs_stats *stats, int index, long amount) { return; } static inline void lprocfs_counter_incr(struct lprocfs_stats *stats, int index) { return; } +static inline void lprocfs_counter_sub(struct lprocfs_stats *stats, + int index, long amount) { return; } static inline void lprocfs_counter_init(struct lprocfs_stats *stats, int index, unsigned conf, const char *name, const char *units) { return; } -static inline struct lprocfs_stats* lprocfs_alloc_stats(unsigned int num) +static inline __u64 lc_read_helper(struct lprocfs_counter *lc, + enum lprocfs_fields_flags field) +{ return 0; } + +static inline struct lprocfs_stats* lprocfs_alloc_stats(unsigned int num, + enum lprocfs_stats_flags flags) { return NULL; } static inline void lprocfs_clear_stats(struct lprocfs_stats *stats) { return; } @@ -399,30 +741,58 @@ static inline int lprocfs_register_stats(cfs_proc_dir_entry_t *root, const char *name, struct lprocfs_stats *stats) { return 0; } -static inline void lprocfs_init_ops_stats(int num_private_stats, +static inline void lprocfs_init_ops_stats(int num_private_stats, struct lprocfs_stats *stats) { return; } +static inline void lprocfs_init_ldlm_stats(struct lprocfs_stats *ldlm_stats) +{ return; } static inline int lprocfs_alloc_obd_stats(struct obd_device *obddev, unsigned int num_private_stats) { return 0; } +static inline int lprocfs_alloc_md_stats(struct obd_device *obddev, + unsigned int num_private_stats) +{ return 0; } static inline void lprocfs_free_obd_stats(struct obd_device *obddev) { return; } struct obd_export; -static inline int lprocfs_exp_setup(struct obd_export *exp) +static inline int lprocfs_add_clear_entry(struct obd_export *exp) +{ return 0; } +static inline int lprocfs_exp_setup(struct obd_export *exp, + lnet_nid_t *peer_nid, int *newnid) { return 0; } static inline int lprocfs_exp_cleanup(struct obd_export *exp) { return 0; } +static inline cfs_proc_dir_entry_t *lprocfs_add_simple(struct proc_dir_entry *root, + char *name, + cfs_read_proc_t *read_proc, + cfs_write_proc_t *write_proc, + void *data, + struct file_operations *fops) +{return 0; } +static inline struct proc_dir_entry *lprocfs_add_symlink(const char *name, + struct proc_dir_entry *parent, const char *dest) +{return NULL; } +static inline void lprocfs_free_per_client_stats(struct obd_device *obd) +{} +static inline +int lprocfs_nid_stats_clear_write(struct file *file, const char *buffer, + unsigned long count, void *data) +{return count;} +static inline +int lprocfs_nid_stats_clear_read(char *page, char **start, off_t off, + int count, int *eof, void *data) +{return count;} static inline cfs_proc_dir_entry_t * lprocfs_register(const char *name, cfs_proc_dir_entry_t *parent, struct lprocfs_vars *list, void *data) { return NULL; } -#define LPROCFS_INIT_VARS(name, vclass, vinstance) -#define lprocfs_init_vars(...) do {} while (0) static inline int lprocfs_add_vars(cfs_proc_dir_entry_t *root, struct lprocfs_vars *var, void *data) { return 0; } static inline void lprocfs_remove(cfs_proc_dir_entry_t **root) {}; +static inline void lprocfs_remove_proc_entry(const char *name, + struct proc_dir_entry *parent) {}; static inline cfs_proc_dir_entry_t *lprocfs_srch(cfs_proc_dir_entry_t *head, const char *name) {return 0;} static inline int lprocfs_obd_setup(struct obd_device *dev, @@ -440,6 +810,12 @@ static inline int lprocfs_rd_server_uuid(char *page, char **start, off_t off, static inline int lprocfs_rd_conn_uuid(char *page, char **start, off_t off, int count, int *eof, void *data) { return 0; } +static inline int lprocfs_rd_import(char *page, char **start, off_t off, + int count, int *eof, void *data) +{ return 0; } +static inline int lprocfs_rd_state(char *page, char **start, off_t off, + int count, int *eof, void *data) +{ return 0; } static inline int lprocfs_rd_connect_flags(char *page, char **start, off_t off, int count, int *eof, void *data) { return 0; } @@ -449,6 +825,16 @@ static inline int lprocfs_rd_num_exports(char *page, char **start, off_t off, static inline int lprocfs_rd_numrefs(char *page, char **start, off_t off, int count, int *eof, void *data) { return 0; } +struct adaptive_timeout; +static inline int lprocfs_at_hist_helper(char *page, int count, int rc, + struct adaptive_timeout *at) +{ return 0; } +static inline int lprocfs_rd_timeouts(char *page, char **start, off_t off, + int count, int *eof, void *data) +{ return 0; } +static inline int lprocfs_wr_timeouts(struct file *file, const char *buffer, + unsigned long count, void *data) +{ return 0; } static inline int lprocfs_wr_evict_client(struct file *file, const char *buffer, unsigned long count, void *data) { return 0; } @@ -488,11 +874,13 @@ void lprocfs_oh_clear(struct obd_histogram *oh) {} static inline unsigned long lprocfs_oh_sum(struct obd_histogram *oh) { return 0; } static inline -int lprocfs_counter_read(char *page, char **start, off_t off, - int count, int *eof, void *data) { return 0; } +void lprocfs_stats_collect(struct lprocfs_stats *stats, int idx, + struct lprocfs_counter *cnt) {} + static inline -int lprocfs_counter_write(struct file *file, const char *buffer, - unsigned long count, void *data) { return 0; } +__u64 lprocfs_stats_collector(struct lprocfs_stats *stats, int idx, + enum lprocfs_fields_flags field) +{ return (__u64)0; } #define LPROCFS_ENTRY() #define LPROCFS_EXIT() @@ -500,6 +888,9 @@ int lprocfs_counter_write(struct file *file, const char *buffer, #define LPROC_SEQ_FOPS_RO(name) #define LPROC_SEQ_FOPS(name) +/* lproc_ptlrpc.c */ +#define target_print_req NULL + #endif /* LPROCFS */ #endif /* LPROCFS_SNMP_H */