From: James Simmons Date: Thu, 14 Nov 2013 14:36:41 +0000 (-0500) Subject: LU-3319 procfs: move lov proc handling over to seq_file X-Git-Tag: 2.5.53~45 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=f93ecd5e11e27c2f9859a24329b40de63cd6a56f LU-3319 procfs: move lov proc handling over to seq_file In order to support 3.10+ kernels for clients we adapt the lov proc handling to using seq_files. Signed-off-by: James Simmons Change-Id: Icd19a7c75301e1351d1d116afbc1aa4f7168c2eb Reviewed-on: http://review.whamcloud.com/7292 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Bob Glossman Reviewed-by: Andreas Dilger Reviewed-by: Oleg Drokin --- diff --git a/lustre/lov/lov_internal.h b/lustre/lov/lov_internal.h index d0424b7..161b029 100644 --- a/lustre/lov/lov_internal.h +++ b/lustre/lov/lov_internal.h @@ -283,12 +283,7 @@ int lovea_destroy_object(struct lov_obd *lov, struct lov_stripe_md *lsm, /* lproc_lov.c */ extern struct file_operations lov_proc_target_fops; #ifdef LPROCFS -void lprocfs_lov_init_vars(struct lprocfs_static_vars *lvars); -#else -static inline void lprocfs_lov_init_vars(struct lprocfs_static_vars *lvars) -{ - memset(lvars, 0, sizeof(*lvars)); -} +extern struct lprocfs_seq_vars lprocfs_lov_obd_vars[]; #endif /* lov_cl.c */ diff --git a/lustre/lov/lov_obd.c b/lustre/lov/lov_obd.c index 5f25c6f..32e7094 100644 --- a/lustre/lov/lov_obd.c +++ b/lustre/lov/lov_obd.c @@ -136,7 +136,7 @@ int lov_connect_obd(struct obd_device *obd, __u32 index, int activate, static struct obd_uuid lov_osc_uuid = { "LOV_OSC_UUID" }; struct obd_import *imp; #ifdef __KERNEL__ - cfs_proc_dir_entry_t *lov_proc_dir; + struct proc_dir_entry *lov_proc_dir; #endif int rc; ENTRY; @@ -198,10 +198,10 @@ int lov_connect_obd(struct obd_device *obd, __u32 index, int activate, obd_uuid2str(tgt_uuid), tgt_obd->obd_name, activate ? "":"in"); #ifdef __KERNEL__ - lov_proc_dir = lprocfs_srch(obd->obd_proc_entry, "target_obds"); + lov_proc_dir = obd->obd_proc_private; if (lov_proc_dir) { struct obd_device *osc_obd = lov->lov_tgts[index]->ltd_exp->exp_obd; - cfs_proc_dir_entry_t *osc_symlink; + struct proc_dir_entry *osc_symlink; LASSERT(osc_obd != NULL); LASSERT(osc_obd->obd_magic == OBD_DEVICE_MAGIC); @@ -218,6 +218,7 @@ int lov_connect_obd(struct obd_device *obd, __u32 index, int activate, obd->obd_type->typ_name, obd->obd_name, osc_obd->obd_name); lprocfs_remove(&lov_proc_dir); + obd->obd_proc_private = NULL; } } #endif @@ -282,7 +283,7 @@ static int lov_connect(const struct lu_env *env, static int lov_disconnect_obd(struct obd_device *obd, struct lov_tgt_desc *tgt) { - cfs_proc_dir_entry_t *lov_proc_dir; + struct proc_dir_entry *lov_proc_dir; struct lov_obd *lov = &obd->u.lov; struct obd_device *osc_obd; int rc; @@ -298,19 +299,9 @@ static int lov_disconnect_obd(struct obd_device *obd, struct lov_tgt_desc *tgt) tgt->ltd_exp->exp_obd->obd_inactive = 1; } - lov_proc_dir = lprocfs_srch(obd->obd_proc_entry, "target_obds"); - if (lov_proc_dir) { - cfs_proc_dir_entry_t *osc_symlink; - - osc_symlink = lprocfs_srch(lov_proc_dir, osc_obd->obd_name); - if (osc_symlink) { - lprocfs_remove(&osc_symlink); - } else { - CERROR("/proc/fs/lustre/%s/%s/target_obds/%s missing.", - obd->obd_type->typ_name, obd->obd_name, - osc_obd->obd_name); - } - } + lov_proc_dir = obd->obd_proc_private; + if (lov_proc_dir) + lprocfs_remove_proc_entry(osc_obd->obd_name, lov_proc_dir); if (osc_obd) { /* Pass it on to our clients. @@ -793,11 +784,10 @@ void lov_fix_desc(struct lov_desc *desc) int lov_setup(struct obd_device *obd, struct lustre_cfg *lcfg) { - struct lprocfs_static_vars lvars = { 0 }; - struct lov_desc *desc; - struct lov_obd *lov = &obd->u.lov; - int rc; - ENTRY; + struct lov_desc *desc; + struct lov_obd *lov = &obd->u.lov; + int rc; + ENTRY; if (LUSTRE_CFG_BUFLEN(lcfg, 1) < 1) { CERROR("LOV setup requires a descriptor\n"); @@ -849,26 +839,22 @@ int lov_setup(struct obd_device *obd, struct lustre_cfg *lcfg) if (rc) GOTO(out, rc); - lprocfs_lov_init_vars(&lvars); - lprocfs_obd_setup(obd, lvars.obd_vars); #ifdef LPROCFS - { - int rc; - - rc = lprocfs_seq_create(obd->obd_proc_entry, "target_obd", - 0444, &lov_proc_target_fops, obd); - if (rc) - CWARN("Error adding the target_obd file\n"); - } + obd->obd_vars = lprocfs_lov_obd_vars; + lprocfs_seq_obd_setup(obd); + rc = lprocfs_seq_create(obd->obd_proc_entry, "target_obd", 0444, + &lov_proc_target_fops, obd); + if (rc) + CWARN("Error adding the target_obd file\n"); + + lov->lov_pool_proc_entry = lprocfs_seq_register("pools", + obd->obd_proc_entry, + NULL, NULL); #endif - lov->lov_pool_proc_entry = lprocfs_register("pools", - obd->obd_proc_entry, - NULL, NULL); - - RETURN(0); + RETURN(0); out: - return rc; + return rc; } static int lov_precleanup(struct obd_device *obd, enum obd_cleanup_stage stage) @@ -980,18 +966,15 @@ int lov_process_config_base(struct obd_device *obd, struct lustre_cfg *lcfg, GOTO(out, rc); } case LCFG_PARAM: { - struct lprocfs_static_vars lvars = { 0 }; - struct lov_desc *desc = &(obd->u.lov.desc); - - if (!desc) - GOTO(out, rc = -EINVAL); + struct lov_desc *desc = &(obd->u.lov.desc); - lprocfs_lov_init_vars(&lvars); + if (!desc) + GOTO(out, rc = -EINVAL); - rc = class_process_proc_param(PARAM_LOV, lvars.obd_vars, - lcfg, obd); - if (rc > 0) - rc = 0; + rc = class_process_proc_seq_param(PARAM_LOV, obd->obd_vars, + lcfg, obd); + if (rc > 0) + rc = 0; GOTO(out, rc); } case LCFG_POOL_NEW: @@ -2907,7 +2890,6 @@ extern struct lu_kmem_descr lov_caches[]; int __init lov_init(void) { - struct lprocfs_static_vars lvars = { 0 }; int rc; ENTRY; @@ -2927,11 +2909,10 @@ int __init lov_init(void) lu_kmem_fini(lov_caches); return -ENOMEM; } - lprocfs_lov_init_vars(&lvars); rc = class_register_type(&lov_obd_ops, NULL, NULL, #ifndef HAVE_ONLY_PROCFS_SEQ - lvars.module_vars, + NULL, #endif LUSTRE_LOV_NAME, &lov_device_type); diff --git a/lustre/lov/lov_pool.c b/lustre/lov/lov_pool.c index 2c6f1e8..32639f0 100644 --- a/lustre/lov/lov_pool.c +++ b/lustre/lov/lov_pool.c @@ -288,7 +288,7 @@ static int pool_proc_open(struct inode *inode, struct file *file) rc = seq_open(file, &pool_proc_ops); if (!rc) { struct seq_file *s = file->private_data; - s->private = PROC_I(inode)->pde->data; + s->private = PDE_DATA(inode); } return rc; } @@ -472,9 +472,12 @@ int lov_pool_new(struct obd_device *obd, char *poolname) /* get ref for /proc file */ lov_pool_getref(new_pool); new_pool->pool_proc_entry = lprocfs_add_simple(lov->lov_pool_proc_entry, - poolname, NULL, NULL, - new_pool, - &pool_proc_operations); + poolname, +#ifndef HAVE_ONLY_PROCFS_SEQ + NULL, NULL, +#endif + new_pool, + &pool_proc_operations); if (IS_ERR(new_pool->pool_proc_entry)) { CWARN("Cannot add proc pool entry "LOV_POOLNAMEF"\n", poolname); new_pool->pool_proc_entry = NULL; diff --git a/lustre/lov/lproc_lov.c b/lustre/lov/lproc_lov.c index 850bb39..e400faf 100644 --- a/lustre/lov/lproc_lov.c +++ b/lustre/lov/lproc_lov.c @@ -39,30 +39,29 @@ #include #include #include -#include +#include #include "lov_internal.h" #ifdef LPROCFS -static int lov_rd_stripesize(char *page, char **start, off_t off, int count, - int *eof, void *data) +static int lov_stripesize_seq_show(struct seq_file *m, void *v) { - struct obd_device *dev = (struct obd_device *)data; - struct lov_desc *desc; + struct obd_device *dev = (struct obd_device *)m->private; + struct lov_desc *desc; - LASSERT(dev != NULL); - desc = &dev->u.lov.desc; - *eof = 1; - return snprintf(page, count, LPU64"\n", desc->ld_default_stripe_size); + LASSERT(dev != NULL); + desc = &dev->u.lov.desc; + + return seq_printf(m, LPU64"\n", desc->ld_default_stripe_size); } -static int lov_wr_stripesize(struct file *file, const char *buffer, - unsigned long count, void *data) +static ssize_t lov_stripesize_seq_write(struct file *file, const char *buffer, + size_t count, loff_t *off) { - struct obd_device *dev = (struct obd_device *)data; + struct obd_device *dev = ((struct seq_file *)file->private_data)->private; struct lov_desc *desc; __u64 val; int rc; - + LASSERT(dev != NULL); desc = &dev->u.lov.desc; rc = lprocfs_write_u64_helper(buffer, count, &val); @@ -73,27 +72,26 @@ static int lov_wr_stripesize(struct file *file, const char *buffer, desc->ld_default_stripe_size = val; return count; } +LPROC_SEQ_FOPS(lov_stripesize); -static int lov_rd_stripeoffset(char *page, char **start, off_t off, int count, - int *eof, void *data) +static int lov_stripeoffset_seq_show(struct seq_file *m, void *v) { - struct obd_device *dev = (struct obd_device *)data; - struct lov_desc *desc; + struct obd_device *dev = (struct obd_device *)m->private; + struct lov_desc *desc; - LASSERT(dev != NULL); - desc = &dev->u.lov.desc; - *eof = 1; - return snprintf(page, count, LPU64"\n", desc->ld_default_stripe_offset); + LASSERT(dev != NULL); + desc = &dev->u.lov.desc; + return seq_printf(m, LPU64"\n", desc->ld_default_stripe_offset); } -static int lov_wr_stripeoffset(struct file *file, const char *buffer, - unsigned long count, void *data) +static ssize_t lov_stripeoffset_seq_write(struct file *file, const char *buffer, + size_t count, loff_t *off) { - struct obd_device *dev = (struct obd_device *)data; + struct obd_device *dev = ((struct seq_file *)file->private_data)->private; struct lov_desc *desc; __u64 val; int rc; - + LASSERT(dev != NULL); desc = &dev->u.lov.desc; rc = lprocfs_write_u64_helper(buffer, count, &val); @@ -103,26 +101,25 @@ static int lov_wr_stripeoffset(struct file *file, const char *buffer, desc->ld_default_stripe_offset = val; return count; } +LPROC_SEQ_FOPS(lov_stripeoffset); -static int lov_rd_stripetype(char *page, char **start, off_t off, int count, - int *eof, void *data) +static int lov_stripetype_seq_show(struct seq_file *m, void *v) { - struct obd_device* dev = (struct obd_device*)data; - struct lov_desc *desc; + struct obd_device* dev = (struct obd_device*)m->private; + struct lov_desc *desc; - LASSERT(dev != NULL); - desc = &dev->u.lov.desc; - *eof = 1; - return snprintf(page, count, "%u\n", desc->ld_pattern); + LASSERT(dev != NULL); + desc = &dev->u.lov.desc; + return seq_printf(m, "%u\n", desc->ld_pattern); } -static int lov_wr_stripetype(struct file *file, const char *buffer, - unsigned long count, void *data) +static ssize_t lov_stripetype_seq_write(struct file *file, const char *buffer, + size_t count, loff_t *off) { - struct obd_device *dev = (struct obd_device *)data; + struct obd_device *dev = ((struct seq_file *)file->private_data)->private; struct lov_desc *desc; int val, rc; - + LASSERT(dev != NULL); desc = &dev->u.lov.desc; rc = lprocfs_write_helper(buffer, count, &val); @@ -133,27 +130,26 @@ static int lov_wr_stripetype(struct file *file, const char *buffer, desc->ld_pattern = val; return count; } +LPROC_SEQ_FOPS(lov_stripetype); -static int lov_rd_stripecount(char *page, char **start, off_t off, int count, - int *eof, void *data) +static int lov_stripecount_seq_show(struct seq_file *m, void *v) { - struct obd_device *dev = (struct obd_device *)data; - struct lov_desc *desc; + struct obd_device *dev = (struct obd_device *)m->private; + struct lov_desc *desc; - LASSERT(dev != NULL); - desc = &dev->u.lov.desc; - *eof = 1; - return snprintf(page, count, "%d\n", - (__s16)(desc->ld_default_stripe_count + 1) - 1); + LASSERT(dev != NULL); + desc = &dev->u.lov.desc; + return seq_printf(m, "%d\n", + (__s16)(desc->ld_default_stripe_count + 1) - 1); } -static int lov_wr_stripecount(struct file *file, const char *buffer, - unsigned long count, void *data) +static ssize_t lov_stripecount_seq_write(struct file *file, const char *buffer, + size_t count, loff_t *off) { - struct obd_device *dev = (struct obd_device *)data; + struct obd_device *dev = ((struct seq_file *)file->private_data)->private; struct lov_desc *desc; int val, rc; - + LASSERT(dev != NULL); desc = &dev->u.lov.desc; rc = lprocfs_write_helper(buffer, count, &val); @@ -164,43 +160,40 @@ static int lov_wr_stripecount(struct file *file, const char *buffer, desc->ld_default_stripe_count = val; return count; } +LPROC_SEQ_FOPS(lov_stripecount); -static int lov_rd_numobd(char *page, char **start, off_t off, int count, - int *eof, void *data) +static int lov_numobd_seq_show(struct seq_file *m, void *v) { - struct obd_device *dev = (struct obd_device*)data; - struct lov_desc *desc; - - LASSERT(dev != NULL); - desc = &dev->u.lov.desc; - *eof = 1; - return snprintf(page, count, "%u\n", desc->ld_tgt_count); + struct obd_device *dev = (struct obd_device*)m->private; + struct lov_desc *desc; + LASSERT(dev != NULL); + desc = &dev->u.lov.desc; + return seq_printf(m, "%u\n", desc->ld_tgt_count); } +LPROC_SEQ_FOPS_RO(lov_numobd); -static int lov_rd_activeobd(char *page, char **start, off_t off, int count, - int *eof, void *data) +static int lov_activeobd_seq_show(struct seq_file *m, void *v) { - struct obd_device* dev = (struct obd_device*)data; - struct lov_desc *desc; + struct obd_device* dev = (struct obd_device*)m->private; + struct lov_desc *desc; - LASSERT(dev != NULL); - desc = &dev->u.lov.desc; - *eof = 1; - return snprintf(page, count, "%u\n", desc->ld_active_tgt_count); + LASSERT(dev != NULL); + desc = &dev->u.lov.desc; + return seq_printf(m, "%u\n", desc->ld_active_tgt_count); } +LPROC_SEQ_FOPS_RO(lov_activeobd); -static int lov_rd_desc_uuid(char *page, char **start, off_t off, int count, - int *eof, void *data) +static int lov_desc_uuid_seq_show(struct seq_file *m, void *v) { - struct obd_device *dev = (struct obd_device*) data; - struct lov_obd *lov; + struct obd_device *dev = m->private; + struct lov_obd *lov; - LASSERT(dev != NULL); - lov = &dev->u.lov; - *eof = 1; - return snprintf(page, count, "%s\n", lov->desc.ld_uuid.uuid); + LASSERT(dev != NULL); + lov = &dev->u.lov; + return seq_printf(m, "%s\n", lov->desc.ld_uuid.uuid); } +LPROC_SEQ_FOPS_RO(lov_desc_uuid); static void *lov_tgt_seq_start(struct seq_file *p, loff_t *pos) { @@ -248,50 +241,45 @@ struct seq_operations lov_tgt_sops = { static int lov_target_seq_open(struct inode *inode, struct file *file) { - struct proc_dir_entry *dp = PDE(inode); - struct seq_file *seq; - int rc; + struct seq_file *seq; + int rc; - LPROCFS_ENTRY_CHECK(dp); - rc = seq_open(file, &lov_tgt_sops); + LPROCFS_ENTRY_CHECK(PDE(inode)); + rc = seq_open(file, &lov_tgt_sops); if (rc) - return rc; + return rc; - seq = file->private_data; - seq->private = dp->data; - return 0; + seq = file->private_data; + seq->private = PDE_DATA(inode); + return 0; } -struct lprocfs_vars lprocfs_lov_obd_vars[] = { - { "uuid", lprocfs_rd_uuid, 0, 0 }, - { "stripesize", lov_rd_stripesize, lov_wr_stripesize, 0 }, - { "stripeoffset", lov_rd_stripeoffset, lov_wr_stripeoffset, 0 }, - { "stripecount", lov_rd_stripecount, lov_wr_stripecount, 0 }, - { "stripetype", lov_rd_stripetype, lov_wr_stripetype, 0 }, - { "numobd", lov_rd_numobd, 0, 0 }, - { "activeobd", lov_rd_activeobd, 0, 0 }, - { "filestotal", lprocfs_rd_filestotal, 0, 0 }, - { "filesfree", lprocfs_rd_filesfree, 0, 0 }, - /*{ "filegroups", lprocfs_rd_filegroups, 0, 0 },*/ - { "blocksize", lprocfs_rd_blksize, 0, 0 }, - { "kbytestotal", lprocfs_rd_kbytestotal, 0, 0 }, - { "kbytesfree", lprocfs_rd_kbytesfree, 0, 0 }, - { "kbytesavail", lprocfs_rd_kbytesavail, 0, 0 }, - { "desc_uuid", lov_rd_desc_uuid, 0, 0 }, - { 0 } -}; - -static struct lprocfs_vars lprocfs_lov_module_vars[] = { - { "num_refs", lprocfs_rd_numrefs, 0, 0 }, - { 0 } +LPROC_SEQ_FOPS_RO_TYPE(lov, uuid); +LPROC_SEQ_FOPS_RO_TYPE(lov, filestotal); +LPROC_SEQ_FOPS_RO_TYPE(lov, filesfree); +LPROC_SEQ_FOPS_RO_TYPE(lov, blksize); +LPROC_SEQ_FOPS_RO_TYPE(lov, kbytestotal); +LPROC_SEQ_FOPS_RO_TYPE(lov, kbytesfree); +LPROC_SEQ_FOPS_RO_TYPE(lov, kbytesavail); + +struct lprocfs_seq_vars lprocfs_lov_obd_vars[] = { + { "uuid", &lov_uuid_fops }, + { "stripesize", &lov_stripesize_fops }, + { "stripeoffset", &lov_stripeoffset_fops }, + { "stripecount", &lov_stripecount_fops }, + { "stripetype", &lov_stripetype_fops }, + { "numobd", &lov_numobd_fops }, + { "activeobd", &lov_activeobd_fops }, + { "filestotal", &lov_filestotal_fops }, + { "filesfree", &lov_filesfree_fops }, + { "blocksize", &lov_blksize_fops }, + { "kbytestotal", &lov_kbytestotal_fops }, + { "kbytesfree", &lov_kbytesfree_fops }, + { "kbytesavail", &lov_kbytesavail_fops }, + { "desc_uuid", &lov_desc_uuid_fops }, + { 0 } }; -void lprocfs_lov_init_vars(struct lprocfs_static_vars *lvars) -{ - lvars->module_vars = lprocfs_lov_module_vars; - lvars->obd_vars = lprocfs_lov_obd_vars; -} - struct file_operations lov_proc_target_fops = { .owner = THIS_MODULE, .open = lov_target_seq_open,