[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAHk-=wh84ks6FN2fBWrGZNKNhOmTZL-r5xZG7gYZ==jESG2GgA@mail.gmail.com>
Date: Thu, 16 Sep 2021 09:25:38 -0700
From: Linus Torvalds <torvalds@...ux-foundation.org>
To: Anders Larsen <al@...rsen.net>
Cc: Guenter Roeck <linux@...ck-us.net>,
Richard Henderson <rth@...ddle.net>,
Ivan Kokshaysky <ink@...assic.park.msu.ru>,
Matt Turner <mattst88@...il.com>,
"James E . J . Bottomley" <James.Bottomley@...senpartnership.com>,
Helge Deller <deller@....de>,
"David S . Miller" <davem@...emloft.net>,
Jakub Kicinski <kuba@...nel.org>,
alpha <linux-alpha@...r.kernel.org>,
Geert Uytterhoeven <geert@...ux-m68k.org>,
Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
linux-parisc@...r.kernel.org, Netdev <netdev@...r.kernel.org>,
Sparse Mailing-list <linux-sparse@...r.kernel.org>
Subject: Re: [PATCH v2 0/4] Introduce and use absolute_pointer macro
On Thu, Sep 16, 2021 at 12:02 AM Anders Larsen <al@...rsen.net> wrote:
>
> On Wednesday, 2021-09-15 23:19 Linus Torvalds wrote:
> >
> > But hey, maybe it just works so well for the very specialized user base ...
>
> it's actually the latter (although I guess the user base is shrinking)
Hey, so if it's actively used, maybe you can answer a question or two
that I have just because I looked at the code..
In particular, the inode number calculation is odd. Is there a reason
for the "-1"? Because iboth the link case and the direct inode case
have it, but t's a _different_ "-1":
For the "inode_entry", it does
ino = blknum * QNX4_INODES_PER_BLOCK + ix - 1;
but it's worth noting that "ix" is zero-based (index within the
block), so this kind of oddly removes one from a zero-based thing, and
the 'ino' for the very first entry ends up being -1.
Of course, it's possible that the first entry is always empty, but it
does seem a bit odd.
For the "link_info" case, it does
ino = ( le32_to_cpu(de->link.dl_inode_blk) - 1 ) *
QNX4_INODES_PER_BLOCK +
de->link.dl_inode_ndx;
so now it takes the _block_ index, and does that "-1" on it, and then
multiplies it by the "entries per block" number, and adds the index.
So now if both are zero, the inode number is -8, not -1.
But all of this matches what the *lookup* code does. It's very odd, though.
But to make it stranger, then in "qnx4_iget()", the calculations all
makes sense. There it just does "take the inode number, and look up
block and index into the block using it".
Very strange and confusing. Because it means that iget() seems to look
up a *different* inode entry than "lookup" and "readdir" actually look
at.
I must be missing something. I obviously didn't touch any of this
logic, I was just doing the "make the type system clearer for the
compiler".
Also, I have to say, since I was looking at compiler output, the
calculations in readdir() are made much worse by the fact that the
dir->pos is a "loff_t". That's signed. And then you use "%" to get the
index within a block. Using '%' instead of bitops is fairly
equivalent, but only for
(a) unsigned types
(b) when the divisor is a compile-time power-of-2
In the qnx4 case, (b) is true, but (a) is not.
Not a big deal. But usually, I tell people to avoid '% ENTRIES',
because it really has very different behavior from '& MASK' for signed
numbers.
Linus
Powered by blists - more mailing lists