Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
fs
jffs2
nodelist.h
Go to the documentation of this file.
1
/*
2
* JFFS2 -- Journalling Flash File System, Version 2.
3
*
4
* Copyright © 2001-2007 Red Hat, Inc.
5
*
6
* Created by David Woodhouse <
[email protected]
>
7
*
8
* For licensing information, see the file 'LICENCE' in this directory.
9
*
10
*/
11
12
#ifndef __JFFS2_NODELIST_H__
13
#define __JFFS2_NODELIST_H__
14
15
#include <linux/fs.h>
16
#include <linux/types.h>
17
#include <
linux/jffs2.h
>
18
#include "
jffs2_fs_sb.h
"
19
#include "
jffs2_fs_i.h
"
20
#include "
xattr.h
"
21
#include "
acl.h
"
22
#include "
summary.h
"
23
24
#ifdef __ECOS
25
#include "os-ecos.h"
26
#else
27
#include "
os-linux.h
"
28
#endif
29
30
#define JFFS2_NATIVE_ENDIAN
31
32
/* Note we handle mode bits conversion from JFFS2 (i.e. Linux) to/from
33
whatever OS we're actually running on here too. */
34
35
#if defined(JFFS2_NATIVE_ENDIAN)
36
#define cpu_to_je16(x) ((jint16_t){x})
37
#define cpu_to_je32(x) ((jint32_t){x})
38
#define cpu_to_jemode(x) ((jmode_t){os_to_jffs2_mode(x)})
39
40
#define constant_cpu_to_je16(x) ((jint16_t){x})
41
#define constant_cpu_to_je32(x) ((jint32_t){x})
42
43
#define je16_to_cpu(x) ((x).v16)
44
#define je32_to_cpu(x) ((x).v32)
45
#define jemode_to_cpu(x) (jffs2_to_os_mode((x).m))
46
#elif defined(JFFS2_BIG_ENDIAN)
47
#define cpu_to_je16(x) ((jint16_t){cpu_to_be16(x)})
48
#define cpu_to_je32(x) ((jint32_t){cpu_to_be32(x)})
49
#define cpu_to_jemode(x) ((jmode_t){cpu_to_be32(os_to_jffs2_mode(x))})
50
51
#define constant_cpu_to_je16(x) ((jint16_t){__constant_cpu_to_be16(x)})
52
#define constant_cpu_to_je32(x) ((jint32_t){__constant_cpu_to_be32(x)})
53
54
#define je16_to_cpu(x) (be16_to_cpu(x.v16))
55
#define je32_to_cpu(x) (be32_to_cpu(x.v32))
56
#define jemode_to_cpu(x) (be32_to_cpu(jffs2_to_os_mode((x).m)))
57
#elif defined(JFFS2_LITTLE_ENDIAN)
58
#define cpu_to_je16(x) ((jint16_t){cpu_to_le16(x)})
59
#define cpu_to_je32(x) ((jint32_t){cpu_to_le32(x)})
60
#define cpu_to_jemode(x) ((jmode_t){cpu_to_le32(os_to_jffs2_mode(x))})
61
62
#define constant_cpu_to_je16(x) ((jint16_t){__constant_cpu_to_le16(x)})
63
#define constant_cpu_to_je32(x) ((jint32_t){__constant_cpu_to_le32(x)})
64
65
#define je16_to_cpu(x) (le16_to_cpu(x.v16))
66
#define je32_to_cpu(x) (le32_to_cpu(x.v32))
67
#define jemode_to_cpu(x) (le32_to_cpu(jffs2_to_os_mode((x).m)))
68
#else
69
#error wibble
70
#endif
71
72
/* The minimal node header size */
73
#define JFFS2_MIN_NODE_HEADER sizeof(struct jffs2_raw_dirent)
74
75
/*
76
This is all we need to keep in-core for each raw node during normal
77
operation. As and when we do read_inode on a particular inode, we can
78
scan the nodes which are listed for it and build up a proper map of
79
which nodes are currently valid. JFFSv1 always used to keep that whole
80
map in core for each inode.
81
*/
82
struct
jffs2_raw_node_ref
83
{
84
struct
jffs2_raw_node_ref
*
next_in_ino
;
/* Points to the next raw_node_ref
85
for this object. If this _is_ the last, it points to the inode_cache,
86
xattr_ref or xattr_datum instead. The common part of those structures
87
has NULL in the first word. See jffs2_raw_ref_to_ic() below */
88
uint32_t
flash_offset
;
89
#undef TEST_TOTLEN
90
#ifdef TEST_TOTLEN
91
uint32_t
__totlen;
/* This may die; use ref_totlen(c, jeb, ) below */
92
#endif
93
};
94
95
#define REF_LINK_NODE ((int32_t)-1)
96
#define REF_EMPTY_NODE ((int32_t)-2)
97
98
/* Use blocks of about 256 bytes */
99
#define REFS_PER_BLOCK ((255/sizeof(struct jffs2_raw_node_ref))-1)
100
101
static
inline
struct
jffs2_raw_node_ref
*ref_next(
struct
jffs2_raw_node_ref
*ref)
102
{
103
ref++;
104
105
/* Link to another block of refs */
106
if
(ref->
flash_offset
==
REF_LINK_NODE
) {
107
ref = ref->
next_in_ino
;
108
if
(!ref)
109
return
ref;
110
}
111
112
/* End of chain */
113
if
(ref->
flash_offset
==
REF_EMPTY_NODE
)
114
return
NULL
;
115
116
return
ref;
117
}
118
119
static
inline
struct
jffs2_inode_cache
*jffs2_raw_ref_to_ic(
struct
jffs2_raw_node_ref
*
raw
)
120
{
121
while
(raw->
next_in_ino
)
122
raw = raw->
next_in_ino
;
123
124
/* NB. This can be a jffs2_xattr_datum or jffs2_xattr_ref and
125
not actually a jffs2_inode_cache. Check ->class */
126
return
((
struct
jffs2_inode_cache
*)raw);
127
}
128
129
/* flash_offset & 3 always has to be zero, because nodes are
130
always aligned at 4 bytes. So we have a couple of extra bits
131
to play with, which indicate the node's status; see below: */
132
#define REF_UNCHECKED 0
/* We haven't yet checked the CRC or built its inode */
133
#define REF_OBSOLETE 1
/* Obsolete, can be completely ignored */
134
#define REF_PRISTINE 2
/* Completely clean. GC without looking */
135
#define REF_NORMAL 3
/* Possibly overlapped. Read the page and write again on GC */
136
#define ref_flags(ref) ((ref)->flash_offset & 3)
137
#define ref_offset(ref) ((ref)->flash_offset & ~3)
138
#define ref_obsolete(ref) (((ref)->flash_offset & 3) == REF_OBSOLETE)
139
#define mark_ref_normal(ref) do { (ref)->flash_offset = ref_offset(ref) | REF_NORMAL; } while(0)
140
141
/* Dirent nodes should be REF_PRISTINE only if they are not a deletion
142
dirent. Deletion dirents should be REF_NORMAL so that GC gets to
143
throw them away when appropriate */
144
#define dirent_node_state(rd) ( (je32_to_cpu((rd)->ino)?REF_PRISTINE:REF_NORMAL) )
145
146
/* NB: REF_PRISTINE for an inode-less node (ref->next_in_ino == NULL) indicates
147
it is an unknown node of type JFFS2_NODETYPE_RWCOMPAT_COPY, so it'll get
148
copied. If you need to do anything different to GC inode-less nodes, then
149
you need to modify gc.c accordingly. */
150
151
/* For each inode in the filesystem, we need to keep a record of
152
nlink, because it would be a PITA to scan the whole directory tree
153
at read_inode() time to calculate it, and to keep sufficient information
154
in the raw_node_ref (basically both parent and child inode number for
155
dirent nodes) would take more space than this does. We also keep
156
a pointer to the first physical node which is part of this inode, too.
157
*/
158
struct
jffs2_inode_cache
{
159
/* First part of structure is shared with other objects which
160
can terminate the raw node refs' next_in_ino list -- which
161
currently struct jffs2_xattr_datum and struct jffs2_xattr_ref. */
162
163
struct
jffs2_full_dirent
*
scan_dents
;
/* Used during scan to hold
164
temporary lists of dirents, and later must be set to
165
NULL to mark the end of the raw_node_ref->next_in_ino
166
chain. */
167
struct
jffs2_raw_node_ref
*
nodes
;
168
uint8_t
class
;
/* It's used for identification */
169
170
/* end of shared structure */
171
172
uint8_t
flags
;
173
uint16_t
state
;
174
uint32_t
ino
;
175
struct
jffs2_inode_cache
*
next
;
176
#ifdef CONFIG_JFFS2_FS_XATTR
177
struct
jffs2_xattr_ref
*xref;
178
#endif
179
uint32_t
pino_nlink
;
/* Directories store parent inode
180
here; other inodes store nlink.
181
Zero always means that it's
182
completely unlinked. */
183
};
184
185
/* Inode states for 'state' above. We need the 'GC' state to prevent
186
someone from doing a read_inode() while we're moving a 'REF_PRISTINE'
187
node without going through all the iget() nonsense */
188
#define INO_STATE_UNCHECKED 0
/* CRC checks not yet done */
189
#define INO_STATE_CHECKING 1
/* CRC checks in progress */
190
#define INO_STATE_PRESENT 2
/* In core */
191
#define INO_STATE_CHECKEDABSENT 3
/* Checked, cleared again */
192
#define INO_STATE_GC 4
/* GCing a 'pristine' node */
193
#define INO_STATE_READING 5
/* In read_inode() */
194
#define INO_STATE_CLEARING 6
/* In clear_inode() */
195
196
#define INO_FLAGS_XATTR_CHECKED 0x01
/* has no duplicate xattr_ref */
197
198
#define RAWNODE_CLASS_INODE_CACHE 0
199
#define RAWNODE_CLASS_XATTR_DATUM 1
200
#define RAWNODE_CLASS_XATTR_REF 2
201
202
#define INOCACHE_HASHSIZE_MIN 128
203
#define INOCACHE_HASHSIZE_MAX 1024
204
205
#define write_ofs(c) ((c)->nextblock->offset + (c)->sector_size - (c)->nextblock->free_size)
206
207
/*
208
Larger representation of a raw node, kept in-core only when the
209
struct inode for this particular ino is instantiated.
210
*/
211
212
struct
jffs2_full_dnode
213
{
214
struct
jffs2_raw_node_ref
*
raw
;
215
uint32_t
ofs
;
/* The offset to which the data of this node belongs */
216
uint32_t
size
;
217
uint32_t
frags
;
/* Number of fragments which currently refer
218
to this node. When this reaches zero,
219
the node is obsolete. */
220
};
221
222
/*
223
Even larger representation of a raw node, kept in-core only while
224
we're actually building up the original map of which nodes go where,
225
in read_inode()
226
*/
227
struct
jffs2_tmp_dnode_info
228
{
229
struct
rb_node
rb
;
230
struct
jffs2_full_dnode
*
fn
;
231
uint32_t
version
;
232
uint32_t
data_crc
;
233
uint32_t
partial_crc
;
234
uint16_t
csize
;
235
uint16_t
overlapped
;
236
};
237
238
/* Temporary data structure used during readinode. */
239
struct
jffs2_readinode_info
240
{
241
struct
rb_root
tn_root
;
242
struct
jffs2_tmp_dnode_info
*
mdata_tn
;
243
uint32_t
highest_version
;
244
uint32_t
latest_mctime
;
245
uint32_t
mctime_ver
;
246
struct
jffs2_full_dirent
*
fds
;
247
struct
jffs2_raw_node_ref
*
latest_ref
;
248
};
249
250
struct
jffs2_full_dirent
251
{
252
struct
jffs2_raw_node_ref
*
raw
;
253
struct
jffs2_full_dirent
*
next
;
254
uint32_t
version
;
255
uint32_t
ino
;
/* == zero for unlink */
256
unsigned
int
nhash
;
257
unsigned
char
type
;
258
unsigned
char
name
[0];
259
};
260
261
/*
262
Fragments - used to build a map of which raw node to obtain
263
data from for each part of the ino
264
*/
265
struct
jffs2_node_frag
266
{
267
struct
rb_node
rb
;
268
struct
jffs2_full_dnode
*
node
;
/* NULL for holes */
269
uint32_t
size
;
270
uint32_t
ofs
;
/* The offset to which this fragment belongs */
271
};
272
273
struct
jffs2_eraseblock
274
{
275
struct
list_head
list
;
276
int
bad_count
;
277
uint32_t
offset
;
/* of this block in the MTD */
278
279
uint32_t
unchecked_size
;
280
uint32_t
used_size
;
281
uint32_t
dirty_size
;
282
uint32_t
wasted_size
;
283
uint32_t
free_size
;
/* Note that sector_size - free_size
284
is the address of the first free space */
285
uint32_t
allocated_refs
;
286
struct
jffs2_raw_node_ref
*
first_node
;
287
struct
jffs2_raw_node_ref
*
last_node
;
288
289
struct
jffs2_raw_node_ref
*
gc_node
;
/* Next node to be garbage collected */
290
};
291
292
static
inline
int
jffs2_blocks_use_vmalloc(
struct
jffs2_sb_info
*
c
)
293
{
294
return
((c->
flash_size
/ c->
sector_size
) *
sizeof
(
struct
jffs2_eraseblock
)) > (128 * 1024);
295
}
296
297
#define ref_totlen(a, b, c) __jffs2_ref_totlen((a), (b), (c))
298
299
#define ALLOC_NORMAL 0
/* Normal allocation */
300
#define ALLOC_DELETION 1
/* Deletion node. Best to allow it */
301
#define ALLOC_GC 2
/* Space requested for GC. Give it or die */
302
#define ALLOC_NORETRY 3
/* For jffs2_write_dnode: On failure, return -EAGAIN instead of retrying */
303
304
/* How much dirty space before it goes on the very_dirty_list */
305
#define VERYDIRTY(c, size) ((size) >= ((c)->sector_size / 2))
306
307
/* check if dirty space is more than 255 Byte */
308
#define ISDIRTY(size) ((size) > sizeof (struct jffs2_raw_inode) + JFFS2_MIN_DATA_LEN)
309
310
#define PAD(x) (((x)+3)&~3)
311
312
static
inline
int
jffs2_encode_dev(
union
jffs2_device_node
*jdev,
dev_t
rdev
)
313
{
314
if
(old_valid_dev(rdev)) {
315
jdev->
old_id
=
cpu_to_je16
(old_encode_dev(rdev));
316
return
sizeof
(jdev->
old_id
);
317
}
else
{
318
jdev->
new_id
=
cpu_to_je32
(new_encode_dev(rdev));
319
return
sizeof
(jdev->
new_id
);
320
}
321
}
322
323
static
inline
struct
jffs2_node_frag
*frag_first(
struct
rb_root
*root)
324
{
325
struct
rb_node
*
node
=
rb_first
(root);
326
327
if
(!node)
328
return
NULL
;
329
330
return
rb_entry
(node,
struct
jffs2_node_frag
,
rb
);
331
}
332
333
static
inline
struct
jffs2_node_frag
*frag_last(
struct
rb_root
*root)
334
{
335
struct
rb_node
*node =
rb_last
(root);
336
337
if
(!node)
338
return
NULL
;
339
340
return
rb_entry
(node,
struct
jffs2_node_frag
,
rb
);
341
}
342
343
#define frag_next(frag) rb_entry(rb_next(&(frag)->rb), struct jffs2_node_frag, rb)
344
#define frag_prev(frag) rb_entry(rb_prev(&(frag)->rb), struct jffs2_node_frag, rb)
345
#define frag_parent(frag) rb_entry(rb_parent(&(frag)->rb), struct jffs2_node_frag, rb)
346
#define frag_left(frag) rb_entry((frag)->rb.rb_left, struct jffs2_node_frag, rb)
347
#define frag_right(frag) rb_entry((frag)->rb.rb_right, struct jffs2_node_frag, rb)
348
#define frag_erase(frag, list) rb_erase(&frag->rb, list);
349
350
#define tn_next(tn) rb_entry(rb_next(&(tn)->rb), struct jffs2_tmp_dnode_info, rb)
351
#define tn_prev(tn) rb_entry(rb_prev(&(tn)->rb), struct jffs2_tmp_dnode_info, rb)
352
#define tn_parent(tn) rb_entry(rb_parent(&(tn)->rb), struct jffs2_tmp_dnode_info, rb)
353
#define tn_left(tn) rb_entry((tn)->rb.rb_left, struct jffs2_tmp_dnode_info, rb)
354
#define tn_right(tn) rb_entry((tn)->rb.rb_right, struct jffs2_tmp_dnode_info, rb)
355
#define tn_erase(tn, list) rb_erase(&tn->rb, list);
356
#define tn_last(list) rb_entry(rb_last(list), struct jffs2_tmp_dnode_info, rb)
357
#define tn_first(list) rb_entry(rb_first(list), struct jffs2_tmp_dnode_info, rb)
358
359
/* nodelist.c */
360
void
jffs2_add_fd_to_list
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_full_dirent
*
new
,
struct
jffs2_full_dirent
**
list
);
361
void
jffs2_set_inocache_state
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_cache
*ic,
int
state
);
362
struct
jffs2_inode_cache
*
jffs2_get_ino_cache
(
struct
jffs2_sb_info
*
c
,
uint32_t
ino
);
363
void
jffs2_add_ino_cache
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_cache
*
new
);
364
void
jffs2_del_ino_cache
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_cache
*old);
365
void
jffs2_free_ino_caches
(
struct
jffs2_sb_info
*
c
);
366
void
jffs2_free_raw_node_refs
(
struct
jffs2_sb_info
*
c
);
367
struct
jffs2_node_frag
*
jffs2_lookup_node_frag
(
struct
rb_root
*
fragtree
,
uint32_t
offset
);
368
void
jffs2_kill_fragtree
(
struct
rb_root
*root,
struct
jffs2_sb_info
*c_delete);
369
int
jffs2_add_full_dnode_to_inode
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*
f
,
struct
jffs2_full_dnode
*
fn
);
370
uint32_t
jffs2_truncate_fragtree
(
struct
jffs2_sb_info
*
c
,
struct
rb_root
*
list
,
uint32_t
size
);
371
struct
jffs2_raw_node_ref
*
jffs2_link_node_ref
(
struct
jffs2_sb_info
*
c
,
372
struct
jffs2_eraseblock
*jeb,
373
uint32_t
ofs,
uint32_t
len,
374
struct
jffs2_inode_cache
*ic);
375
extern
uint32_t
__jffs2_ref_totlen
(
struct
jffs2_sb_info
*
c
,
376
struct
jffs2_eraseblock
*jeb,
377
struct
jffs2_raw_node_ref
*ref);
378
379
/* nodemgmt.c */
380
int
jffs2_thread_should_wake
(
struct
jffs2_sb_info
*
c
);
381
int
jffs2_reserve_space
(
struct
jffs2_sb_info
*
c
,
uint32_t
minsize
,
382
uint32_t
*len,
int
prio
,
uint32_t
sumsize);
383
int
jffs2_reserve_space_gc
(
struct
jffs2_sb_info
*
c
,
uint32_t
minsize
,
384
uint32_t
*len,
uint32_t
sumsize);
385
struct
jffs2_raw_node_ref
*
jffs2_add_physical_node_ref
(
struct
jffs2_sb_info
*
c
,
386
uint32_t
ofs,
uint32_t
len,
387
struct
jffs2_inode_cache
*ic);
388
void
jffs2_complete_reservation
(
struct
jffs2_sb_info
*
c
);
389
void
jffs2_mark_node_obsolete
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_raw_node_ref
*raw);
390
391
/* write.c */
392
int
jffs2_do_new_inode
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*
f
,
uint32_t
mode
,
struct
jffs2_raw_inode
*ri);
393
394
struct
jffs2_full_dnode
*
jffs2_write_dnode
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*
f
,
395
struct
jffs2_raw_inode
*ri,
const
unsigned
char
*
data
,
396
uint32_t
datalen
,
int
alloc_mode);
397
struct
jffs2_full_dirent
*
jffs2_write_dirent
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*
f
,
398
struct
jffs2_raw_dirent
*
rd
,
const
unsigned
char
*
name
,
399
uint32_t
namelen
,
int
alloc_mode);
400
int
jffs2_write_inode_range
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*
f
,
401
struct
jffs2_raw_inode
*ri,
unsigned
char
*
buf
,
402
uint32_t
offset
,
uint32_t
writelen,
uint32_t
*retlen);
403
int
jffs2_do_create
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*dir_f,
struct
jffs2_inode_info
*
f
,
404
struct
jffs2_raw_inode
*ri,
const
struct
qstr
*
qstr
);
405
int
jffs2_do_unlink
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*dir_f,
const
char
*
name
,
406
int
namelen
,
struct
jffs2_inode_info
*dead_f,
uint32_t
time
);
407
int
jffs2_do_link
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*dir_f,
uint32_t
ino
,
408
uint8_t
type
,
const
char
*
name
,
int
namelen
,
uint32_t
time
);
409
410
411
/* readinode.c */
412
int
jffs2_do_read_inode
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*
f
,
413
uint32_t
ino
,
struct
jffs2_raw_inode
*latest_node);
414
int
jffs2_do_crccheck_inode
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_cache
*ic);
415
void
jffs2_do_clear_inode
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*
f
);
416
417
/* malloc.c */
418
int
jffs2_create_slab_caches
(
void
);
419
void
jffs2_destroy_slab_caches
(
void
);
420
421
struct
jffs2_full_dirent
*
jffs2_alloc_full_dirent
(
int
namesize);
422
void
jffs2_free_full_dirent
(
struct
jffs2_full_dirent
*);
423
struct
jffs2_full_dnode
*
jffs2_alloc_full_dnode
(
void
);
424
void
jffs2_free_full_dnode
(
struct
jffs2_full_dnode
*);
425
struct
jffs2_raw_dirent
*
jffs2_alloc_raw_dirent
(
void
);
426
void
jffs2_free_raw_dirent
(
struct
jffs2_raw_dirent
*);
427
struct
jffs2_raw_inode
*
jffs2_alloc_raw_inode
(
void
);
428
void
jffs2_free_raw_inode
(
struct
jffs2_raw_inode
*);
429
struct
jffs2_tmp_dnode_info
*
jffs2_alloc_tmp_dnode_info
(
void
);
430
void
jffs2_free_tmp_dnode_info
(
struct
jffs2_tmp_dnode_info
*);
431
int
jffs2_prealloc_raw_node_refs
(
struct
jffs2_sb_info
*
c
,
432
struct
jffs2_eraseblock
*jeb,
int
nr
);
433
void
jffs2_free_refblock
(
struct
jffs2_raw_node_ref
*);
434
struct
jffs2_node_frag
*
jffs2_alloc_node_frag
(
void
);
435
void
jffs2_free_node_frag
(
struct
jffs2_node_frag
*);
436
struct
jffs2_inode_cache
*
jffs2_alloc_inode_cache
(
void
);
437
void
jffs2_free_inode_cache
(
struct
jffs2_inode_cache
*);
438
#ifdef CONFIG_JFFS2_FS_XATTR
439
struct
jffs2_xattr_datum
*jffs2_alloc_xattr_datum(
void
);
440
void
jffs2_free_xattr_datum(
struct
jffs2_xattr_datum
*);
441
struct
jffs2_xattr_ref
*jffs2_alloc_xattr_ref(
void
);
442
void
jffs2_free_xattr_ref(
struct
jffs2_xattr_ref
*);
443
#endif
444
445
/* gc.c */
446
int
jffs2_garbage_collect_pass
(
struct
jffs2_sb_info
*
c
);
447
448
/* read.c */
449
int
jffs2_read_dnode
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*
f
,
450
struct
jffs2_full_dnode
*
fd
,
unsigned
char
*
buf
,
451
int
ofs,
int
len);
452
int
jffs2_read_inode_range
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*
f
,
453
unsigned
char
*
buf
,
uint32_t
offset
,
uint32_t
len);
454
char
*
jffs2_getlink
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_inode_info
*
f
);
455
456
/* scan.c */
457
int
jffs2_scan_medium
(
struct
jffs2_sb_info
*
c
);
458
void
jffs2_rotate_lists
(
struct
jffs2_sb_info
*
c
);
459
struct
jffs2_inode_cache
*
jffs2_scan_make_ino_cache
(
struct
jffs2_sb_info
*
c
,
uint32_t
ino
);
460
int
jffs2_scan_classify_jeb
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_eraseblock
*jeb);
461
int
jffs2_scan_dirty_space
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_eraseblock
*jeb,
uint32_t
size
);
462
463
/* build.c */
464
int
jffs2_do_mount_fs
(
struct
jffs2_sb_info
*
c
);
465
466
/* erase.c */
467
int
jffs2_erase_pending_blocks
(
struct
jffs2_sb_info
*
c
,
int
count
);
468
void
jffs2_free_jeb_node_refs
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_eraseblock
*jeb);
469
470
#ifdef CONFIG_JFFS2_FS_WRITEBUFFER
471
/* wbuf.c */
472
int
jffs2_flush_wbuf_gc
(
struct
jffs2_sb_info
*
c
,
uint32_t
ino
);
473
int
jffs2_flush_wbuf_pad
(
struct
jffs2_sb_info
*
c
);
474
int
jffs2_check_nand_cleanmarker
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_eraseblock
*jeb);
475
int
jffs2_write_nand_cleanmarker
(
struct
jffs2_sb_info
*
c
,
struct
jffs2_eraseblock
*jeb);
476
#endif
477
478
#include "
debug.h
"
479
480
#endif
/* __JFFS2_NODELIST_H__ */
Generated on Thu Jan 10 2013 14:47:41 for Linux Kernel by
1.8.2