Whamcloud - gitweb
LU-12904 gss: struct cache_detail readers changed to writers
[fs/lustre-release.git] / lustre / mgs / lproc_mgs.c
index 2d86d35..5a5c70b 100644 (file)
  *
  * You should have received a copy of the GNU General Public License
  * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
+ * http://www.gnu.org/licenses/gpl-2.0.html
  *
  * GPL HEADER END
  */
@@ -27,7 +23,7 @@
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2014, Intel Corporation.
+ * Copyright (c) 2011, 2017, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
 #include <obd.h>
 #include <obd_class.h>
 #include <lprocfs_status.h>
-#include <lustre_param.h>
+#include <uapi/linux/lustre/lustre_param.h>
 #include "mgs_internal.h"
 
-#ifdef LPROCFS
+#ifdef CONFIG_PROC_FS
 
 static int mgs_fs_seq_show(struct seq_file *seq, void *v)
 {
@@ -85,21 +81,23 @@ out:
 LPROC_SEQ_FOPS_RO(mgs_fs);
 
 static void seq_show_srpc_rules(struct seq_file *seq, const char *tgtname,
-                                struct sptlrpc_rule_set *rset)
+                               struct sptlrpc_rule_set *rset)
 {
-        struct sptlrpc_rule    *r;
-        char                    dirbuf[10];
-        char                    flvrbuf[40];
-        char                   *net;
-        int                     i;
+       struct sptlrpc_rule *r;
+       char dirbuf[10];
+       char flvrbuf[40];
+       char net_buf[LNET_NIDSTR_SIZE];
+       const char *net;
+       int i;
 
-        for (i = 0; i < rset->srs_nrule; i++) {
-                r = &rset->srs_rules[i];
+       for (i = 0; i < rset->srs_nrule; i++) {
+               r = &rset->srs_rules[i];
 
-                if (r->sr_netid == LNET_NIDNET(LNET_NID_ANY))
-                        net = "default";
-                else
-                        net = libcfs_net2str(r->sr_netid);
+               if (r->sr_netid == LNET_NIDNET(LNET_NID_ANY))
+                       net = "default";
+               else
+                       net = libcfs_net2str_r(r->sr_netid, net_buf,
+                                              sizeof(net_buf));
 
                 if (r->sr_from == LUSTRE_SP_ANY && r->sr_to == LUSTRE_SP_ANY)
                         dirbuf[0] = '\0';
@@ -164,7 +162,7 @@ static int mgs_live_seq_show(struct seq_file *seq, void *v)
        return 0;
 }
 
-static ssize_t mgs_live_seq_write(struct file *file, const char *buf,
+static ssize_t mgs_live_seq_write(struct file *file, const char __user *buf,
                                  size_t len, loff_t *off)
 {
        struct seq_file *seq  = file->private_data;
@@ -182,17 +180,20 @@ int lproc_mgs_add_live(struct mgs_device *mgs, struct fs_db *fsdb)
 {
        int rc;
 
-       if (!mgs->mgs_proc_live)
+       if (!mgs->mgs_proc_live || fsdb->fsdb_has_lproc_entry)
                return 0;
+
        rc = lprocfs_seq_create(mgs->mgs_proc_live, fsdb->fsdb_name, 0644,
                                &mgs_live_fops, fsdb);
+       if (!rc)
+               fsdb->fsdb_has_lproc_entry = 1;
 
-       return 0;
+       return rc;
 }
 
 int lproc_mgs_del_live(struct mgs_device *mgs, struct fs_db *fsdb)
 {
-       if (!mgs->mgs_proc_live)
+       if (!mgs->mgs_proc_live || !fsdb->fsdb_has_lproc_entry)
                return 0;
 
        /* didn't create the proc file for MGSSELF_NAME */
@@ -201,65 +202,129 @@ int lproc_mgs_del_live(struct mgs_device *mgs, struct fs_db *fsdb)
        return 0;
 }
 
-LPROC_SEQ_FOPS_RO_TYPE(mgs, uuid);
-LPROC_SEQ_FOPS_RO_TYPE(mgs, num_exports);
 LPROC_SEQ_FOPS_RO_TYPE(mgs, hash);
-LPROC_SEQ_FOPS_WO_TYPE(mgs, evict_client);
+LPROC_SEQ_FOPS_WR_ONLY(mgs, evict_client);
 LPROC_SEQ_FOPS_RW_TYPE(mgs, ir_timeout);
 
-static struct lprocfs_seq_vars lprocfs_mgs_obd_vars[] = {
-       { .name =       "uuid",
-         .fops =       &mgs_uuid_fops          },
-       { .name =       "num_exports",
-         .fops =       &mgs_num_exports_fops   },
+static struct lprocfs_vars lprocfs_mgs_obd_vars[] = {
        { .name =       "hash_stats",
          .fops =       &mgs_hash_fops          },
        { .name =       "evict_client",
          .fops =       &mgs_evict_client_fops  },
        { .name =       "ir_timeout",
          .fops =       &mgs_ir_timeout_fops    },
-       { 0 }
+       { NULL }
+};
+
+LUSTRE_RO_ATTR(num_exports);
+
+static ssize_t fstype_show(struct kobject *kobj, struct attribute *attr,
+                          char *buf)
+{
+       struct obd_device *obd = container_of(kobj, struct obd_device,
+                                             obd_kset.kobj);
+       struct mgs_device *mgs = lu2mgs_dev(obd->obd_lu_dev);
+       struct kobject *osd_kobj;
+
+       if (!mgs || !mgs->mgs_fstype || !mgs->mgs_bottom)
+               return -ENODEV;
+
+       osd_kobj = &mgs->mgs_bottom->dd_kobj;
+       return lustre_attr_show(osd_kobj, mgs->mgs_fstype, buf);
+}
+LUSTRE_RO_ATTR(fstype);
+
+static ssize_t mntdev_show(struct kobject *kobj, struct attribute *attr,
+                          char *buf)
+{
+       struct obd_device *obd = container_of(kobj, struct obd_device,
+                                             obd_kset.kobj);
+       struct mgs_device *mgs = lu2mgs_dev(obd->obd_lu_dev);
+       struct kobject *osd_kobj;
+
+       if (!mgs || !mgs->mgs_mntdev || !mgs->mgs_bottom)
+               return -ENODEV;
+
+       osd_kobj = &mgs->mgs_bottom->dd_kobj;
+       return lustre_attr_show(osd_kobj, mgs->mgs_mntdev, buf);
+}
+LUSTRE_RO_ATTR(mntdev);
+
+static struct attribute *mgs_attrs[] = {
+       &lustre_attr_fstype.attr,
+       &lustre_attr_mntdev.attr,
+       &lustre_attr_num_exports.attr,
+       NULL,
 };
 
 int lproc_mgs_setup(struct mgs_device *mgs, const char *osd_name)
 {
+       int osd_len = strlen(osd_name) - strlen("-osd");
        struct obd_device *obd = mgs->mgs_obd;
-       struct obd_device *osd_obd = mgs->mgs_bottom->dd_lu_dev.ld_obd;
-       int                osd_len = strlen(osd_name) - strlen("-osd");
-       int                rc;
+       struct kobj_type *bottom_type;
+       struct obd_device *osd_obd;
+       int rc;
+       int i;
 
        obd->obd_vars = lprocfs_mgs_obd_vars;
-       rc = lprocfs_obd_setup(obd);
+       obd->obd_ktype.default_attrs = mgs_attrs;
+       rc = lprocfs_obd_setup(obd, true);
        if (rc != 0)
                GOTO(out, rc);
 
-        rc = lprocfs_obd_seq_create(obd, "filesystems", 0444,
-                                    &mgs_fs_fops, obd);
+       rc = ldebugfs_seq_create(obd->obd_debugfs_entry, "filesystems", 0444,
+                                &mgs_fs_fops, obd);
        if (rc != 0)
                GOTO(out, rc);
 
-       rc = lprocfs_obd_seq_create(obd, "srpc_rules", 0400,
-                                   &mgsself_srpc_fops, obd);
+       rc = ldebugfs_seq_create(obd->obd_debugfs_entry, "srpc_rules", 0400,
+                                &mgsself_srpc_fops, obd);
        if (rc != 0)
                GOTO(out, rc);
 
-       mgs->mgs_proc_live = lprocfs_seq_register("live", obd->obd_proc_entry,
-                                                 NULL, NULL);
+       mgs->mgs_proc_live = lprocfs_register("live", obd->obd_proc_entry,
+                                             NULL, NULL);
         if (IS_ERR(mgs->mgs_proc_live)) {
                 rc = PTR_ERR(mgs->mgs_proc_live);
                 mgs->mgs_proc_live = NULL;
                GOTO(out, rc);
         }
 
-       obd->obd_proc_exports_entry = lprocfs_seq_register("exports",
-                                                          obd->obd_proc_entry,
-                                                          NULL, NULL);
+       obd->obd_proc_exports_entry = lprocfs_register("exports",
+                                                      obd->obd_proc_entry,
+                                                      NULL, NULL);
         if (IS_ERR(obd->obd_proc_exports_entry)) {
                 rc = PTR_ERR(obd->obd_proc_exports_entry);
                 obd->obd_proc_exports_entry = NULL;
                GOTO(out, rc);
         }
 
+       rc = sysfs_create_link(&obd->obd_kset.kobj, &mgs->mgs_bottom->dd_kobj,
+                              "osd");
+       if (rc) {
+               CWARN("%s: failed to create symlink osd -> %s, rc = %d\n",
+                     kobject_name(&obd->obd_kset.kobj),
+                     kobject_name(&mgs->mgs_bottom->dd_kobj), rc);
+               rc = 0;
+       }
+
+       bottom_type = get_ktype(&mgs->mgs_bottom->dd_kobj);
+
+       for (i = 0; bottom_type->default_attrs[i]; i++) {
+               if (strcmp(bottom_type->default_attrs[i]->name, "fstype") == 0) {
+                       mgs->mgs_fstype = bottom_type->default_attrs[i];
+                       break;
+               }
+       }
+
+       for (i = 0; bottom_type->default_attrs[i]; i++) {
+               if (strcmp(bottom_type->default_attrs[i]->name, "mntdev") == 0) {
+                       mgs->mgs_mntdev = bottom_type->default_attrs[i];
+                       break;
+               }
+       }
+
+       osd_obd = mgs->mgs_bottom->dd_lu_dev.ld_obd;
        mgs->mgs_proc_osd = lprocfs_add_symlink("osd",
                                                obd->obd_proc_entry,
                                                "../../%s/%.*s",
@@ -267,20 +332,7 @@ int lproc_mgs_setup(struct mgs_device *mgs, const char *osd_name)
                                                osd_len, /* Strip "-osd". */
                                                osd_name);
        if (mgs->mgs_proc_osd == NULL)
-               GOTO(out, rc = -ENOMEM);
-
-       mgs->mgs_proc_mntdev = lprocfs_add_symlink("mntdev",
-                                                  obd->obd_proc_entry,
-                                                  "osd/mntdev");
-       if (mgs->mgs_proc_mntdev == NULL)
-               GOTO(out, rc = -ENOMEM);
-
-       mgs->mgs_proc_fstype = lprocfs_add_symlink("fstype",
-                                                  obd->obd_proc_entry,
-                                                  "osd/fstype");
-       if (mgs->mgs_proc_fstype == NULL)
-               GOTO(out, rc = -ENOMEM);
-
+               rc = -ENOMEM;
 out:
        if (rc != 0)
                lproc_mgs_cleanup(mgs);
@@ -298,11 +350,7 @@ void lproc_mgs_cleanup(struct mgs_device *mgs)
        if (mgs->mgs_proc_osd != NULL)
                lprocfs_remove(&mgs->mgs_proc_osd);
 
-       if (mgs->mgs_proc_fstype != NULL)
-               lprocfs_remove(&mgs->mgs_proc_fstype);
-
-       if (mgs->mgs_proc_mntdev != NULL)
-               lprocfs_remove(&mgs->mgs_proc_mntdev);
+       sysfs_remove_link(&obd->obd_kset.kobj, "osd");
 
        if (mgs->mgs_proc_live != NULL) {
                /* Should be no live entries */