Skip site navigation (1)Skip section navigation (2)
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>