~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/filesystems/seq_file.rst

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /Documentation/filesystems/seq_file.rst (Version linux-6.12-rc7) and /Documentation/filesystems/seq_file.rst (Version linux-4.19.323)


  1 .. SPDX-License-Identifier: GPL-2.0               
  2                                                   
  3 ======================                            
  4 The seq_file Interface                            
  5 ======================                            
  6                                                   
  7         Copyright 2003 Jonathan Corbet <corbet@    
  8                                                   
  9         This file is originally from the LWN.n    
 10         https://lwn.net/Articles/driver-portin    
 11                                                   
 12                                                   
 13 There are numerous ways for a device driver (o    
 14 provide information to the user or system admi    
 15 technique is the creation of virtual files, in    
 16 Virtual files can provide human-readable outpu    
 17 without any special utility programs; they can    
 18 script writers. It is not surprising that the     
 19 grown over the years.                             
 20                                                   
 21 Creating those files correctly has always been    
 22 however. It is not that hard to make a virtual    
 23 string. But life gets trickier if the output i    
 24 than an application is likely to read in a sin    
 25 multiple reads (and seeks) requires careful at    
 26 position within the virtual file - that positi    
 27 middle of a line of output. The kernel has tra    
 28 implementations that got this wrong.              
 29                                                   
 30 The 2.6 kernel contains a set of functions (im    
 31 which are designed to make it easy for virtual    
 32 right.                                            
 33                                                   
 34 The seq_file interface is available via <linux    
 35 three aspects to seq_file:                        
 36                                                   
 37      * An iterator interface which lets a virt    
 38        step through the objects it is presenti    
 39                                                   
 40      * Some utility functions for formatting o    
 41        needing to worry about things like outp    
 42                                                   
 43      * A set of canned file_operations which i    
 44        the virtual file.                          
 45                                                   
 46 We'll look at the seq_file interface via an ex    
 47 loadable module which creates a file called /p    
 48 read, simply produces a set of increasing inte    
 49 sequence will continue until the user loses pa    
 50 better to do. The file is seekable, in that on    
 51 following::                                       
 52                                                   
 53     dd if=/proc/sequence of=out1 count=1          
 54     dd if=/proc/sequence skip=1 of=out2 count=    
 55                                                   
 56 Then concatenate the output files out1 and out    
 57 result. Yes, it is a thoroughly useless module    
 58 how the mechanism works without getting lost i    
 59 wanting to see the full source for this module    
 60 https://lwn.net/Articles/22359/).                 
 61                                                   
 62 Deprecated create_proc_entry                      
 63 ============================                      
 64                                                   
 65 Note that the above article uses create_proc_e    
 66 kernel 3.10. Current versions require the foll    
 67                                                   
 68     -   entry = create_proc_entry("sequence",     
 69     -   if (entry)                                
 70     -           entry->proc_fops = &ct_file_op    
 71     +   entry = proc_create("sequence", 0, NUL    
 72                                                   
 73 The iterator interface                            
 74 ======================                            
 75                                                   
 76 Modules implementing a virtual file with seq_f    
 77 iterator object that allows stepping through t    
 78 during a "session" (roughly one read() system     
 79 is able to move to a specific position - like     
 80 though with freedom to map the position number    
 81 in whatever way is convenient - the iterator n    
 82 transiently during a session.  If the iterator    
 83 numerical position but works well with a first    
 84 iterator can be stored in the private data are    
 85 session to the next.                              
 86                                                   
 87 A seq_file implementation that is formatting f    
 88 table, for example, could provide a simple ite    
 89 position N as the Nth rule in the chain.  A se    
 90 that presents the content of a, potentially vo    
 91 might record a pointer into that list, providi    
 92 without risk of the current location being rem    
 93                                                   
 94 Positioning can thus be done in whatever way m    
 95 the generator of the data, which need not be a    
 96 translates to an offset in the virtual file. T    
 97 is that a position of zero should indicate the    
 98                                                   
 99 The /proc/sequence iterator just uses the coun    
100 will output as its position.                      
101                                                   
102 Four functions must be implemented to make the    
103 first, called start(), starts a session and ta    
104 argument, returning an iterator which will sta    
105 position.  The pos passed to start() will alwa    
106 the most recent pos used in the previous sessi    
107                                                   
108 For our simple sequence example,                  
109 the start() function looks like::                 
110                                                   
111         static void *ct_seq_start(struct seq_f    
112         {                                         
113                 loff_t *spos = kmalloc(sizeof(    
114                 if (! spos)                       
115                         return NULL;              
116                 *spos = *pos;                     
117                 return spos;                      
118         }                                         
119                                                   
120 The entire data structure for this iterator is    
121 holding the current position. There is no uppe    
122 iterator, but that will not be the case for mo    
123 implementations; in most cases the start() fun    
124 "past end of file" condition and return NULL i    
125                                                   
126 For more complicated applications, the private    
127 structure can be used to hold state from sessi    
128 also a special value which can be returned by     
129 called SEQ_START_TOKEN; it can be used if you     
130 show() function (described below) to print a h    
131 output. SEQ_START_TOKEN should only be used if    
132 however.  SEQ_START_TOKEN has no special meani    
133 code.  It is provided as a convenience for a s    
134 communicate with the next() and show() functio    
135                                                   
136 The next function to implement is called, amaz    
137 move the iterator forward to the next position    
138 example module can simply increment the positi    
139 modules will do what is needed to step through    
140 next() function returns a new iterator, or NUL    
141 complete. Here's the example version::            
142                                                   
143         static void *ct_seq_next(struct seq_fi    
144         {                                         
145                 loff_t *spos = v;                 
146                 *pos = ++*spos;                   
147                 return spos;                      
148         }                                         
149                                                   
150 The next() function should set ``*pos`` to a v    
151 to find the new location in the sequence.  Whe    
152 stored in the private data area, rather than b    
153 start(), it might seem sufficient to simply se    
154 value (zero always tells start() to restart th    
155 sufficient due to historical problems.            
156                                                   
157 Historically, many next() functions have *not*    
158 end-of-file.  If the value is then used by sta    
159 iterator, this can result in corner cases wher    
160 sequence is reported twice in the file.  In or    
161 from being resurrected, the core seq_file code    
162 a next() function does not change the value of    
163 next() function *must* change the value of ``*    
164 set it to a non-zero value.                       
165                                                   
166 The stop() function closes a session; its job,    
167 up. If dynamic memory is allocated for the ite    
168 place to free it; if a lock was taken by start    
169 that lock.  The value that ``*pos`` was set to    
170 before stop() is remembered, and used for the     
171 the next session unless lseek() has been calle    
172 case next start() will be asked to start at po    
173                                                   
174         static void ct_seq_stop(struct seq_fil    
175         {                                         
176                 kfree(v);                         
177         }                                         
178                                                   
179 Finally, the show() function should format the    
180 by the iterator for output.  The example modul    
181                                                   
182         static int ct_seq_show(struct seq_file    
183         {                                         
184                 loff_t *spos = v;                 
185                 seq_printf(s, "%lld\n", (long     
186                 return 0;                         
187         }                                         
188                                                   
189 If all is well, the show() function should ret    
190 code in the usual manner indicates that someth    
191 passed back to user space.  This function can     
192 causes the current item to be skipped; if the     
193 generated output before returning SEQ_SKIP, th    
194                                                   
195 We will look at seq_printf() in a moment. But     
196 seq_file iterator is finished by creating a se    
197 the four functions we have just defined::         
198                                                   
199         static const struct seq_operations ct_    
200                 .start = ct_seq_start,            
201                 .next  = ct_seq_next,             
202                 .stop  = ct_seq_stop,             
203                 .show  = ct_seq_show              
204         };                                        
205                                                   
206 This structure will be needed to tie our itera    
207 a little bit.                                     
208                                                   
209 It's worth noting that the iterator value retu    
210 manipulated by the other functions is consider    
211 the seq_file code. It can thus be anything tha    
212 through the data to be output. Counters can be    
213 a direct pointer into an array or linked list.    
214 the programmer is aware that things can happen    
215 iterator function. However, the seq_file code     
216 between the calls to start() and stop(), so ho    
217 is a reasonable thing to do. The seq_file code    
218 other locks while the iterator is active.         
219                                                   
220 The iterator value returned by start() or next    
221 passed to a subsequent next() or stop() call.     
222 such as locks that were taken to be reliably r    
223 guarantee that the iterator will be passed to     
224 it often will be.                                 
225                                                   
226                                                   
227 Formatted output                                  
228 ================                                  
229                                                   
230 The seq_file code manages positioning within t    
231 iterator and getting it into the user's buffer    
232 output must be passed to the seq_file code. So    
233 been defined which make this task easy.           
234                                                   
235 Most code will simply use seq_printf(), which     
236 printk(), but which requires the seq_file poin    
237                                                   
238 For straight character output, the following f    
239                                                   
240         seq_putc(struct seq_file *m, char c);     
241         seq_puts(struct seq_file *m, const cha    
242         seq_escape(struct seq_file *m, const c    
243                                                   
244 The first two output a single character and a     
245 expect. seq_escape() is like seq_puts(), excep    
246 which is in the string esc will be represented    
247                                                   
248 There are also a pair of functions for printin    
249                                                   
250         int seq_path(struct seq_file *m, const    
251                      const char *esc);            
252         int seq_path_root(struct seq_file *m,     
253                           const struct path *r    
254                                                   
255 Here, path indicates the file of interest, and    
256 which should be escaped in the output.  A call    
257 the path relative to the current process's fil    
258 root is desired, it can be used with seq_path_    
259 path cannot be reached from root, seq_path_roo    
260                                                   
261 A function producing complicated output may wa    
262                                                   
263         bool seq_has_overflowed(struct seq_fil    
264                                                   
265 and avoid further seq_<output> calls if true i    
266                                                   
267 A true return from seq_has_overflowed means th    
268 be discarded and the seq_show function will at    
269 buffer and retry printing.                        
270                                                   
271                                                   
272 Making it all work                                
273 ==================                                
274                                                   
275 So far, we have a nice set of functions which     
276 seq_file system, but we have not yet turned th    
277 can see. Creating a file within the kernel req    
278 creation of a set of file_operations which imp    
279 file. The seq_file interface provides a set of    
280 most of the work. The virtual file author stil    
281 method, however, to hook everything up. The op    
282 line, as in the example module::                  
283                                                   
284         static int ct_open(struct inode *inode    
285         {                                         
286                 return seq_open(file, &ct_seq_    
287         }                                         
288                                                   
289 Here, the call to seq_open() takes the seq_ope    
290 before, and gets set up to iterate through the    
291                                                   
292 On a successful open, seq_open() stores the st    
293 file->private_data. If you have an application    
294 be used for more than one file, you can store     
295 private field of the seq_file structure; that     
296 by the iterator functions.                        
297                                                   
298 There is also a wrapper function to seq_open()    
299 kmallocs a zero filled block of memory and sto    
300 private field of the seq_file structure, retur    
301 block size is specified in a third parameter t    
302                                                   
303         static int ct_open(struct inode *inode    
304         {                                         
305                 return seq_open_private(file,     
306                                         sizeof    
307         }                                         
308                                                   
309 There is also a variant function, __seq_open_p    
310 identical except that, if successful, it retur    
311 memory block, allowing further initialisation     
312                                                   
313         static int ct_open(struct inode *inode    
314         {                                         
315                 struct mystruct *p =              
316                         __seq_open_private(fil    
317                                                   
318                 if (!p)                           
319                         return -ENOMEM;           
320                                                   
321                 p->foo = bar; /* initialize my    
322                         ...                       
323                 p->baz = true;                    
324                                                   
325                 return 0;                         
326         }                                         
327                                                   
328 A corresponding close function, seq_release_pr    
329 frees the memory allocated in the correspondin    
330                                                   
331 The other operations of interest - read(), lls    
332 all implemented by the seq_file code itself. S    
333 file_operations structure will look like::        
334                                                   
335         static const struct file_operations ct    
336                 .owner   = THIS_MODULE,           
337                 .open    = ct_open,               
338                 .read    = seq_read,              
339                 .llseek  = seq_lseek,             
340                 .release = seq_release            
341         };                                        
342                                                   
343 There is also a seq_release_private() which pa    
344 seq_file private field to kfree() before relea    
345                                                   
346 The final step is the creation of the /proc fi    
347 code, that is done in the initialization code     
348                                                   
349         static int ct_init(void)                  
350         {                                         
351                 struct proc_dir_entry *entry;     
352                                                   
353                 proc_create("sequence", 0, NUL    
354                 return 0;                         
355         }                                         
356                                                   
357         module_init(ct_init);                     
358                                                   
359 And that is pretty much it.                       
360                                                   
361                                                   
362 seq_list                                          
363 ========                                          
364                                                   
365 If your file will be iterating through a linke    
366 routines useful::                                 
367                                                   
368         struct list_head *seq_list_start(struc    
369                                          loff_    
370         struct list_head *seq_list_start_head(    
371                                                   
372         struct list_head *seq_list_next(void *    
373                                         loff_t    
374                                                   
375 These helpers will interpret pos as a position    
376 accordingly.  Your start() and next() function    
377 ``seq_list_*`` helpers with a pointer to the a    
378                                                   
379                                                   
380 The extra-simple version                          
381 ========================                          
382                                                   
383 For extremely simple virtual files, there is a    
384 module can define only the show() function, wh    
385 output that the virtual file will contain. The    
386 calls::                                           
387                                                   
388         int single_open(struct file *file,        
389                         int (*show)(struct seq    
390                         void *data);              
391                                                   
392 When output time comes, the show() function wi    
393 value given to single_open() can be found in t    
394 seq_file structure. When using single_open(),     
395 single_release() instead of seq_release() in t    
396 to avoid a memory leak.                           
                                                      

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php