TH VENTI-FILE 2
SH NAME
VtFile,
vtfileblock,
vtfileblockscore,
vtfileclose,
vtfilecreate,
vtfilecreateroot,
vtfileflush,
vtfileflushbefore,
vtfilegetdirsize,
vtfilegetentry,
vtfilegetsize,
vtfileincref,
vtfilelock,
vtfilelock2,
vtfileopen,
vtfileopenroot,
vtfileread,
vtfileremove,
vtfilesetdirsize,
vtfilesetentry,
vtfilesetsize,
vtfiletruncate,
vtfileunlock,
vtfilewrite \- Venti files
SH SYNOPSIS
ta +\w'\fLVtBlock* 'u
PP
B
VtFile* vtfilecreateroot(VtCache *c, int psize, int dsize, int type);
PP
B
VtFile* vtfileopenroot(VtCache *c, VtEntry *e);
PP
B
VtFile* vtfileopen(VtFile *f, u32int n, int mode);
PP
B
VtFile* vtfilecreate(VtFile *f, int psize, int dsize, int type);
PP
B
void vtfileincref(VtFile *f);
PP
B
void vtfileclose(VtFile *f);
PP
B
int vtfileremove(VtFile *f);
PP
B
VtBlock* vtfileblock(VtFile *f, u32int n, int mode);
PP
B
long vtfileread(VtFile *f, void *buf, long n, vlong offset);
PP
B
long vtfilewrite(VtFile *f, void *buf, long n, vlong offset);
PP
B
int vtfileflush(VtFile *f);
PP
B
int vtfileflushbefore(VtFile *f, vlong offset);
PP
B
int vtfiletruncate(VtFile *f);
PP
B
uvlong vtfilegetsize(VtFile *f);
PP
B
int vtfilesetsize(VtFile *f, vlong size);
PP
B
u32int vtfilegetdirsize(VtFile *f);
PP
B
int vtfilesetdirsize(VtFile *f, u32int size);
PP
B
int vtfilegetentry(VtFile *f, VtEntry *e);
PP
B
int vtfilesetentry(VtFile *f, VtEntry *e);
PP
B
int vtfileblockscore(VtFile *f, u32int n,
uchar score[VtScoreSize]);
PP
B
int vtfilelock(VtFile *f, int mode);
PP
B
int vtfilelock2(VtFile *f, VtFile *f, int mode);
PP
B
void vtfileunlock(VtFile *f);
SH DESCRIPTION
These routines provide a simple interface to create and
manipulate Venti file trees (see
IR venti (6)).
PP
I Vtfilecreateroot
creates a new Venti file.
I Type
must be either
B VtDataType
or
BR VtDirType ,
specifying a data or directory file.
I Dsize
is the block size to use for leaf (data or directory) blocks in the hash tree;
I psize
is the block size to use for internal (pointer) blocks.
PP
I Vtfileopenroot
opens an existing Venti file described by
IR e .
PP
I Vtfileopen
opens the Venti file described by the
IR n th
entry in the directory
IR f .
I Mode
should be one of
BR VtOREAD ,
BR VtOWRITE ,
or
BR VtORDWR ,
indicating how the returned file is to be used.
The
BR VtOWRITE
and
BR VtORDWR
modes can only be used if
IR f
is open with mode
BR VtORDWR .
PP
I Vtfilecreate
creates a new file in the directory
I f
with block type
I type
and block sizes
I dsize
and
I psize
(see
I vtfilecreateroot
above).
PP
Each file has an associated reference count
and holds a reference to its parent in the file tree.
I Vtfileincref
increments this reference count.
I Vtfileclose
decrements the reference count.
If there are no other references,
I vtfileclose
releases the reference to
IR f 's
parent and then frees the in-memory structure
IR f .
The data stored in
I f
is still accessible by reopening it.
PP
I Vtfileremove
removes the file
I f
from its parent directory.
It also acts as
IR vtfileclose ,
releasing the reference to
I f
and potentially freeing the structure.
PP
I Vtfileblock
returns the
IR n th
block in the file
IR f .
If there are not
I n
blocks in the file and
I mode
is
BR VtOREAD ,
I vtfileblock
returns nil.
If the mode is
B VtOWRITE
or
BR VtORDWR ,
I vtfileblock
grows the file as needed and then returns the block.
PP
I Vtfileread
reads at most
I n
bytes at offset
I offset
from
I f
into memory at
IR buf .
It returns the number of bytes read.
PP
I Vtfilewrite
writes the
I n
bytes in memory at
I buf
into the file
I f
at offset
IR n .
It returns the number of bytes written,
or \-1 on error.
Writing fewer bytes than requested will only happen
if an error is encountered.
PP
I Vtfilewrite
writes to an in-memory copy of the data blocks
(see
IR venti-cache (2))
instead of writing directly to Venti.
I Vtfileflush
writes all copied blocks associated with
I f
to the Venti server.
I Vtfileflushbefore
flushes only those blocks corresponding to data in the file before
byte
IR offset .
Loops that
I vtfilewrite
should call
I vtfileflushbefore
regularly to avoid filling the block cache with unwritten blocks.
PP
I Vtfiletruncate
changes the file
I f
to have zero length.
PP
I Vtfilegetsize
returns the length (in bytes) of file
IR f .
PP
I Vtfilesetsize
sets the length (in bytes) of file
IR f .
PP
I Vtfilegetdirsize
returns the length (in directory entries)
of the directory
IR f .
PP
I Vtfilesetdirsize
sets the length (in directory entries)
of the directory
IR f .
PP
I Vtfilegetentry
fills
I e
with an entry that can be passed to
IR vtfileopenroot
to reopen
I f
at a later time.
PP
I Vtfilesetentry
sets the entry associated with
I f
to be
IR e .
PP
I Vtfileblockscore
returns in
I score
the score of the
IR n th
block in the file
IR f .
PP
Venti files are locked and unlocked
via
I vtfilelock
and
I vtfileunlock
to moderate concurrent access.
Only one thread at a time\(emthe one that has the file locked\(emcan
read or modify the file.
The functions that return files
RI ( vtfilecreateroot ,
IR vtfileopenroot ,
IR vtfilecreate ,
and
IR vtfileopen )
return them unlocked.
When files are passed to any of the functions documented in
this manual page, it is the caller's responsibility to ensure that
they are already locked.
PP
Internally, a file is locked by locking the
block that contains its directory entry.
When two files in the same
directory both need to be locked,
I vtfilelock2
must be used.
It locks both its arguments, taking special care
not to deadlock if their entries are stored
in the same directory block.
SH SOURCE
B /sys/src/libventi/file.c
SH SEE ALSO
IR venti-cache (2),
IR venti-conn (2),
IR venti-client (2),
IR venti (6)