X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Finclude%2Flprocfs_status.h;h=8611349298667f8c3a03b6ee25dab35059ebedb9;hp=efb56e2782305ec192509be73dd9de1642d5c76b;hb=e5c8f6670fbeea9ec8c6092dfa4369508da54485;hpb=a32ce8f50ecafa4fd44732023cc1d45f57cd56bd diff --git a/lustre/include/lprocfs_status.h b/lustre/include/lprocfs_status.h index efb56e2..8611349 100644 --- a/lustre/include/lprocfs_status.h +++ b/lustre/include/lprocfs_status.h @@ -43,18 +43,31 @@ #include #include #include +#include #include #include #include +/* + * Liuux 5.6 introduces proc_ops with v5.5-8862-gd56c0d45f0e2 + * Now that proc and debugfs use separate operation vector types + * separate containers are also needed. + */ struct lprocfs_vars { const char *name; const struct file_operations *fops; void *data; - /** - * /proc file mode. - */ + /** /proc file mode. */ + mode_t proc_mode; +}; + +/** Provide a debugfs container */ +struct ldebugfs_vars { + const char *name; + const struct file_operations *fops; + void *data; + /** debugfs file mode. */ mode_t proc_mode; }; @@ -144,17 +157,23 @@ struct rename_stats { */ enum { - LPROCFS_CNTR_EXTERNALLOCK = 0x0001, - LPROCFS_CNTR_AVGMINMAX = 0x0002, - LPROCFS_CNTR_STDDEV = 0x0004, - - /* counter data type */ - LPROCFS_TYPE_REGS = 0x0100, - LPROCFS_TYPE_BYTES = 0x0200, - LPROCFS_TYPE_PAGES = 0x0400, - LPROCFS_TYPE_CYCLE = 0x0800, + LPROCFS_CNTR_EXTERNALLOCK = 0x0001, + LPROCFS_CNTR_AVGMINMAX = 0x0002, + LPROCFS_CNTR_STDDEV = 0x0004, + + /* counter data type */ + LPROCFS_TYPE_REQS = 0x0100, + LPROCFS_TYPE_BYTES = 0x0200, + LPROCFS_TYPE_PAGES = 0x0400, + LPROCFS_TYPE_USEC = 0x0800, + + LPROCFS_TYPE_LATENCY = LPROCFS_TYPE_USEC | + LPROCFS_CNTR_AVGMINMAX | + LPROCFS_CNTR_STDDEV, + LPROCFS_TYPE_BYTES_FULL = LPROCFS_TYPE_BYTES | + LPROCFS_CNTR_AVGMINMAX | + LPROCFS_CNTR_STDDEV, }; - #define LC_MIN_INIT ((~(__u64)0) >> 1) struct lprocfs_counter_header { @@ -394,7 +413,8 @@ struct obd_histogram; #define JOBSTATS_NODELOCAL "nodelocal" #define JOBSTATS_SESSION "session" -typedef void (*cntr_init_callback)(struct lprocfs_stats *stats); +typedef void (*cntr_init_callback)(struct lprocfs_stats *stats, + unsigned int offset); struct obd_job_stats { struct cfs_hash *ojs_hash; /* hash of jobids */ @@ -478,18 +498,18 @@ 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_ldlm_stats(struct lprocfs_stats *ldlm_stats); -extern int lprocfs_alloc_obd_stats(struct obd_device *obddev, +extern int lprocfs_alloc_obd_stats(struct obd_device *obd, unsigned int num_stats); -extern int lprocfs_alloc_md_stats(struct obd_device *obddev, - unsigned int num_private_stats); +extern int lprocfs_alloc_md_stats(struct obd_device *obd, + 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); -extern void lprocfs_free_md_stats(struct obd_device *obddev); + unsigned conf, const char *name, + const char *units); +extern void lprocfs_free_obd_stats(struct obd_device *obd); +extern void lprocfs_free_md_stats(struct obd_device *obd); struct obd_export; struct nid_stat; -extern int lprocfs_add_clear_entry(struct obd_device * obd, +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); @@ -500,8 +520,6 @@ struct dentry *ldebugfs_add_symlink(const char *name, const char *target, static inline int lprocfs_exp_cleanup(struct obd_export *exp) { return 0; } #endif -struct dentry *ldebugfs_add_simple(struct dentry *root, char *name, void *data, - const struct file_operations *fops); extern struct proc_dir_entry * lprocfs_add_simple(struct proc_dir_entry *root, char *name, void *data, const struct file_operations *fops); @@ -515,65 +533,38 @@ lprocfs_nid_stats_clear_seq_write(struct file *file, const char __user *buffer, size_t count, loff_t *off); extern int lprocfs_nid_stats_clear_seq_show(struct seq_file *file, void *data); #endif -extern int ldebugfs_register_stats(struct dentry *parent, const char *name, - struct lprocfs_stats *stats); extern int lprocfs_register_stats(struct proc_dir_entry *root, const char *name, - struct lprocfs_stats *stats); + struct lprocfs_stats *stats); +extern const struct file_operations ldebugfs_stats_seq_fops; /* lprocfs_status.c */ -extern int ldebugfs_add_vars(struct dentry *parent, struct lprocfs_vars *var, - void *data); -extern int lprocfs_add_vars(struct proc_dir_entry *root, - struct lprocfs_vars *var, void *data); - +extern void ldebugfs_add_vars(struct dentry *parent, struct ldebugfs_vars *var, + void *data); extern struct dentry *ldebugfs_register(const char *name, struct dentry *parent, - struct lprocfs_vars *list, + struct ldebugfs_vars *list, void *data); +extern int lprocfs_add_vars(struct proc_dir_entry *root, + struct lprocfs_vars *var, void *data); + extern struct proc_dir_entry * lprocfs_register(const char *name, struct proc_dir_entry *parent, struct lprocfs_vars *list, void *data); -extern void ldebugfs_remove(struct dentry **entryp); extern void lprocfs_remove(struct proc_dir_entry **root); extern void lprocfs_remove_proc_entry(const char *name, struct proc_dir_entry *parent); -#ifndef HAVE_REMOVE_PROC_SUBTREE -extern int remove_proc_subtree(const char *name, - struct proc_dir_entry *parent); -#define PDE_DATA(inode) (PDE(inode)->data) - -static inline int LPROCFS_ENTRY_CHECK(struct inode *inode) -{ - struct proc_dir_entry *dp = PDE(inode); - int deleted = 0; - - spin_lock(&(dp)->pde_unload_lock); - if (dp->proc_fops == NULL) - deleted = 1; - spin_unlock(&(dp)->pde_unload_lock); - if (deleted) - return -ENODEV; - return 0; -} -#else -static inline int LPROCFS_ENTRY_CHECK(struct inode *inode) -{ return 0; } -#endif - extern int lprocfs_obd_setup(struct obd_device *obd, bool uuid_only); extern int lprocfs_obd_cleanup(struct obd_device *obd); #ifdef HAVE_SERVER_SUPPORT extern const struct file_operations lprocfs_evict_client_fops; #endif -int ldebugfs_seq_create(struct dentry *parent, const char *name, umode_t mode, - const struct file_operations *seq_fops, void *data); extern int lprocfs_seq_create(struct proc_dir_entry *parent, const char *name, mode_t mode, const struct file_operations *seq_fops, void *data); -extern int lprocfs_obd_seq_create(struct obd_device *dev, const char *name, +extern int lprocfs_obd_seq_create(struct obd_device *obd, const char *name, mode_t mode, const struct file_operations *seq_fops, void *data); @@ -586,7 +577,8 @@ extern int lprocfs_import_seq_show(struct seq_file *m, void *data); extern int lprocfs_state_seq_show(struct seq_file *m, void *data); extern int lprocfs_connect_flags_seq_show(struct seq_file *m, void *data); #ifdef HAVE_SERVER_SUPPORT -extern int lprocfs_num_exports_seq_show(struct seq_file *m, void *data); +ssize_t num_exports_show(struct kobject *kobj, struct attribute *attr, + char *buf); #endif struct adaptive_timeout; extern int lprocfs_at_hist_helper(struct seq_file *m, @@ -606,17 +598,23 @@ ssize_t ping_show(struct kobject *kobj, struct attribute *attr, char *buffer); extern ssize_t +ldebugfs_import_seq_write(struct file *file, const char __user *buffer, + size_t count, loff_t *off); +static inline ssize_t lprocfs_import_seq_write(struct file *file, const char __user *buffer, - size_t count, loff_t *off); + size_t count, loff_t *off) +{ + return ldebugfs_import_seq_write(file, buffer, count, off); +} + extern int lprocfs_pinger_recov_seq_show(struct seq_file *m, void *data); extern ssize_t lprocfs_pinger_recov_seq_write(struct file *file, const char __user *buffer, size_t count, loff_t *off); -extern int lprocfs_str_with_units_to_s64(const char __user *buffer, - unsigned long count, __s64 *val, - char defunit); - +int string_to_size(u64 *size, const char *buffer, size_t count); +int sysfs_memparse(const char *buffer, size_t count, u64 *val, + const char *defunit); char *lprocfs_strnstr(const char *s1, const char *s2, size_t len); char *lprocfs_find_named_value(const char *buffer, const char *name, size_t *count); @@ -636,10 +634,10 @@ int lprocfs_recovery_status_seq_show(struct seq_file *m, void *data); int lprocfs_hash_seq_show(struct seq_file *m, void *data); /* lprocfs_status.c: IR factor */ -int lprocfs_ir_factor_seq_show(struct seq_file *m, void *data); -ssize_t -lprocfs_ir_factor_seq_write(struct file *file, const char __user *buffer, - size_t count, loff_t *off); +ssize_t ir_factor_show(struct kobject *kobj, struct attribute *attr, + char *buf); +ssize_t ir_factor_store(struct kobject *kobj, struct attribute *attr, + const char *buffer, size_t count); #endif /* lprocfs_status.c: dump pages on cksum error */ @@ -652,22 +650,19 @@ extern int lprocfs_single_release(struct inode *, struct file *); extern int lprocfs_seq_release(struct inode *, struct file *); /* 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); \ - down_read(&(obd)->u.cli.cl_sem); \ - if ((obd)->u.cli.cl_import == NULL) { \ - up_read(&(obd)->u.cli.cl_sem); \ - return -ENODEV; \ - } \ -} while(0) -#define LPROCFS_CLIMP_EXIT(obd) \ - up_read(&(obd)->u.cli.cl_sem); + * the import in a client obd_device for a lprocfs entry + */ +#define with_imp_locked(__obd, __imp, __rc) \ + for (down_read(&(__obd)->u.cli.cl_sem), \ + __imp = (__obd)->u.cli.cl_import, \ + __rc = __imp ? 0 : -ENODEV; \ + __imp ? 1 : (up_read(&(__obd)->u.cli.cl_sem), 0); \ + __imp = NULL) /* write the name##_seq_show function, call LDEBUGFS_SEQ_FOPS_RO for read-only * debugfs entries; otherwise, you will define name##_seq_write function also * for a read-write debugfs entry, and then call LDEBUGFS_SEQ_FOPS instead. - * Finally, call ldebugfs_seq_create(obd, filename, 0444, &name#_fops, data); + * Finally, call debugfs_create_file(filename, 0444, obd, data, &name#_fops); */ #define __LDEBUGFS_SEQ_FOPS(name, custom_seq_write) \ static int name##_single_open(struct inode *inode, struct file *file) \ @@ -690,6 +685,8 @@ static const struct file_operations name##_fops = { \ #define LDEBUGFS_SEQ_FOPS_RO_TYPE(name, type) \ static int name##_##type##_seq_show(struct seq_file *m, void *v)\ { \ + if (!m->private) \ + return -ENODEV; \ return lprocfs_##type##_seq_show(m, m->private); \ } \ LDEBUGFS_SEQ_FOPS_RO(name##_##type) @@ -697,6 +694,8 @@ static const struct file_operations name##_fops = { \ #define LDEBUGFS_SEQ_FOPS_RW_TYPE(name, type) \ static int name##_##type##_seq_show(struct seq_file *m, void *v)\ { \ + if (!m->private) \ + return -ENODEV; \ return lprocfs_##type##_seq_show(m, m->private); \ } \ static ssize_t name##_##type##_seq_write(struct file *file, \ @@ -704,6 +703,9 @@ static const struct file_operations name##_fops = { \ loff_t *off) \ { \ struct seq_file *seq = file->private_data; \ + \ + if (!seq->private) \ + return -ENODEV; \ return ldebugfs_##type##_seq_write(file, buffer, count, \ seq->private); \ } \ @@ -736,12 +738,6 @@ static const struct file_operations name##_fops = { \ #define __LPROC_SEQ_FOPS(name, custom_seq_write) \ static int name##_single_open(struct inode *inode, struct file *file) \ { \ - int rc; \ - \ - rc = LPROCFS_ENTRY_CHECK(inode); \ - if (rc < 0) \ - return rc; \ - \ return single_open(file, name##_seq_show, \ inode->i_private ? inode->i_private : \ PDE_DATA(inode)); \ @@ -832,22 +828,26 @@ int lprocfs_job_stats_log(struct obd_device *obd, char *jobid, void lprocfs_job_stats_fini(struct obd_device *obd); int lprocfs_job_stats_init(struct obd_device *obd, int cntr_num, cntr_init_callback fn); -int lprocfs_job_interval_seq_show(struct seq_file *m, void *data); -ssize_t -lprocfs_job_interval_seq_write(struct file *file, const char __user *buffer, - size_t count, loff_t *off); -/* lproc_status.c */ -int lprocfs_recovery_time_soft_seq_show(struct seq_file *m, void *data); -ssize_t lprocfs_recovery_time_soft_seq_write(struct file *file, - const char __user *buffer, - size_t count, loff_t *off); -int lprocfs_recovery_time_hard_seq_show(struct seq_file *m, void *data); -ssize_t -lprocfs_recovery_time_hard_seq_write(struct file *file, - const char __user *buffer, - size_t count, loff_t *off); -int lprocfs_target_instance_seq_show(struct seq_file *m, void *data); +ssize_t job_cleanup_interval_show(struct kobject *kobj, struct attribute *attr, + char *buf); +ssize_t job_cleanup_interval_store(struct kobject *kobj, + struct attribute *attr, + const char *buffer, size_t count); +/* lproc_status_server.c */ +ssize_t recovery_time_soft_show(struct kobject *kobj, struct attribute *attr, + char *buf); +ssize_t recovery_time_soft_store(struct kobject *kobj, + struct attribute *attr, + const char *buffer, size_t count); +ssize_t recovery_time_hard_show(struct kobject *kobj, struct attribute *attr, + char *buf); +ssize_t recovery_time_hard_store(struct kobject *kobj, + struct attribute *attr, + const char *buffer, size_t count); +ssize_t instance_show(struct kobject *kobj, struct attribute *attr, + char *buf); #endif +/* lproc_status.c */ int lprocfs_obd_max_pages_per_rpc_seq_show(struct seq_file *m, void *data); ssize_t lprocfs_obd_max_pages_per_rpc_seq_write(struct file *file, const char __user *buffer, @@ -906,15 +906,15 @@ static inline int lprocfs_register_stats(struct proc_dir_entry *root, { return 0; } static inline void lprocfs_init_ldlm_stats(struct lprocfs_stats *ldlm_stats) { return; } -static inline int lprocfs_alloc_obd_stats(struct obd_device *obddev, +static inline int lprocfs_alloc_obd_stats(struct obd_device *obd, unsigned int num_stats) { return 0; } -static inline int lprocfs_alloc_md_stats(struct obd_device *obddev, +static inline int lprocfs_alloc_md_stats(struct obd_device *obd, unsigned int num_private_stats) { return 0; } -static inline void lprocfs_free_obd_stats(struct obd_device *obddev) +static inline void lprocfs_free_obd_stats(struct obd_device *obd) { return; } -static inline void lprocfs_free_md_stats(struct obd_device *obddev) +static inline void lprocfs_free_md_stats(struct obd_device *obd) { return; } struct obd_export; @@ -956,9 +956,9 @@ static inline void lprocfs_remove(struct proc_dir_entry **root) static inline void lprocfs_remove_proc_entry(const char *name, struct proc_dir_entry *parent) { return; } -static inline int lprocfs_obd_setup(struct obd_device *dev, bool uuid_only) +static inline int lprocfs_obd_setup(struct obd_device *obd, bool uuid_only) { return 0; } -static inline int lprocfs_obd_cleanup(struct obd_device *dev) +static inline int lprocfs_obd_cleanup(struct obd_device *obd) { return 0; } static inline int lprocfs_uuid_seq_show(struct seq_file *m, void *data) { return 0; } @@ -995,6 +995,10 @@ lprocfs_ping_seq_write(struct file *file, const char __user *buffer, size_t count, loff_t *off) { return 0; } static inline ssize_t +ldebugfs_import_seq_write(struct file *file, const char __user *buffer, + size_t count, loff_t *off) +{ return 0; } +static inline ssize_t lprocfs_import_seq_write(struct file *file, const char __user *buffer, size_t count, loff_t *off) { return 0; }