Date: Tue, 03 Oct 2006 00:51:34 -0600 From: Scott Long <scottl@samsco.org> To: Shane Adams <adamsch1@yahoo.com> Cc: freebsd-fs@freebsd.org Subject: Re: curiosity between bread and UFS_BALLOC on struct buf Message-ID: <45220876.1060109@samsco.org> In-Reply-To: <20061003062648.24344.qmail@web31810.mail.mud.yahoo.com> References: <20061003062648.24344.qmail@web31810.mail.mud.yahoo.com>
next in thread | previous in thread | raw e-mail | index | archive | help
Ok, that makes more sense. Yes, you need to use getblk(). Once you've modified the bp->b_data, you need to set appropriate flags on the buf so the the VM system knows that buffer is dirty and needs to be flushed to disk. Although B_DIRTY looks like the obvious flag, it apparently only has meaning to ext2fs. What you need to do is clear B_INVAL if it is set. You might also need to twiddle B_CACHE, but I can't recall for sure anymore. Scott Shane Adams wrote: > Hey thanks for the response! I should of mentioned that I am hacking on my own filesystem, using UFS/FFS as a basis. So I'm actually below VOP_*. I did find in my digging throught the code that UFS_BALLOC ultimatly for my code path gets the bufer from a call to getblk. > > From the documentation I've read I would think that I could then immediatly bwrite on that buffer, which I attempt, but my change application specific changes to the buffer do not persist. I have a couple of anciallary functions that do the bread/bwrite and those work perfectly. > > *shrug* > > Hopefully I'll nail it! > > Cheers, > Shane > > > ----- Original Message ---- > From: Scott Long <scottl@samsco.org> > To: Shane Adams <adamsch1@yahoo.com> > Cc: freebsd-fs@freebsd.org > Sent: Monday, October 2, 2006 8:31:44 PM > Subject: Re: curiosity between bread and UFS_BALLOC on struct buf > > > > On Mon, 2 Oct 2006, Shane Adams wrote: > >> Hey all, > >> I've been puzzling with a bit of code. I'm creating a file from within >> a kernel module, that works fine, but I've got a question if perhaps I'm >> missing something: >> >> I use UFS_BALLOC to allocate some space. That function has a struct buf >> thats returned. What I would expect is that I could manipulate the >> bp->b_data field then do a bwrite and have my changes saved. Doesnt >> workthat way. Only way I can get it to work is >> >> 1 UFS_BALLOC( ... ) >> >> 2 bwrite( .. ) >> >> 3 bread( ... ) >> >> 4 /* Make changes to what I read */ >> >> 5 bwrite() >> >> Seems like I could get rid of, 2 and 3. I'm not sure why I have to >> bwrite the buffer returned from UFS_BALLOC. I dug around and there are >> a few examples of where ffs/ufs manipulate the buffer returned from >> UFS_BALLOC so I am guessing I'm missing a flag or something. >> >> Hope the question is clear enough! > > You shouldn't be groping around in UFS internals like this. Using > VOP_WRITE will probably serve you much better. Look at something like > kern_ktrace.c to see how file writing in the kernel is done. > > Scott > > > >
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?45220876.1060109>