+
+int lod_procfs_init(struct lod_device *lod)
+{
+ struct obd_device *obd = lod2obd(lod);
+ struct lprocfs_static_vars lvars;
+ cfs_proc_dir_entry_t *lov_proc_dir;
+ int rc;
+
+ lprocfs_lod_init_vars(&lvars);
+ rc = lprocfs_obd_setup(obd, lvars.obd_vars);
+ if (rc) {
+ CERROR("%s: cannot setup procfs entry: %d\n",
+ obd->obd_name, rc);
+ RETURN(rc);
+ }
+
+ rc = lprocfs_add_vars(obd->obd_proc_entry, lprocfs_lod_osd_vars,
+ &lod->lod_dt_dev);
+ if (rc) {
+ CERROR("%s: cannot setup procfs entry: %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);
+ }
+
+ /* for compatibility we link old procfs's OSC entries to osp ones */
+ lov_proc_dir = lprocfs_srch(proc_lustre_root, "lov");
+ if (lov_proc_dir != NULL && strstr(obd->obd_name, "lov") != NULL)
+ lod->lod_symlink = lprocfs_add_symlink(obd->obd_name,
+ lov_proc_dir,
+ "../lod/%s",
+ obd->obd_name);
+
+ RETURN(0);
+
+out:
+ lprocfs_obd_cleanup(obd);
+
+ return rc;
+}
+
+void lod_procfs_fini(struct lod_device *lod)
+{
+ struct obd_device *obd = lod2obd(lod);
+
+ if (lod->lod_symlink != NULL)
+ lprocfs_remove(&lod->lod_symlink);
+
+ if (lod->lod_pool_proc_entry != NULL) {
+ lprocfs_remove(&lod->lod_pool_proc_entry);
+ lod->lod_pool_proc_entry = NULL;
+ }
+
+ lprocfs_obd_cleanup(obd);
+}
+