Blame view

fs/jffs2/nodelist.h 17.8 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
  /*
   * JFFS2 -- Journalling Flash File System, Version 2.
   *
c00c310ea   David Woodhouse   [JFFS2] Tidy up l...
4
   * Copyright © 2001-2007 Red Hat, Inc.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5
6
7
8
9
   *
   * Created by David Woodhouse <dwmw2@infradead.org>
   *
   * For licensing information, see the file 'LICENCE' in this directory.
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
10
11
12
13
   */
  
  #ifndef __JFFS2_NODELIST_H__
  #define __JFFS2_NODELIST_H__
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
14
15
16
  #include <linux/fs.h>
  #include <linux/types.h>
  #include <linux/jffs2.h>
cbb9a5617   David Woodhouse   Move jffs2_fs_i.h...
17
18
  #include "jffs2_fs_sb.h"
  #include "jffs2_fs_i.h"
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
19
20
  #include "xattr.h"
  #include "acl.h"
e631ddba5   Ferenc Havasi   [JFFS2] Add erase...
21
  #include "summary.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
22
23
24
25
  
  #ifdef __ECOS
  #include "os-ecos.h"
  #else
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26
27
  #include "os-linux.h"
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
28
29
30
31
32
33
34
35
36
  #define JFFS2_NATIVE_ENDIAN
  
  /* Note we handle mode bits conversion from JFFS2 (i.e. Linux) to/from
     whatever OS we're actually running on here too. */
  
  #if defined(JFFS2_NATIVE_ENDIAN)
  #define cpu_to_je16(x) ((jint16_t){x})
  #define cpu_to_je32(x) ((jint32_t){x})
  #define cpu_to_jemode(x) ((jmode_t){os_to_jffs2_mode(x)})
566865a2a   David Woodhouse   [JFFS2] Fix cross...
37
38
  #define constant_cpu_to_je16(x) ((jint16_t){x})
  #define constant_cpu_to_je32(x) ((jint32_t){x})
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
39
40
41
42
43
44
45
  #define je16_to_cpu(x) ((x).v16)
  #define je32_to_cpu(x) ((x).v32)
  #define jemode_to_cpu(x) (jffs2_to_os_mode((x).m))
  #elif defined(JFFS2_BIG_ENDIAN)
  #define cpu_to_je16(x) ((jint16_t){cpu_to_be16(x)})
  #define cpu_to_je32(x) ((jint32_t){cpu_to_be32(x)})
  #define cpu_to_jemode(x) ((jmode_t){cpu_to_be32(os_to_jffs2_mode(x))})
566865a2a   David Woodhouse   [JFFS2] Fix cross...
46
47
  #define constant_cpu_to_je16(x) ((jint16_t){__constant_cpu_to_be16(x)})
  #define constant_cpu_to_je32(x) ((jint32_t){__constant_cpu_to_be32(x)})
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
48
49
50
51
52
53
54
  #define je16_to_cpu(x) (be16_to_cpu(x.v16))
  #define je32_to_cpu(x) (be32_to_cpu(x.v32))
  #define jemode_to_cpu(x) (be32_to_cpu(jffs2_to_os_mode((x).m)))
  #elif defined(JFFS2_LITTLE_ENDIAN)
  #define cpu_to_je16(x) ((jint16_t){cpu_to_le16(x)})
  #define cpu_to_je32(x) ((jint32_t){cpu_to_le32(x)})
  #define cpu_to_jemode(x) ((jmode_t){cpu_to_le32(os_to_jffs2_mode(x))})
566865a2a   David Woodhouse   [JFFS2] Fix cross...
55
56
  #define constant_cpu_to_je16(x) ((jint16_t){__constant_cpu_to_le16(x)})
  #define constant_cpu_to_je32(x) ((jint32_t){__constant_cpu_to_le32(x)})
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
57
58
59
  #define je16_to_cpu(x) (le16_to_cpu(x.v16))
  #define je32_to_cpu(x) (le32_to_cpu(x.v32))
  #define jemode_to_cpu(x) (le32_to_cpu(jffs2_to_os_mode((x).m)))
