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