On Wed, 5 Aug 2009, Bruce Rowen wrote:
> On Aug 5, 2009, at 9:34 AM, Robert P. J. Day wrote:
> i'm still somewhat confused here. in every example using a seq_file
> that i've ever seen, it's *assumed* that the very first call to the
> start() routine is going to pass a (*pos) value of zero, which is used
> to signify the initial call to that start routine. that *has* to be
> consistent. if it can be something other than zero for that *initial*
> call, how would seq_files ever be guaranteed to work properly?
>
>
> I pulled this from fs/proc/devices.c, I hope it's version compatible with
> your query:
>
> static void *devinfo_start(struct seq_file *f, loff_t *pos)
>
> 27 {
> 28 if (*pos < (BLKDEV_MAJOR_HASH_SIZE + CHRDEV_MAJOR_HASH_SIZE))
> 29 return pos;
> 30 return NULL;
> 31 }
>
> This example does not assume (*pos) is initialized to zero. Digging
> further back into the sequence of events that occurs before the
> start() is called, I can't find anything that explicitly sets the
> (*pos) to zero, unless it follows philosophy of setting ( *pos) to
> zero when open() is called (this is probably buried in the more
> generic file I/O layers).
i think we're actually agreeing here. the seq_file start routine
doesn't technically assume an initial pos of zero, but for the overall
operation to work properly, *something* has to initialize that to
zero, almost certainly further down in the open code.
rday
--
========================================================================
Robert P. J. Day Waterloo, Ontario, CANADA
Linux Consulting, Training and Annoying Kernel Pedantry.
Web page: http://crashcourse.ca
Twitter: http://twitter.com/rpjday
"Kernel Newbie Corner" column @ linux.com: http://cli.gs/WG6WYX
========================================================================