182ec4eee   Thomas Gleixner   [JFFS2] Clean up ...
60
  #else
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
61
62
  #error wibble
  #endif
1e0da3cb6   Artem B. Bityutskiy   [JFFS2] Build fra...
63
64
  /* The minimal node header size */
  #define JFFS2_MIN_NODE_HEADER sizeof(struct jffs2_raw_dirent)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
65
66
67
  /*
    This is all we need to keep in-core for each raw node during normal
    operation. As and when we do read_inode on a particular inode, we can
182ec4eee   Thomas Gleixner   [JFFS2] Clean up ...
68
    scan the nodes which are listed for it and build up a proper map of
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
69
70
71
72
73
74
    which nodes are currently valid. JFFSv1 always used to keep that whole
    map in core for each inode.
  */
  struct jffs2_raw_node_ref
  {
  	struct jffs2_raw_node_ref *next_in_ino; /* Points to the next raw_node_ref
987d47b71   David Woodhouse   [JFFS2] Put list ...
75
76
77
  		for this object. If this _is_ the last, it points to the inode_cache,
  		xattr_ref or xattr_datum instead. The common part of those structures
  		has NULL in the first word. See jffs2_raw_ref_to_ic() below */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
78
  	uint32_t flash_offset;
19e56ceae   David Woodhouse   [JFFS2] Finally r...
79
  #undef TEST_TOTLEN
ca89a517f   David Woodhouse   [JFFS2] Finally e...
80
  #ifdef TEST_TOTLEN
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81
  	uint32_t __totlen; /* This may die; use ref_totlen(c, jeb, ) below */
ca89a517f   David Woodhouse   [JFFS2] Finally e...
82
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
83
  };
9bfeb691e   David Woodhouse   [JFFS2] Switch to...
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
  #define REF_LINK_NODE ((int32_t)-1)
  #define REF_EMPTY_NODE ((int32_t)-2)
  
  /* Use blocks of about 256 bytes */
  #define REFS_PER_BLOCK ((255/sizeof(struct jffs2_raw_node_ref))-1)
  
  static inline struct jffs2_raw_node_ref *ref_next(struct jffs2_raw_node_ref *ref)
  {
  	ref++;
  
  	/* Link to another block of refs */
  	if (ref->flash_offset == REF_LINK_NODE) {
  		ref = ref->next_in_ino;
  		if (!ref)
  			return ref;
  	}
  
  	/* End of chain */
  	if (ref->flash_offset == REF_EMPTY_NODE)
  		return NULL;
  
  	return ref;
  }
99988f7bb   David Woodhouse   [JFFS2] Introduce...
107

987d47b71   David Woodhouse   [JFFS2] Put list ...
108
109
  static inline struct jffs2_inode_cache *jffs2_raw_ref_to_ic(struct jffs2_raw_node_ref *raw)
  {
99988f7bb   David Woodhouse   [JFFS2] Introduce...
110
  	while(raw->next_in_ino)
987d47b71   David Woodhouse   [JFFS2] Put list ...
111
  		raw = raw->next_in_ino;
987d47b71   David Woodhouse   [JFFS2] Put list ...
112
113
114
115
116
  
  	/* NB. This can be a jffs2_xattr_datum or jffs2_xattr_ref and
  	   not actually a jffs2_inode_cache. Check ->class */
  	return ((struct jffs2_inode_cache *)raw);
  }
ef53cb02f   David Woodhouse   [JFFS2] Whitespac...
117
  	/* flash_offset & 3 always has to be zero, because nodes are
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
118
  	   always aligned at 4 bytes. So we have a couple of extra bits
182ec4eee   Thomas Gleixner   [JFFS2] Clean up ...
119
  	   to play with, which indicate the node's status; see below: */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
