diff options
Diffstat (limited to 'fs/jffs2/readinode.c')
-rw-r--r-- | fs/jffs2/readinode.c | 134 |
1 files changed, 59 insertions, 75 deletions
diff --git a/fs/jffs2/readinode.c b/fs/jffs2/readinode.c index 85a285b2a309..67732ba08c3e 100644 --- a/fs/jffs2/readinode.c +++ b/fs/jffs2/readinode.c | |||
@@ -7,7 +7,7 @@ | |||
7 | * | 7 | * |
8 | * For licensing information, see the file 'LICENCE' in this directory. | 8 | * For licensing information, see the file 'LICENCE' in this directory. |
9 | * | 9 | * |
10 | * $Id: readinode.c,v 1.131 2005/07/27 14:46:11 dedekind Exp $ | 10 | * $Id: readinode.c,v 1.132 2005/07/28 14:46:40 dedekind Exp $ |
11 | * | 11 | * |
12 | */ | 12 | */ |
13 | 13 | ||
@@ -24,12 +24,12 @@ void jffs2_truncate_fragtree (struct jffs2_sb_info *c, struct rb_root *list, uin | |||
24 | { | 24 | { |
25 | struct jffs2_node_frag *frag = jffs2_lookup_node_frag(list, size); | 25 | struct jffs2_node_frag *frag = jffs2_lookup_node_frag(list, size); |
26 | 26 | ||
27 | D1(printk(KERN_DEBUG "Truncating fraglist to 0x%08x bytes\n", size)); | 27 | JFFS2_DBG_FRAGTREE("truncating fragtree to 0x%08x bytes\n", size); |
28 | 28 | ||
29 | /* We know frag->ofs <= size. That's what lookup does for us */ | 29 | /* We know frag->ofs <= size. That's what lookup does for us */ |
30 | if (frag && frag->ofs != size) { | 30 | if (frag && frag->ofs != size) { |
31 | if (frag->ofs+frag->size >= size) { | 31 | if (frag->ofs+frag->size >= size) { |
32 | D1(printk(KERN_DEBUG "Truncating frag 0x%08x-0x%08x\n", frag->ofs, frag->ofs+frag->size)); | 32 | JFFS2_DBG_FRAGTREE2("truncating frag 0x%08x-0x%08x\n", frag->ofs, frag->ofs+frag->size); |
33 | frag->size = size - frag->ofs; | 33 | frag->size = size - frag->ofs; |
34 | } | 34 | } |
35 | frag = frag_next(frag); | 35 | frag = frag_next(frag); |
@@ -37,7 +37,7 @@ void jffs2_truncate_fragtree (struct jffs2_sb_info *c, struct rb_root *list, uin | |||
37 | while (frag && frag->ofs >= size) { | 37 | while (frag && frag->ofs >= size) { |
38 | struct jffs2_node_frag *next = frag_next(frag); | 38 | struct jffs2_node_frag *next = frag_next(frag); |
39 | 39 | ||
40 | D1(printk(KERN_DEBUG "Removing frag 0x%08x-0x%08x\n", frag->ofs, frag->ofs+frag->size)); | 40 | JFFS2_DBG_FRAGTREE("removing frag 0x%08x-0x%08x\n", frag->ofs, frag->ofs+frag->size); |
41 | frag_erase(frag, list); | 41 | frag_erase(frag, list); |
42 | jffs2_obsolete_node_frag(c, frag); | 42 | jffs2_obsolete_node_frag(c, frag); |
43 | frag = next; | 43 | frag = next; |
@@ -120,7 +120,7 @@ static struct jffs2_raw_node_ref *jffs2_first_valid_node(struct jffs2_raw_node_r | |||
120 | while (ref && ref->next_in_ino) { | 120 | while (ref && ref->next_in_ino) { |
121 | if (!ref_obsolete(ref)) | 121 | if (!ref_obsolete(ref)) |
122 | return ref; | 122 | return ref; |
123 | D1(printk(KERN_DEBUG "node at 0x%08x is obsoleted. Ignoring.\n", ref_offset(ref))); | 123 | JFFS2_DBG_NODEREF("node at 0x%08x is obsoleted. Ignoring.\n", ref_offset(ref)); |
124 | ref = ref->next_in_ino; | 124 | ref = ref->next_in_ino; |
125 | } | 125 | } |
126 | return NULL; | 126 | return NULL; |
@@ -152,7 +152,7 @@ read_direntry(struct jffs2_sb_info *c, | |||
152 | 152 | ||
153 | /* Sanity check */ | 153 | /* Sanity check */ |
154 | if (unlikely(PAD((rd->nsize + sizeof(*rd))) != PAD(je32_to_cpu(rd->totlen)))) { | 154 | if (unlikely(PAD((rd->nsize + sizeof(*rd))) != PAD(je32_to_cpu(rd->totlen)))) { |
155 | printk(KERN_ERR "Error! Illegal nsize in node at %#08x: nsize %#02x, totlen %#04x\n", | 155 | JFFS2_ERROR("illegal nsize in node at %#08x: nsize %#02x, totlen %#04x\n", |
156 | ref_offset(ref), rd->nsize, je32_to_cpu(rd->totlen)); | 156 | ref_offset(ref), rd->nsize, je32_to_cpu(rd->totlen)); |
157 | return 1; | 157 | return 1; |
158 | } | 158 | } |
@@ -192,7 +192,7 @@ read_direntry(struct jffs2_sb_info *c, | |||
192 | return -EIO; | 192 | return -EIO; |
193 | 193 | ||
194 | if (unlikely(err)) { | 194 | if (unlikely(err)) { |
195 | printk(KERN_WARNING "Read remainder of name: error %d\n", err); | 195 | JFFS2_ERROR("read remainder of name: error %d\n", err); |
196 | jffs2_free_full_dirent(fd); | 196 | jffs2_free_full_dirent(fd); |
197 | return -EIO; | 197 | return -EIO; |
198 | } | 198 | } |
@@ -206,8 +206,6 @@ read_direntry(struct jffs2_sb_info *c, | |||
206 | * Wheee. We now have a complete jffs2_full_dirent structure, with | 206 | * Wheee. We now have a complete jffs2_full_dirent structure, with |
207 | * the name in it and everything. Link it into the list | 207 | * the name in it and everything. Link it into the list |
208 | */ | 208 | */ |
209 | D1(printk(KERN_DEBUG "Adding fd \"%s\", ino #%u\n", fd->name, fd->ino)); | ||
210 | |||
211 | jffs2_add_fd_to_list(c, fd, fdp); | 209 | jffs2_add_fd_to_list(c, fd, fdp); |
212 | 210 | ||
213 | return 0; | 211 | return 0; |
@@ -242,7 +240,7 @@ read_dnode(struct jffs2_sb_info *c, | |||
242 | 240 | ||
243 | crc = crc32(0, rd, sizeof(*rd) - 8); | 241 | crc = crc32(0, rd, sizeof(*rd) - 8); |
244 | if (unlikely(crc != je32_to_cpu(rd->node_crc))) { | 242 | if (unlikely(crc != je32_to_cpu(rd->node_crc))) { |
245 | printk(KERN_WARNING "Header CRC failed on node at %#08x: read %#08x, calculated %#08x\n", | 243 | JFFS2_NOTICE("header CRC failed on node at %#08x: read %#08x, calculated %#08x\n", |
246 | ref_offset(ref), je32_to_cpu(rd->node_crc), crc); | 244 | ref_offset(ref), je32_to_cpu(rd->node_crc), crc); |
247 | return 1; | 245 | return 1; |
248 | } | 246 | } |
@@ -250,11 +248,8 @@ read_dnode(struct jffs2_sb_info *c, | |||
250 | /* Sanity checks */ | 248 | /* Sanity checks */ |
251 | if (unlikely(je32_to_cpu(rd->offset) > je32_to_cpu(rd->isize)) || | 249 | if (unlikely(je32_to_cpu(rd->offset) > je32_to_cpu(rd->isize)) || |
252 | unlikely(PAD(je32_to_cpu(rd->csize) + sizeof(*rd)) != PAD(je32_to_cpu(rd->totlen)))) { | 250 | unlikely(PAD(je32_to_cpu(rd->csize) + sizeof(*rd)) != PAD(je32_to_cpu(rd->totlen)))) { |
253 | printk(KERN_WARNING "Inode corrupted at %#08x, totlen %d, #ino %d, version %d, " | 251 | JFFS2_WARNING("inode node header CRC is corrupted at %#08x\n", ref_offset(ref)); |
254 | "isize %d, csize %d, dsize %d \n", | 252 | __jffs2_dbg_dump_node(c, ref_offset(ref)); |
255 | ref_offset(ref), je32_to_cpu(rd->totlen), je32_to_cpu(rd->ino), | ||
256 | je32_to_cpu(rd->version), je32_to_cpu(rd->isize), | ||
257 | je32_to_cpu(rd->csize), je32_to_cpu(rd->dsize)); | ||
258 | return 1; | 253 | return 1; |
259 | } | 254 | } |
260 | 255 | ||
@@ -267,11 +262,11 @@ read_dnode(struct jffs2_sb_info *c, | |||
267 | err = c->mtd->point (c->mtd, ref_offset(ref) + sizeof(*rd), je32_to_cpu(rd->csize), | 262 | err = c->mtd->point (c->mtd, ref_offset(ref) + sizeof(*rd), je32_to_cpu(rd->csize), |
268 | &read, &buf); | 263 | &read, &buf); |
269 | if (unlikely(read < je32_to_cpu(rd->csize)) && likely(!err)) { | 264 | if (unlikely(read < je32_to_cpu(rd->csize)) && likely(!err)) { |
270 | D1(printk(KERN_DEBUG "MTD point returned len too short: 0x%zx\n", read)); | 265 | JFFS2_ERROR("MTD point returned len too short: 0x%zx\n", read); |
271 | c->mtd->unpoint(c->mtd, buf, ref_offset(ref) + sizeof(*rd), | 266 | c->mtd->unpoint(c->mtd, buf, ref_offset(ref) + sizeof(*rd), |
272 | je32_to_cpu(rd->csize)); | 267 | je32_to_cpu(rd->csize)); |
273 | } else if (unlikely(err)){ | 268 | } else if (unlikely(err)){ |
274 | D1(printk(KERN_DEBUG "MTD point failed %d\n", err)); | 269 | JFFS2_ERROR("MTD point failed %d\n", err); |
275 | } else | 270 | } else |
276 | pointed = 1; /* succefully pointed to device */ | 271 | pointed = 1; /* succefully pointed to device */ |
277 | } | 272 | } |
@@ -299,8 +294,8 @@ read_dnode(struct jffs2_sb_info *c, | |||
299 | #endif | 294 | #endif |
300 | 295 | ||
301 | if (crc != je32_to_cpu(rd->data_crc)) { | 296 | if (crc != je32_to_cpu(rd->data_crc)) { |
302 | printk(KERN_NOTICE "Data CRC failed on node at %#08x: read %#08x, calculated %#08x\n", | 297 | JFFS2_NOTICE("data CRC failed on node at %#08x: read %#08x, calculated %#08x\n", |
303 | ref_offset(ref), je32_to_cpu(rd->data_crc), crc); | 298 | ref_offset(ref), je32_to_cpu(rd->data_crc), crc); |
304 | return 1; | 299 | return 1; |
305 | } | 300 | } |
306 | 301 | ||
@@ -326,10 +321,10 @@ read_dnode(struct jffs2_sb_info *c, | |||
326 | if ((je32_to_cpu(rd->dsize) >= PAGE_CACHE_SIZE) || | 321 | if ((je32_to_cpu(rd->dsize) >= PAGE_CACHE_SIZE) || |
327 | ( ((je32_to_cpu(rd->offset) & (PAGE_CACHE_SIZE-1))==0) && | 322 | ( ((je32_to_cpu(rd->offset) & (PAGE_CACHE_SIZE-1))==0) && |
328 | (je32_to_cpu(rd->dsize) + je32_to_cpu(rd->offset) == je32_to_cpu(rd->isize)))) { | 323 | (je32_to_cpu(rd->dsize) + je32_to_cpu(rd->offset) == je32_to_cpu(rd->isize)))) { |
329 | D1(printk(KERN_DEBUG "Marking node at %#08x REF_PRISTINE\n", ref_offset(ref))); | 324 | JFFS2_DBG_READINODE("marking node at %#08x REF_PRISTINE\n", ref_offset(ref)); |
330 | ref->flash_offset = ref_offset(ref) | REF_PRISTINE; | 325 | ref->flash_offset = ref_offset(ref) | REF_PRISTINE; |
331 | } else { | 326 | } else { |
332 | D1(printk(KERN_DEBUG "Marking node at %#08x REF_NORMAL\n", ref_offset(ref))); | 327 | JFFS2_DBG_READINODE("marking node at %#08x REF_NORMAL\n", ref_offset(ref)); |
333 | ref->flash_offset = ref_offset(ref) | REF_NORMAL; | 328 | ref->flash_offset = ref_offset(ref) | REF_NORMAL; |
334 | } | 329 | } |
335 | spin_unlock(&c->erase_completion_lock); | 330 | spin_unlock(&c->erase_completion_lock); |
@@ -337,13 +332,13 @@ read_dnode(struct jffs2_sb_info *c, | |||
337 | 332 | ||
338 | tn = jffs2_alloc_tmp_dnode_info(); | 333 | tn = jffs2_alloc_tmp_dnode_info(); |
339 | if (!tn) { | 334 | if (!tn) { |
340 | D1(printk(KERN_DEBUG "alloc tn failed\n")); | 335 | JFFS2_ERROR("alloc tn failed\n"); |
341 | return -ENOMEM; | 336 | return -ENOMEM; |
342 | } | 337 | } |
343 | 338 | ||
344 | tn->fn = jffs2_alloc_full_dnode(); | 339 | tn->fn = jffs2_alloc_full_dnode(); |
345 | if (!tn->fn) { | 340 | if (!tn->fn) { |
346 | D1(printk(KERN_DEBUG "alloc fn failed\n")); | 341 | JFFS2_ERROR("alloc fn failed\n"); |
347 | jffs2_free_tmp_dnode_info(tn); | 342 | jffs2_free_tmp_dnode_info(tn); |
348 | return -ENOMEM; | 343 | return -ENOMEM; |
349 | } | 344 | } |
@@ -359,9 +354,8 @@ read_dnode(struct jffs2_sb_info *c, | |||
359 | else // normal case... | 354 | else // normal case... |
360 | tn->fn->size = je32_to_cpu(rd->dsize); | 355 | tn->fn->size = je32_to_cpu(rd->dsize); |
361 | 356 | ||
362 | D1(printk(KERN_DEBUG "dnode @%08x: ver %u, offset %#04x, dsize %#04x\n", | 357 | JFFS2_DBG_READINODE("dnode @%08x: ver %u, offset %#04x, dsize %#04x\n", |
363 | ref_offset(ref), je32_to_cpu(rd->version), | 358 | ref_offset(ref), je32_to_cpu(rd->version), je32_to_cpu(rd->offset), je32_to_cpu(rd->dsize)); |
364 | je32_to_cpu(rd->offset), je32_to_cpu(rd->dsize))); | ||
365 | 359 | ||
366 | jffs2_add_tn_to_tree(tn, tnp); | 360 | jffs2_add_tn_to_tree(tn, tnp); |
367 | 361 | ||
@@ -388,37 +382,33 @@ read_unknown(struct jffs2_sb_info *c, | |||
388 | un->nodetype = cpu_to_je16(JFFS2_NODE_ACCURATE | je16_to_cpu(un->nodetype)); | 382 | un->nodetype = cpu_to_je16(JFFS2_NODE_ACCURATE | je16_to_cpu(un->nodetype)); |
389 | 383 | ||
390 | if (crc32(0, un, sizeof(struct jffs2_unknown_node) - 4) != je32_to_cpu(un->hdr_crc)) { | 384 | if (crc32(0, un, sizeof(struct jffs2_unknown_node) - 4) != je32_to_cpu(un->hdr_crc)) { |
391 | |||
392 | /* Hmmm. This should have been caught at scan time. */ | 385 | /* Hmmm. This should have been caught at scan time. */ |
393 | printk(KERN_WARNING "Warning! Node header CRC failed at %#08x. " | 386 | JFFS2_NOTICE("node header CRC failed at %#08x. But it must have been OK earlier.\n", ref_offset(ref)); |
394 | "But it must have been OK earlier.\n", ref_offset(ref)); | 387 | __jffs2_dbg_dump_node(c, ref_offset(ref)); |
395 | D1(printk(KERN_DEBUG "Node was: { %#04x, %#04x, %#08x, %#08x }\n", | ||
396 | je16_to_cpu(un->magic), je16_to_cpu(un->nodetype), | ||
397 | je32_to_cpu(un->totlen), je32_to_cpu(un->hdr_crc))); | ||
398 | return 1; | 388 | return 1; |
399 | } else { | 389 | } else { |
400 | switch(je16_to_cpu(un->nodetype) & JFFS2_COMPAT_MASK) { | 390 | switch(je16_to_cpu(un->nodetype) & JFFS2_COMPAT_MASK) { |
401 | 391 | ||
402 | case JFFS2_FEATURE_INCOMPAT: | 392 | case JFFS2_FEATURE_INCOMPAT: |
403 | printk(KERN_NOTICE "Unknown INCOMPAT nodetype %#04X at %#08x\n", | 393 | JFFS2_ERROR("unknown INCOMPAT nodetype %#04X at %#08x\n", |
404 | je16_to_cpu(un->nodetype), ref_offset(ref)); | 394 | je16_to_cpu(un->nodetype), ref_offset(ref)); |
405 | /* EEP */ | 395 | /* EEP */ |
406 | BUG(); | 396 | BUG(); |
407 | break; | 397 | break; |
408 | 398 | ||
409 | case JFFS2_FEATURE_ROCOMPAT: | 399 | case JFFS2_FEATURE_ROCOMPAT: |
410 | printk(KERN_NOTICE "Unknown ROCOMPAT nodetype %#04X at %#08x\n", | 400 | JFFS2_ERROR("unknown ROCOMPAT nodetype %#04X at %#08x\n", |
411 | je16_to_cpu(un->nodetype), ref_offset(ref)); | 401 | je16_to_cpu(un->nodetype), ref_offset(ref)); |
412 | BUG_ON(!(c->flags & JFFS2_SB_FLAG_RO)); | 402 | BUG_ON(!(c->flags & JFFS2_SB_FLAG_RO)); |
413 | break; | 403 | break; |
414 | 404 | ||
415 | case JFFS2_FEATURE_RWCOMPAT_COPY: | 405 | case JFFS2_FEATURE_RWCOMPAT_COPY: |
416 | printk(KERN_NOTICE "Unknown RWCOMPAT_COPY nodetype %#04X at %#08x\n", | 406 | JFFS2_NOTICE("unknown RWCOMPAT_COPY nodetype %#04X at %#08x\n", |
417 | je16_to_cpu(un->nodetype), ref_offset(ref)); | 407 | je16_to_cpu(un->nodetype), ref_offset(ref)); |
418 | break; | 408 | break; |
419 | 409 | ||
420 | case JFFS2_FEATURE_RWCOMPAT_DELETE: | 410 | case JFFS2_FEATURE_RWCOMPAT_DELETE: |
421 | printk(KERN_NOTICE "Unknown RWCOMPAT_DELETE nodetype %#04X at %#08x\n", | 411 | JFFS2_NOTICE("unknown RWCOMPAT_DELETE nodetype %#04X at %#08x\n", |
422 | je16_to_cpu(un->nodetype), ref_offset(ref)); | 412 | je16_to_cpu(un->nodetype), ref_offset(ref)); |
423 | return 1; | 413 | return 1; |
424 | } | 414 | } |
@@ -444,14 +434,14 @@ static int jffs2_get_inode_nodes(struct jffs2_sb_info *c, struct jffs2_inode_inf | |||
444 | 434 | ||
445 | *mctime_ver = 0; | 435 | *mctime_ver = 0; |
446 | 436 | ||
447 | D1(printk(KERN_DEBUG "jffs2_get_inode_nodes(): ino #%u\n", f->inocache->ino)); | 437 | JFFS2_DBG_READINODE("ino #%u\n", f->inocache->ino); |
448 | 438 | ||
449 | spin_lock(&c->erase_completion_lock); | 439 | spin_lock(&c->erase_completion_lock); |
450 | 440 | ||
451 | valid_ref = jffs2_first_valid_node(f->inocache->nodes); | 441 | valid_ref = jffs2_first_valid_node(f->inocache->nodes); |
452 | 442 | ||
453 | if (!valid_ref && (f->inocache->ino != 1)) | 443 | if (!valid_ref && (f->inocache->ino != 1)) |
454 | printk(KERN_WARNING "Eep. No valid nodes for ino #%u\n", f->inocache->ino); | 444 | JFFS2_WARNING("no valid nodes for ino #%u\n", f->inocache->ino); |
455 | 445 | ||
456 | while (valid_ref) { | 446 | while (valid_ref) { |
457 | /* We can hold a pointer to a non-obsolete node without the spinlock, | 447 | /* We can hold a pointer to a non-obsolete node without the spinlock, |
@@ -471,17 +461,17 @@ static int jffs2_get_inode_nodes(struct jffs2_sb_info *c, struct jffs2_inode_inf | |||
471 | min_t(uint32_t, ref_totlen(c, NULL, ref), sizeof(node)), | 461 | min_t(uint32_t, ref_totlen(c, NULL, ref), sizeof(node)), |
472 | &retlen, (void *)&node); | 462 | &retlen, (void *)&node); |
473 | if (err) { | 463 | if (err) { |
474 | printk(KERN_WARNING "error %d reading node at 0x%08x in get_inode_nodes()\n", err, ref_offset(ref)); | 464 | JFFS2_ERROR("error %d reading node at 0x%08x in get_inode_nodes()\n", err, ref_offset(ref)); |
475 | goto free_out; | 465 | goto free_out; |
476 | } | 466 | } |
477 | 467 | ||
478 | switch (je16_to_cpu(node.u.nodetype)) { | 468 | switch (je16_to_cpu(node.u.nodetype)) { |
479 | 469 | ||
480 | case JFFS2_NODETYPE_DIRENT: | 470 | case JFFS2_NODETYPE_DIRENT: |
481 | D1(printk(KERN_DEBUG "Node at %08x (%d) is a dirent node\n", ref_offset(ref), ref_flags(ref))); | 471 | JFFS2_DBG_READINODE("node at %08x (%d) is a dirent node\n", ref_offset(ref), ref_flags(ref)); |
482 | 472 | ||
483 | if (retlen < sizeof(node.d)) { | 473 | if (retlen < sizeof(node.d)) { |
484 | printk(KERN_WARNING "Warning! Short read dirent at %#08x\n", ref_offset(ref)); | 474 | JFFS2_ERROR("short read dirent at %#08x\n", ref_offset(ref)); |
485 | err = -EIO; | 475 | err = -EIO; |
486 | goto free_out; | 476 | goto free_out; |
487 | } | 477 | } |
@@ -499,10 +489,10 @@ static int jffs2_get_inode_nodes(struct jffs2_sb_info *c, struct jffs2_inode_inf | |||
499 | break; | 489 | break; |
500 | 490 | ||
501 | case JFFS2_NODETYPE_INODE: | 491 | case JFFS2_NODETYPE_INODE: |
502 | D1(printk(KERN_DEBUG "Node at %08x (%d) is a data node\n", ref_offset(ref), ref_flags(ref))); | 492 | JFFS2_DBG_READINODE("node at %08x (%d) is a data node\n", ref_offset(ref), ref_flags(ref)); |
503 | 493 | ||
504 | if (retlen < sizeof(node.i)) { | 494 | if (retlen < sizeof(node.i)) { |
505 | printk(KERN_WARNING "Warning! Short read dnode at %#08x\n", ref_offset(ref)); | 495 | JFFS2_ERROR("short read dnode at %#08x\n", ref_offset(ref)); |
506 | err = -EIO; | 496 | err = -EIO; |
507 | goto free_out; | 497 | goto free_out; |
508 | } | 498 | } |
@@ -517,16 +507,15 @@ static int jffs2_get_inode_nodes(struct jffs2_sb_info *c, struct jffs2_inode_inf | |||
517 | if (je32_to_cpu(node.i.version) > *highest_version) | 507 | if (je32_to_cpu(node.i.version) > *highest_version) |
518 | *highest_version = je32_to_cpu(node.i.version); | 508 | *highest_version = je32_to_cpu(node.i.version); |
519 | 509 | ||
520 | D1(printk(KERN_DEBUG "version %d, highest_version now %d\n", | 510 | JFFS2_DBG_READINODE("version %d, highest_version now %d\n", |
521 | je32_to_cpu(node.i.version), *highest_version)); | 511 | je32_to_cpu(node.i.version), *highest_version); |
522 | 512 | ||
523 | break; | 513 | break; |
524 | 514 | ||
525 | default: | 515 | default: |
526 | /* Check we've managed to read at least the common node header */ | 516 | /* Check we've managed to read at least the common node header */ |
527 | if (retlen < sizeof(struct jffs2_unknown_node)) { | 517 | if (retlen < sizeof(struct jffs2_unknown_node)) { |
528 | printk(KERN_WARNING "Warning! Short read unknown node at %#08x\n", | 518 | JFFS2_ERROR("short read unknown node at %#08x\n", ref_offset(ref)); |
529 | ref_offset(ref)); | ||
530 | return -EIO; | 519 | return -EIO; |
531 | } | 520 | } |
532 | 521 | ||
@@ -568,13 +557,13 @@ static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c, | |||
568 | size_t retlen; | 557 | size_t retlen; |
569 | int ret; | 558 | int ret; |
570 | 559 | ||
571 | D1(printk(KERN_DEBUG "jffs2_do_read_inode_internal(): ino #%u nlink is %d\n", f->inocache->ino, f->inocache->nlink)); | 560 | JFFS2_DBG_READINODE("ino #%u nlink is %d\n", f->inocache->ino, f->inocache->nlink); |
572 | 561 | ||
573 | /* Grab all nodes relevant to this ino */ | 562 | /* Grab all nodes relevant to this ino */ |
574 | ret = jffs2_get_inode_nodes(c, f, &tn_list, &fd_list, &f->highest_version, &latest_mctime, &mctime_ver); | 563 | ret = jffs2_get_inode_nodes(c, f, &tn_list, &fd_list, &f->highest_version, &latest_mctime, &mctime_ver); |
575 | 564 | ||
576 | if (ret) { | 565 | if (ret) { |
577 | printk(KERN_CRIT "jffs2_get_inode_nodes() for ino %u returned %d\n", f->inocache->ino, ret); | 566 | JFFS2_ERROR("cannot read nodes for ino %u, returned error is %d\n", f->inocache->ino, ret); |
578 | if (f->inocache->state == INO_STATE_READING) | 567 | if (f->inocache->state == INO_STATE_READING) |
579 | jffs2_set_inocache_state(c, f->inocache, INO_STATE_CHECKEDABSENT); | 568 | jffs2_set_inocache_state(c, f->inocache, INO_STATE_CHECKEDABSENT); |
580 | return ret; | 569 | return ret; |
@@ -589,7 +578,7 @@ static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c, | |||
589 | 578 | ||
590 | if (f->metadata) { | 579 | if (f->metadata) { |
591 | if (likely(tn->version >= mdata_ver)) { | 580 | if (likely(tn->version >= mdata_ver)) { |
592 | D1(printk(KERN_DEBUG "Obsoleting old metadata at 0x%08x\n", ref_offset(f->metadata->raw))); | 581 | JFFS2_DBG_READINODE("obsoleting old metadata at 0x%08x\n", ref_offset(f->metadata->raw)); |
593 | jffs2_mark_node_obsolete(c, f->metadata->raw); | 582 | jffs2_mark_node_obsolete(c, f->metadata->raw); |
594 | jffs2_free_full_dnode(f->metadata); | 583 | jffs2_free_full_dnode(f->metadata); |
595 | f->metadata = NULL; | 584 | f->metadata = NULL; |
@@ -597,7 +586,7 @@ static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c, | |||
597 | mdata_ver = 0; | 586 | mdata_ver = 0; |
598 | } else { | 587 | } else { |
599 | /* This should never happen. */ | 588 | /* This should never happen. */ |
600 | printk(KERN_WARNING "Er. New metadata at 0x%08x with ver %d is actually older than previous ver %d at 0x%08x\n", | 589 | JFFS2_ERROR("Er. New metadata at 0x%08x with ver %d is actually older than previous ver %d at 0x%08x\n", |
601 | ref_offset(fn->raw), tn->version, mdata_ver, ref_offset(f->metadata->raw)); | 590 | ref_offset(fn->raw), tn->version, mdata_ver, ref_offset(f->metadata->raw)); |
602 | jffs2_mark_node_obsolete(c, fn->raw); | 591 | jffs2_mark_node_obsolete(c, fn->raw); |
603 | jffs2_free_full_dnode(fn); | 592 | jffs2_free_full_dnode(fn); |
@@ -611,7 +600,7 @@ static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c, | |||
611 | jffs2_add_full_dnode_to_inode(c, f, fn); | 600 | jffs2_add_full_dnode_to_inode(c, f, fn); |
612 | } else { | 601 | } else { |
613 | /* Zero-sized node at end of version list. Just a metadata update */ | 602 | /* Zero-sized node at end of version list. Just a metadata update */ |
614 | D1(printk(KERN_DEBUG "metadata @%08x: ver %d\n", ref_offset(fn->raw), tn->version)); | 603 | JFFS2_DBG_READINODE("metadata @%08x: ver %d\n", ref_offset(fn->raw), tn->version); |
615 | f->metadata = fn; | 604 | f->metadata = fn; |
616 | mdata_ver = tn->version; | 605 | mdata_ver = tn->version; |
617 | } | 606 | } |
@@ -646,13 +635,13 @@ static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c, | |||
646 | if (!fn) { | 635 | if (!fn) { |
647 | /* No data nodes for this inode. */ | 636 | /* No data nodes for this inode. */ |
648 | if (f->inocache->ino != 1) { | 637 | if (f->inocache->ino != 1) { |
649 | printk(KERN_WARNING "jffs2_do_read_inode(): No data nodes found for ino #%u\n", f->inocache->ino); | 638 | JFFS2_WARNING("no data nodes found for ino #%u\n", f->inocache->ino); |
650 | if (!fd_list) { | 639 | if (!fd_list) { |
651 | if (f->inocache->state == INO_STATE_READING) | 640 | if (f->inocache->state == INO_STATE_READING) |
652 | jffs2_set_inocache_state(c, f->inocache, INO_STATE_CHECKEDABSENT); | 641 | jffs2_set_inocache_state(c, f->inocache, INO_STATE_CHECKEDABSENT); |
653 | return -EIO; | 642 | return -EIO; |
654 | } | 643 | } |
655 | printk(KERN_WARNING "jffs2_do_read_inode(): But it has children so we fake some modes for it\n"); | 644 | JFFS2_NOTICE("but it has children so we fake some modes for it\n"); |
656 | } | 645 | } |
657 | latest_node->mode = cpu_to_jemode(S_IFDIR|S_IRUGO|S_IWUSR|S_IXUGO); | 646 | latest_node->mode = cpu_to_jemode(S_IFDIR|S_IRUGO|S_IWUSR|S_IXUGO); |
658 | latest_node->version = cpu_to_je32(0); | 647 | latest_node->version = cpu_to_je32(0); |
@@ -667,8 +656,8 @@ static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c, | |||
667 | 656 | ||
668 | ret = jffs2_flash_read(c, ref_offset(fn->raw), sizeof(*latest_node), &retlen, (void *)latest_node); | 657 | ret = jffs2_flash_read(c, ref_offset(fn->raw), sizeof(*latest_node), &retlen, (void *)latest_node); |
669 | if (ret || retlen != sizeof(*latest_node)) { | 658 | if (ret || retlen != sizeof(*latest_node)) { |
670 | printk(KERN_NOTICE "MTD read in jffs2_do_read_inode() failed: Returned %d, %zd of %zd bytes read\n", | 659 | JFFS2_ERROR("failed to read from flash: error %d, %zd of %zd bytes read\n", |
671 | ret, retlen, sizeof(*latest_node)); | 660 | ret, retlen, sizeof(*latest_node)); |
672 | /* FIXME: If this fails, there seems to be a memory leak. Find it. */ | 661 | /* FIXME: If this fails, there seems to be a memory leak. Find it. */ |
673 | up(&f->sem); | 662 | up(&f->sem); |
674 | jffs2_do_clear_inode(c, f); | 663 | jffs2_do_clear_inode(c, f); |
@@ -677,7 +666,8 @@ static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c, | |||
677 | 666 | ||
678 | crc = crc32(0, latest_node, sizeof(*latest_node)-8); | 667 | crc = crc32(0, latest_node, sizeof(*latest_node)-8); |
679 | if (crc != je32_to_cpu(latest_node->node_crc)) { | 668 | if (crc != je32_to_cpu(latest_node->node_crc)) { |
680 | printk(KERN_NOTICE "CRC failed for read_inode of inode %u at physical location 0x%x\n", f->inocache->ino, ref_offset(fn->raw)); | 669 | JFFS2_ERROR("CRC failed for read_inode of inode %u at physical location 0x%x\n", |
670 | f->inocache->ino, ref_offset(fn->raw)); | ||
681 | up(&f->sem); | 671 | up(&f->sem); |
682 | jffs2_do_clear_inode(c, f); | 672 | jffs2_do_clear_inode(c, f); |
683 | return -EIO; | 673 | return -EIO; |
@@ -712,9 +702,7 @@ static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c, | |||
712 | * operation. */ | 702 | * operation. */ |
713 | f->target = kmalloc(je32_to_cpu(latest_node->csize) + 1, GFP_KERNEL); | 703 | f->target = kmalloc(je32_to_cpu(latest_node->csize) + 1, GFP_KERNEL); |
714 | if (!f->target) { | 704 | if (!f->target) { |
715 | printk(KERN_WARNING "Can't allocate %d bytes of memory " | 705 | JFFS2_ERROR("can't allocate %d bytes of memory for the symlink target path cache\n", je32_to_cpu(latest_node->csize)); |
716 | "for the symlink target path cache\n", | ||
717 | je32_to_cpu(latest_node->csize)); | ||
718 | up(&f->sem); | 706 | up(&f->sem); |
719 | jffs2_do_clear_inode(c, f); | 707 | jffs2_do_clear_inode(c, f); |
720 | return -ENOMEM; | 708 | return -ENOMEM; |
@@ -734,8 +722,7 @@ static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c, | |||
734 | } | 722 | } |
735 | 723 | ||
736 | f->target[je32_to_cpu(latest_node->csize)] = '\0'; | 724 | f->target[je32_to_cpu(latest_node->csize)] = '\0'; |
737 | D1(printk(KERN_DEBUG "jffs2_do_read_inode(): symlink's target '%s' cached\n", | 725 | JFFS2_DBG_READINODE("symlink's target '%s' cached\n", f->target); |
738 | f->target)); | ||
739 | } | 726 | } |
740 | 727 | ||
741 | /* fall through... */ | 728 | /* fall through... */ |
@@ -745,14 +732,14 @@ static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c, | |||
745 | /* Certain inode types should have only one data node, and it's | 732 | /* Certain inode types should have only one data node, and it's |
746 | kept as the metadata node */ | 733 | kept as the metadata node */ |
747 | if (f->metadata) { | 734 | if (f->metadata) { |
748 | printk(KERN_WARNING "Argh. Special inode #%u with mode 0%o had metadata node\n", | 735 | JFFS2_ERROR("Argh. Special inode #%u with mode 0%o had metadata node\n", |
749 | f->inocache->ino, jemode_to_cpu(latest_node->mode)); | 736 | f->inocache->ino, jemode_to_cpu(latest_node->mode)); |
750 | up(&f->sem); | 737 | up(&f->sem); |
751 | jffs2_do_clear_inode(c, f); | 738 | jffs2_do_clear_inode(c, f); |
752 | return -EIO; | 739 | return -EIO; |
753 | } | 740 | } |
754 | if (!frag_first(&f->fragtree)) { | 741 | if (!frag_first(&f->fragtree)) { |
755 | printk(KERN_WARNING "Argh. Special inode #%u with mode 0%o has no fragments\n", | 742 | JFFS2_ERROR("Argh. Special inode #%u with mode 0%o has no fragments\n", |
756 | f->inocache->ino, jemode_to_cpu(latest_node->mode)); | 743 | f->inocache->ino, jemode_to_cpu(latest_node->mode)); |
757 | up(&f->sem); | 744 | up(&f->sem); |
758 | jffs2_do_clear_inode(c, f); | 745 | jffs2_do_clear_inode(c, f); |
@@ -760,7 +747,7 @@ static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c, | |||
760 | } | 747 | } |
761 | /* ASSERT: f->fraglist != NULL */ | 748 | /* ASSERT: f->fraglist != NULL */ |
762 | if (frag_next(frag_first(&f->fragtree))) { | 749 | if (frag_next(frag_first(&f->fragtree))) { |
763 | printk(KERN_WARNING "Argh. Special inode #%u with mode 0x%x had more than one node\n", | 750 | JFFS2_ERROR("Argh. Special inode #%u with mode 0x%x had more than one node\n", |
764 | f->inocache->ino, jemode_to_cpu(latest_node->mode)); | 751 | f->inocache->ino, jemode_to_cpu(latest_node->mode)); |
765 | /* FIXME: Deal with it - check crc32, check for duplicate node, check times and discard the older one */ | 752 | /* FIXME: Deal with it - check crc32, check for duplicate node, check times and discard the older one */ |
766 | up(&f->sem); | 753 | up(&f->sem); |
@@ -783,14 +770,12 @@ static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c, | |||
783 | int jffs2_do_read_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, | 770 | int jffs2_do_read_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, |
784 | uint32_t ino, struct jffs2_raw_inode *latest_node) | 771 | uint32_t ino, struct jffs2_raw_inode *latest_node) |
785 | { | 772 | { |
786 | D2(printk(KERN_DEBUG "jffs2_do_read_inode(): getting inocache\n")); | 773 | JFFS2_DBG_READINODE("read inode #%u\n", ino); |
787 | 774 | ||
788 | retry_inocache: | 775 | retry_inocache: |
789 | spin_lock(&c->inocache_lock); | 776 | spin_lock(&c->inocache_lock); |
790 | f->inocache = jffs2_get_ino_cache(c, ino); | 777 | f->inocache = jffs2_get_ino_cache(c, ino); |
791 | 778 | ||
792 | D2(printk(KERN_DEBUG "jffs2_do_read_inode(): Got inocache at %p\n", f->inocache)); | ||
793 | |||
794 | if (f->inocache) { | 779 | if (f->inocache) { |
795 | /* Check its state. We may need to wait before we can use it */ | 780 | /* Check its state. We may need to wait before we can use it */ |
796 | switch(f->inocache->state) { | 781 | switch(f->inocache->state) { |
@@ -804,8 +789,7 @@ int jffs2_do_read_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, | |||
804 | /* If it's in either of these states, we need | 789 | /* If it's in either of these states, we need |
805 | to wait for whoever's got it to finish and | 790 | to wait for whoever's got it to finish and |
806 | put it back. */ | 791 | put it back. */ |
807 | D1(printk(KERN_DEBUG "jffs2_get_ino_cache_read waiting for ino #%u in state %d\n", | 792 | JFFS2_DBG_READINODE("waiting for ino #%u in state %d\n", ino, f->inocache->state); |
808 | ino, f->inocache->state)); | ||
809 | sleep_on_spinunlock(&c->inocache_wq, &c->inocache_lock); | 793 | sleep_on_spinunlock(&c->inocache_wq, &c->inocache_lock); |
810 | goto retry_inocache; | 794 | goto retry_inocache; |
811 | 795 | ||
@@ -814,7 +798,7 @@ int jffs2_do_read_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, | |||
814 | /* Eep. This should never happen. It can | 798 | /* Eep. This should never happen. It can |
815 | happen if Linux calls read_inode() again | 799 | happen if Linux calls read_inode() again |
816 | before clear_inode() has finished though. */ | 800 | before clear_inode() has finished though. */ |
817 | printk(KERN_WARNING "Eep. Trying to read_inode #%u when it's already in state %d!\n", ino, f->inocache->state); | 801 | JFFS2_ERROR("Eep. Trying to read_inode #%u when it's already in state %d!\n", ino, f->inocache->state); |
818 | /* Fail. That's probably better than allowing it to succeed */ | 802 | /* Fail. That's probably better than allowing it to succeed */ |
819 | f->inocache = NULL; | 803 | f->inocache = NULL; |
820 | break; | 804 | break; |
@@ -829,10 +813,10 @@ int jffs2_do_read_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, | |||
829 | /* Special case - no root inode on medium */ | 813 | /* Special case - no root inode on medium */ |
830 | f->inocache = jffs2_alloc_inode_cache(); | 814 | f->inocache = jffs2_alloc_inode_cache(); |
831 | if (!f->inocache) { | 815 | if (!f->inocache) { |
832 | printk(KERN_CRIT "jffs2_do_read_inode(): Cannot allocate inocache for root inode\n"); | 816 | JFFS2_ERROR("cannot allocate inocache for root inode\n"); |
833 | return -ENOMEM; | 817 | return -ENOMEM; |
834 | } | 818 | } |
835 | D1(printk(KERN_DEBUG "jffs2_do_read_inode(): Creating inocache for root inode\n")); | 819 | JFFS2_DBG_READINODE("creating inocache for root inode\n"); |
836 | memset(f->inocache, 0, sizeof(struct jffs2_inode_cache)); | 820 | memset(f->inocache, 0, sizeof(struct jffs2_inode_cache)); |
837 | f->inocache->ino = f->inocache->nlink = 1; | 821 | f->inocache->ino = f->inocache->nlink = 1; |
838 | f->inocache->nodes = (struct jffs2_raw_node_ref *)f->inocache; | 822 | f->inocache->nodes = (struct jffs2_raw_node_ref *)f->inocache; |
@@ -840,7 +824,7 @@ int jffs2_do_read_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, | |||
840 | jffs2_add_ino_cache(c, f->inocache); | 824 | jffs2_add_ino_cache(c, f->inocache); |
841 | } | 825 | } |
842 | if (!f->inocache) { | 826 | if (!f->inocache) { |
843 | printk(KERN_WARNING "jffs2_do_read_inode() on nonexistent ino %u\n", ino); | 827 | JFFS2_ERROR("requestied to read an nonexistent ino %u\n", ino); |
844 | return -ENOENT; | 828 | return -ENOENT; |
845 | } | 829 | } |
846 | 830 | ||