Re: [PATCH 3/5] proc: Use ppos instead of m->version

From: Matthew Wilcox
Date: Tue Mar 03 2020 - 16:06:01 EST


On Tue, Mar 03, 2020 at 11:53:03PM +0300, Alexey Dobriyan wrote:
> On Tue, Mar 03, 2020 at 12:29:23PM -0800, Matthew Wilcox wrote:
> > On Tue, Mar 03, 2020 at 10:55:29PM +0300, Alexey Dobriyan wrote:
> > > On Sat, Feb 29, 2020 at 08:59:08AM -0800, Matthew Wilcox wrote:
> > > > -static void *m_next(struct seq_file *m, void *v, loff_t *pos)
> > > > +static void *m_next(struct seq_file *m, void *v, loff_t *ppos)
> > >
> > > This looks like hungarian notation.
> >
> > It's the standard naming convention used throughout the VFS. loff_t is
> > pos, loff_t * is ppos.
> >
> > $ git grep 'loff_t \*' fs/*.c |wc
> > 77 556 5233
> > $ git grep 'loff_t \*ppos' fs/*.c |wc
> > 43 309 2974
> > $ git grep 'loff_t \*pos' fs/*.c |wc
> > 22 168 1524
>
> Yes, people copy-pasted terrible thing for years!
> Oh well, whatever...

In an environment where we sometimes pass loff_t and sometimes pass
loff_t *, this convention is a great way to catch copy-and-paste mistakes.
If I have 'pos += done' in a function which takes a loff_t pos, and I
copy-and-paste it to a function which takes a 'loff_t *pos', it's going
to create a bug that hits at runtime. If that function takes an
loff_t *ppos instead, it'll be a compile-time error, and I'll know to
transform it to *ppos += done;