When can a struct buf's b_lblkno field by < 0 ?

Warner Losh imp at bsdimp.com
Fri Apr 12 15:40:08 UTC 2019


On Fri, Apr 12, 2019 at 9:12 AM Alan Somers <asomers at freebsd.org> wrote:

> In struct buf, b_lblkno is documented as "Logical block number".  I
> would expect that to always be nonnegative.  However, vtruncbuf loops
> through a list of buffers, skipping those where "bp->b_lblkno > 0".
> Maybe that's just an awkward way of writing "do something for the
> buffer where b_lblkno == 0", but SVN archaeology suggests otherwise.
> Before r112182, the code looked like this, implying that the b_lblkno
> could actually be negative:
>
> if ((bp->b_flags & B_DELWRI) && (bp->b_lblkno < 0)) {
>
> Does anybody know under what circumstances that field might be
> negative?  Also, was r112182 a correct change?  It appears to have
> negated "<" and gotten ">", neglecting the "==" case.
>
> https://svnweb.freebsd.org/base/head/sys/kern/vfs_subr.c?r1=112182&r2=112181&pathrev=112182


b_lblkno can be negative when it describes the meta-data for a file,
non-negative when it describes data for the file.

Warner


More information about the freebsd-hackers mailing list