Whamcloud - gitweb
LU-3319 procfs: provide framework for seq_file handling
[fs/lustre-release.git] / lustre / obdclass / genops.c
index 7f5a6bc..b430c24 100644 (file)
@@ -163,8 +163,11 @@ EXPORT_SYMBOL(class_put_type);
 #define CLASS_MAX_NAME 1024
 
 int class_register_type(struct obd_ops *dt_ops, struct md_ops *md_ops,
-                        struct lprocfs_vars *vars, const char *name,
-                        struct lu_device_type *ldt)
+                       struct lprocfs_seq_vars *module_vars,
+#ifndef HAVE_ONLY_PROCFS_SEQ
+                       struct lprocfs_vars *vars,
+#endif
+                       const char *name, struct lu_device_type *ldt)
 {
         struct obd_type *type;
         int rc = 0;
@@ -200,13 +203,23 @@ int class_register_type(struct obd_ops *dt_ops, struct md_ops *md_ops,
        spin_lock_init(&type->obd_type_lock);
 
 #ifdef LPROCFS
-        type->typ_procroot = lprocfs_register(type->typ_name, proc_lustre_root,
-                                              vars, type);
-        if (IS_ERR(type->typ_procroot)) {
-                rc = PTR_ERR(type->typ_procroot);
-                type->typ_procroot = NULL;
-                GOTO (failed, rc);
-        }
+#ifndef HAVE_ONLY_PROCFS_SEQ
+       if (vars) {
+               type->typ_procroot = lprocfs_register(type->typ_name,
+                                                       proc_lustre_root,
+                                                       vars, type);
+       } else
+#endif
+       {
+               type->typ_procroot = lprocfs_seq_register(type->typ_name,
+                                                       proc_lustre_root,
+                                                       module_vars, type);
+       }
+       if (IS_ERR(type->typ_procroot)) {
+               rc = PTR_ERR(type->typ_procroot);
+               type->typ_procroot = NULL;
+               GOTO (failed, rc);
+       }
 #endif
         if (ldt != NULL) {
                 type->typ_lu = ldt;
@@ -228,6 +241,13 @@ int class_register_type(struct obd_ops *dt_ops, struct md_ops *md_ops,
                 OBD_FREE_PTR(type->typ_md_ops);
         if (type->typ_dt_ops != NULL)
                 OBD_FREE_PTR(type->typ_dt_ops);
+#ifdef LPROCFS
+#ifndef HAVE_ONLY_PROCFS_SEQ
+       lprocfs_try_remove_proc_entry(type->typ_name, proc_lustre_root);
+#else
+       remove_proc_subtree(type->typ_name, proc_lustre_root);
+#endif
+#endif
         OBD_FREE(type, sizeof(*type));
         RETURN(rc);
 }
@@ -256,8 +276,13 @@ int class_unregister_type(const char *name)
         * other modules can share names (i.e. lod can use lov entry). so
         * we can't reference pointer as it can get invalided when another
         * module removes the entry */
+#ifdef LPROCFS
+#ifndef HAVE_ONLY_PROCFS_SEQ
        lprocfs_try_remove_proc_entry(type->typ_name, proc_lustre_root);
-
+#else
+       remove_proc_subtree(type->typ_name, proc_lustre_root);
+#endif
+#endif
         if (type->typ_lu)
                 lu_device_type_fini(type->typ_lu);