Whamcloud - gitweb
LU-8066 lmv: Move suitable entries from procfs to sysfs 60/28460/13
authorOleg Drokin <oleg.drokin@intel.com>
Thu, 5 Apr 2018 20:01:43 +0000 (16:01 -0400)
committerOleg Drokin <oleg.drokin@intel.com>
Sun, 6 May 2018 03:41:16 +0000 (03:41 +0000)
Linux-commit: b5fa70d76fb1c532dd4468b8083e2945c9df9ddb

Change-Id: I89ffcf5a8efe870a3bd02462681b24952a788dab
Signed-off-by: Oleg Drokin <green@linuxhacker.ru>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: James Simmons <uja.ornl@yahoo.com>
Reviewed-on: https://review.whamcloud.com/28460
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Dmitry Eremin <dmitry.eremin@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/include/obd.h
lustre/lmv/lmv_internal.h
lustre/lmv/lmv_obd.c
lustre/lmv/lproc_lmv.c

index 9372539..4e672f2 100644 (file)
@@ -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 {
index 2c9dd05..c2dcfed 100644 (file)
@@ -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
index 7895ab4..2a6fbfe 100644 (file)
@@ -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) {
index d11207a..95fe927 100644 (file)
 
 #define DEBUG_SUBSYSTEM S_CLASS
 
-#include <linux/version.h>
 #include <linux/seq_file.h>
-#include <asm/statfs.h>
+#include <linux/statfs.h>
 #include <lprocfs_status.h>
 #include <obd_class.h>
 
 #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;
+}