data blocks question

David Schultz das at FreeBSD.ORG
Wed Sep 29 21:09:26 PDT 2004


On Wed, Sep 29, 2004, Nehal wrote:
> On Wed, 29 Sep 2004 19:09:29 -0400
> David Schultz <das at FreeBSD.ORG> wrote:
> 
> > On Wed, Sep 29, 2004, Nehal wrote:
> > > On Wed, 29 Sep 2004 16:42:33 -0400
> > > David Schultz <das at FreeBSD.ORG> wrote:
> > > 
> > > > On Wed, Sep 29, 2004, Nehal wrote:
> > > > > on my ufs2 partition, there is a file that has a size of
> > > > > 65536, and has 2 direct blocks only. the block size of the
> > > > > fs is 16k and fragment block size is 2k.
> > > > > 
> > > > > how can this be possible? wouldn't 2 direct blocks mean
> > > > > that the maximum size is 2x16k = 32k? or am i not
> > > > > understanding something correctly?
> > > > > 
> > > > > i've made a copy of the file, and the new file has 4
> > > > > direct blocks.
> > > > > 
> > > > > it is a binary file, and i can read it fine (ie, cat it).
> > > > > i've done fsck on the filesystem and it found no problem.
> > > > 
> > > > Yes, UFS supports sparse files.  That is, you can have a
> > > > file with parts you haven't written to, and the blocks for
> > > > those parts won't be allocated.  The cp utility doesn't know
> > > > about this, though, so copies will have the ``holes'' filled
> > > > with zeroes.
> > > > 
> > > 
> > > how would i determine the offset and length of these 'holes'
> > > for sparse files?
> > 
> > It's an implementation detail, so you're not supposed to need to
> > know most of the time.  You can use fsdb to find out.
> > 
> i would like to know how it is implemented. is there somewhere in
> the freebsd source that i can find this info?

src/sys/fs/ufs/ffs/ffs_{balloc,inode}.c would probably be most
helpful.  The code is complicated, but the approach to this
problem isn't:

  When a file is extended via ftruncate(), don't
  allocate new blocks.  Instead, do that lazily as portions of the
  file are written.  On reads, pretend that unallocated blocks are
  filled with all zeroes.


More information about the freebsd-fs mailing list