+ .release = single_release, \
+}
+
+#define LDEBUGFS_SEQ_FOPS_RO(name) __LDEBUGFS_SEQ_FOPS(name, NULL)
+#define LDEBUGFS_SEQ_FOPS(name) __LDEBUGFS_SEQ_FOPS(name, \
+ name##_seq_write)
+
+#define LDEBUGFS_SEQ_FOPS_RO_TYPE(name, type) \
+ static int name##_##type##_seq_show(struct seq_file *m, void *v)\
+ { \
+ if (!m->private) \
+ return -ENODEV; \
+ return lprocfs_##type##_seq_show(m, m->private); \
+ } \
+ LDEBUGFS_SEQ_FOPS_RO(name##_##type)
+
+#define LDEBUGFS_SEQ_FOPS_RW_TYPE(name, type) \
+ static int name##_##type##_seq_show(struct seq_file *m, void *v)\
+ { \
+ if (!m->private) \
+ return -ENODEV; \
+ return lprocfs_##type##_seq_show(m, m->private); \
+ } \
+ static ssize_t name##_##type##_seq_write(struct file *file, \
+ const char __user *buffer, size_t count, \
+ loff_t *off) \
+ { \
+ struct seq_file *seq = file->private_data; \
+ \
+ if (!seq->private) \
+ return -ENODEV; \
+ return ldebugfs_##type##_seq_write(file, buffer, count, \
+ seq->private); \
+ } \
+ LDEBUGFS_SEQ_FOPS(name##_##type);
+
+#define LDEBUGFS_FOPS_WR_ONLY(name, type) \
+ static ssize_t name##_##type##_write(struct file *file, \
+ const char __user *buffer, size_t count, \
+ loff_t *off) \
+ { \
+ return ldebugfs_##type##_seq_write(file, buffer, count, \
+ off); \
+ } \
+ static int name##_##type##_open(struct inode *inode, \
+ struct file *file) \
+ { \
+ return single_open(file, NULL, inode->i_private); \
+ } \
+ static const struct file_operations name##_##type##_fops = { \
+ .open = name##_##type##_open, \
+ .write = name##_##type##_write, \
+ .release = single_release, \
+ };
+
+/* write the name##_seq_show function, call LPROC_SEQ_FOPS_RO for read-only
+ * proc entries; otherwise, you will define name##_seq_write function also for
+ * a read-write proc entry, and then call LPROC_SEQ_FOPS instead. Finally,
+ * call ldebugfs_obd_seq_create(obd, filename, 0444, &name#_fops, data);
+ */
+#define __LPROC_SEQ_FOPS(name, custom_seq_write) \
+static int name##_single_open(struct inode *inode, struct file *file) \
+{ \
+ return single_open(file, name##_seq_show, \
+ inode->i_private ? inode->i_private : \
+ PDE_DATA(inode)); \
+} \
+static const struct proc_ops name##_fops = { \
+ PROC_OWNER(THIS_MODULE) \
+ .proc_open = name##_single_open, \
+ .proc_read = seq_read, \
+ .proc_write = custom_seq_write, \
+ .proc_lseek = seq_lseek, \
+ .proc_release = lprocfs_single_release, \