From d76e96c1794f82296a772065e3d36469e3a07836 Mon Sep 17 00:00:00 2001 From: Oleg Drokin Date: Thu, 5 Apr 2018 16:01:43 -0400 Subject: [PATCH] LU-8066 lmv: Move suitable entries from procfs to sysfs Linux-commit: b5fa70d76fb1c532dd4468b8083e2945c9df9ddb Change-Id: I89ffcf5a8efe870a3bd02462681b24952a788dab Signed-off-by: Oleg Drokin Signed-off-by: Greg Kroah-Hartman Signed-off-by: James Simmons Reviewed-on: https://review.whamcloud.com/28460 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Dmitry Eremin Reviewed-by: Andreas Dilger Reviewed-by: Oleg Drokin --- lustre/include/obd.h | 2 +- lustre/lmv/lmv_internal.h | 5 +- lustre/lmv/lmv_obd.c | 70 +++++++++------------------- lustre/lmv/lproc_lmv.c | 115 +++++++++++++++++++++++++++------------------- 4 files changed, 92 insertions(+), 100 deletions(-) diff --git a/lustre/include/obd.h b/lustre/include/obd.h index 9372539..4e672f2 100644 --- a/lustre/include/obd.h +++ b/lustre/include/obd.h @@ -425,7 +425,6 @@ struct lmv_obd { struct lu_client_fld lmv_fld; spinlock_t lmv_lock; struct lmv_desc desc; - struct proc_dir_entry *targets_proc_entry; struct mutex lmv_init_mutex; int connected; @@ -436,6 +435,7 @@ struct lmv_obd { struct lmv_tgt_desc **tgts; struct obd_connect_data conn_data; + struct kobject *lmv_tgts_kobj; }; struct niobuf_local { diff --git a/lustre/lmv/lmv_internal.h b/lustre/lmv/lmv_internal.h index 2c9dd05..c2dcfed 100644 --- a/lustre/lmv/lmv_internal.h +++ b/lustre/lmv/lmv_internal.h @@ -152,9 +152,6 @@ struct lmv_tgt_desc *lmv_locate_mds(struct lmv_obd *lmv, struct md_op_data *op_data, struct lu_fid *fid); /* lproc_lmv.c */ -#ifdef CONFIG_PROC_FS -extern struct lprocfs_vars lprocfs_lmv_obd_vars[]; -#endif -extern struct file_operations lmv_proc_target_fops; +int lmv_tunables_init(struct obd_device *obd); #endif diff --git a/lustre/lmv/lmv_obd.c b/lustre/lmv/lmv_obd.c index 7895ab4..2a6fbfe 100644 --- a/lustre/lmv/lmv_obd.c +++ b/lustre/lmv/lmv_obd.c @@ -213,30 +213,24 @@ static int lmv_connect(const struct lu_env *env, lmv->connected = 0; lmv->conn_data = *data; - if (lmv->targets_proc_entry == NULL) { - lmv->targets_proc_entry = lprocfs_register("target_obds", - obd->obd_proc_entry, - NULL, NULL); - if (IS_ERR(lmv->targets_proc_entry)) { - CERROR("%s: cannot register " - "/proc/fs/lustre/%s/%s/target_obds\n", - obd->obd_name, obd->obd_type->typ_name, - obd->obd_name); - lmv->targets_proc_entry = NULL; - } + lmv->lmv_tgts_kobj = kobject_create_and_add("target_obds", + &obd->obd_kset.kobj); + if (!lmv->lmv_tgts_kobj) { + CERROR("%s: cannot create /sys/fs/lustre/%s/%s/target_obds\n", + obd->obd_name, obd->obd_type->typ_name, obd->obd_name); } rc = lmv_check_connect(obd); if (rc != 0) - GOTO(out_proc, rc); + GOTO(out_sysfs, rc); *pexp = exp; RETURN(rc); -out_proc: - if (lmv->targets_proc_entry != NULL) - lprocfs_remove(&lmv->targets_proc_entry); +out_sysfs: + if (lmv->lmv_tgts_kobj) + kobject_put(lmv->lmv_tgts_kobj); class_disconnect(exp); @@ -363,23 +357,11 @@ int lmv_connect_mdc(struct obd_device *obd, struct lmv_tgt_desc *tgt) mdc_obd->obd_name, mdc_obd->obd_uuid.uuid, atomic_read(&obd->obd_refcount)); - if (lmv->targets_proc_entry != NULL) { - 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->targets_proc_entry, - "../../../%s/%s", - mdc_obd->obd_type->typ_name, - mdc_obd->obd_name); - if (mdc_symlink == NULL) { - CERROR("cannot register LMV target " - "/proc/fs/lustre/%s/%s/target_obds/%s\n", - obd->obd_type->typ_name, obd->obd_name, - mdc_obd->obd_name); - } - } + if (lmv->lmv_tgts_kobj) + /* Even if we failed to create the link, that's fine */ + rc = sysfs_create_link(lmv->lmv_tgts_kobj, + &mdc_obd->obd_kset.kobj, + mdc_obd->obd_name); RETURN(0); } @@ -584,9 +566,9 @@ static int lmv_disconnect_mdc(struct obd_device *obd, struct lmv_tgt_desc *tgt) mdc_obd->obd_fail = obd->obd_fail; mdc_obd->obd_no_recov = obd->obd_no_recov; - if (lmv->targets_proc_entry != NULL) - lprocfs_remove_proc_entry(mdc_obd->obd_name, - lmv->targets_proc_entry); + if (lmv->lmv_tgts_kobj) + sysfs_remove_link(lmv->lmv_tgts_kobj, + mdc_obd->obd_name); } rc = obd_fid_fini(tgt->ltd_exp->exp_obd); @@ -629,11 +611,8 @@ static int lmv_disconnect(struct obd_export *exp) lmv_disconnect_mdc(obd, lmv->tgts[i]); } - if (lmv->targets_proc_entry != NULL) - lprocfs_remove(&lmv->targets_proc_entry); - else - CERROR("/proc/fs/lustre/%s/%s/target_obds missing\n", - obd->obd_type->typ_name, obd->obd_name); + if (lmv->lmv_tgts_kobj) + kobject_put(lmv->lmv_tgts_kobj); out_local: /* @@ -1287,16 +1266,11 @@ static int lmv_setup(struct obd_device *obd, struct lustre_cfg *lcfg) spin_lock_init(&lmv->lmv_lock); mutex_init(&lmv->lmv_init_mutex); -#ifdef CONFIG_PROC_FS - obd->obd_vars = lprocfs_lmv_obd_vars; - lprocfs_obd_setup(obd, true); - lprocfs_alloc_md_stats(obd, 0); - rc = lprocfs_seq_create(obd->obd_proc_entry, "target_obd", - 0444, &lmv_proc_target_fops, obd); + rc = lmv_tunables_init(obd); if (rc) - CWARN("%s: error adding LMV target_obd file: rc = %d\n", + CWARN("%s: error adding LMV sysfs/debugfs files: rc = %d\n", obd->obd_name, rc); -#endif + rc = fld_client_init(&lmv->lmv_fld, obd->obd_name, LUSTRE_CLI_FLD_HASH_DHT); if (rc) { diff --git a/lustre/lmv/lproc_lmv.c b/lustre/lmv/lproc_lmv.c index d11207a..95fe927 100644 --- a/lustre/lmv/lproc_lmv.c +++ b/lustre/lmv/lproc_lmv.c @@ -32,63 +32,58 @@ #define DEBUG_SUBSYSTEM S_CLASS -#include #include -#include +#include #include #include #include "lmv_internal.h" -#ifndef CONFIG_PROC_FS -static struct lprocfs_vars lprocfs_module_vars[] = { {0} }; -static struct lprocfs_vars lprocfs_obd_vars[] = { {0} }; -#else -static int lmv_numobd_seq_show(struct seq_file *m, void *v) +static ssize_t numobd_show(struct kobject *kobj, struct attribute *attr, + char *buf) { - struct obd_device *dev = (struct obd_device *)m->private; - struct lmv_desc *desc; + struct obd_device *dev = container_of(kobj, struct obd_device, + obd_kset.kobj); + struct lmv_desc *desc; - LASSERT(dev != NULL); desc = &dev->u.lmv.desc; - seq_printf(m, "%u\n", desc->ld_tgt_count); - return 0; + return sprintf(buf, "%u\n", desc->ld_tgt_count); } -LPROC_SEQ_FOPS_RO(lmv_numobd); +LUSTRE_RO_ATTR(numobd); -static int lmv_activeobd_seq_show(struct seq_file *m, void *v) +static ssize_t activeobd_show(struct kobject *kobj, struct attribute *attr, + char *buf) { - struct obd_device *dev = (struct obd_device *)m->private; - struct lmv_desc *desc; + struct obd_device *dev = container_of(kobj, struct obd_device, + obd_kset.kobj); + struct lmv_desc *desc; - LASSERT(dev != NULL); desc = &dev->u.lmv.desc; - seq_printf(m, "%u\n", desc->ld_active_tgt_count); - return 0; + return sprintf(buf, "%u\n", desc->ld_active_tgt_count); } -LPROC_SEQ_FOPS_RO(lmv_activeobd); +LUSTRE_RO_ATTR(activeobd); -static int lmv_desc_uuid_seq_show(struct seq_file *m, void *v) +static ssize_t desc_uuid_show(struct kobject *kobj, struct attribute *attr, + char *buf) { - struct obd_device *dev = (struct obd_device*)m->private; - struct lmv_obd *lmv; + struct obd_device *dev = container_of(kobj, struct obd_device, + obd_kset.kobj); + struct lmv_desc *desc; - LASSERT(dev != NULL); - lmv = &dev->u.lmv; - seq_printf(m, "%s\n", lmv->desc.ld_uuid.uuid); - return 0; + desc = &dev->u.lmv.desc; + return sprintf(buf, "%s\n", desc->ld_uuid.uuid); } -LPROC_SEQ_FOPS_RO(lmv_desc_uuid); +LUSTRE_RO_ATTR(desc_uuid); +#ifdef CONFIG_PROC_FS static void *lmv_tgt_seq_start(struct seq_file *p, loff_t *pos) { struct obd_device *dev = p->private; struct lmv_obd *lmv = &dev->u.lmv; while (*pos < lmv->tgts_size) { - if (lmv->tgts[*pos] != NULL) + if (lmv->tgts[*pos]) return lmv->tgts[*pos]; - ++*pos; } @@ -97,7 +92,6 @@ static void *lmv_tgt_seq_start(struct seq_file *p, loff_t *pos) static void lmv_tgt_seq_stop(struct seq_file *p, void *v) { - return; } static void *lmv_tgt_seq_next(struct seq_file *p, void *v, loff_t *pos) @@ -107,9 +101,8 @@ static void *lmv_tgt_seq_next(struct seq_file *p, void *v, loff_t *pos) ++*pos; while (*pos < lmv->tgts_size) { - if (lmv->tgts[*pos] != NULL) + if (lmv->tgts[*pos]) return lmv->tgts[*pos]; - ++*pos; } @@ -120,10 +113,12 @@ static int lmv_tgt_seq_show(struct seq_file *p, void *v) { struct lmv_tgt_desc *tgt = v; - if (tgt == NULL) + if (!tgt) return 0; - seq_printf(p, "%u: %s %sACTIVE\n", tgt->ltd_idx, - tgt->ltd_uuid.uuid, tgt->ltd_active ? "" : "IN"); + + seq_printf(p, "%u: %s %sACTIVE\n", + tgt->ltd_idx, tgt->ltd_uuid.uuid, + tgt->ltd_active ? "" : "IN"); return 0; } @@ -148,17 +143,7 @@ static int lmv_target_seq_open(struct inode *inode, struct file *file) return 0; } -struct lprocfs_vars lprocfs_lmv_obd_vars[] = { - { .name = "numobd", - .fops = &lmv_numobd_fops }, - { .name = "activeobd", - .fops = &lmv_activeobd_fops }, - { .name = "desc_uuid", - .fops = &lmv_desc_uuid_fops }, - { NULL } -}; - -struct file_operations lmv_proc_target_fops = { +static const struct file_operations lmv_proc_target_fops = { .owner = THIS_MODULE, .open = lmv_target_seq_open, .read = seq_read, @@ -166,3 +151,39 @@ struct file_operations lmv_proc_target_fops = { .release = seq_release, }; #endif /* CONFIG_PROC_FS */ + +static struct attribute *lmv_attrs[] = { + &lustre_attr_activeobd.attr, + &lustre_attr_desc_uuid.attr, + &lustre_attr_numobd.attr, + NULL, +}; + +int lmv_tunables_init(struct obd_device *obd) +{ + int rc; + + obd->obd_ktype.default_attrs = lmv_attrs; + rc = lprocfs_obd_setup(obd, true); + if (rc) + goto out_failed; +#ifdef CONFIG_PROC_FS + rc = lprocfs_alloc_md_stats(obd, 0); + if (rc) { + lprocfs_obd_cleanup(obd); + goto out_failed; + } + + rc = lprocfs_seq_create(obd->obd_proc_entry, "target_obd", + 0444, &lmv_proc_target_fops, obd); + if (rc) { + lprocfs_free_md_stats(obd); + lprocfs_obd_cleanup(obd); + CWARN("%s: error adding LMV target_obd file: rc = %d\n", + obd->obd_name, rc); + rc = 0; + } +#endif /* CONFIG_PROC_FS */ +out_failed: + return rc; +} -- 1.8.3.1