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