From: James Simmons Date: Thu, 14 Nov 2013 14:32:29 +0000 (-0500) Subject: LU-3319 procfs: move lmv proc handling over to seq_file X-Git-Tag: 2.5.53~8 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=bfa6343413c5c6423e96b6db387ae616d756a27f;p=fs%2Flustre-release.git LU-3319 procfs: move lmv proc handling over to seq_file In order to support 3.10+ kernels for clients we adapt the lmv proc handling to using seq_files. Signed-off-by: James Simmons Change-Id: I34f58c3a484ee79b41b59d4a60f6a21726373152 Reviewed-on: http://review.whamcloud.com/7291 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Peng Tao Reviewed-by: Bob Glossman Reviewed-by: Oleg Drokin --- diff --git a/lustre/lmv/lmv_internal.h b/lustre/lmv/lmv_internal.h index 15692c5..1d027d7 100644 --- a/lustre/lmv/lmv_internal.h +++ b/lustre/lmv/lmv_internal.h @@ -147,12 +147,7 @@ struct lmv_tgt_desc struct lu_fid *fid); /* lproc_lmv.c */ #ifdef LPROCFS -void lprocfs_lmv_init_vars(struct lprocfs_static_vars *lvars); -#else -static inline void lprocfs_lmv_init_vars(struct lprocfs_static_vars *lvars) -{ - memset(lvars, 0, sizeof(*lvars)); -} +extern struct lprocfs_seq_vars lprocfs_lmv_obd_vars[]; #endif extern struct file_operations lmv_proc_target_fops; diff --git a/lustre/lmv/lmv_obd.c b/lustre/lmv/lmv_obd.c index 56d6e20..888a86f 100644 --- a/lustre/lmv/lmv_obd.c +++ b/lustre/lmv/lmv_obd.c @@ -239,13 +239,19 @@ static int lmv_connect(const struct lu_env *env, lmv->conn_data = *data; #ifdef __KERNEL__ - lmv_proc_dir = lprocfs_register("target_obds", obd->obd_proc_entry, - NULL, NULL); - if (IS_ERR(lmv_proc_dir)) { - CERROR("could not register /proc/fs/lustre/%s/%s/target_obds.", - obd->obd_type->typ_name, obd->obd_name); - lmv_proc_dir = NULL; - } + if (obd->obd_proc_private != NULL) { + lmv_proc_dir = obd->obd_proc_private; + } else { + lmv_proc_dir = lprocfs_seq_register("target_obds", + obd->obd_proc_entry, + NULL, NULL); + if (IS_ERR(lmv_proc_dir)) { + CERROR("could not register /proc/fs/lustre/%s/%s/target_obds.", + obd->obd_type->typ_name, obd->obd_name); + lmv_proc_dir = NULL; + } + obd->obd_proc_private = lmv_proc_dir; + } #endif /* @@ -258,12 +264,11 @@ static int lmv_connect(const struct lu_env *env, rc = lmv_check_connect(obd); #ifdef __KERNEL__ - if (rc) { - if (lmv_proc_dir) - lprocfs_remove(&lmv_proc_dir); - } + if (rc && lmv_proc_dir) { + lprocfs_remove(&lmv_proc_dir); + obd->obd_proc_private = NULL; + } #endif - RETURN(rc); } @@ -423,28 +428,28 @@ int lmv_connect_mdc(struct obd_device *obd, struct lmv_tgt_desc *tgt) cfs_atomic_read(&obd->obd_refcount)); #ifdef __KERNEL__ - lmv_proc_dir = lprocfs_srch(obd->obd_proc_entry, "target_obds"); - if (lmv_proc_dir) { - struct proc_dir_entry *mdc_symlink; - - LASSERT(mdc_obd->obd_type != NULL); - LASSERT(mdc_obd->obd_type->typ_name != NULL); - mdc_symlink = lprocfs_add_symlink(mdc_obd->obd_name, - lmv_proc_dir, - "../../../%s/%s", - mdc_obd->obd_type->typ_name, - mdc_obd->obd_name); - if (mdc_symlink == NULL) { - CERROR("Could not register LMV target " - "/proc/fs/lustre/%s/%s/target_obds/%s.", - obd->obd_type->typ_name, obd->obd_name, - mdc_obd->obd_name); - lprocfs_remove(&lmv_proc_dir); - lmv_proc_dir = NULL; - } - } + lmv_proc_dir = obd->obd_proc_private; + if (lmv_proc_dir) { + struct proc_dir_entry *mdc_symlink; + + LASSERT(mdc_obd->obd_type != NULL); + LASSERT(mdc_obd->obd_type->typ_name != NULL); + mdc_symlink = lprocfs_add_symlink(mdc_obd->obd_name, + lmv_proc_dir, + "../../../%s/%s", + mdc_obd->obd_type->typ_name, + mdc_obd->obd_name); + if (mdc_symlink == NULL) { + CERROR("Could not register LMV target " + "/proc/fs/lustre/%s/%s/target_obds/%s.", + obd->obd_type->typ_name, obd->obd_name, + mdc_obd->obd_name); + lprocfs_remove(&lmv_proc_dir); + obd->obd_proc_private = NULL; + } + } #endif - RETURN(0); + RETURN(0); } static void lmv_del_target(struct lmv_obd *lmv, int index) @@ -652,19 +657,9 @@ static int lmv_disconnect_mdc(struct obd_device *obd, struct lmv_tgt_desc *tgt) } #ifdef __KERNEL__ - lmv_proc_dir = lprocfs_srch(obd->obd_proc_entry, "target_obds"); - if (lmv_proc_dir) { - struct proc_dir_entry *mdc_symlink; - - mdc_symlink = lprocfs_srch(lmv_proc_dir, mdc_obd->obd_name); - if (mdc_symlink) { - lprocfs_remove(&mdc_symlink); - } else { - CERROR("/proc/fs/lustre/%s/%s/target_obds/%s missing\n", - obd->obd_type->typ_name, obd->obd_name, - mdc_obd->obd_name); - } - } + lmv_proc_dir = obd->obd_proc_private; + if (lmv_proc_dir) + lprocfs_remove_proc_entry(mdc_obd->obd_name, lmv_proc_dir); #endif rc = obd_fid_fini(tgt->ltd_exp->exp_obd); if (rc) @@ -691,9 +686,6 @@ static int lmv_disconnect_mdc(struct obd_device *obd, struct lmv_tgt_desc *tgt) static int lmv_disconnect(struct obd_export *exp) { struct obd_device *obd = class_exp2obd(exp); -#ifdef __KERNEL__ - struct proc_dir_entry *lmv_proc_dir; -#endif struct lmv_obd *lmv = &obd->u.lmv; int rc; __u32 i; @@ -717,13 +709,11 @@ static int lmv_disconnect(struct obd_export *exp) } #ifdef __KERNEL__ - lmv_proc_dir = lprocfs_srch(obd->obd_proc_entry, "target_obds"); - if (lmv_proc_dir) { - lprocfs_remove(&lmv_proc_dir); - } else { - CERROR("/proc/fs/lustre/%s/%s/target_obds missing\n", - obd->obd_type->typ_name, obd->obd_name); - } + if (obd->obd_proc_private) + lprocfs_remove((struct proc_dir_entry **)&obd->obd_proc_private); + else + CERROR("/proc/fs/lustre/%s/%s/target_obds missing\n", + obd->obd_type->typ_name, obd->obd_name); #endif out_local: @@ -1383,11 +1373,10 @@ int lmv_fid_alloc(struct obd_export *exp, struct lu_fid *fid, static int lmv_setup(struct obd_device *obd, struct lustre_cfg *lcfg) { - struct lmv_obd *lmv = &obd->u.lmv; - struct lprocfs_static_vars lvars; - struct lmv_desc *desc; - int rc; - ENTRY; + struct lmv_obd *lmv = &obd->u.lmv; + struct lmv_desc *desc; + int rc; + ENTRY; if (LUSTRE_CFG_BUFLEN(lcfg, 1) < 1) { CERROR("LMV setup requires a descriptor\n"); @@ -1417,18 +1406,15 @@ static int lmv_setup(struct obd_device *obd, struct lustre_cfg *lcfg) spin_lock_init(&lmv->lmv_lock); mutex_init(&lmv->init_mutex); - lprocfs_lmv_init_vars(&lvars); - - lprocfs_obd_setup(obd, lvars.obd_vars); - lprocfs_alloc_md_stats(obd, 0); #ifdef LPROCFS - { - rc = lprocfs_seq_create(obd->obd_proc_entry, "target_obd", - 0444, &lmv_proc_target_fops, obd); - if (rc) - CWARN("%s: error adding LMV target_obd file: rc = %d\n", - obd->obd_name, rc); - } + obd->obd_vars = lprocfs_lmv_obd_vars; + lprocfs_seq_obd_setup(obd); + lprocfs_alloc_md_stats(obd, 0); + rc = lprocfs_seq_create(obd->obd_proc_entry, "target_obd", + 0444, &lmv_proc_target_fops, obd); + if (rc) + CWARN("%s: error adding LMV target_obd file: rc = %d\n", + obd->obd_name, rc); #endif rc = fld_client_init(&lmv->lmv_fld, obd->obd_name, LUSTRE_CLI_FLD_HASH_DHT); @@ -2477,7 +2463,7 @@ int lmv_set_info_async(const struct lu_env *env, struct obd_export *exp, obd_count keylen, void *key, obd_count vallen, void *val, struct ptlrpc_request_set *set) { - struct lmv_tgt_desc *tgt; + struct lmv_tgt_desc *tgt = NULL; struct obd_device *obd; struct lmv_obd *lmv; int rc = 0; @@ -2982,13 +2968,9 @@ struct md_ops lmv_md_ops = { int __init lmv_init(void) { - struct lprocfs_static_vars lvars; - - lprocfs_lmv_init_vars(&lvars); - return class_register_type(&lmv_obd_ops, &lmv_md_ops, NULL, #ifndef HAVE_ONLY_PROCFS_SEQ - lvars.module_vars, + NULL, #endif LUSTRE_LMV_NAME, NULL); } diff --git a/lustre/lmv/lproc_lmv.c b/lustre/lmv/lproc_lmv.c index 6a3b128..eea5927 100644 --- a/lustre/lmv/lproc_lmv.c +++ b/lustre/lmv/lproc_lmv.c @@ -46,18 +46,16 @@ static struct lprocfs_vars lprocfs_module_vars[] = { {0} }; static struct lprocfs_vars lprocfs_obd_vars[] = { {0} }; #else -static int lmv_rd_numobd(char *page, char **start, off_t off, int count, - int *eof, void *data) +static int lmv_numobd_seq_show(struct seq_file *m, void *v) { - struct obd_device *dev = (struct obd_device*)data; + struct obd_device *dev = (struct obd_device *)m->private; struct lmv_desc *desc; LASSERT(dev != NULL); desc = &dev->u.lmv.desc; - *eof = 1; - return snprintf(page, count, "%u\n", desc->ld_tgt_count); - + return seq_printf(m, "%u\n", desc->ld_tgt_count); } +LPROC_SEQ_FOPS_RO(lmv_numobd); static const char *placement_name[] = { [PLACEMENT_CHAR_POLICY] = "CHAR", @@ -82,26 +80,22 @@ static const char *placement_policy2name(placement_policy_t placement) return placement_name[placement]; } -static int lmv_rd_placement(char *page, char **start, off_t off, int count, - int *eof, void *data) +static int lmv_placement_seq_show(struct seq_file *m, void *v) { - struct obd_device *dev = (struct obd_device*)data; + struct obd_device *dev = (struct obd_device *)m->private; struct lmv_obd *lmv; LASSERT(dev != NULL); lmv = &dev->u.lmv; - *eof = 1; - return snprintf(page, count, "%s\n", - placement_policy2name(lmv->lmv_placement)); - + return seq_printf(m, "%s\n", placement_policy2name(lmv->lmv_placement)); } #define MAX_POLICY_STRING_SIZE 64 -static int lmv_wr_placement(struct file *file, const char *buffer, - unsigned long count, void *data) +static ssize_t lmv_placement_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; char dummy[MAX_POLICY_STRING_SIZE + 1]; int len = count; placement_policy_t policy; @@ -131,30 +125,29 @@ static int lmv_wr_placement(struct file *file, const char *buffer, } return count; } +LPROC_SEQ_FOPS(lmv_placement); -static int lmv_rd_activeobd(char *page, char **start, off_t off, int count, - int *eof, void *data) +static int lmv_activeobd_seq_show(struct seq_file *m, void *v) { - struct obd_device *dev = (struct obd_device*)data; + struct obd_device *dev = (struct obd_device *)m->private; struct lmv_desc *desc; LASSERT(dev != NULL); desc = &dev->u.lmv.desc; - *eof = 1; - return snprintf(page, count, "%u\n", desc->ld_active_tgt_count); + return seq_printf(m, "%u\n", desc->ld_active_tgt_count); } +LPROC_SEQ_FOPS_RO(lmv_activeobd); -static int lmv_rd_desc_uuid(char *page, char **start, off_t off, int count, - int *eof, void *data) +static int lmv_desc_uuid_seq_show(struct seq_file *m, void *v) { - struct obd_device *dev = (struct obd_device*) data; + struct obd_device *dev = (struct obd_device*)m->private; struct lmv_obd *lmv; LASSERT(dev != NULL); lmv = &dev->u.lmv; - *eof = 1; - return snprintf(page, count, "%s\n", lmv->desc.ld_uuid.uuid); + return seq_printf(m, "%s\n", lmv->desc.ld_uuid.uuid); } +LPROC_SEQ_FOPS_RO(lmv_desc_uuid); static void *lmv_tgt_seq_start(struct seq_file *p, loff_t *pos) { @@ -195,7 +188,6 @@ struct seq_operations lmv_tgt_sops = { static int lmv_target_seq_open(struct inode *inode, struct file *file) { - struct proc_dir_entry *dp = PDE(inode); struct seq_file *seq; int rc; @@ -203,24 +195,20 @@ static int lmv_target_seq_open(struct inode *inode, struct file *file) if (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_lmv_obd_vars[] = { - { "numobd", lmv_rd_numobd, 0, 0 }, - { "placement", lmv_rd_placement, lmv_wr_placement, 0 }, - { "activeobd", lmv_rd_activeobd, 0, 0 }, - { "uuid", lprocfs_rd_uuid, 0, 0 }, - { "desc_uuid", lmv_rd_desc_uuid, 0, 0 }, - { 0 } -}; +LPROC_SEQ_FOPS_RO_TYPE(lmv, uuid); -static struct lprocfs_vars lprocfs_lmv_module_vars[] = { - { "num_refs", lprocfs_rd_numrefs, 0, 0 }, - { 0 } +struct lprocfs_seq_vars lprocfs_lmv_obd_vars[] = { + { "numobd", &lmv_numobd_fops }, + { "placement", &lmv_placement_fops }, + { "activeobd", &lmv_activeobd_fops }, + { "uuid", &lmv_uuid_fops }, + { "desc_uuid", &lmv_desc_uuid_fops }, + { 0 } }; struct file_operations lmv_proc_target_fops = { @@ -230,10 +218,4 @@ struct file_operations lmv_proc_target_fops = { .llseek = seq_lseek, .release = seq_release, }; - #endif /* LPROCFS */ -void lprocfs_lmv_init_vars(struct lprocfs_static_vars *lvars) -{ - lvars->module_vars = lprocfs_lmv_module_vars; - lvars->obd_vars = lprocfs_lmv_obd_vars; -}