Re: mysterious setting of B_DIRECT?
- Reply: Rick Macklem : "Re: mysterious setting of B_DIRECT?"
- In reply to: Konstantin Belousov : "Re: mysterious setting of B_DIRECT?"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 26 Apr 2024 03:51:55 UTC
On Thu, Apr 25, 2024 at 8:09 PM Konstantin Belousov <kib@freebsd.org> wrote: > > On Thu, Apr 25, 2024 at 07:49:23PM -0700, Rick Macklem wrote: > > Hi, > > > > This week I have been doing active testing as a part of an IETF > > bakeathon for NFSv4. During the week I had a NFSv4 client > > crash. On the surface, it is straightforward, in that it called > > ncl_doio_directwrite() and the field called b_caller1 was NULL. > > > > Now, here's the weird part... > > ncl_doio_directwrite() should never be called because B_DIRECT > > should never be set. (The only place B_DIRECT gets set in the code > > is never currently executed.) > Do you mean the place in nfs_directio_write()? And the fact that > IO_SYNC is always set. Yes. > > > > > I have a patch that clears out the "never to be executed" code and > > this seems to avoid the patch, since with the patch, ncl_doio_directwrite() > > no longer exists. > > > > What I cannot figure out is how B_DIRECT got set? > > I can note that UFS was under heavy load when the client crashed, > > but I cannot see how a UFS "struct buf" would become a NFS "struct buf" > > without b_flags being set to 0. > > There are also vfs_bio_brelse()/vfs_bio_setflags() functions which can > set B_DIRECT. On the other hand, they are not used by nfs client. Yes, again. > > What was the overall state of the buffer with the B_DIRECT flag? Which > vnode it was assigned to? Unfortunately I was in a hurry and didn't get more info. And, since I have never seen this crash before, I doubt I'll be able to reproduce it. Thanks, rick