+static struct attribute *lod_attrs[] = {
+ &lustre_attr_dom_stripesize.attr,
+ &lustre_attr_dom_stripesize_max_kb.attr,
+ &lustre_attr_dom_stripesize_cur_kb.attr,
+ &lustre_attr_dom_threshold_free_mb.attr,
+ &lustre_attr_stripesize.attr,
+ &lustre_attr_stripeoffset.attr,
+ &lustre_attr_stripecount.attr,
+ &lustre_attr_stripetype.attr,
+ &lustre_attr_activeobd.attr,
+ &lustre_attr_desc_uuid.attr,
+ &lustre_attr_lmv_failout.attr,
+ &lustre_attr_numobd.attr,
+ &lustre_attr_qos_maxage.attr,
+ &lustre_attr_qos_prio_free.attr,
+ &lustre_attr_qos_threshold_rr.attr,
+ &lustre_attr_mdt_stripecount.attr,
+ &lustre_attr_mdt_stripetype.attr,
+ &lustre_attr_mdt_activeobd.attr,
+ &lustre_attr_mdt_numobd.attr,
+ &lustre_attr_mdt_qos_maxage.attr,
+ &lustre_attr_mdt_qos_prio_free.attr,
+ &lustre_attr_mdt_qos_threshold_rr.attr,
+ &lustre_attr_mdt_hash.attr,
+ NULL,
+};
+
+/**
+ * Initialize procfs entries for LOD.
+ *
+ * \param[in] lod LOD device
+ *
+ * \retval 0 on success
+ * \retval negative error code if failed
+ */
+int lod_procfs_init(struct lod_device *lod)
+{
+ struct ldebugfs_vars ldebugfs_obd_vars[] = { { NULL } };
+ struct obd_device *obd = lod2obd(lod);
+ struct obd_type *type;
+ struct kobject *lov;
+ int rc;
+
+ lod->lod_dt_dev.dd_ktype.default_attrs = lod_attrs;
+ rc = dt_tunables_init(&lod->lod_dt_dev, obd->obd_type, obd->obd_name,
+ ldebugfs_obd_vars);
+ if (rc) {
+ CERROR("%s: failed to setup DT tunables: %d\n",
+ obd->obd_name, rc);
+ RETURN(rc);
+ }
+
+ obd->obd_vars = lprocfs_lod_obd_vars;
+ obd->obd_proc_entry = lprocfs_register(obd->obd_name,
+ obd->obd_type->typ_procroot,
+ obd->obd_vars, obd);
+ if (IS_ERR(obd->obd_proc_entry)) {
+ rc = PTR_ERR(obd->obd_proc_entry);
+ CERROR("%s: error %d setting up lprocfs\n",
+ obd->obd_name, rc);
+ GOTO(out, rc);
+ }
+
+ rc = lprocfs_seq_create(obd->obd_proc_entry, "mdt_obd",
+ 0444, &lod_proc_mdt_fops, obd);
+ if (rc) {
+ CWARN("%s: Error adding the target_obd file %d\n",
+ obd->obd_name, rc);
+ GOTO(out, rc);
+ }
+
+ rc = lprocfs_seq_create(obd->obd_proc_entry, "target_obd",
+ 0444, &lod_proc_target_fops, obd);
+ if (rc) {
+ CWARN("%s: Error adding the target_obd file %d\n",
+ obd->obd_name, rc);
+ GOTO(out, rc);
+ }
+
+ lod->lod_pool_proc_entry = lprocfs_register("pools",
+ obd->obd_proc_entry,
+ NULL, NULL);
+ if (IS_ERR(lod->lod_pool_proc_entry)) {
+ rc = PTR_ERR(lod->lod_pool_proc_entry);
+ lod->lod_pool_proc_entry = NULL;
+ CWARN("%s: Failed to create pool proc file: %d\n",
+ obd->obd_name, rc);
+ GOTO(out, rc);
+ }
+
+ lov = kset_find_obj(lustre_kset, "lov");
+ if (!lov) {
+ CERROR("%s: lov subsystem not found\n", obd->obd_name);
+ GOTO(out, rc = -ENODEV);
+ }
+
+ rc = sysfs_create_link(lov, &lod->lod_dt_dev.dd_kobj,
+ obd->obd_name);
+ if (rc)
+ CERROR("%s: failed to create LOV sysfs symlink\n",
+ obd->obd_name);
+ kobject_put(lov);
+
+ lod->lod_debugfs = ldebugfs_add_symlink(obd->obd_name, "lov",
+ "../lod/%s", obd->obd_name);
+ if (!lod->lod_debugfs)
+ CERROR("%s: failed to create LOV debugfs symlink\n",
+ obd->obd_name);
+
+ type = container_of(lov, struct obd_type, typ_kobj);
+ if (!type->typ_procroot)
+ RETURN(0);
+
+ /* for compatibility we link old procfs's LOV entries to lod ones */
+ lod->lod_symlink = lprocfs_add_symlink(obd->obd_name,
+ type->typ_procroot,
+ "../lod/%s", obd->obd_name);
+ if (lod->lod_symlink == NULL)
+ CERROR("cannot create LOV symlink for /proc/fs/lustre/lod/%s\n",
+ obd->obd_name);
+ RETURN(0);
+
+out:
+ dt_tunables_fini(&lod->lod_dt_dev);
+
+ return rc;
+}
+
+/**
+ * Cleanup procfs entries registred for LOD.
+ *
+ * \param[in] lod LOD device
+ */
+void lod_procfs_fini(struct lod_device *lod)
+{
+ struct obd_device *obd = lod2obd(lod);
+ struct kobject *lov;
+
+ if (lod->lod_symlink != NULL) {
+ lprocfs_remove(&lod->lod_symlink);
+ lod->lod_symlink = NULL;
+ }
+
+ lov = kset_find_obj(lustre_kset, "lov");
+ if (lov) {
+ sysfs_remove_link(lov, obd->obd_name);
+ kobject_put(lov);
+ }
+
+ debugfs_remove_recursive(lod->lod_debugfs);
+
+ if (obd->obd_proc_entry) {
+ lprocfs_remove(&obd->obd_proc_entry);
+ obd->obd_proc_entry = NULL;
+ }
+
+ dt_tunables_fini(&lod->lod_dt_dev);
+}
+
+#endif /* CONFIG_PROC_FS */