Subversion Repositories planix.SVN

Rev

Rev 2 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
.TH VENTI-FILE 2
2
.SH NAME
3
VtFile,
4
vtfileblock,
5
vtfileblockscore,
6
vtfileclose,
7
vtfilecreate,
8
vtfilecreateroot,
9
vtfileflush,
10
vtfileflushbefore,
11
vtfilegetdirsize,
12
vtfilegetentry,
13
vtfilegetsize,
14
vtfileincref,
15
vtfilelock,
16
vtfilelock2,
17
vtfileopen,
18
vtfileopenroot,
19
vtfileread, 
20
vtfileremove,
21
vtfilesetdirsize,
22
vtfilesetentry,
23
vtfilesetsize,
24
vtfiletruncate,
25
vtfileunlock,
26
vtfilewrite \- Venti files
27
.SH SYNOPSIS
28
.ta +\w'\fLVtBlock* 'u
29
.PP
30
.B
31
VtFile*	vtfilecreateroot(VtCache *c, int psize, int dsize, int type);
32
.PP
33
.B
34
VtFile*	vtfileopenroot(VtCache *c, VtEntry *e);
35
.PP
36
.B
37
VtFile*	vtfileopen(VtFile *f, u32int n, int mode);
38
.PP
39
.B
40
VtFile*	vtfilecreate(VtFile *f, int psize, int dsize, int type);
41
.PP
42
.B
43
void	vtfileincref(VtFile *f);
44
.PP
45
.B
46
void	vtfileclose(VtFile *f);
47
.PP
48
.B
49
int	vtfileremove(VtFile *f);
50
.PP
51
.B
52
VtBlock*	vtfileblock(VtFile *f, u32int n, int mode);
53
.PP
54
.B
55
long	vtfileread(VtFile *f, void *buf, long n, vlong offset);
56
.PP
57
.B
58
long	vtfilewrite(VtFile *f, void *buf, long n, vlong offset);
59
.PP
60
.B
61
int	vtfileflush(VtFile *f);
62
.PP
63
.B
64
int	vtfileflushbefore(VtFile *f, vlong offset);
65
.PP
66
.B
67
int	vtfiletruncate(VtFile *f);
68
.PP
69
.B
70
uvlong	vtfilegetsize(VtFile *f);
71
.PP
72
.B
73
int	vtfilesetsize(VtFile *f, vlong size);
74
.PP
75
.B
76
u32int	vtfilegetdirsize(VtFile *f);
77
.PP
78
.B
79
int	vtfilesetdirsize(VtFile *f, u32int size);
80
.PP
81
.B
82
int	vtfilegetentry(VtFile *f, VtEntry *e);
83
.PP
84
.B
85
int	vtfilesetentry(VtFile *f, VtEntry *e);
86
.PP
87
.B
88
int	vtfileblockscore(VtFile *f, u32int n, 
89
	    uchar score[VtScoreSize]);
