]> bbs.cooldavid.org Git - net-next-2.6.git/blame - fs/jffs2/readinode.c
[MTD] Restore MTD_ROM and MTD_RAM types
[net-next-2.6.git] / fs / jffs2 / readinode.c
CommitLineData
1da177e4
LT
1/*
2 * JFFS2 -- Journalling Flash File System, Version 2.
3 *
4 * Copyright (C) 2001-2003 Red Hat, Inc.
5 *
6 * Created by David Woodhouse <dwmw2@infradead.org>
7 *
8 * For licensing information, see the file 'LICENCE' in this directory.
9 *
182ec4ee 10 * $Id: readinode.c,v 1.143 2005/11/07 11:14:41 gleixner Exp $
1da177e4
LT
11 *
12 */
13
14#include <linux/kernel.h>
737b7661 15#include <linux/sched.h>
1da177e4
LT
16#include <linux/slab.h>
17#include <linux/fs.h>
18#include <linux/crc32.h>
19#include <linux/pagemap.h>
20#include <linux/mtd/mtd.h>
21#include <linux/compiler.h>
22#include "nodelist.h"
23
1e0da3cb
AB
24/*
25 * Put a new tmp_dnode_info into the temporaty RB-tree, keeping the list in
f97117d1 26 * order of increasing version.
1da177e4 27 */
f97117d1 28static void jffs2_add_tn_to_tree(struct jffs2_tmp_dnode_info *tn, struct rb_root *list)
1da177e4 29{
f97117d1
AB
30 struct rb_node **p = &list->rb_node;
31 struct rb_node * parent = NULL;
32 struct jffs2_tmp_dnode_info *this;
33
34 while (*p) {
35 parent = *p;
36 this = rb_entry(parent, struct jffs2_tmp_dnode_info, rb);
37
38 /* There may actually be a collision here, but it doesn't
39 actually matter. As long as the two nodes with the same
40 version are together, it's all fine. */
1e0da3cb 41 if (tn->version > this->version)
f97117d1
AB
42 p = &(*p)->rb_left;
43 else
44 p = &(*p)->rb_right;
1e0da3cb 45 }
f97117d1
AB
46
47 rb_link_node(&tn->rb, parent, p);
48 rb_insert_color(&tn->rb, list);
49}
1da177e4 50
f97117d1
AB
51static void jffs2_free_tmp_dnode_info_list(struct rb_root *list)
52{
53 struct rb_node *this;
54 struct jffs2_tmp_dnode_info *tn;
55
56 this = list->rb_node;
57
58 /* Now at bottom of tree */
59 while (this) {
60 if (this->rb_left)
61 this = this->rb_left;
62 else if (this->rb_right)
63 this = this->rb_right;
64 else {
65 tn = rb_entry(this, struct jffs2_tmp_dnode_info, rb);
66 jffs2_free_full_dnode(tn->fn);
67 jffs2_free_tmp_dnode_info(tn);
68
69 this = this->rb_parent;
70 if (!this)
71 break;
72
73 if (this->rb_left == &tn->rb)
74 this->rb_left = NULL;
75 else if (this->rb_right == &tn->rb)
76 this->rb_right = NULL;
77 else BUG();
78 }
79 }
80 list->rb_node = NULL;
81}
1da177e4 82
f97117d1
AB
83static void jffs2_free_full_dirent_list(struct jffs2_full_dirent *fd)
84{
85 struct jffs2_full_dirent *next;
336d2ff7 86
f97117d1
AB
87 while (fd) {
88 next = fd->next;
89 jffs2_free_full_dirent(fd);
90 fd = next;
91 }
92}
1da177e4 93
f97117d1
AB
94/* Returns first valid node after 'ref'. May return 'ref' */
95static struct jffs2_raw_node_ref *jffs2_first_valid_node(struct jffs2_raw_node_ref *ref)
96{
97 while (ref && ref->next_in_ino) {
98 if (!ref_obsolete(ref))
99 return ref;
733802d9 100 dbg_noderef("node at 0x%08x is obsoleted. Ignoring.\n", ref_offset(ref));
f97117d1
AB
101 ref = ref->next_in_ino;
102 }
103 return NULL;
104}
1da177e4 105
f97117d1
AB
106/*
107 * Helper function for jffs2_get_inode_nodes().
108 * It is called every time an directory entry node is found.
109 *
110 * Returns: 0 on succes;
111 * 1 if the node should be marked obsolete;
112 * negative error code on failure.
113 */
1e0da3cb 114static inline int read_direntry(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *ref,
0ef675d4 115 struct jffs2_raw_dirent *rd, size_t read, struct jffs2_full_dirent **fdp,
1e0da3cb 116 uint32_t *latest_mctime, uint32_t *mctime_ver)
f97117d1
AB
117{
118 struct jffs2_full_dirent *fd;
182ec4ee 119
f97117d1
AB
120 /* The direntry nodes are checked during the flash scanning */
121 BUG_ON(ref_flags(ref) == REF_UNCHECKED);
122 /* Obsoleted. This cannot happen, surely? dwmw2 20020308 */
123 BUG_ON(ref_obsolete(ref));
182ec4ee 124
f97117d1
AB
125 /* Sanity check */
126 if (unlikely(PAD((rd->nsize + sizeof(*rd))) != PAD(je32_to_cpu(rd->totlen)))) {
e0d60137 127 JFFS2_ERROR("illegal nsize in node at %#08x: nsize %#02x, totlen %#04x\n",
f97117d1
AB
128 ref_offset(ref), rd->nsize, je32_to_cpu(rd->totlen));
129 return 1;
130 }
182ec4ee 131
f97117d1
AB
132 fd = jffs2_alloc_full_dirent(rd->nsize + 1);
133 if (unlikely(!fd))
134 return -ENOMEM;
1da177e4 135
f97117d1
AB
136 fd->raw = ref;
137 fd->version = je32_to_cpu(rd->version);
138 fd->ino = je32_to_cpu(rd->ino);
139 fd->type = rd->type;
1da177e4 140
f97117d1 141 /* Pick out the mctime of the latest dirent */
3a69e0cd 142 if(fd->version > *mctime_ver && je32_to_cpu(rd->mctime)) {
f97117d1
AB
143 *mctime_ver = fd->version;
144 *latest_mctime = je32_to_cpu(rd->mctime);
1da177e4
LT
145 }
146
182ec4ee 147 /*
f97117d1
AB
148 * Copy as much of the name as possible from the raw
149 * dirent we've already read from the flash.
150 */
151 if (read > sizeof(*rd))
152 memcpy(&fd->name[0], &rd->name[0],
153 min_t(uint32_t, rd->nsize, (read - sizeof(*rd)) ));
182ec4ee 154
f97117d1
AB
155 /* Do we need to copy any more of the name directly from the flash? */
156 if (rd->nsize + sizeof(*rd) > read) {
157 /* FIXME: point() */
158 int err;
159 int already = read - sizeof(*rd);
182ec4ee
TG
160
161 err = jffs2_flash_read(c, (ref_offset(ref)) + read,
f97117d1
AB
162 rd->nsize - already, &read, &fd->name[already]);
163 if (unlikely(read != rd->nsize - already) && likely(!err))
164 return -EIO;
182ec4ee 165
f97117d1 166 if (unlikely(err)) {
e0d60137 167 JFFS2_ERROR("read remainder of name: error %d\n", err);
f97117d1
AB
168 jffs2_free_full_dirent(fd);
169 return -EIO;
1da177e4
LT
170 }
171 }
182ec4ee 172
f97117d1
AB
173 fd->nhash = full_name_hash(fd->name, rd->nsize);
174 fd->next = NULL;
175 fd->name[rd->nsize] = '\0';
182ec4ee 176
f97117d1
AB
177 /*
178 * Wheee. We now have a complete jffs2_full_dirent structure, with
182ec4ee 179 * the name in it and everything. Link it into the list
f97117d1 180 */
f97117d1
AB
181 jffs2_add_fd_to_list(c, fd, fdp);
182
1da177e4
LT
183 return 0;
184}
185
f97117d1
AB
186/*
187 * Helper function for jffs2_get_inode_nodes().
188 * It is called every time an inode node is found.
189 *
190 * Returns: 0 on succes;
191 * 1 if the node should be marked obsolete;
192 * negative error code on failure.
193 */
1e0da3cb
AB
194static inline int read_dnode(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *ref,
195 struct jffs2_raw_inode *rd, struct rb_root *tnp, int rdlen,
196 uint32_t *latest_mctime, uint32_t *mctime_ver)
1da177e4 197{
f97117d1 198 struct jffs2_tmp_dnode_info *tn;
1e0da3cb
AB
199 uint32_t len, csize;
200 int ret = 1;
182ec4ee 201
f97117d1
AB
202 /* Obsoleted. This cannot happen, surely? dwmw2 20020308 */
203 BUG_ON(ref_obsolete(ref));
204
1e0da3cb
AB
205 tn = jffs2_alloc_tmp_dnode_info();
206 if (!tn) {
fb6a82c9 207 JFFS2_ERROR("failed to allocate tn (%zu bytes).\n", sizeof(*tn));
1e0da3cb
AB
208 return -ENOMEM;
209 }
210
211 tn->partial_crc = 0;
212 csize = je32_to_cpu(rd->csize);
182ec4ee 213
f97117d1
AB
214 /* If we've never checked the CRCs on this node, check them now */
215 if (ref_flags(ref) == REF_UNCHECKED) {
1e0da3cb 216 uint32_t crc;
f97117d1
AB
217
218 crc = crc32(0, rd, sizeof(*rd) - 8);
219 if (unlikely(crc != je32_to_cpu(rd->node_crc))) {
e0d60137 220 JFFS2_NOTICE("header CRC failed on node at %#08x: read %#08x, calculated %#08x\n",
f97117d1 221 ref_offset(ref), je32_to_cpu(rd->node_crc), crc);
1e0da3cb 222 goto free_out;
f97117d1 223 }
182ec4ee 224
f97117d1
AB
225 /* Sanity checks */
226 if (unlikely(je32_to_cpu(rd->offset) > je32_to_cpu(rd->isize)) ||
227 unlikely(PAD(je32_to_cpu(rd->csize) + sizeof(*rd)) != PAD(je32_to_cpu(rd->totlen)))) {
e0d60137 228 JFFS2_WARNING("inode node header CRC is corrupted at %#08x\n", ref_offset(ref));
737b7661 229 jffs2_dbg_dump_node(c, ref_offset(ref));
1e0da3cb 230 goto free_out;
1da177e4
LT
231 }
232
1e0da3cb
AB
233 if (jffs2_is_writebuffered(c) && csize != 0) {
234 /* At this point we are supposed to check the data CRC
235 * of our unchecked node. But thus far, we do not
236 * know whether the node is valid or obsolete. To
237 * figure this out, we need to walk all the nodes of
238 * the inode and build the inode fragtree. We don't
239 * want to spend time checking data of nodes which may
240 * later be found to be obsolete. So we put off the full
241 * data CRC checking until we have read all the inode
242 * nodes and have started building the fragtree.
243 *
244 * The fragtree is being built starting with nodes
245 * having the highest version number, so we'll be able
246 * to detect whether a node is valid (i.e., it is not
247 * overlapped by a node with higher version) or not.
248 * And we'll be able to check only those nodes, which
249 * are not obsolete.
250 *
251 * Of course, this optimization only makes sense in case
252 * of NAND flashes (or other flashes whith
253 * !jffs2_can_mark_obsolete()), since on NOR flashes
254 * nodes are marked obsolete physically.
255 *
256 * Since NAND flashes (or other flashes with
257 * jffs2_is_writebuffered(c)) are anyway read by
258 * fractions of c->wbuf_pagesize, and we have just read
259 * the node header, it is likely that the starting part
260 * of the node data is also read when we read the
261 * header. So we don't mind to check the CRC of the
262 * starting part of the data of the node now, and check
263 * the second part later (in jffs2_check_node_data()).
264 * Of course, we will not need to re-read and re-check
265 * the NAND page which we have just read. This is why we
266 * read the whole NAND page at jffs2_get_inode_nodes(),
267 * while we needed only the node header.
268 */
269 unsigned char *buf;
270
271 /* 'buf' will point to the start of data */
272 buf = (unsigned char *)rd + sizeof(*rd);
273 /* len will be the read data length */
274 len = min_t(uint32_t, rdlen - sizeof(*rd), csize);
280562b2
AB
275 tn->partial_crc = crc32(0, buf, len);
276
733802d9 277 dbg_readinode("Calculates CRC (%#08x) for %d bytes, csize %d\n", tn->partial_crc, len, csize);
1e0da3cb
AB
278
279 /* If we actually calculated the whole data CRC
280 * and it is wrong, drop the node. */
3c091337 281 if (len >= csize && unlikely(tn->partial_crc != je32_to_cpu(rd->data_crc))) {
39243508
AB
282 JFFS2_NOTICE("wrong data CRC in data node at 0x%08x: read %#08x, calculated %#08x.\n",
283 ref_offset(ref), tn->partial_crc, je32_to_cpu(rd->data_crc));
1e0da3cb 284 goto free_out;
39243508 285 }
1da177e4 286
1e0da3cb
AB
287 } else if (csize == 0) {
288 /*
289 * We checked the header CRC. If the node has no data, adjust
290 * the space accounting now. For other nodes this will be done
291 * later either when the node is marked obsolete or when its
292 * data is checked.
293 */
294 struct jffs2_eraseblock *jeb;
295
733802d9 296 dbg_readinode("the node has no data.\n");
1e0da3cb
AB
297 jeb = &c->blocks[ref->flash_offset / c->sector_size];
298 len = ref_totlen(c, jeb, ref);
299
300 spin_lock(&c->erase_completion_lock);
301 jeb->used_size += len;
302 jeb->unchecked_size -= len;
303 c->used_size += len;
304 c->unchecked_size -= len;
f97117d1 305 ref->flash_offset = ref_offset(ref) | REF_NORMAL;
1e0da3cb 306 spin_unlock(&c->erase_completion_lock);
1da177e4 307 }
1da177e4 308 }
1da177e4 309
f97117d1
AB
310 tn->fn = jffs2_alloc_full_dnode();
311 if (!tn->fn) {
e0d60137 312 JFFS2_ERROR("alloc fn failed\n");
1e0da3cb
AB
313 ret = -ENOMEM;
314 goto free_out;
f97117d1 315 }
182ec4ee 316
f97117d1
AB
317 tn->version = je32_to_cpu(rd->version);
318 tn->fn->ofs = je32_to_cpu(rd->offset);
1e0da3cb
AB
319 tn->data_crc = je32_to_cpu(rd->data_crc);
320 tn->csize = csize;
f97117d1 321 tn->fn->raw = ref;
182ec4ee 322
f97117d1
AB
323 /* There was a bug where we wrote hole nodes out with
324 csize/dsize swapped. Deal with it */
1e0da3cb
AB
325 if (rd->compr == JFFS2_COMPR_ZERO && !je32_to_cpu(rd->dsize) && csize)
326 tn->fn->size = csize;
f97117d1
AB
327 else // normal case...
328 tn->fn->size = je32_to_cpu(rd->dsize);
329
733802d9 330 dbg_readinode("dnode @%08x: ver %u, offset %#04x, dsize %#04x, csize %#04x\n",
280562b2 331 ref_offset(ref), je32_to_cpu(rd->version), je32_to_cpu(rd->offset), je32_to_cpu(rd->dsize), csize);
182ec4ee 332
f97117d1 333 jffs2_add_tn_to_tree(tn, tnp);
1da177e4
LT
334
335 return 0;
1e0da3cb
AB
336
337free_out:
338 jffs2_free_tmp_dnode_info(tn);
339 return ret;
1da177e4
LT
340}
341
f97117d1
AB
342/*
343 * Helper function for jffs2_get_inode_nodes().
344 * It is called every time an unknown node is found.
345 *
346 * Returns: 0 on succes;
347 * 1 if the node should be marked obsolete;
348 * negative error code on failure.
349 */
1e0da3cb 350static inline int read_unknown(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *ref, struct jffs2_unknown_node *un)
1da177e4 351{
f97117d1
AB
352 /* We don't mark unknown nodes as REF_UNCHECKED */
353 BUG_ON(ref_flags(ref) == REF_UNCHECKED);
182ec4ee 354
f97117d1 355 un->nodetype = cpu_to_je16(JFFS2_NODE_ACCURATE | je16_to_cpu(un->nodetype));
1da177e4 356
f97117d1 357 if (crc32(0, un, sizeof(struct jffs2_unknown_node) - 4) != je32_to_cpu(un->hdr_crc)) {
f97117d1 358 /* Hmmm. This should have been caught at scan time. */
e0d60137 359 JFFS2_NOTICE("node header CRC failed at %#08x. But it must have been OK earlier.\n", ref_offset(ref));
737b7661 360 jffs2_dbg_dump_node(c, ref_offset(ref));
f97117d1
AB
361 return 1;
362 } else {
363 switch(je16_to_cpu(un->nodetype) & JFFS2_COMPAT_MASK) {
364
365 case JFFS2_FEATURE_INCOMPAT:
e0d60137
AB
366 JFFS2_ERROR("unknown INCOMPAT nodetype %#04X at %#08x\n",
367 je16_to_cpu(un->nodetype), ref_offset(ref));
f97117d1
AB
368 /* EEP */
369 BUG();
370 break;
371
372 case JFFS2_FEATURE_ROCOMPAT:
e0d60137 373 JFFS2_ERROR("unknown ROCOMPAT nodetype %#04X at %#08x\n",
f97117d1
AB
374 je16_to_cpu(un->nodetype), ref_offset(ref));
375 BUG_ON(!(c->flags & JFFS2_SB_FLAG_RO));
376 break;
377
378 case JFFS2_FEATURE_RWCOMPAT_COPY:
e0d60137 379 JFFS2_NOTICE("unknown RWCOMPAT_COPY nodetype %#04X at %#08x\n",
f97117d1
AB
380 je16_to_cpu(un->nodetype), ref_offset(ref));
381 break;
382
383 case JFFS2_FEATURE_RWCOMPAT_DELETE:
e0d60137 384 JFFS2_NOTICE("unknown RWCOMPAT_DELETE nodetype %#04X at %#08x\n",
f97117d1
AB
385 je16_to_cpu(un->nodetype), ref_offset(ref));
386 return 1;
1da177e4 387 }
1da177e4 388 }
1da177e4 389
f97117d1 390 return 0;
1da177e4
LT
391}
392
1e0da3cb
AB
393/*
394 * Helper function for jffs2_get_inode_nodes().
395 * The function detects whether more data should be read and reads it if yes.
396 *
397 * Returns: 0 on succes;
398 * negative error code on failure.
399 */
400static int read_more(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *ref,
401 int right_size, int *rdlen, unsigned char *buf, unsigned char *bufstart)
402{
403 int right_len, err, len;
404 size_t retlen;
405 uint32_t offs;
406
407 if (jffs2_is_writebuffered(c)) {
408 right_len = c->wbuf_pagesize - (bufstart - buf);
409 if (right_size + (int)(bufstart - buf) > c->wbuf_pagesize)
410 right_len += c->wbuf_pagesize;
411 } else
412 right_len = right_size;
413
414 if (*rdlen == right_len)
415 return 0;
416
417 /* We need to read more data */
418 offs = ref_offset(ref) + *rdlen;
419 if (jffs2_is_writebuffered(c)) {
420 bufstart = buf + c->wbuf_pagesize;
421 len = c->wbuf_pagesize;
422 } else {
423 bufstart = buf + *rdlen;
424 len = right_size - *rdlen;
425 }
182ec4ee 426
733802d9 427 dbg_readinode("read more %d bytes\n", len);
1e0da3cb
AB
428
429 err = jffs2_flash_read(c, offs, len, &retlen, bufstart);
430 if (err) {
431 JFFS2_ERROR("can not read %d bytes from 0x%08x, "
432 "error code: %d.\n", len, offs, err);
433 return err;
434 }
182ec4ee 435
1e0da3cb 436 if (retlen < len) {
fb6a82c9 437 JFFS2_ERROR("short read at %#08x: %zu instead of %d.\n",
1e0da3cb
AB
438 offs, retlen, len);
439 return -EIO;
440 }
441
442 *rdlen = right_len;
443
444 return 0;
445}
446
f97117d1
AB
447/* Get tmp_dnode_info and full_dirent for all non-obsolete nodes associated
448 with this ino, returning the former in order of version */
f97117d1
AB
449static int jffs2_get_inode_nodes(struct jffs2_sb_info *c, struct jffs2_inode_info *f,
450 struct rb_root *tnp, struct jffs2_full_dirent **fdp,
451 uint32_t *highest_version, uint32_t *latest_mctime,
452 uint32_t *mctime_ver)
1da177e4 453{
f97117d1
AB
454 struct jffs2_raw_node_ref *ref, *valid_ref;
455 struct rb_root ret_tn = RB_ROOT;
456 struct jffs2_full_dirent *ret_fd = NULL;
1e0da3cb
AB
457 unsigned char *buf = NULL;
458 union jffs2_node_union *node;
f97117d1 459 size_t retlen;
1e0da3cb 460 int len, err;
1da177e4 461
f97117d1 462 *mctime_ver = 0;
182ec4ee 463
733802d9 464 dbg_readinode("ino #%u\n", f->inocache->ino);
1da177e4 465
1e0da3cb
AB
466 if (jffs2_is_writebuffered(c)) {
467 /*
468 * If we have the write buffer, we assume the minimal I/O unit
469 * is c->wbuf_pagesize. We implement some optimizations which in
470 * this case and we need a temporary buffer of size =
471 * 2*c->wbuf_pagesize bytes (see comments in read_dnode()).
472 * Basically, we want to read not only the node header, but the
473 * whole wbuf (NAND page in case of NAND) or 2, if the node
474 * header overlaps the border between the 2 wbufs.
475 */
476 len = 2*c->wbuf_pagesize;
477 } else {
478 /*
479 * When there is no write buffer, the size of the temporary
480 * buffer is the size of the larges node header.
481 */
482 len = sizeof(union jffs2_node_union);
483 }
1da177e4 484
1e0da3cb
AB
485 /* FIXME: in case of NOR and available ->point() this
486 * needs to be fixed. */
487 buf = kmalloc(len, GFP_KERNEL);
488 if (!buf)
489 return -ENOMEM;
182ec4ee 490
1e0da3cb 491 spin_lock(&c->erase_completion_lock);
f97117d1 492 valid_ref = jffs2_first_valid_node(f->inocache->nodes);
1e0da3cb
AB
493 if (!valid_ref && f->inocache->ino != 1)
494 JFFS2_WARNING("Eep. No valid nodes for ino #%u.\n", f->inocache->ino);
f97117d1 495 while (valid_ref) {
1e0da3cb
AB
496 unsigned char *bufstart;
497
f97117d1
AB
498 /* We can hold a pointer to a non-obsolete node without the spinlock,
499 but _obsolete_ nodes may disappear at any time, if the block
500 they're in gets erased. So if we mark 'ref' obsolete while we're
501 not holding the lock, it can go away immediately. For that reason,
502 we find the next valid node first, before processing 'ref'.
503 */
504 ref = valid_ref;
505 valid_ref = jffs2_first_valid_node(ref->next_in_ino);
506 spin_unlock(&c->erase_completion_lock);
507
508 cond_resched();
509
1e0da3cb
AB
510 /*
511 * At this point we don't know the type of the node we're going
512 * to read, so we do not know the size of its header. In order
513 * to minimize the amount of flash IO we assume the node has
514 * size = JFFS2_MIN_NODE_HEADER.
515 */
516 if (jffs2_is_writebuffered(c)) {
182ec4ee 517 /*
1e0da3cb
AB
518 * We treat 'buf' as 2 adjacent wbufs. We want to
519 * adjust bufstart such as it points to the
520 * beginning of the node within this wbuf.
521 */
522 bufstart = buf + (ref_offset(ref) % c->wbuf_pagesize);
523 /* We will read either one wbuf or 2 wbufs. */
524 len = c->wbuf_pagesize - (bufstart - buf);
39243508
AB
525 if (JFFS2_MIN_NODE_HEADER + (int)(bufstart - buf) > c->wbuf_pagesize) {
526 /* The header spans the border of the first wbuf */
1e0da3cb
AB
527 len += c->wbuf_pagesize;
528 }
529 } else {
530 bufstart = buf;
531 len = JFFS2_MIN_NODE_HEADER;
532 }
533
733802d9 534 dbg_readinode("read %d bytes at %#08x(%d).\n", len, ref_offset(ref), ref_flags(ref));
1e0da3cb 535
f97117d1 536 /* FIXME: point() */
1e0da3cb
AB
537 err = jffs2_flash_read(c, ref_offset(ref), len,
538 &retlen, bufstart);
f97117d1 539 if (err) {
1e0da3cb
AB
540 JFFS2_ERROR("can not read %d bytes from 0x%08x, " "error code: %d.\n", len, ref_offset(ref), err);
541 goto free_out;
542 }
182ec4ee 543
1e0da3cb 544 if (retlen < len) {
fb6a82c9 545 JFFS2_ERROR("short read at %#08x: %zu instead of %d.\n", ref_offset(ref), retlen, len);
1e0da3cb 546 err = -EIO;
f97117d1
AB
547 goto free_out;
548 }
182ec4ee 549
1e0da3cb 550 node = (union jffs2_node_union *)bufstart;
182ec4ee 551
1e0da3cb 552 switch (je16_to_cpu(node->u.nodetype)) {
182ec4ee 553
f97117d1 554 case JFFS2_NODETYPE_DIRENT:
f97117d1 555
1e0da3cb
AB
556 if (JFFS2_MIN_NODE_HEADER < sizeof(struct jffs2_raw_dirent)) {
557 err = read_more(c, ref, sizeof(struct jffs2_raw_dirent), &len, buf, bufstart);
558 if (unlikely(err))
559 goto free_out;
560 }
182ec4ee 561
1e0da3cb 562 err = read_direntry(c, ref, &node->d, retlen, &ret_fd, latest_mctime, mctime_ver);
f97117d1
AB
563 if (err == 1) {
564 jffs2_mark_node_obsolete(c, ref);
565 break;
566 } else if (unlikely(err))
567 goto free_out;
182ec4ee 568
1e0da3cb
AB
569 if (je32_to_cpu(node->d.version) > *highest_version)
570 *highest_version = je32_to_cpu(node->d.version);
1da177e4 571
1da177e4
LT
572 break;
573
f97117d1 574 case JFFS2_NODETYPE_INODE:
182ec4ee 575
1e0da3cb
AB
576 if (JFFS2_MIN_NODE_HEADER < sizeof(struct jffs2_raw_inode)) {
577 err = read_more(c, ref, sizeof(struct jffs2_raw_inode), &len, buf, bufstart);
578 if (unlikely(err))
579 goto free_out;
f97117d1 580 }
1da177e4 581
1e0da3cb 582 err = read_dnode(c, ref, &node->i, &ret_tn, len, latest_mctime, mctime_ver);
f97117d1
AB
583 if (err == 1) {
584 jffs2_mark_node_obsolete(c, ref);
585 break;
586 } else if (unlikely(err))
587 goto free_out;
1da177e4 588
1e0da3cb
AB
589 if (je32_to_cpu(node->i.version) > *highest_version)
590 *highest_version = je32_to_cpu(node->i.version);
182ec4ee 591
f97117d1 592 break;
1da177e4 593
f97117d1 594 default:
1e0da3cb
AB
595 if (JFFS2_MIN_NODE_HEADER < sizeof(struct jffs2_unknown_node)) {
596 err = read_more(c, ref, sizeof(struct jffs2_unknown_node), &len, buf, bufstart);
597 if (unlikely(err))
598 goto free_out;
f97117d1 599 }
182ec4ee 600
1e0da3cb 601 err = read_unknown(c, ref, &node->u);
f97117d1
AB
602 if (err == 1) {
603 jffs2_mark_node_obsolete(c, ref);
604 break;
605 } else if (unlikely(err))
606 goto free_out;
607
608 }
609 spin_lock(&c->erase_completion_lock);
1da177e4 610 }
1e0da3cb 611
f97117d1
AB
612 spin_unlock(&c->erase_completion_lock);
613 *tnp = ret_tn;
614 *fdp = ret_fd;
1e0da3cb 615 kfree(buf);
f97117d1 616
733802d9 617 dbg_readinode("nodes of inode #%u were read, the highest version is %u, latest_mctime %u, mctime_ver %u.\n",
1e0da3cb 618 f->inocache->ino, *highest_version, *latest_mctime, *mctime_ver);
f97117d1
AB
619 return 0;
620
621 free_out:
622 jffs2_free_tmp_dnode_info_list(&ret_tn);
623 jffs2_free_full_dirent_list(ret_fd);
1e0da3cb 624 kfree(buf);
f97117d1 625 return err;
1da177e4
LT
626}
627
182ec4ee 628static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c,
1da177e4
LT
629 struct jffs2_inode_info *f,
630 struct jffs2_raw_inode *latest_node)
631{
1e0da3cb 632 struct jffs2_tmp_dnode_info *tn;
9dee7503
DW
633 struct rb_root tn_list;
634 struct rb_node *rb, *repl_rb;
1da177e4 635 struct jffs2_full_dirent *fd_list;
1e0da3cb 636 struct jffs2_full_dnode *fn, *first_fn = NULL;
1da177e4
LT
637 uint32_t crc;
638 uint32_t latest_mctime, mctime_ver;
1da177e4
LT
639 size_t retlen;
640 int ret;
641
733802d9 642 dbg_readinode("ino #%u nlink is %d\n", f->inocache->ino, f->inocache->nlink);
1da177e4
LT
643
644 /* Grab all nodes relevant to this ino */
645 ret = jffs2_get_inode_nodes(c, f, &tn_list, &fd_list, &f->highest_version, &latest_mctime, &mctime_ver);
646
647 if (ret) {
e0d60137 648 JFFS2_ERROR("cannot read nodes for ino %u, returned error is %d\n", f->inocache->ino, ret);
1da177e4
LT
649 if (f->inocache->state == INO_STATE_READING)
650 jffs2_set_inocache_state(c, f->inocache, INO_STATE_CHECKEDABSENT);
651 return ret;
652 }
653 f->dents = fd_list;
654
9dee7503 655 rb = rb_first(&tn_list);
1da177e4 656
9dee7503 657 while (rb) {
1e0da3cb 658 cond_resched();
9dee7503 659 tn = rb_entry(rb, struct jffs2_tmp_dnode_info, rb);
1da177e4 660 fn = tn->fn;
1e0da3cb 661 ret = 1;
733802d9 662 dbg_readinode("consider node ver %u, phys offset "
1e0da3cb
AB
663 "%#08x(%d), range %u-%u.\n", tn->version,
664 ref_offset(fn->raw), ref_flags(fn->raw),
665 fn->ofs, fn->ofs + fn->size);
1da177e4
LT
666
667 if (fn->size) {
1e0da3cb
AB
668 ret = jffs2_add_older_frag_to_fragtree(c, f, tn);
669 /* TODO: the error code isn't checked, check it */
670 jffs2_dbg_fragtree_paranoia_check_nolock(f);
671 BUG_ON(ret < 0);
672 if (!first_fn && ret == 0)
673 first_fn = fn;
674 } else if (!first_fn) {
675 first_fn = fn;
1da177e4 676 f->metadata = fn;
1e0da3cb
AB
677 ret = 0; /* Prevent freeing the metadata update node */
678 } else
679 jffs2_mark_node_obsolete(c, fn->raw);
182ec4ee 680
9dee7503 681 BUG_ON(rb->rb_left);
9dee7503
DW
682 if (rb->rb_parent && rb->rb_parent->rb_left == rb) {
683 /* We were then left-hand child of our parent. We need
1e0da3cb 684 * to move our own right-hand child into our place. */
9dee7503
DW
685 repl_rb = rb->rb_right;
686 if (repl_rb)
687 repl_rb->rb_parent = rb->rb_parent;
688 } else
689 repl_rb = NULL;
690
691 rb = rb_next(rb);
692
693 /* Remove the spent tn from the tree; don't bother rebalancing
1e0da3cb 694 * but put our right-hand child in our own place. */
9dee7503
DW
695 if (tn->rb.rb_parent) {
696 if (tn->rb.rb_parent->rb_left == &tn->rb)
697 tn->rb.rb_parent->rb_left = repl_rb;
698 else if (tn->rb.rb_parent->rb_right == &tn->rb)
699 tn->rb.rb_parent->rb_right = repl_rb;
700 else BUG();
701 } else if (tn->rb.rb_right)
702 tn->rb.rb_right->rb_parent = NULL;
703
1da177e4 704 jffs2_free_tmp_dnode_info(tn);
1e0da3cb 705 if (ret) {
733802d9 706 dbg_readinode("delete dnode %u-%u.\n",
1e0da3cb
AB
707 fn->ofs, fn->ofs + fn->size);
708 jffs2_free_full_dnode(fn);
709 }
1da177e4 710 }
e0c8e42f 711 jffs2_dbg_fragtree_paranoia_check_nolock(f);
1da177e4 712
1e0da3cb
AB
713 BUG_ON(first_fn && ref_obsolete(first_fn->raw));
714
715 fn = first_fn;
716 if (unlikely(!first_fn)) {
1da177e4
LT
717 /* No data nodes for this inode. */
718 if (f->inocache->ino != 1) {
e0d60137 719 JFFS2_WARNING("no data nodes found for ino #%u\n", f->inocache->ino);
1da177e4
LT
720 if (!fd_list) {
721 if (f->inocache->state == INO_STATE_READING)
722 jffs2_set_inocache_state(c, f->inocache, INO_STATE_CHECKEDABSENT);
723 return -EIO;
724 }
e0d60137 725 JFFS2_NOTICE("but it has children so we fake some modes for it\n");
1da177e4
LT
726 }
727 latest_node->mode = cpu_to_jemode(S_IFDIR|S_IRUGO|S_IWUSR|S_IXUGO);
728 latest_node->version = cpu_to_je32(0);
729 latest_node->atime = latest_node->ctime = latest_node->mtime = cpu_to_je32(0);
730 latest_node->isize = cpu_to_je32(0);
731 latest_node->gid = cpu_to_je16(0);
732 latest_node->uid = cpu_to_je16(0);
733 if (f->inocache->state == INO_STATE_READING)
734 jffs2_set_inocache_state(c, f->inocache, INO_STATE_PRESENT);
735 return 0;
736 }
737
738 ret = jffs2_flash_read(c, ref_offset(fn->raw), sizeof(*latest_node), &retlen, (void *)latest_node);
739 if (ret || retlen != sizeof(*latest_node)) {
e0d60137
AB
740 JFFS2_ERROR("failed to read from flash: error %d, %zd of %zd bytes read\n",
741 ret, retlen, sizeof(*latest_node));
1da177e4
LT
742 /* FIXME: If this fails, there seems to be a memory leak. Find it. */
743 up(&f->sem);
744 jffs2_do_clear_inode(c, f);
745 return ret?ret:-EIO;
746 }
747
748 crc = crc32(0, latest_node, sizeof(*latest_node)-8);
749 if (crc != je32_to_cpu(latest_node->node_crc)) {
e0d60137
AB
750 JFFS2_ERROR("CRC failed for read_inode of inode %u at physical location 0x%x\n",
751 f->inocache->ino, ref_offset(fn->raw));
1da177e4
LT
752 up(&f->sem);
753 jffs2_do_clear_inode(c, f);
754 return -EIO;
755 }
756
757 switch(jemode_to_cpu(latest_node->mode) & S_IFMT) {
758 case S_IFDIR:
759 if (mctime_ver > je32_to_cpu(latest_node->version)) {
760 /* The times in the latest_node are actually older than
761 mctime in the latest dirent. Cheat. */
762 latest_node->ctime = latest_node->mtime = cpu_to_je32(latest_mctime);
763 }
764 break;
765
182ec4ee 766
1da177e4
LT
767 case S_IFREG:
768 /* If it was a regular file, truncate it to the latest node's isize */
f302cd02 769 jffs2_truncate_fragtree(c, &f->fragtree, je32_to_cpu(latest_node->isize));
1da177e4
LT
770 break;
771
772 case S_IFLNK:
773 /* Hack to work around broken isize in old symlink code.
774 Remove this when dwmw2 comes to his senses and stops
775 symlinks from being an entirely gratuitous special
776 case. */
777 if (!je32_to_cpu(latest_node->isize))
778 latest_node->isize = latest_node->dsize;
32f1a95d
AB
779
780 if (f->inocache->state != INO_STATE_CHECKING) {
781 /* Symlink's inode data is the target path. Read it and
2b79adcc
AB
782 * keep in RAM to facilitate quick follow symlink
783 * operation. */
784 f->target = kmalloc(je32_to_cpu(latest_node->csize) + 1, GFP_KERNEL);
785 if (!f->target) {
e0d60137 786 JFFS2_ERROR("can't allocate %d bytes of memory for the symlink target path cache\n", je32_to_cpu(latest_node->csize));
32f1a95d
AB
787 up(&f->sem);
788 jffs2_do_clear_inode(c, f);
789 return -ENOMEM;
790 }
182ec4ee 791
32f1a95d 792 ret = jffs2_flash_read(c, ref_offset(fn->raw) + sizeof(*latest_node),
2b79adcc 793 je32_to_cpu(latest_node->csize), &retlen, (char *)f->target);
182ec4ee 794
32f1a95d
AB
795 if (ret || retlen != je32_to_cpu(latest_node->csize)) {
796 if (retlen != je32_to_cpu(latest_node->csize))
797 ret = -EIO;
2b79adcc
AB
798 kfree(f->target);
799 f->target = NULL;
32f1a95d
AB
800 up(&f->sem);
801 jffs2_do_clear_inode(c, f);
802 return -ret;
803 }
804
2b79adcc 805 f->target[je32_to_cpu(latest_node->csize)] = '\0';
733802d9 806 dbg_readinode("symlink's target '%s' cached\n", f->target);
32f1a95d 807 }
182ec4ee 808
1da177e4
LT
809 /* fall through... */
810
811 case S_IFBLK:
812 case S_IFCHR:
813 /* Certain inode types should have only one data node, and it's
814 kept as the metadata node */
815 if (f->metadata) {
e0d60137 816 JFFS2_ERROR("Argh. Special inode #%u with mode 0%o had metadata node\n",
1da177e4
LT
817 f->inocache->ino, jemode_to_cpu(latest_node->mode));
818 up(&f->sem);
819 jffs2_do_clear_inode(c, f);
820 return -EIO;
821 }
822 if (!frag_first(&f->fragtree)) {
e0d60137 823 JFFS2_ERROR("Argh. Special inode #%u with mode 0%o has no fragments\n",
1da177e4
LT
824 f->inocache->ino, jemode_to_cpu(latest_node->mode));
825 up(&f->sem);
826 jffs2_do_clear_inode(c, f);
827 return -EIO;
828 }
829 /* ASSERT: f->fraglist != NULL */
830 if (frag_next(frag_first(&f->fragtree))) {
e0d60137 831 JFFS2_ERROR("Argh. Special inode #%u with mode 0x%x had more than one node\n",
1da177e4
LT
832 f->inocache->ino, jemode_to_cpu(latest_node->mode));
833 /* FIXME: Deal with it - check crc32, check for duplicate node, check times and discard the older one */
834 up(&f->sem);
835 jffs2_do_clear_inode(c, f);
836 return -EIO;
837 }
838 /* OK. We're happy */
839 f->metadata = frag_first(&f->fragtree)->node;
840 jffs2_free_node_frag(frag_first(&f->fragtree));
841 f->fragtree = RB_ROOT;
842 break;
843 }
844 if (f->inocache->state == INO_STATE_READING)
845 jffs2_set_inocache_state(c, f->inocache, INO_STATE_PRESENT);
846
847 return 0;
848}
849
f97117d1 850/* Scan the list of all nodes present for this ino, build map of versions, etc. */
182ec4ee 851int jffs2_do_read_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f,
f97117d1
AB
852 uint32_t ino, struct jffs2_raw_inode *latest_node)
853{
733802d9 854 dbg_readinode("read inode #%u\n", ino);
f97117d1
AB
855
856 retry_inocache:
857 spin_lock(&c->inocache_lock);
858 f->inocache = jffs2_get_ino_cache(c, ino);
859
f97117d1
AB
860 if (f->inocache) {
861 /* Check its state. We may need to wait before we can use it */
862 switch(f->inocache->state) {
863 case INO_STATE_UNCHECKED:
864 case INO_STATE_CHECKEDABSENT:
865 f->inocache->state = INO_STATE_READING;
866 break;
182ec4ee 867
f97117d1
AB
868 case INO_STATE_CHECKING:
869 case INO_STATE_GC:
870 /* If it's in either of these states, we need
871 to wait for whoever's got it to finish and
872 put it back. */
733802d9 873 dbg_readinode("waiting for ino #%u in state %d\n", ino, f->inocache->state);
f97117d1
AB
874 sleep_on_spinunlock(&c->inocache_wq, &c->inocache_lock);
875 goto retry_inocache;
876
877 case INO_STATE_READING:
878 case INO_STATE_PRESENT:
879 /* Eep. This should never happen. It can
880 happen if Linux calls read_inode() again
881 before clear_inode() has finished though. */
e0d60137 882 JFFS2_ERROR("Eep. Trying to read_inode #%u when it's already in state %d!\n", ino, f->inocache->state);
f97117d1
AB
883 /* Fail. That's probably better than allowing it to succeed */
884 f->inocache = NULL;
885 break;
886
887 default:
888 BUG();
889 }
890 }
891 spin_unlock(&c->inocache_lock);
892
893 if (!f->inocache && ino == 1) {
894 /* Special case - no root inode on medium */
895 f->inocache = jffs2_alloc_inode_cache();
896 if (!f->inocache) {
e0d60137 897 JFFS2_ERROR("cannot allocate inocache for root inode\n");
f97117d1
AB
898 return -ENOMEM;
899 }
733802d9 900 dbg_readinode("creating inocache for root inode\n");
f97117d1
AB
901 memset(f->inocache, 0, sizeof(struct jffs2_inode_cache));
902 f->inocache->ino = f->inocache->nlink = 1;
903 f->inocache->nodes = (struct jffs2_raw_node_ref *)f->inocache;
904 f->inocache->state = INO_STATE_READING;
905 jffs2_add_ino_cache(c, f->inocache);
906 }
907 if (!f->inocache) {
e0d60137 908 JFFS2_ERROR("requestied to read an nonexistent ino %u\n", ino);
f97117d1
AB
909 return -ENOENT;
910 }
911
912 return jffs2_do_read_inode_internal(c, f, latest_node);
913}
914
915int jffs2_do_crccheck_inode(struct jffs2_sb_info *c, struct jffs2_inode_cache *ic)
916{
917 struct jffs2_raw_inode n;
918 struct jffs2_inode_info *f = kmalloc(sizeof(*f), GFP_KERNEL);
919 int ret;
920
921 if (!f)
922 return -ENOMEM;
923
924 memset(f, 0, sizeof(*f));
925 init_MUTEX_LOCKED(&f->sem);
926 f->inocache = ic;
927
928 ret = jffs2_do_read_inode_internal(c, f, &n);
929 if (!ret) {
930 up(&f->sem);
931 jffs2_do_clear_inode(c, f);
932 }
933 kfree (f);
934 return ret;
935}
936
1da177e4
LT
937void jffs2_do_clear_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f)
938{
939 struct jffs2_full_dirent *fd, *fds;
940 int deleted;
941
942 down(&f->sem);
943 deleted = f->inocache && !f->inocache->nlink;
944
67e345d1
DW
945 if (f->inocache && f->inocache->state != INO_STATE_CHECKING)
946 jffs2_set_inocache_state(c, f->inocache, INO_STATE_CLEARING);
947
1da177e4
LT
948 if (f->metadata) {
949 if (deleted)
950 jffs2_mark_node_obsolete(c, f->metadata->raw);
951 jffs2_free_full_dnode(f->metadata);
952 }
953
954 jffs2_kill_fragtree(&f->fragtree, deleted?c:NULL);
955
2b79adcc
AB
956 if (f->target) {
957 kfree(f->target);
958 f->target = NULL;
959 }
182ec4ee 960
2b79adcc
AB
961 fds = f->dents;
962 while(fds) {
963 fd = fds;
964 fds = fd->next;
965 jffs2_free_full_dirent(fd);
1da177e4
LT
966 }
967
67e345d1 968 if (f->inocache && f->inocache->state != INO_STATE_CHECKING) {
1da177e4 969 jffs2_set_inocache_state(c, f->inocache, INO_STATE_CHECKEDABSENT);
67e345d1
DW
970 if (f->inocache->nodes == (void *)f->inocache)
971 jffs2_del_ino_cache(c, f->inocache);
972 }
1da177e4
LT
973
974 up(&f->sem);
975}