+int lproc_mgs_setup(struct mgs_device *mgs, const char *osd_name)
+{
+ 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;
+
+ obd->obd_vars = lprocfs_mgs_obd_vars;
+ rc = lprocfs_obd_setup(obd);
+ if (rc != 0)
+ GOTO(out, rc);
+
+ rc = lprocfs_obd_seq_create(obd, "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);
+ if (rc != 0)
+ GOTO(out, rc);
+
+ 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_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);
+ }
+
+ mgs->mgs_proc_osd = lprocfs_add_symlink("osd",
+ obd->obd_proc_entry,
+ "../../%s/%.*s",
+ osd_obd->obd_type->typ_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);
+
+out:
+ if (rc != 0)
+ lproc_mgs_cleanup(mgs);
+
+ return rc;
+}
+
+void lproc_mgs_cleanup(struct mgs_device *mgs)
+{
+ struct obd_device *obd = mgs->mgs_obd;
+
+ if (obd == NULL)
+ return;
+
+ 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);
+
+ if (mgs->mgs_proc_live != NULL) {
+ /* Should be no live entries */
+ lprocfs_remove(&mgs->mgs_proc_live);
+ mgs->mgs_proc_live = NULL;
+ }
+
+ lprocfs_free_per_client_stats(obd);
+ lprocfs_obd_cleanup(obd);
+ lprocfs_free_obd_stats(obd);
+ lprocfs_free_md_stats(obd);
+}