120
121
122
123
124
125
126
127
  #define REF_UNCHECKED	0	/* We haven't yet checked the CRC or built its inode */
  #define REF_OBSOLETE	1	/* Obsolete, can be completely ignored */
  #define REF_PRISTINE	2	/* Completely clean. GC without looking */
  #define REF_NORMAL	3	/* Possibly overlapped. Read the page and write again on GC */
  #define ref_flags(ref)		((ref)->flash_offset & 3)
  #define ref_offset(ref)		((ref)->flash_offset & ~3)
  #define ref_obsolete(ref)	(((ref)->flash_offset & 3) == REF_OBSOLETE)
  #define mark_ref_normal(ref)    do { (ref)->flash_offset = ref_offset(ref) | REF_NORMAL; } while(0)
6171586a7   David Woodhouse   [JFFS2] Correct h...
128

43dfa07fb   David Woodhouse   [JFFS2] Deletion ...
129
130
131
132
  /* Dirent nodes should be REF_PRISTINE only if they are not a deletion
     dirent. Deletion dirents should be REF_NORMAL so that GC gets to
     throw them away when appropriate */
  #define dirent_node_state(rd)	( (je32_to_cpu((rd)->ino)?REF_PRISTINE:REF_NORMAL) )
6171586a7   David Woodhouse   [JFFS2] Correct h...
133
134
135
136
  /* NB: REF_PRISTINE for an inode-less node (ref->next_in_ino == NULL) indicates
     it is an unknown node of type JFFS2_NODETYPE_RWCOMPAT_COPY, so it'll get
     copied. If you need to do anything different to GC inode-less nodes, then
     you need to modify gc.c accordingly. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
137
138
139
140
  
  /* For each inode in the filesystem, we need to keep a record of
     nlink, because it would be a PITA to scan the whole directory tree
     at read_inode() time to calculate it, and to keep sufficient information
182ec4eee   Thomas Gleixner   [JFFS2] Clean up ...
141
     in the raw_node_ref (basically both parent and child inode number for
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
142
143
144
145
     dirent nodes) would take more space than this does. We also keep
     a pointer to the first physical node which is part of this inode, too.
  */
  struct jffs2_inode_cache {
987d47b71   David Woodhouse   [JFFS2] Put list ...
146
147
148
  	/* First part of structure is shared with other objects which
  	   can terminate the raw node refs' next_in_ino list -- which
  	   currently struct jffs2_xattr_datum and struct jffs2_xattr_ref. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
149
150
151
152
  	struct jffs2_full_dirent *scan_dents; /* Used during scan to hold
  		temporary lists of dirents, and later must be set to
  		NULL to mark the end of the raw_node_ref->next_in_ino
  		chain. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
153
  	struct jffs2_raw_node_ref *nodes;
987d47b71   David Woodhouse   [JFFS2] Put list ...
154
155
156
157
158
159
  	uint8_t class;	/* It's used for identification */
  
  	/* end of shared structure */
  
  	uint8_t flags;
  	uint16_t state;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
160
  	uint32_t ino;
987d47b71   David Woodhouse   [JFFS2] Put list ...
161
  	struct jffs2_inode_cache *next;
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
162
  #ifdef CONFIG_JFFS2_FS_XATTR
8f2b6f49c   KaiGai Kohei   [JFFS2][XATTR] Re...
163
  	struct jffs2_xattr_ref *xref;
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
164
  #endif
27c72b040   David Woodhouse   [JFFS2] Track par...
165
166
167
168
  	uint32_t pino_nlink;	/* Directories store parent inode
  				   here; other inodes store nlink.
  				   Zero always means that it's
  				   completely unlinked. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
169
170
171
172
173
174
175
176
177
178
179
  };
  
  /* Inode states for 'state' above. We need the 'GC' state to prevent
     someone from doing a read_inode() while we're moving a 'REF_PRISTINE'
     node without going through all the iget() nonsense */
  #define INO_STATE_UNCHECKED	0	/* CRC checks not yet done */
  #define INO_STATE_CHECKING	1	/* CRC checks in progress */
  #define INO_STATE_PRESENT	2	/* In core */
  #define INO_STATE_CHECKEDABSENT	3	/* Checked, cleared again */
  #define INO_STATE_GC		4	/* GCing a 'pristine' node */
  #define INO_STATE_READING	5	/* In read_inode() */
67e345d17   David Woodhouse   [JFFS2] Prevent i...
180
  #define INO_STATE_CLEARING	6	/* In clear_inode() */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
181

aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
182
183
184
185
186
  #define INO_FLAGS_XATTR_CHECKED	0x01	/* has no duplicate xattr_ref */
  
  #define RAWNODE_CLASS_INODE_CACHE	0
  #define RAWNODE_CLASS_XATTR_DATUM	1
  #define RAWNODE_CLASS_XATTR_REF		2
65e5a0e18   Daniel Drake   jffs2: Dynamicall...
187
188
  #define INOCACHE_HASHSIZE_MIN 128
  #define INOCACHE_HASHSIZE_MAX 1024
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
189

9fe4854cd   David Woodhouse   [JFFS2] Remove fl...
190
  #define write_ofs(c) ((c)->nextblock->offset + (c)->sector_size - (c)->nextblock->free_size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
191
  /*
182ec4eee   Thomas Gleixner   [JFFS2] Clean up ...
192
    Larger representation of a raw node, kept in-core only when the
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
193
194
195
196
197
198
199
200
201
    struct inode for this particular ino is instantiated.
  */
  
  struct jffs2_full_dnode
  {
  	struct jffs2_raw_node_ref *raw;
  	uint32_t ofs; /* The offset to which the data of this node belongs */
  	uint32_t size;
  	uint32_t frags; /* Number of fragments which currently refer
182ec4eee   Thomas Gleixner   [JFFS2] Clean up ...
202
  			to this node. When this reaches zero,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
203
204
  			the node is obsolete.  */
  };
182ec4eee   Thomas Gleixner   [JFFS2] Clean up ...
205
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
206
207
208
209
210
211
     Even larger representation of a raw node, kept in-core only while
     we're actually building up the original map of which nodes go where,
     in read_inode()
  */
  struct jffs2_tmp_dnode_info
  {
9dee7503c   David Woodhouse   [JFFS2] Optimise ...
212
  	struct rb_node rb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
213
214
  	struct jffs2_full_dnode *fn;
  	uint32_t version;
1e0da3cb6   Artem B. Bityutskiy   [JFFS2] Build fra...
215
216
  	uint32_t data_crc;
  	uint32_t partial_crc;
df8e96f39   David Woodhouse   [JFFS2] Improve r...
217
218
219
220
221
222
223
224
225
226
227
228
229
230
  	uint16_t csize;
  	uint16_t overlapped;
  };
  
  /* Temporary data structure used during readinode. */
  struct jffs2_readinode_info
  {
  	struct rb_root tn_root;
  	struct jffs2_tmp_dnode_info *mdata_tn;
  	uint32_t highest_version;
  	uint32_t latest_mctime;
  	uint32_t mctime_ver;
  	struct jffs2_full_dirent *fds;
  	struct jffs2_raw_node_ref *latest_ref;
182ec4eee   Thomas Gleixner   [JFFS2] Clean up ...
231
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
232
233
234
235
236
237
238
239
240
241
242
243
244
  
  struct jffs2_full_dirent
  {
  	struct jffs2_raw_node_ref *raw;
  	struct jffs2_full_dirent *next;
  	uint32_t version;
  	uint32_t ino; /* == zero for unlink */
  	unsigned int nhash;
  	unsigned char type;
  	unsigned char name[0];
  };
  
  /*
182ec4eee   Thomas Gleixner   [JFFS2] Clean up ...
245
    Fragments - used to build a map of which raw node to obtain
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
    data from for each part of the ino
  */
  struct jffs2_node_frag
  {
  	struct rb_node rb;
  	struct jffs2_full_dnode *node; /* NULL for holes */
  	uint32_t size;
  	uint32_t ofs; /* The offset to which this fragment belongs */
  };
  
  struct jffs2_eraseblock
  {
  	struct list_head list;
  	int bad_count;
  	uint32_t offset;		/* of this block in the MTD */
  
  	uint32_t unchecked_size;
  	uint32_t used_size;
  	uint32_t dirty_size;
  	uint32_t wasted_size;
  	uint32_t free_size;	/* Note that sector_size - free_size
  				   is the address of the first free space */
9bfeb691e   David Woodhouse   [JFFS2] Switch to...
268
  	uint32_t allocated_refs;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
269
270
271
272
273
  	struct jffs2_raw_node_ref *first_node;
  	struct jffs2_raw_node_ref *last_node;
  
  	struct jffs2_raw_node_ref *gc_node;	/* Next node to be garbage collected */
  };
4ce1f5621   Ferenc Havasi   [JFFS2] Remove su...
274
275
276
277
  static inline int jffs2_blocks_use_vmalloc(struct jffs2_sb_info *c)
  {
  	return ((c->flash_size / c->sector_size) * sizeof (struct jffs2_eraseblock)) > (128 * 1024);
  }
ca89a517f   David Woodhouse   [JFFS2] Finally e...
278
  #define ref_totlen(a, b, c) __jffs2_ref_totlen((a), (b), (c))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
279

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
280
281
282
283
284
285
286
287
288
  #define ALLOC_NORMAL	0	/* Normal allocation */
  #define ALLOC_DELETION	1	/* Deletion node. Best to allow it */
  #define ALLOC_GC	2	/* Space requested for GC. Give it or die */
  #define ALLOC_NORETRY	3	/* For jffs2_write_dnode: On failure, return -EAGAIN instead of retrying */
  
  /* How much dirty space before it goes on the very_dirty_list */
  #define VERYDIRTY(c, size) ((size) >= ((c)->sector_size / 2))
  
  /* check if dirty space is more than 255 Byte */
182ec4eee   Thomas Gleixner   [JFFS2] Clean up ...
289
  #define ISDIRTY(size) ((size) >  sizeof (struct jffs2_raw_inode) + JFFS2_MIN_DATA_LEN)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
290
291
  
  #define PAD(x) (((x)+3)&~3)
aef9ab478   David Woodhouse   [JFFS2] Support n...
292
293
294
  static inline int jffs2_encode_dev(union jffs2_device_node *jdev, dev_t rdev)
  {
  	if (old_valid_dev(rdev)) {
91f802660   Andrew Morton   JFFS2: avoid usin...
295
296
  		jdev->old_id = cpu_to_je16(old_encode_dev(rdev));
  		return sizeof(jdev->old_id);
aef9ab478   David Woodhouse   [JFFS2] Support n...
297
  	} else {
91f802660   Andrew Morton   JFFS2: avoid usin...
298
299
  		jdev->new_id = cpu_to_je32(new_encode_dev(rdev));
  		return sizeof(jdev->new_id);
aef9ab478   David Woodhouse   [JFFS2] Support n...
300
301
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
302
303
  static inline struct jffs2_node_frag *frag_first(struct rb_root *root)
  {
ea7415cca   Akinobu Mita   [JFFS2] Use rb_fi...
304
  	struct rb_node *node = rb_first(root);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
305
306
307
  
  	if (!node)
  		return NULL;
ea7415cca   Akinobu Mita   [JFFS2] Use rb_fi...
308

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
309
310
  	return rb_entry(node, struct jffs2_node_frag, rb);
  }
8557fd51c   Artem B. Bityuckiy   [JFFS2] Fix race ...
311
312
313
  
  static inline struct jffs2_node_frag *frag_last(struct rb_root *root)
  {
ea7415cca   Akinobu Mita   [JFFS2] Use rb_fi...
314
  	struct rb_node *node = rb_last(root);
8557fd51c   Artem B. Bityuckiy   [JFFS2] Fix race ...
315
316
317
  
  	if (!node)
  		return NULL;
ea7415cca   Akinobu Mita   [JFFS2] Use rb_fi...
318

8557fd51c   Artem B. Bityuckiy   [JFFS2] Fix race ...
319
320
  	return rb_entry(node, struct jffs2_node_frag, rb);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
321
322
323
324
325
326
  #define frag_next(frag) rb_entry(rb_next(&(frag)->rb), struct jffs2_node_frag, rb)
  #define frag_prev(frag) rb_entry(rb_prev(&(frag)->rb), struct jffs2_node_frag, rb)
  #define frag_parent(frag) rb_entry(rb_parent(&(frag)->rb), struct jffs2_node_frag, rb)
  #define frag_left(frag) rb_entry((frag)->rb.rb_left, struct jffs2_node_frag, rb)
  #define frag_right(frag) rb_entry((frag)->rb.rb_right, struct jffs2_node_frag, rb)
  #define frag_erase(frag, list) rb_erase(&frag->rb, list);
df8e96f39   David Woodhouse   [JFFS2] Improve r...
327
328
329
330
331
332
333
334
  #define tn_next(tn) rb_entry(rb_next(&(tn)->rb), struct jffs2_tmp_dnode_info, rb)
  #define tn_prev(tn) rb_entry(rb_prev(&(tn)->rb), struct jffs2_tmp_dnode_info, rb)
  #define tn_parent(tn) rb_entry(rb_parent(&(tn)->rb), struct jffs2_tmp_dnode_info, rb)
  #define tn_left(tn) rb_entry((tn)->rb.rb_left, struct jffs2_tmp_dnode_info, rb)
  #define tn_right(tn) rb_entry((tn)->rb.rb_right, struct jffs2_tmp_dnode_info, rb)
  #define tn_erase(tn, list) rb_erase(&tn->rb, list);
  #define tn_last(list) rb_entry(rb_last(list), struct jffs2_tmp_dnode_info, rb)
  #define tn_first(list) rb_entry(rb_first(list), struct jffs2_tmp_dnode_info, rb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
335
  /* nodelist.c */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
336
  void jffs2_add_fd_to_list(struct jffs2_sb_info *c, struct jffs2_full_dirent *new, struct jffs2_full_dirent **list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
337
338
339
340
341
342
343
344
  void jffs2_set_inocache_state(struct jffs2_sb_info *c, struct jffs2_inode_cache *ic, int state);
  struct jffs2_inode_cache *jffs2_get_ino_cache(struct jffs2_sb_info *c, uint32_t ino);
  void jffs2_add_ino_cache (struct jffs2_sb_info *c, struct jffs2_inode_cache *new);
  void jffs2_del_ino_cache(struct jffs2_sb_info *c, struct jffs2_inode_cache *old);
  void jffs2_free_ino_caches(struct jffs2_sb_info *c);
  void jffs2_free_raw_node_refs(struct jffs2_sb_info *c);
  struct jffs2_node_frag *jffs2_lookup_node_frag(struct rb_root *fragtree, uint32_t offset);
  void jffs2_kill_fragtree(struct rb_root *root, struct jffs2_sb_info *c_delete);
f97117d15   Artem B. Bityutskiy   [JFFS2] Move scat...
345
  int jffs2_add_full_dnode_to_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_full_dnode *fn);
61c4b2377   David Woodhouse   [JFFS2] Handle in...
346
  uint32_t jffs2_truncate_fragtree (struct jffs2_sb_info *c, struct rb_root *list, uint32_t size);
2f785402f   David Woodhouse   [JFFS2] Reduce vi...
347
348
349
350
  struct jffs2_raw_node_ref *jffs2_link_node_ref(struct jffs2_sb_info *c,
  					       struct jffs2_eraseblock *jeb,
  					       uint32_t ofs, uint32_t len,
  					       struct jffs2_inode_cache *ic);
ca89a517f   David Woodhouse   [JFFS2] Finally e...
351
352
353
  extern uint32_t __jffs2_ref_totlen(struct jffs2_sb_info *c,
  				   struct jffs2_eraseblock *jeb,
  				   struct jffs2_raw_node_ref *ref);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
354
355
356
  
  /* nodemgmt.c */
  int jffs2_thread_should_wake(struct jffs2_sb_info *c);
9fe4854cd   David Woodhouse   [JFFS2] Remove fl...
357
  int jffs2_reserve_space(struct jffs2_sb_info *c, uint32_t minsize,
e631ddba5   Ferenc Havasi   [JFFS2] Add erase...
358
  			uint32_t *len, int prio, uint32_t sumsize);
9fe4854cd   David Woodhouse   [JFFS2] Remove fl...
359
  int jffs2_reserve_space_gc(struct jffs2_sb_info *c, uint32_t minsize,
e631ddba5   Ferenc Havasi   [JFFS2] Add erase...
360
  			uint32_t *len, uint32_t sumsize);
2f785402f   David Woodhouse   [JFFS2] Reduce vi...
361
362
363
  struct jffs2_raw_node_ref *jffs2_add_physical_node_ref(struct jffs2_sb_info *c, 
  						       uint32_t ofs, uint32_t len,
  						       struct jffs2_inode_cache *ic);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
364
365
  void jffs2_complete_reservation(struct jffs2_sb_info *c);
  void jffs2_mark_node_obsolete(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *raw);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
366
367
368
  
  /* write.c */
  int jffs2_do_new_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, uint32_t mode, struct jffs2_raw_inode *ri);
9fe4854cd   David Woodhouse   [JFFS2] Remove fl...
369
370
371
372
373
374
  struct jffs2_full_dnode *jffs2_write_dnode(struct jffs2_sb_info *c, struct jffs2_inode_info *f,
  					   struct jffs2_raw_inode *ri, const unsigned char *data,
  					   uint32_t datalen, int alloc_mode);
  struct jffs2_full_dirent *jffs2_write_dirent(struct jffs2_sb_info *c, struct jffs2_inode_info *f,
  					     struct jffs2_raw_dirent *rd, const unsigned char *name,
  					     uint32_t namelen, int alloc_mode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
375
  int jffs2_write_inode_range(struct jffs2_sb_info *c, struct jffs2_inode_info *f,
182ec4eee   Thomas Gleixner   [JFFS2] Clean up ...
376
  			    struct jffs2_raw_inode *ri, unsigned char *buf,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
377
  			    uint32_t offset, uint32_t writelen, uint32_t *retlen);
9fe4854cd   David Woodhouse   [JFFS2] Remove fl...
378
  int jffs2_do_create(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, struct jffs2_inode_info *f,
2a7dba391   Eric Paris   fs/vfs/security: ...
379
  		    struct jffs2_raw_inode *ri, const struct qstr *qstr);
9fe4854cd   David Woodhouse   [JFFS2] Remove fl...
380
381
382
383
  int jffs2_do_unlink(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, const char *name,
  		    int namelen, struct jffs2_inode_info *dead_f, uint32_t time);
  int jffs2_do_link(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, uint32_t ino,
  		   uint8_t type, const char *name, int namelen, uint32_t time);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
384
385
386
  
  
  /* readinode.c */
182ec4eee   Thomas Gleixner   [JFFS2] Clean up ...
387
  int jffs2_do_read_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
  			uint32_t ino, struct jffs2_raw_inode *latest_node);
  int jffs2_do_crccheck_inode(struct jffs2_sb_info *c, struct jffs2_inode_cache *ic);
  void jffs2_do_clear_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f);
  
  /* malloc.c */
  int jffs2_create_slab_caches(void);
  void jffs2_destroy_slab_caches(void);
  
  struct jffs2_full_dirent *jffs2_alloc_full_dirent(int namesize);
  void jffs2_free_full_dirent(struct jffs2_full_dirent *);
  struct jffs2_full_dnode *jffs2_alloc_full_dnode(void);
  void jffs2_free_full_dnode(struct jffs2_full_dnode *);
  struct jffs2_raw_dirent *jffs2_alloc_raw_dirent(void);
  void jffs2_free_raw_dirent(struct jffs2_raw_dirent *);
  struct jffs2_raw_inode *jffs2_alloc_raw_inode(void);
  void jffs2_free_raw_inode(struct jffs2_raw_inode *);
  struct jffs2_tmp_dnode_info *jffs2_alloc_tmp_dnode_info(void);
  void jffs2_free_tmp_dnode_info(struct jffs2_tmp_dnode_info *);
9bfeb691e   David Woodhouse   [JFFS2] Switch to...
406
  int jffs2_prealloc_raw_node_refs(struct jffs2_sb_info *c,
046b8b980   David Woodhouse   [JFFS2] Add 'jeb'...
407
  				 struct jffs2_eraseblock *jeb, int nr);
9bfeb691e   David Woodhouse   [JFFS2] Switch to...
408
  void jffs2_free_refblock(struct jffs2_raw_node_ref *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
409
410
411
412
  struct jffs2_node_frag *jffs2_alloc_node_frag(void);
  void jffs2_free_node_frag(struct jffs2_node_frag *);
  struct jffs2_inode_cache *jffs2_alloc_inode_cache(void);
  void jffs2_free_inode_cache(struct jffs2_inode_cache *);
aa98d7cf5   KaiGai Kohei   [JFFS2][XATTR] XA...
413
414
415
416
417
418
  #ifdef CONFIG_JFFS2_FS_XATTR
  struct jffs2_xattr_datum *jffs2_alloc_xattr_datum(void);
  void jffs2_free_xattr_datum(struct jffs2_xattr_datum *);
  struct jffs2_xattr_ref *jffs2_alloc_xattr_ref(void);
  void jffs2_free_xattr_ref(struct jffs2_xattr_ref *);
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
  
  /* gc.c */
  int jffs2_garbage_collect_pass(struct jffs2_sb_info *c);
  
  /* read.c */
  int jffs2_read_dnode(struct jffs2_sb_info *c, struct jffs2_inode_info *f,
  		     struct jffs2_full_dnode *fd, unsigned char *buf,
  		     int ofs, int len);
  int jffs2_read_inode_range(struct jffs2_sb_info *c, struct jffs2_inode_info *f,
  			   unsigned char *buf, uint32_t offset, uint32_t len);
  char *jffs2_getlink(struct jffs2_sb_info *c, struct jffs2_inode_info *f);
  
  /* scan.c */
  int jffs2_scan_medium(struct jffs2_sb_info *c);
  void jffs2_rotate_lists(struct jffs2_sb_info *c);
e631ddba5   Ferenc Havasi   [JFFS2] Add erase...
434
435
  struct jffs2_inode_cache *jffs2_scan_make_ino_cache(struct jffs2_sb_info *c, uint32_t ino);
  int jffs2_scan_classify_jeb(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb);
68270995f   David Woodhouse   [JFFS2] Introduce...
436
  int jffs2_scan_dirty_space(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, uint32_t size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
437
438
439
440
441
  
  /* build.c */
  int jffs2_do_mount_fs(struct jffs2_sb_info *c);
  
  /* erase.c */
9957abea3   Joakim Tjernlund   jffs2: Add 'work_...
442
  int jffs2_erase_pending_blocks(struct jffs2_sb_info *c, int count);
c38c1b613   David Woodhouse   [JFFS2] jffs2_fre...
443
  void jffs2_free_jeb_node_refs(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
444

2f82ce1eb   Andrew Victor   [JFFS2] Use a sin...
445
  #ifdef CONFIG_JFFS2_FS_WRITEBUFFER
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
446
447
448
449
450
451
  /* wbuf.c */
  int jffs2_flush_wbuf_gc(struct jffs2_sb_info *c, uint32_t ino);
  int jffs2_flush_wbuf_pad(struct jffs2_sb_info *c);
  int jffs2_check_nand_cleanmarker(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb);
  int jffs2_write_nand_cleanmarker(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb);
  #endif
730554d94   Artem B. Bityutskiy   [JFFS2] Debug cod...
452
  #include "debug.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
453
  #endif /* __JFFS2_NODELIST_H__ */