From 2670599090a754d9fa8c7d952b530bc8fb88d56e Mon Sep 17 00:00:00 2001 From: James Simmons Date: Sun, 9 Feb 2014 11:08:45 -0500 Subject: [PATCH 06/12] LU-3319 procfs: move lod proc handling to seq_files With 3.10 linux kernel and above proc handling now only uses struct seq_files. This patch migrates the lod layer proc entries over to using seq_files. Signed-off-by: James Simmons Change-Id: Iaa0f617fcd430e91f12afbc0faf6906fd275a7a5 --- lustre/lod/lod_dev.c | 39 ++++--- lustre/lod/lod_internal.h | 1 - lustre/lod/lod_pool.c | 7 +- lustre/lod/lproc_lod.c | 251 ++++++++++++++++++++++++---------------------- 4 files changed, 152 insertions(+), 146 deletions(-) diff --git a/lustre/lod/lod_dev.c b/lustre/lod/lod_dev.c index a451462..8776aa3 100644 --- a/lustre/lod/lod_dev.c +++ b/lustre/lod/lod_dev.c @@ -289,12 +289,10 @@ static int lod_process_config(const struct lu_env *env, } case LCFG_PARAM: { - struct lprocfs_static_vars v = { 0 }; - struct obd_device *obd = lod2obd(lod); + struct obd_device *obd = lod2obd(lod); - lprocfs_lod_init_vars(&v); - - rc = class_process_proc_param(PARAM_LOV, v.obd_vars, lcfg, obd); + rc = class_process_proc_seq_param(PARAM_LOV, obd->obd_vars, + lcfg, obd); if (rc > 0) rc = 0; GOTO(out, rc); @@ -890,19 +888,16 @@ static struct obd_ops lod_obd_device_ops = { static int __init lod_mod_init(void) { - struct lprocfs_static_vars lvars = { 0 }; - cfs_proc_dir_entry_t *lov_proc_dir; - int rc; + struct obd_type *lod, *lov; + int rc; rc = lu_kmem_init(lod_caches); if (rc) return rc; - lprocfs_lod_init_vars(&lvars); - rc = class_register_type(&lod_obd_device_ops, NULL, NULL, #ifndef HAVE_ONLY_PROCFS_SEQ - lvars.module_vars, + NULL, #endif LUSTRE_LOD_NAME, &lod_device_type); if (rc) { @@ -911,23 +906,25 @@ static int __init lod_mod_init(void) } /* create "lov" entry in procfs for compatibility purposes */ - lov_proc_dir = lprocfs_srch(proc_lustre_root, "lov"); - if (lov_proc_dir == NULL) { - lov_proc_dir = lprocfs_register("lov", proc_lustre_root, - NULL, NULL); - if (IS_ERR(lov_proc_dir)) + lod = class_search_type(LUSTRE_LOD_NAME); + lov = class_search_type(LUSTRE_LOV_NAME); + if (lov == NULL) { + lod->typ_procsym = lprocfs_seq_register("lov", proc_lustre_root, + NULL, NULL); + if (IS_ERR(lod->typ_procsym)) { CERROR("lod: can't create compat entry \"lov\": %d\n", - (int)PTR_ERR(lov_proc_dir)); + (int)PTR_ERR(lod->typ_procsym)); + lod->typ_procsym = NULL; + } + } else { + /* Map lov proc root to lod symlink */ + lod->typ_procsym = lov->typ_procroot; } - return rc; } static void __exit lod_mod_exit(void) { - - lprocfs_try_remove_proc_entry("lov", proc_lustre_root); - class_unregister_type(LUSTRE_LOD_NAME); lu_kmem_fini(lod_caches); } diff --git a/lustre/lod/lod_internal.h b/lustre/lod/lod_internal.h index 2a00890..65ba47a 100644 --- a/lustre/lod/lod_internal.h +++ b/lustre/lod/lod_internal.h @@ -431,7 +431,6 @@ int qos_add_tgt(struct lod_device*, struct lod_tgt_desc *); int qos_del_tgt(struct lod_device *, struct lod_tgt_desc *); /* lproc_lod.c */ -void lprocfs_lod_init_vars(struct lprocfs_static_vars *lvars); int lod_procfs_init(struct lod_device *lod); void lod_procfs_fini(struct lod_device *lod); diff --git a/lustre/lod/lod_pool.c b/lustre/lod/lod_pool.c index 98b2416..1849e5d 100644 --- a/lustre/lod/lod_pool.c +++ b/lustre/lod/lod_pool.c @@ -283,7 +283,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; } @@ -462,7 +462,10 @@ int lod_pool_new(struct obd_device *obd, char *poolname) #ifdef LPROCFS lod_pool_getref(new_pool); new_pool->pool_proc_entry = lprocfs_add_simple(lod->lod_pool_proc_entry, - poolname, NULL, NULL, + poolname, +#ifndef HAVE_ONLY_PROCFS_SEQ + NULL, NULL, +#endif new_pool, &pool_proc_operations); if (IS_ERR(new_pool->pool_proc_entry)) { diff --git a/lustre/lod/lproc_lod.c b/lustre/lod/lproc_lod.c index e976063..e420a5e 100644 --- a/lustre/lod/lproc_lod.c +++ b/lustre/lod/lproc_lod.c @@ -42,23 +42,22 @@ #include #ifdef LPROCFS -static int lod_rd_stripesize(char *page, char **start, off_t off, int count, - int *eof, void *data) +static int lod_stripesize_seq_show(struct seq_file *m, void *v) { - struct obd_device *dev = (struct obd_device *)data; + struct obd_device *dev = m->private; struct lod_device *lod; LASSERT(dev != NULL); lod = lu2lod_dev(dev->obd_lu_dev); - *eof = 1; - return snprintf(page, count, LPU64"\n", + return seq_printf(m, LPU64"\n", lod->lod_desc.ld_default_stripe_size); } -static int lod_wr_stripesize(struct file *file, const char *buffer, - unsigned long count, void *data) +static ssize_t +lod_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 lod_device *lod; __u64 val; int rc; @@ -73,24 +72,24 @@ static int lod_wr_stripesize(struct file *file, const char *buffer, lod->lod_desc.ld_default_stripe_size = val; return count; } +LPROC_SEQ_FOPS(lod_stripesize); -static int lod_rd_stripeoffset(char *page, char **start, off_t off, int count, - int *eof, void *data) +static int lod_stripeoffset_seq_show(struct seq_file *m, void *v) { - struct obd_device *dev = (struct obd_device *)data; + struct obd_device *dev = m->private; struct lod_device *lod; LASSERT(dev != NULL); lod = lu2lod_dev(dev->obd_lu_dev); - *eof = 1; - return snprintf(page, count, LPU64"\n", + return seq_printf(m, LPU64"\n", lod->lod_desc.ld_default_stripe_offset); } -static int lod_wr_stripeoffset(struct file *file, const char *buffer, - unsigned long count, void *data) +static ssize_t +lod_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 lod_device *lod; __u64 val; int rc; @@ -104,23 +103,23 @@ static int lod_wr_stripeoffset(struct file *file, const char *buffer, lod->lod_desc.ld_default_stripe_offset = val; return count; } +LPROC_SEQ_FOPS(lod_stripeoffset); -static int lod_rd_stripetype(char *page, char **start, off_t off, int count, - int *eof, void *data) +static int lod_stripetype_seq_show(struct seq_file *m, void *v) { - struct obd_device *dev = (struct obd_device *)data; + struct obd_device *dev = m->private; struct lod_device *lod; LASSERT(dev != NULL); lod = lu2lod_dev(dev->obd_lu_dev); - *eof = 1; - return snprintf(page, count, "%u\n", lod->lod_desc.ld_pattern); + return seq_printf(m, "%u\n", lod->lod_desc.ld_pattern); } -static int lod_wr_stripetype(struct file *file, const char *buffer, - unsigned long count, void *data) +static ssize_t +lod_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 lod_device *lod; int val, rc; @@ -134,24 +133,24 @@ static int lod_wr_stripetype(struct file *file, const char *buffer, lod->lod_desc.ld_pattern = val; return count; } +LPROC_SEQ_FOPS(lod_stripetype); -static int lod_rd_stripecount(char *page, char **start, off_t off, int count, - int *eof, void *data) +static int lod_stripecount_seq_show(struct seq_file *m, void *v) { - struct obd_device *dev = (struct obd_device *)data; + struct obd_device *dev = m->private; struct lod_device *lod; LASSERT(dev != NULL); lod = lu2lod_dev(dev->obd_lu_dev); - *eof = 1; - return snprintf(page, count, "%d\n", + return seq_printf(m, "%d\n", (__s16)(lod->lod_desc.ld_default_stripe_count + 1) - 1); } -static int lod_wr_stripecount(struct file *file, const char *buffer, - unsigned long count, void *data) +static ssize_t +lod_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 lod_device *lod; int val, rc; @@ -165,62 +164,57 @@ static int lod_wr_stripecount(struct file *file, const char *buffer, lod->lod_desc.ld_default_stripe_count = val; return count; } +LPROC_SEQ_FOPS(lod_stripecount); -static int lod_rd_numobd(char *page, char **start, off_t off, int count, - int *eof, void *data) +static int lod_numobd_seq_show(struct seq_file *m, void *v) { - struct obd_device *dev = (struct obd_device*)data; + struct obd_device *dev = m->private; struct lod_device *lod; LASSERT(dev != NULL); lod = lu2lod_dev(dev->obd_lu_dev); - *eof = 1; - return snprintf(page, count, "%u\n", lod->lod_desc.ld_tgt_count); - + return seq_printf(m, "%u\n", lod->lod_desc.ld_tgt_count); } +LPROC_SEQ_FOPS_RO(lod_numobd); -static int lod_rd_activeobd(char *page, char **start, off_t off, int count, - int *eof, void *data) +static int lod_activeobd_seq_show(struct seq_file *m, void *v) { - struct obd_device* dev = (struct obd_device*)data; + struct obd_device* dev = m->private; struct lod_device *lod; LASSERT(dev != NULL); lod = lu2lod_dev(dev->obd_lu_dev); - *eof = 1; - return snprintf(page, count, "%u\n", - lod->lod_desc.ld_active_tgt_count); + return seq_printf(m, "%u\n", lod->lod_desc.ld_active_tgt_count); } +LPROC_SEQ_FOPS_RO(lod_activeobd); -static int lod_rd_desc_uuid(char *page, char **start, off_t off, int count, - int *eof, void *data) +static int lod_desc_uuid_seq_show(struct seq_file *m, void *v) { - struct obd_device *dev = (struct obd_device*) data; + struct obd_device *dev = m->private; struct lod_device *lod; LASSERT(dev != NULL); lod = lu2lod_dev(dev->obd_lu_dev); - *eof = 1; - return snprintf(page, count, "%s\n", lod->lod_desc.ld_uuid.uuid); + return seq_printf(m, "%s\n", lod->lod_desc.ld_uuid.uuid); } +LPROC_SEQ_FOPS_RO(lod_desc_uuid); /* free priority (0-255): how badly user wants to choose empty osts */ -static int lod_rd_qos_priofree(char *page, char **start, off_t off, int count, - int *eof, void *data) +static int lod_qos_priofree_seq_show(struct seq_file *m, void *v) { - struct obd_device *dev = (struct obd_device*) data; + struct obd_device *dev = m->private; struct lod_device *lod = lu2lod_dev(dev->obd_lu_dev); LASSERT(lod != NULL); - *eof = 1; - return snprintf(page, count, "%d%%\n", + return seq_printf(m, "%d%%\n", (lod->lod_qos.lq_prio_free * 100 + 255) >> 8); } -static int lod_wr_qos_priofree(struct file *file, const char *buffer, - unsigned long count, void *data) +static ssize_t +lod_qos_priofree_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 lod_device *lod; int val, rc; @@ -238,24 +232,24 @@ static int lod_wr_qos_priofree(struct file *file, const char *buffer, lod->lod_qos.lq_reset = 1; return count; } +LPROC_SEQ_FOPS(lod_qos_priofree); -static int lod_rd_qos_thresholdrr(char *page, char **start, off_t off, - int count, int *eof, void *data) +static int lod_qos_thresholdrr_seq_show(struct seq_file *m, void *v) { - struct obd_device *dev = (struct obd_device*) data; + struct obd_device *dev = m->private; struct lod_device *lod; LASSERT(dev != NULL); lod = lu2lod_dev(dev->obd_lu_dev); - *eof = 1; - return snprintf(page, count, "%d%%\n", + return seq_printf(m, "%d%%\n", (lod->lod_qos.lq_threshold_rr * 100 + 255) >> 8); } -static int lod_wr_qos_thresholdrr(struct file *file, const char *buffer, - unsigned long count, void *data) +static ssize_t +lod_qos_thresholdrr_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 lod_device *lod; int val, rc; @@ -273,23 +267,23 @@ static int lod_wr_qos_thresholdrr(struct file *file, const char *buffer, lod->lod_qos.lq_dirty = 1; return count; } +LPROC_SEQ_FOPS(lod_qos_thresholdrr); -static int lod_rd_qos_maxage(char *page, char **start, off_t off, int count, - int *eof, void *data) +static int lod_qos_maxage_seq_show(struct seq_file *m, void *v) { - struct obd_device *dev = (struct obd_device*) data; + struct obd_device *dev = m->private; struct lod_device *lod; LASSERT(dev != NULL); lod = lu2lod_dev(dev->obd_lu_dev); - *eof = 1; - return snprintf(page, count, "%u Sec\n", lod->lod_desc.ld_qos_maxage); + return seq_printf(m, "%u Sec\n", lod->lod_desc.ld_qos_maxage); } -static int lod_wr_qos_maxage(struct file *file, const char *buffer, - unsigned long count, void *data) +static ssize_t +lod_qos_maxage_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 lustre_cfg_bufs bufs; struct lod_device *lod; struct lu_device *next; @@ -327,6 +321,7 @@ static int lod_wr_qos_maxage(struct file *file, const char *buffer, return count; } +LPROC_SEQ_FOPS(lod_qos_maxage); static void *lod_osts_seq_start(struct seq_file *p, loff_t *pos) { @@ -414,56 +409,63 @@ static const struct seq_operations lod_osts_sops = { static int lod_osts_seq_open(struct inode *inode, struct file *file) { - struct proc_dir_entry *dp = PDE(inode); struct seq_file *seq; int rc; - LPROCFS_ENTRY_CHECK(dp); rc = seq_open(file, &lod_osts_sops); if (rc) return rc; seq = file->private_data; - seq->private = dp->data; + seq->private = PDE_DATA(inode); return 0; } -static struct lprocfs_vars lprocfs_lod_obd_vars[] = { - { "uuid", lprocfs_rd_uuid, 0, 0 }, - { "stripesize", lod_rd_stripesize, lod_wr_stripesize, 0 }, - { "stripeoffset", lod_rd_stripeoffset, lod_wr_stripeoffset, 0 }, - { "stripecount", lod_rd_stripecount, lod_wr_stripecount, 0 }, - { "stripetype", lod_rd_stripetype, lod_wr_stripetype, 0 }, - { "numobd", lod_rd_numobd, 0, 0 }, - { "activeobd", lod_rd_activeobd, 0, 0 }, - { "desc_uuid", lod_rd_desc_uuid, 0, 0 }, - { "qos_prio_free",lod_rd_qos_priofree, lod_wr_qos_priofree, 0 }, - { "qos_threshold_rr", lod_rd_qos_thresholdrr, lod_wr_qos_thresholdrr, 0 }, - { "qos_maxage", lod_rd_qos_maxage, lod_wr_qos_maxage, 0 }, +LPROC_SEQ_FOPS_RO_TYPE(lod, uuid); + +LPROC_SEQ_FOPS_RO_TYPE(lod, dt_blksize); +LPROC_SEQ_FOPS_RO_TYPE(lod, dt_kbytestotal); +LPROC_SEQ_FOPS_RO_TYPE(lod, dt_kbytesfree); +LPROC_SEQ_FOPS_RO_TYPE(lod, dt_kbytesavail); +LPROC_SEQ_FOPS_RO_TYPE(lod, dt_filestotal); +LPROC_SEQ_FOPS_RO_TYPE(lod, dt_filesfree); + +static struct lprocfs_seq_vars lprocfs_lod_obd_vars[] = { + { .name = "uuid", + .fops = &lod_uuid_fops }, + { .name = "stripesize", + .fops = &lod_stripesize_fops }, + { .name = "stripeoffset", + .fops = &lod_stripeoffset_fops }, + { .name = "stripecount", + .fops = &lod_stripecount_fops }, + { .name = "stripetype", + .fops = &lod_stripetype_fops }, + { .name = "numobd", + .fops = &lod_numobd_fops }, + { .name = "activeobd", + .fops = &lod_activeobd_fops }, + { .name = "desc_uuid", + .fops = &lod_desc_uuid_fops }, + { .name = "qos_prio_free", + .fops = &lod_qos_priofree_fops }, + { .name = "qos_threshold_rr", + .fops = &lod_qos_thresholdrr_fops }, + { .name = "qos_maxage", + .fops = &lod_qos_maxage_fops }, { 0 } }; -static struct lprocfs_vars lprocfs_lod_osd_vars[] = { - { "blocksize", lprocfs_dt_rd_blksize, 0, 0 }, - { "kbytestotal", lprocfs_dt_rd_kbytestotal, 0, 0 }, - { "kbytesfree", lprocfs_dt_rd_kbytesfree, 0, 0 }, - { "kbytesavail", lprocfs_dt_rd_kbytesavail, 0, 0 }, - { "filestotal", lprocfs_dt_rd_filestotal, 0, 0 }, - { "filesfree", lprocfs_dt_rd_filesfree, 0, 0 }, +static struct lprocfs_seq_vars lprocfs_lod_osd_vars[] = { + { "blocksize", &lod_dt_blksize_fops }, + { "kbytestotal", &lod_dt_kbytestotal_fops }, + { "kbytesfree", &lod_dt_kbytesfree_fops }, + { "kbytesavail", &lod_dt_kbytesavail_fops }, + { "filestotal", &lod_dt_filestotal_fops }, + { "filesfree", &lod_dt_filesfree_fops }, { 0 } }; -static struct lprocfs_vars lprocfs_lod_module_vars[] = { - { "num_refs", lprocfs_rd_numrefs, 0, 0 }, - { 0 } -}; - -void lprocfs_lod_init_vars(struct lprocfs_static_vars *lvars) -{ - lvars->module_vars = lprocfs_lod_module_vars; - lvars->obd_vars = lprocfs_lod_obd_vars; -} - static const struct file_operations lod_proc_target_fops = { .owner = THIS_MODULE, .open = lod_osts_seq_open, @@ -475,20 +477,18 @@ static const struct file_operations lod_proc_target_fops = { int lod_procfs_init(struct lod_device *lod) { struct obd_device *obd = lod2obd(lod); - struct lprocfs_static_vars lvars; - cfs_proc_dir_entry_t *lov_proc_dir; int rc; - lprocfs_lod_init_vars(&lvars); - rc = lprocfs_obd_setup(obd, lvars.obd_vars); + obd->obd_vars = lprocfs_lod_obd_vars; + rc = lprocfs_seq_obd_setup(obd); if (rc) { CERROR("%s: cannot setup procfs entry: %d\n", obd->obd_name, rc); RETURN(rc); } - rc = lprocfs_add_vars(obd->obd_proc_entry, lprocfs_lod_osd_vars, - &lod->lod_dt_dev); + rc = lprocfs_seq_add_vars(obd->obd_proc_entry, lprocfs_lod_osd_vars, + &lod->lod_dt_dev); if (rc) { CERROR("%s: cannot setup procfs entry: %d\n", obd->obd_name, rc); @@ -503,9 +503,9 @@ int lod_procfs_init(struct lod_device *lod) GOTO(out, rc); } - lod->lod_pool_proc_entry = lprocfs_register("pools", - obd->obd_proc_entry, - NULL, NULL); + lod->lod_pool_proc_entry = lprocfs_seq_register("pools", + obd->obd_proc_entry, + NULL, NULL); if (IS_ERR(lod->lod_pool_proc_entry)) { rc = PTR_ERR(lod->lod_pool_proc_entry); lod->lod_pool_proc_entry = NULL; @@ -514,14 +514,18 @@ int lod_procfs_init(struct lod_device *lod) GOTO(out, rc); } - /* for compatibility we link old procfs's OSC entries to osp ones */ - lov_proc_dir = lprocfs_srch(proc_lustre_root, "lov"); - if (lov_proc_dir != NULL && strstr(obd->obd_name, "lov") != NULL) + /* for compatibility we link old procfs's LOV entries to lod ones */ + if (obd->obd_type->typ_procsym != NULL) { lod->lod_symlink = lprocfs_add_symlink(obd->obd_name, - lov_proc_dir, - "../lod/%s", - obd->obd_name); - + obd->obd_type->typ_procsym, + "../lod/%s", + obd->obd_name); + if (lod->lod_symlink == NULL) { + CERROR("could not register LOV symlink for " + "/proc/fs/lustre/lod/%s.", obd->obd_name); + lprocfs_remove(&obd->obd_type->typ_procsym); + } + } RETURN(0); out: @@ -542,6 +546,9 @@ void lod_procfs_fini(struct lod_device *lod) lod->lod_pool_proc_entry = NULL; } + if (obd->obd_type->typ_procsym != NULL) + lprocfs_remove(&obd->obd_type->typ_procsym); + lprocfs_obd_cleanup(obd); } -- 1.8.5.3