90
.PP
91
.B
92
int	vtfilelock(VtFile *f, int mode);
93
.PP
94
.B
95
int	vtfilelock2(VtFile *f, VtFile *f, int mode);
96
.PP
97
.B
98
void	vtfileunlock(VtFile *f);
99
.SH DESCRIPTION
100
These routines provide a simple interface to create and
101
manipulate Venti file trees (see
102
.IR venti (6)).
103
.PP
104
.I Vtfilecreateroot
105
creates a new Venti file.
106
.I Type
107
must be either
108
.B VtDataType
109
or
110
.BR VtDirType ,
111
specifying a data or directory file.
112
.I Dsize
113
is the block size to use for leaf (data or directory) blocks in the hash tree;
114
.I psize
115
is the block size to use for internal (pointer) blocks.
116
.PP
117
.I Vtfileopenroot
118
opens an existing Venti file described by
119
.IR e .
120
.PP
121
.I Vtfileopen
122
opens the Venti file described by the
123
.IR n th
124
entry in the directory
125
.IR f .
126
.I Mode
127
should be one of
128
.BR VtOREAD ,
129
.BR VtOWRITE ,
130
or
131
.BR VtORDWR ,
132
indicating how the returned file is to be used.
133
The
134
.BR VtOWRITE
135
and
136
.BR VtORDWR
137
modes can only be used if
138
.IR f
139
is open with mode
140
.BR VtORDWR .
141
.PP
142
.I Vtfilecreate
143
creates a new file in the directory
144
.I f
145
with block type
146
.I type
147
and block sizes
148
.I dsize
149
and
150
.I psize
151
(see
152
.I vtfilecreateroot
153
above).
154
.PP
155
Each file has an associated reference count
156
and holds a reference to its parent in the file tree.
157
.I Vtfileincref
158
increments this reference count.
159
.I Vtfileclose
160
decrements the reference count.
161
If there are no other references,
162
.I vtfileclose
163
releases the reference to
164
.IR f 's
165
parent and then frees the in-memory structure
166
.IR f .
167
The data stored in 
168
.I f
169
is still accessible by reopening it.
170
.PP
171
.I Vtfileremove
172
removes the file
173
.I f
174
from its parent directory.
175
It also acts as 
176
.IR vtfileclose ,
177
releasing the reference to
178
.I f
179
and potentially freeing the structure.
180
.PP
181
.I Vtfileblock
182
returns the
183
.IR n th
184
block in the file
185
.IR f .
186
If there are not 
187
.I n
188
blocks in the file and
189
.I mode
190
is 
191
.BR VtOREAD ,
192
.I vtfileblock
193
returns nil.
194
If the mode is
195
.B VtOWRITE
196
or
197
.BR VtORDWR ,
198
.I vtfileblock
199
grows the file as needed and then returns the block.
200
.PP
201
.I Vtfileread
202
reads at most
203
.I n
204
bytes at offset
205
.I offset
206
from
207
.I f
208
into memory at
209
.IR buf .
210
It returns the number of bytes read.
211
.PP
212
.I Vtfilewrite
213
writes the 
214
.I n
215
bytes in memory at
216
.I buf
217
into the file
218
.I f
219
at offset 
220
.IR n .
221
It returns the number of bytes written,
222
or \-1 on error.
223
Writing fewer bytes than requested will only happen
224
if an error is encountered.
225
.PP
226
.I Vtfilewrite
227
writes to an in-memory copy of the data blocks
228
(see
229
.IR venti-cache (2))
230
instead of writing directly to Venti.
231
.I Vtfileflush
232
writes all copied blocks associated with 
233
.I f
234
to the Venti server.
235
.I Vtfileflushbefore
236
flushes only those blocks corresponding to data in the file before
237
byte
238
.IR offset .
239
Loops that
240
.I vtfilewrite
241
should call
242
.I vtfileflushbefore
243
regularly to avoid filling the block cache with unwritten blocks.
244
.PP
245
.I Vtfiletruncate
246
changes the file
247
.I f
248
to have zero length.
249
.PP
250
.I Vtfilegetsize
251
returns the length (in bytes) of file
252
.IR f .
253
.PP
254
.I Vtfilesetsize
255
sets the length (in bytes) of file
256
.IR f .
257
.PP
258
.I Vtfilegetdirsize
259
returns the length (in directory entries)
260
of the directory
261
.IR f .
262
.PP
263
.I Vtfilesetdirsize
264
sets the length (in directory entries)
265
of the directory
266
.IR f .
267
.PP
268
.I Vtfilegetentry
269
fills
270
.I e
271
with an entry that can be passed to
272
.IR vtfileopenroot
273
to reopen
274
.I f
275
at a later time.
276
.PP
277
.I Vtfilesetentry
278
sets the entry associated with
279
.I f
280
to be
281
.IR e .
282
.PP
283
.I Vtfileblockscore
284
returns in
285
.I score
286
the score of the
287
.IR n th
288
block in the file
289
.IR f .
290
.PP
291
Venti files are locked and unlocked
292
via
293
.I vtfilelock
294
and
295
.I vtfileunlock
296
to moderate concurrent access.
297
Only one thread at a time\(emthe one that has the file locked\(emcan
298
read or modify the file.
299
The functions that return files
300
.RI ( vtfilecreateroot ,
301
.IR vtfileopenroot ,
302
.IR vtfilecreate ,
303
and
304
.IR vtfileopen )
305
return them unlocked.
306
When files are passed to any of the functions documented in 
307
this manual page, it is the caller's responsibility to ensure that
308
they are already locked.
309
.PP
310
Internally, a file is locked by locking the
311
block that contains its directory entry.
312
When two files in the same
313
directory both need to be locked,
314
.I vtfilelock2
315
must be used.
316
It locks both its arguments, taking special care
317
not to deadlock if their entries are stored
318
in the same directory block.
319
.SH SOURCE
320
.B /sys/src/libventi/file.c
321
.SH SEE ALSO
322
.IR venti-cache (2),
323
.IR venti-conn (2),
324
.IR venti-client (2),
325
.IR venti (6)