Whamcloud - gitweb
LU-8066 obd: Add debugfs root
[fs/lustre-release.git] / lustre / obdclass / lprocfs_status.c
index c9b4711..7bb366b 100644 (file)
@@ -114,6 +114,35 @@ EXPORT_SYMBOL(lprocfs_add_symlink);
 
 static const struct file_operations lprocfs_generic_fops = { };
 
+int ldebugfs_add_vars(struct dentry *parent, struct lprocfs_vars *list,
+                     void *data)
+{
+       if (IS_ERR_OR_NULL(parent) || IS_ERR_OR_NULL(list))
+               return -EINVAL;
+
+       while (list->name) {
+               struct dentry *entry;
+               umode_t mode = 0;
+
+               if (list->proc_mode != 0000) {
+                       mode = list->proc_mode;
+               } else if (list->fops) {
+                       if (list->fops->read)
+                               mode = 0444;
+                       if (list->fops->write)
+                               mode |= 0200;
+               }
+               entry = debugfs_create_file(list->name, mode, parent,
+                                           list->data ? : data,
+                                           list->fops ? : &lprocfs_generic_fops);
+               if (IS_ERR_OR_NULL(entry))
+                       return entry ? PTR_ERR(entry) : -ENOMEM;
+               list++;
+       }
+       return 0;
+}
+EXPORT_SYMBOL_GPL(ldebugfs_add_vars);
+
 /**
  * Add /proc entries.
  *
@@ -155,6 +184,13 @@ lprocfs_add_vars(struct proc_dir_entry *root, struct lprocfs_vars *list,
 }
 EXPORT_SYMBOL(lprocfs_add_vars);
 
+void ldebugfs_remove(struct dentry **entryp)
+{
+       debugfs_remove(*entryp);
+       *entryp = NULL;
+}
+EXPORT_SYMBOL_GPL(ldebugfs_remove);
+
 #ifndef HAVE_REMOVE_PROC_SUBTREE
 /* for b=10866, global variable */
 DECLARE_RWSEM(_lprocfs_lock);
@@ -264,6 +300,31 @@ void lprocfs_remove_proc_entry(const char *name, struct proc_dir_entry *parent)
 }
 EXPORT_SYMBOL(lprocfs_remove_proc_entry);
 
+struct dentry *ldebugfs_register(const char *name, struct dentry *parent,
+                                struct lprocfs_vars *list, void *data)
+{
+       struct dentry *entry;
+
+       entry = debugfs_create_dir(name, parent);
+       if (IS_ERR_OR_NULL(entry)) {
+               entry = entry ?: ERR_PTR(-ENOMEM);
+               goto out;
+       }
+
+       if (!IS_ERR_OR_NULL(list)) {
+               int rc;
+
+               rc = ldebugfs_add_vars(entry, list, data);
+               if (rc) {
+                       debugfs_remove(entry);
+                       entry = ERR_PTR(rc);
+               }
+       }
+out:
+       return entry;
+}
+EXPORT_SYMBOL_GPL(ldebugfs_register);
+
 struct proc_dir_entry *
 lprocfs_register(const char *name, struct proc_dir_entry *parent,
                 struct lprocfs_vars *list, void *data)
@@ -1436,7 +1497,7 @@ static int lprocfs_stats_seq_open(struct inode *inode, struct file *file)
        if (rc)
                return rc;
        seq = file->private_data;
-       seq->private = PDE_DATA(inode);
+       seq->private = inode->i_private ? : PDE_DATA(inode);
        return 0;
 }
 
@@ -1449,6 +1510,22 @@ static const struct file_operations lprocfs_stats_seq_fops = {
         .release = lprocfs_seq_release,
 };
 
+int ldebugfs_register_stats(struct dentry *parent, const char *name,
+                           struct lprocfs_stats *stats)
+{
+       struct dentry *entry;
+
+       LASSERT(!IS_ERR_OR_NULL(parent));
+
+       entry = debugfs_create_file(name, 0644, parent, stats,
+                                   &lprocfs_stats_seq_fops);
+       if (IS_ERR_OR_NULL(entry))
+               return entry ? PTR_ERR(entry) : -ENOMEM;
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(ldebugfs_register_stats);
+
 int lprocfs_register_stats(struct proc_dir_entry *root, const char *name,
                            struct lprocfs_stats *stats)
 {
@@ -2101,6 +2178,22 @@ char *lprocfs_find_named_value(const char *buffer, const char *name,
 }
 EXPORT_SYMBOL(lprocfs_find_named_value);
 
+int ldebugfs_seq_create(struct dentry *parent, const char *name, umode_t mode,
+                       const struct file_operations *seq_fops, void *data)
+{
+       struct dentry *entry;
+
+       /* Disallow secretly (un)writable entries. */
+       LASSERT((!seq_fops->write) == (!(mode & 0222)));
+
+       entry = debugfs_create_file(name, mode, parent, data, seq_fops);
+       if (IS_ERR_OR_NULL(entry))
+               return entry ? PTR_ERR(entry) : -ENOMEM;
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(ldebugfs_seq_create);
+
 int lprocfs_seq_create(struct proc_dir_entry *parent,
                       const char *name,
                       mode_t mode,