Hi,
On 18/08/14 12:40, Rob Jones wrote:
Despite the fact that these functions have been around for years, theyAcked-by: Steven Whitehouse <swhiteho@xxxxxxxxxx>
are
little used (only 15 uses in 13 files at the preseht time) even though
many other files use work-arounds to achieve the same result.
By documenting them, hopefully they will become more widely used.
Signed-off-by: Rob Jones <rob.jones@xxxxxxxxxxxxxxx>
Steve.
---
Documentation/filesystems/seq_file.txt | 33
++++++++++++++++++++++++++++++++
1 file changed, 33 insertions(+)
diff --git a/Documentation/filesystems/seq_file.txt
b/Documentation/filesystems/seq_file.txt
index a1e2e0d..420fc0d 100644
--- a/Documentation/filesystems/seq_file.txt
+++ b/Documentation/filesystems/seq_file.txt
@@ -226,6 +226,39 @@ be used for more than one file, you can store an
arbitrary pointer in the
private field of the seq_file structure; that value can then be
retrieved
by the iterator functions.
+There is also a wrapper function to seq_open() called
seq_open_private(). It
+kmallocs a zero filled block of memory and stores a pointer to it in the
+private field of the seq_file structure, returning 0 on success. The
+block size is specified in a third parameter to the function, e.g.:
+
+ static int ct_open(struct inode *inode, struct file *file)
+ {
+ return seq_open_private(file, &ct_seq_ops,
+ sizeof(struct mystruct));
+ }
+
+There is also a variant function, __seq_open_private(), which is
functionally
+identical except that, if successful, it returns the pointer to the
allocated
+memory block, allowing further initialisation e.g.:
+
+ static int ct_open(struct inode *inode, struct file *file)
+ {
+ struct mystruct *p =
+ __seq_open_private(file, &ct_seq_ops, sizeof(*p));
+
+ if (!p)
+ return -ENOMEM;
+
+ p->foo = bar; /* initialize my stuff */
+ ...
+ p->baz = true;
+
+ return 0;
+ }
+
+A corresponding close function, seq_release_private() is available which
+frees the memory allocated in the corresponding open.
+
The other operations of interest - read(), llseek(), and release() -
are
all implemented by the seq_file code itself. So a virtual file's
file_operations structure will look like: