curiosity between bread and UFS_BALLOC on struct buf
Shane Adams
adamsch1 at yahoo.com
Mon Oct 2 23:26:49 PDT 2006
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 at samsco.org>
To: Shane Adams <adamsch1 at yahoo.com>
Cc: freebsd-fs at 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
More information about the freebsd-fs
mailing list