source: rtems/cpukit/libfs/src/jffs2/src/readinode.c @ 2c5980f

5
Last change on this file since 2c5980f was 2c5980f, checked in by Geert Uytterhoeven <geert+renesas@…>, on 11/27/14 at 11:05:46

jffs2: Drop bogus if in comment

Signed-off-by: Geert Uytterhoeven <geert+renesas@…>
Cc: David Woodhouse <dwmw2@…>
Cc: linux-mtd@…
Signed-off-by: Brian Norris <computersforpeace@…>

  • Property mode set to 100644
File size: 43.4 KB
Line 
1#include "rtems-jffs2-config.h"
2
3/*
4 * JFFS2 -- Journalling Flash File System, Version 2.
5 *
6 * Copyright © 2001-2007 Red Hat, Inc.
7 *
8 * Created by David Woodhouse <dwmw2@infradead.org>
9 *
10 * For licensing information, see the file 'LICENCE' in this directory.
11 *
12 */
13
14#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
15
16#include <linux/kernel.h>
17#include <linux/sched.h>
18#include <linux/slab.h>
19#include <linux/fs.h>
20#include <linux/crc32.h>
21#include <linux/pagemap.h>
22#include <linux/mtd/mtd.h>
23#include <linux/compiler.h>
24#include "nodelist.h"
25
26/*
27 * Check the data CRC of the node.
28 *
29 * Returns: 0 if the data CRC is correct;
30 *          1 - if incorrect;
31 *          error code if an error occurred.
32 */
33static int check_node_data(struct jffs2_sb_info *c, struct jffs2_tmp_dnode_info *tn)
34{
35        struct jffs2_raw_node_ref *ref = tn->fn->raw;
36        int err = 0, pointed = 0;
37        struct jffs2_eraseblock *jeb;
38        unsigned char *buffer;
39        uint32_t crc, ofs, len;
40        size_t retlen;
41
42        BUG_ON(tn->csize == 0);
43
44        /* Calculate how many bytes were already checked */
45        ofs = ref_offset(ref) + sizeof(struct jffs2_raw_inode);
46        len = tn->csize;
47
48        if (jffs2_is_writebuffered(c)) {
49                int adj = ofs % c->wbuf_pagesize;
50                if (likely(adj))
51                        adj = c->wbuf_pagesize - adj;
52
53                if (adj >= tn->csize) {
54                        dbg_readinode("no need to check node at %#08x, data length %u, data starts at %#08x - it has already been checked.\n",
55                                      ref_offset(ref), tn->csize, ofs);
56                        goto adj_acc;
57                }
58
59                ofs += adj;
60                len -= adj;
61        }
62
63        dbg_readinode("check node at %#08x, data length %u, partial CRC %#08x, correct CRC %#08x, data starts at %#08x, start checking from %#08x - %u bytes.\n",
64                ref_offset(ref), tn->csize, tn->partial_crc, tn->data_crc, ofs - len, ofs, len);
65
66#ifndef __ECOS
67        /* TODO: instead, incapsulate point() stuff to jffs2_flash_read(),
68         * adding and jffs2_flash_read_end() interface. */
69        err = mtd_point(c->mtd, ofs, len, &retlen, (void **)&buffer, NULL);
70        if (!err && retlen < len) {
71                JFFS2_WARNING("MTD point returned len too short: %zu instead of %u.\n", retlen, tn->csize);
72                mtd_unpoint(c->mtd, ofs, retlen);
73        } else if (err) {
74                if (err != -EOPNOTSUPP)
75                        JFFS2_WARNING("MTD point failed: error code %d.\n", err);
76        } else
77                pointed = 1; /* succefully pointed to device */
78#endif
79
80        if (!pointed) {
81                buffer = kmalloc(len, GFP_KERNEL);
82                if (unlikely(!buffer))
83                        return -ENOMEM;
84
85                /* TODO: this is very frequent pattern, make it a separate
86                 * routine */
87                err = jffs2_flash_read(c, ofs, len, &retlen, buffer);
88                if (err) {
89                        JFFS2_ERROR("can not read %d bytes from 0x%08x, error code: %d.\n", len, ofs, err);
90                        goto free_out;
91                }
92
93                if (retlen != len) {
94                        JFFS2_ERROR("short read at %#08x: %zd instead of %d.\n", ofs, retlen, len);
95                        err = -EIO;
96                        goto free_out;
97                }
98        }
99
100        /* Continue calculating CRC */
101        crc = crc32(tn->partial_crc, buffer, len);
102        if(!pointed)
103                kfree(buffer);
104#ifndef __ECOS
105        else
106                mtd_unpoint(c->mtd, ofs, len);
107#endif
108
109        if (crc != tn->data_crc) {
110                JFFS2_NOTICE("wrong data CRC in data node at 0x%08x: read %#08x, calculated %#08x.\n",
111                             ref_offset(ref), tn->data_crc, crc);
112                return 1;
113        }
114
115adj_acc:
116        jeb = &c->blocks[ref->flash_offset / c->sector_size];
117        len = ref_totlen(c, jeb, ref);
118        /* If it should be REF_NORMAL, it'll get marked as such when
119           we build the fragtree, shortly. No need to worry about GC
120           moving it while it's marked REF_PRISTINE -- GC won't happen
121           till we've finished checking every inode anyway. */
122        ref->flash_offset |= REF_PRISTINE;
123        /*
124         * Mark the node as having been checked and fix the
125         * accounting accordingly.
126         */
127        spin_lock(&c->erase_completion_lock);
128        jeb->used_size += len;
129        jeb->unchecked_size -= len;
130        c->used_size += len;
131        c->unchecked_size -= len;
132        jffs2_dbg_acct_paranoia_check_nolock(c, jeb);
133        spin_unlock(&c->erase_completion_lock);
134
135        return 0;
136
137free_out:
138        if(!pointed)
139                kfree(buffer);
140#ifndef __ECOS
141        else
142                mtd_unpoint(c->mtd, ofs, len);
143#endif
144        return err;
145}
146
147/*
148 * Helper function for jffs2_add_older_frag_to_fragtree().
149 *
150 * Checks the node if we are in the checking stage.
151 */
152static int check_tn_node(struct jffs2_sb_info *c, struct jffs2_tmp_dnode_info *tn)
153{
154        int ret;
155
156        BUG_ON(ref_obsolete(tn->fn->raw));
157
158        /* We only check the data CRC of unchecked nodes */
159        if (ref_flags(tn->fn->raw) != REF_UNCHECKED)
160                return 0;
161
162        dbg_readinode("check node %#04x-%#04x, phys offs %#08x\n",
163                      tn->fn->ofs, tn->fn->ofs + tn->fn->size, ref_offset(tn->fn->raw));
164
165        ret = check_node_data(c, tn);
166        if (unlikely(ret < 0)) {
167                JFFS2_ERROR("check_node_data() returned error: %d.\n",
168                        ret);
169        } else if (unlikely(ret > 0)) {
170                dbg_readinode("CRC error, mark it obsolete.\n");
171                jffs2_mark_node_obsolete(c, tn->fn->raw);
172        }
173
174        return ret;
175}
176
177static struct jffs2_tmp_dnode_info *jffs2_lookup_tn(struct rb_root *tn_root, uint32_t offset)
178{
179        struct rb_node *next;
180        struct jffs2_tmp_dnode_info *tn = NULL;
181
182        dbg_readinode("root %p, offset %d\n", tn_root, offset);
183
184        next = tn_root->rb_node;
185
186        while (next) {
187                tn = rb_entry(next, struct jffs2_tmp_dnode_info, rb);
188
189                if (tn->fn->ofs < offset)
190                        next = tn->rb.rb_right;
191                else if (tn->fn->ofs >= offset)
192                        next = tn->rb.rb_left;
193                else
194                        break;
195        }
196
197        return tn;
198}
199
200
201static void jffs2_kill_tn(struct jffs2_sb_info *c, struct jffs2_tmp_dnode_info *tn)
202{
203        jffs2_mark_node_obsolete(c, tn->fn->raw);
204        jffs2_free_full_dnode(tn->fn);
205        jffs2_free_tmp_dnode_info(tn);
206}
207/*
208 * This function is used when we read an inode. Data nodes arrive in
209 * arbitrary order -- they may be older or newer than the nodes which
210 * are already in the tree. Where overlaps occur, the older node can
211 * be discarded as long as the newer passes the CRC check. We don't
212 * bother to keep track of holes in this rbtree, and neither do we deal
213 * with frags -- we can have multiple entries starting at the same
214 * offset, and the one with the smallest length will come first in the
215 * ordering.
216 *
217 * Returns 0 if the node was handled (including marking it obsolete)
218 *       < 0 an if error occurred
219 */
220static int jffs2_add_tn_to_tree(struct jffs2_sb_info *c,
221                                struct jffs2_readinode_info *rii,
222                                struct jffs2_tmp_dnode_info *tn)
223{
224        uint32_t fn_end = tn->fn->ofs + tn->fn->size;
225        struct jffs2_tmp_dnode_info *this, *ptn;
226
227        dbg_readinode("insert fragment %#04x-%#04x, ver %u at %08x\n", tn->fn->ofs, fn_end, tn->version, ref_offset(tn->fn->raw));
228
229        /* If a node has zero dsize, we only have to keep it if it might be the
230           node with highest version -- i.e. the one which will end up as f->metadata.
231           Note that such nodes won't be REF_UNCHECKED since there are no data to
232           check anyway. */
233        if (!tn->fn->size) {
234                if (rii->mdata_tn) {
235                        if (rii->mdata_tn->version < tn->version) {
236                                /* We had a candidate mdata node already */
237                                dbg_readinode("kill old mdata with ver %d\n", rii->mdata_tn->version);
238                                jffs2_kill_tn(c, rii->mdata_tn);
239                        } else {
240                                dbg_readinode("kill new mdata with ver %d (older than existing %d\n",
241                                              tn->version, rii->mdata_tn->version);
242                                jffs2_kill_tn(c, tn);
243                                return 0;
244                        }
245                }
246                rii->mdata_tn = tn;
247                dbg_readinode("keep new mdata with ver %d\n", tn->version);
248                return 0;
249        }
250
251        /* Find the earliest node which _may_ be relevant to this one */
252        this = jffs2_lookup_tn(&rii->tn_root, tn->fn->ofs);
253        if (this) {
254                /* If the node is coincident with another at a lower address,
255                   back up until the other node is found. It may be relevant */
256                while (this->overlapped) {
257                        ptn = tn_prev(this);
258                        if (!ptn) {
259                                /*
260                                 * We killed a node which set the overlapped
261                                 * flags during the scan. Fix it up.
262                                 */
263                                this->overlapped = 0;
264                                break;
265                        }
266                        this = ptn;
267                }
268                dbg_readinode("'this' found %#04x-%#04x (%s)\n", this->fn->ofs, this->fn->ofs + this->fn->size, this->fn ? "data" : "hole");
269        }
270
271        while (this) {
272                if (this->fn->ofs > fn_end)
273                        break;
274                dbg_readinode("Ponder this ver %d, 0x%x-0x%x\n",
275                              this->version, this->fn->ofs, this->fn->size);
276
277                if (this->version == tn->version) {
278                        /* Version number collision means REF_PRISTINE GC. Accept either of them
279                           as long as the CRC is correct. Check the one we have already...  */
280                        if (!check_tn_node(c, this)) {
281                                /* The one we already had was OK. Keep it and throw away the new one */
282                                dbg_readinode("Like old node. Throw away new\n");
283                                jffs2_kill_tn(c, tn);
284                                return 0;
285                        } else {
286                                /* Who cares if the new one is good; keep it for now anyway. */
287                                dbg_readinode("Like new node. Throw away old\n");
288                                rb_replace_node(&this->rb, &tn->rb, &rii->tn_root);
289                                jffs2_kill_tn(c, this);
290                                /* Same overlapping from in front and behind */
291                                return 0;
292                        }
293                }
294                if (this->version < tn->version &&
295                    this->fn->ofs >= tn->fn->ofs &&
296                    this->fn->ofs + this->fn->size <= fn_end) {
297                        /* New node entirely overlaps 'this' */
298                        if (check_tn_node(c, tn)) {
299                                dbg_readinode("new node bad CRC\n");
300                                jffs2_kill_tn(c, tn);
301                                return 0;
302                        }
303                        /* ... and is good. Kill 'this' and any subsequent nodes which are also overlapped */
304                        while (this && this->fn->ofs + this->fn->size <= fn_end) {
305                                struct jffs2_tmp_dnode_info *next = tn_next(this);
306                                if (this->version < tn->version) {
307                                        tn_erase(this, &rii->tn_root);
308                                        dbg_readinode("Kill overlapped ver %d, 0x%x-0x%x\n",
309                                                      this->version, this->fn->ofs,
310                                                      this->fn->ofs+this->fn->size);
311                                        jffs2_kill_tn(c, this);
312                                }
313                                this = next;
314                        }
315                        dbg_readinode("Done killing overlapped nodes\n");
316                        continue;
317                }
318                if (this->version > tn->version &&
319                    this->fn->ofs <= tn->fn->ofs &&
320                    this->fn->ofs+this->fn->size >= fn_end) {
321                        /* New node entirely overlapped by 'this' */
322                        if (!check_tn_node(c, this)) {
323                                dbg_readinode("Good CRC on old node. Kill new\n");
324                                jffs2_kill_tn(c, tn);
325                                return 0;
326                        }
327                        /* ... but 'this' was bad. Replace it... */
328                        dbg_readinode("Bad CRC on old overlapping node. Kill it\n");
329                        tn_erase(this, &rii->tn_root);
330                        jffs2_kill_tn(c, this);
331                        break;
332                }
333
334                this = tn_next(this);
335        }
336
337        /* We neither completely obsoleted nor were completely
338           obsoleted by an earlier node. Insert into the tree */
339        {
340                struct rb_node *parent;
341                struct rb_node **link = &rii->tn_root.rb_node;
342                struct jffs2_tmp_dnode_info *insert_point = NULL;
343
344                while (*link) {
345                        parent = *link;
346                        insert_point = rb_entry(parent, struct jffs2_tmp_dnode_info, rb);
347                        if (tn->fn->ofs > insert_point->fn->ofs)
348                                link = &insert_point->rb.rb_right;
349                        else if (tn->fn->ofs < insert_point->fn->ofs ||
350                                 tn->fn->size < insert_point->fn->size)
351                                link = &insert_point->rb.rb_left;
352                        else
353                                link = &insert_point->rb.rb_right;
354                }
355                rb_link_node(&tn->rb, &insert_point->rb, link);
356                rb_insert_color(&tn->rb, &rii->tn_root);
357        }
358
359        /* If there's anything behind that overlaps us, note it */
360        this = tn_prev(tn);
361        if (this) {
362                while (1) {
363                        if (this->fn->ofs + this->fn->size > tn->fn->ofs) {
364                                dbg_readinode("Node is overlapped by %p (v %d, 0x%x-0x%x)\n",
365                                              this, this->version, this->fn->ofs,
366                                              this->fn->ofs+this->fn->size);
367                                tn->overlapped = 1;
368                                break;
369                        }
370                        if (!this->overlapped)
371                                break;
372
373                        ptn = tn_prev(this);
374                        if (!ptn) {
375                                /*
376                                 * We killed a node which set the overlapped
377                                 * flags during the scan. Fix it up.
378                                 */
379                                this->overlapped = 0;
380                                break;
381                        }
382                        this = ptn;
383                }
384        }
385
386        /* If the new node overlaps anything ahead, note it */
387        this = tn_next(tn);
388        while (this && this->fn->ofs < fn_end) {
389                this->overlapped = 1;
390                dbg_readinode("Node ver %d, 0x%x-0x%x is overlapped\n",
391                              this->version, this->fn->ofs,
392                              this->fn->ofs+this->fn->size);
393                this = tn_next(this);
394        }
395        return 0;
396}
397
398/* Trivial function to remove the last node in the tree. Which by definition
399   has no right-hand child — so can be removed just by making its left-hand
400   child (if any) take its place under its parent. Since this is only done
401   when we're consuming the whole tree, there's no need to use rb_erase()
402   and let it worry about adjusting colours and balancing the tree. That
403   would just be a waste of time. */
404static void eat_last(struct rb_root *root, struct rb_node *node)
405{
406        struct rb_node *parent = rb_parent(node);
407        struct rb_node **link;
408
409        /* LAST! */
410        BUG_ON(node->rb_right);
411
412        if (!parent)
413                link = &root->rb_node;
414        else if (node == parent->rb_left)
415                link = &parent->rb_left;
416        else
417                link = &parent->rb_right;
418
419        *link = node->rb_left;
420        if (node->rb_left)
421#ifndef __rtems__
422                node->rb_left->__rb_parent_color = node->__rb_parent_color;
423#else /* __rtems__ */
424        {
425                node->rb_left->Node.rbe_parent = node->Node.rbe_parent;
426                node->rb_left->Node.rbe_color = node->Node.rbe_color;
427        }
428#endif /* __rtems__ */
429}
430
431/* We put the version tree in reverse order, so we can use the same eat_last()
432   function that we use to consume the tmpnode tree (tn_root). */
433static void ver_insert(struct rb_root *ver_root, struct jffs2_tmp_dnode_info *tn)
434{
435        struct rb_node **link = &ver_root->rb_node;
436        struct rb_node *parent = NULL;
437        struct jffs2_tmp_dnode_info *this_tn;
438
439        while (*link) {
440                parent = *link;
441                this_tn = rb_entry(parent, struct jffs2_tmp_dnode_info, rb);
442
443                if (tn->version > this_tn->version)
444                        link = &parent->rb_left;
445                else
446                        link = &parent->rb_right;
447        }
448        dbg_readinode("Link new node at %p (root is %p)\n", link, ver_root);
449        rb_link_node(&tn->rb, parent, link);
450        rb_insert_color(&tn->rb, ver_root);
451}
452
453/* Build final, normal fragtree from tn tree. It doesn't matter which order
454   we add nodes to the real fragtree, as long as they don't overlap. And
455   having thrown away the majority of overlapped nodes as we went, there
456   really shouldn't be many sets of nodes which do overlap. If we start at
457   the end, we can use the overlap markers -- we can just eat nodes which
458   aren't overlapped, and when we encounter nodes which _do_ overlap we
459   sort them all into a temporary tree in version order before replaying them. */
460static int jffs2_build_inode_fragtree(struct jffs2_sb_info *c,
461                                      struct jffs2_inode_info *f,
462                                      struct jffs2_readinode_info *rii)
463{
464        struct jffs2_tmp_dnode_info *pen, *last, *this;
465        struct rb_root ver_root = RB_ROOT;
466        uint32_t high_ver = 0;
467
468        if (rii->mdata_tn) {
469                dbg_readinode("potential mdata is ver %d at %p\n", rii->mdata_tn->version, rii->mdata_tn);
470                high_ver = rii->mdata_tn->version;
471                rii->latest_ref = rii->mdata_tn->fn->raw;
472        }
473#ifdef JFFS2_DBG_READINODE_MESSAGES
474        this = tn_last(&rii->tn_root);
475        while (this) {
476                dbg_readinode("tn %p ver %d range 0x%x-0x%x ov %d\n", this, this->version, this->fn->ofs,
477                              this->fn->ofs+this->fn->size, this->overlapped);
478                this = tn_prev(this);
479        }
480#endif
481        pen = tn_last(&rii->tn_root);
482        while ((last = pen)) {
483                pen = tn_prev(last);
484
485                eat_last(&rii->tn_root, &last->rb);
486                ver_insert(&ver_root, last);
487
488                if (unlikely(last->overlapped)) {
489                        if (pen)
490                                continue;
491                        /*
492                         * We killed a node which set the overlapped
493                         * flags during the scan. Fix it up.
494                         */
495                        last->overlapped = 0;
496                }
497
498                /* Now we have a bunch of nodes in reverse version
499                   order, in the tree at ver_root. Most of the time,
500                   there'll actually be only one node in the 'tree',
501                   in fact. */
502                this = tn_last(&ver_root);
503
504                while (this) {
505                        struct jffs2_tmp_dnode_info *vers_next;
506                        int ret;
507                        vers_next = tn_prev(this);
508                        eat_last(&ver_root, &this->rb);
509                        if (check_tn_node(c, this)) {
510                                dbg_readinode("node ver %d, 0x%x-0x%x failed CRC\n",
511                                             this->version, this->fn->ofs,
512                                             this->fn->ofs+this->fn->size);
513                                jffs2_kill_tn(c, this);
514                        } else {
515                                if (this->version > high_ver) {
516                                        /* Note that this is different from the other
517                                           highest_version, because this one is only
518                                           counting _valid_ nodes which could give the
519                                           latest inode metadata */
520                                        high_ver = this->version;
521                                        rii->latest_ref = this->fn->raw;
522                                }
523                                dbg_readinode("Add %p (v %d, 0x%x-0x%x, ov %d) to fragtree\n",
524                                             this, this->version, this->fn->ofs,
525                                             this->fn->ofs+this->fn->size, this->overlapped);
526
527                                ret = jffs2_add_full_dnode_to_inode(c, f, this->fn);
528                                if (ret) {
529                                        /* Free the nodes in vers_root; let the caller
530                                           deal with the rest */
531                                        JFFS2_ERROR("Add node to tree failed %d\n", ret);
532                                        while (1) {
533                                                vers_next = tn_prev(this);
534                                                if (check_tn_node(c, this))
535                                                        jffs2_mark_node_obsolete(c, this->fn->raw);
536                                                jffs2_free_full_dnode(this->fn);
537                                                jffs2_free_tmp_dnode_info(this);
538                                                this = vers_next;
539                                                if (!this)
540                                                        break;
541                                                eat_last(&ver_root, &vers_next->rb);
542                                        }
543                                        return ret;
544                                }
545                                jffs2_free_tmp_dnode_info(this);
546                        }
547                        this = vers_next;
548                }
549        }
550        return 0;
551}
552
553static void jffs2_free_tmp_dnode_info_list(struct rb_root *list)
554{
555        struct jffs2_tmp_dnode_info *tn, *next;
556
557        rbtree_postorder_for_each_entry_safe(tn, next, list, rb) {
558                        jffs2_free_full_dnode(tn->fn);
559                        jffs2_free_tmp_dnode_info(tn);
560        }
561
562        *list = RB_ROOT;
563}
564
565static void jffs2_free_full_dirent_list(struct jffs2_full_dirent *fd)
566{
567        struct jffs2_full_dirent *next;
568
569        while (fd) {
570                next = fd->next;
571                jffs2_free_full_dirent(fd);
572                fd = next;
573        }
574}
575
576/* Returns first valid node after 'ref'. May return 'ref' */
577static struct jffs2_raw_node_ref *jffs2_first_valid_node(struct jffs2_raw_node_ref *ref)
578{
579        while (ref && ref->next_in_ino) {
580                if (!ref_obsolete(ref))
581                        return ref;
582                dbg_noderef("node at 0x%08x is obsoleted. Ignoring.\n", ref_offset(ref));
583                ref = ref->next_in_ino;
584        }
585        return NULL;
586}
587
588/*
589 * Helper function for jffs2_get_inode_nodes().
590 * It is called every time an directory entry node is found.
591 *
592 * Returns: 0 on success;
593 *          negative error code on failure.
594 */
595static inline int read_direntry(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *ref,
596                                struct jffs2_raw_dirent *rd, size_t read,
597                                struct jffs2_readinode_info *rii)
598{
599        struct jffs2_full_dirent *fd;
600        uint32_t crc;
601
602        /* Obsoleted. This cannot happen, surely? dwmw2 20020308 */
603        BUG_ON(ref_obsolete(ref));
604
605        crc = crc32(0, rd, sizeof(*rd) - 8);
606        if (unlikely(crc != je32_to_cpu(rd->node_crc))) {
607                JFFS2_NOTICE("header CRC failed on dirent node at %#08x: read %#08x, calculated %#08x\n",
608                             ref_offset(ref), je32_to_cpu(rd->node_crc), crc);
609                jffs2_mark_node_obsolete(c, ref);
610                return 0;
611        }
612
613        /* If we've never checked the CRCs on this node, check them now */
614        if (ref_flags(ref) == REF_UNCHECKED) {
615                struct jffs2_eraseblock *jeb;
616                int len;
617
618                /* Sanity check */
619                if (unlikely(PAD((rd->nsize + sizeof(*rd))) != PAD(je32_to_cpu(rd->totlen)))) {
620                        JFFS2_ERROR("illegal nsize in node at %#08x: nsize %#02x, totlen %#04x\n",
621                                    ref_offset(ref), rd->nsize, je32_to_cpu(rd->totlen));
622                        jffs2_mark_node_obsolete(c, ref);
623                        return 0;
624                }
625
626                jeb = &c->blocks[ref->flash_offset / c->sector_size];
627                len = ref_totlen(c, jeb, ref);
628
629                spin_lock(&c->erase_completion_lock);
630                jeb->used_size += len;
631                jeb->unchecked_size -= len;
632                c->used_size += len;
633                c->unchecked_size -= len;
634                ref->flash_offset = ref_offset(ref) | dirent_node_state(rd);
635                spin_unlock(&c->erase_completion_lock);
636        }
637
638        fd = jffs2_alloc_full_dirent(rd->nsize + 1);
639        if (unlikely(!fd))
640                return -ENOMEM;
641
642        fd->raw = ref;
643        fd->version = je32_to_cpu(rd->version);
644        fd->ino = je32_to_cpu(rd->ino);
645        fd->type = rd->type;
646
647        if (fd->version > rii->highest_version)
648                rii->highest_version = fd->version;
649
650        /* Pick out the mctime of the latest dirent */
651        if(fd->version > rii->mctime_ver && je32_to_cpu(rd->mctime)) {
652                rii->mctime_ver = fd->version;
653                rii->latest_mctime = je32_to_cpu(rd->mctime);
654        }
655
656        /*
657         * Copy as much of the name as possible from the raw
658         * dirent we've already read from the flash.
659         */
660        if (read > sizeof(*rd))
661                memcpy(&fd->name[0], &rd->name[0],
662                       min_t(uint32_t, rd->nsize, (read - sizeof(*rd)) ));
663
664        /* Do we need to copy any more of the name directly from the flash? */
665        if (rd->nsize + sizeof(*rd) > read) {
666                /* FIXME: point() */
667                int err;
668                int already = read - sizeof(*rd);
669
670                err = jffs2_flash_read(c, (ref_offset(ref)) + read,
671                                rd->nsize - already, &read, &fd->name[already]);
672                if (unlikely(read != rd->nsize - already) && likely(!err))
673                        return -EIO;
674
675                if (unlikely(err)) {
676                        JFFS2_ERROR("read remainder of name: error %d\n", err);
677                        jffs2_free_full_dirent(fd);
678                        return -EIO;
679                }
680        }
681
682        fd->nhash = full_name_hash(fd->name, rd->nsize);
683        fd->next = NULL;
684        fd->name[rd->nsize] = '\0';
685
686        /*
687         * Wheee. We now have a complete jffs2_full_dirent structure, with
688         * the name in it and everything. Link it into the list
689         */
690        jffs2_add_fd_to_list(c, fd, &rii->fds);
691
692        return 0;
693}
694
695/*
696 * Helper function for jffs2_get_inode_nodes().
697 * It is called every time an inode node is found.
698 *
699 * Returns: 0 on success (possibly after marking a bad node obsolete);
700 *          negative error code on failure.
701 */
702static inline int read_dnode(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *ref,
703                             struct jffs2_raw_inode *rd, int rdlen,
704                             struct jffs2_readinode_info *rii)
705{
706        struct jffs2_tmp_dnode_info *tn;
707        uint32_t len, csize;
708        int ret = 0;
709        uint32_t crc;
710
711        /* Obsoleted. This cannot happen, surely? dwmw2 20020308 */
712        BUG_ON(ref_obsolete(ref));
713
714        crc = crc32(0, rd, sizeof(*rd) - 8);
715        if (unlikely(crc != je32_to_cpu(rd->node_crc))) {
716                JFFS2_NOTICE("node CRC failed on dnode at %#08x: read %#08x, calculated %#08x\n",
717                             ref_offset(ref), je32_to_cpu(rd->node_crc), crc);
718                jffs2_mark_node_obsolete(c, ref);
719                return 0;
720        }
721
722        tn = jffs2_alloc_tmp_dnode_info();
723        if (!tn) {
724                JFFS2_ERROR("failed to allocate tn (%zu bytes).\n", sizeof(*tn));
725                return -ENOMEM;
726        }
727
728        tn->partial_crc = 0;
729        csize = je32_to_cpu(rd->csize);
730
731        /* If we've never checked the CRCs on this node, check them now */
732        if (ref_flags(ref) == REF_UNCHECKED) {
733
734                /* Sanity checks */
735                if (unlikely(je32_to_cpu(rd->offset) > je32_to_cpu(rd->isize)) ||
736                    unlikely(PAD(je32_to_cpu(rd->csize) + sizeof(*rd)) != PAD(je32_to_cpu(rd->totlen)))) {
737                        JFFS2_WARNING("inode node header CRC is corrupted at %#08x\n", ref_offset(ref));
738                        jffs2_dbg_dump_node(c, ref_offset(ref));
739                        jffs2_mark_node_obsolete(c, ref);
740                        goto free_out;
741                }
742
743                if (jffs2_is_writebuffered(c) && csize != 0) {
744                        /* At this point we are supposed to check the data CRC
745                         * of our unchecked node. But thus far, we do not
746                         * know whether the node is valid or obsolete. To
747                         * figure this out, we need to walk all the nodes of
748                         * the inode and build the inode fragtree. We don't
749                         * want to spend time checking data of nodes which may
750                         * later be found to be obsolete. So we put off the full
751                         * data CRC checking until we have read all the inode
752                         * nodes and have started building the fragtree.
753                         *
754                         * The fragtree is being built starting with nodes
755                         * having the highest version number, so we'll be able
756                         * to detect whether a node is valid (i.e., it is not
757                         * overlapped by a node with higher version) or not.
758                         * And we'll be able to check only those nodes, which
759                         * are not obsolete.
760                         *
761                         * Of course, this optimization only makes sense in case
762                         * of NAND flashes (or other flashes with
763                         * !jffs2_can_mark_obsolete()), since on NOR flashes
764                         * nodes are marked obsolete physically.
765                         *
766                         * Since NAND flashes (or other flashes with
767                         * jffs2_is_writebuffered(c)) are anyway read by
768                         * fractions of c->wbuf_pagesize, and we have just read
769                         * the node header, it is likely that the starting part
770                         * of the node data is also read when we read the
771                         * header. So we don't mind to check the CRC of the
772                         * starting part of the data of the node now, and check
773                         * the second part later (in jffs2_check_node_data()).
774                         * Of course, we will not need to re-read and re-check
775                         * the NAND page which we have just read. This is why we
776                         * read the whole NAND page at jffs2_get_inode_nodes(),
777                         * while we needed only the node header.
778                         */
779                        unsigned char *buf;
780
781                        /* 'buf' will point to the start of data */
782                        buf = (unsigned char *)rd + sizeof(*rd);
783                        /* len will be the read data length */
784                        len = min_t(uint32_t, rdlen - sizeof(*rd), csize);
785                        tn->partial_crc = crc32(0, buf, len);
786
787                        dbg_readinode("Calculates CRC (%#08x) for %d bytes, csize %d\n", tn->partial_crc, len, csize);
788
789                        /* If we actually calculated the whole data CRC
790                         * and it is wrong, drop the node. */
791                        if (len >= csize && unlikely(tn->partial_crc != je32_to_cpu(rd->data_crc))) {
792                                JFFS2_NOTICE("wrong data CRC in data node at 0x%08x: read %#08x, calculated %#08x.\n",
793                                        ref_offset(ref), tn->partial_crc, je32_to_cpu(rd->data_crc));
794                                jffs2_mark_node_obsolete(c, ref);
795                                goto free_out;
796                        }
797
798                } else if (csize == 0) {
799                        /*
800                         * We checked the header CRC. If the node has no data, adjust
801                         * the space accounting now. For other nodes this will be done
802                         * later either when the node is marked obsolete or when its
803                         * data is checked.
804                         */
805                        struct jffs2_eraseblock *jeb;
806
807                        dbg_readinode("the node has no data.\n");
808                        jeb = &c->blocks[ref->flash_offset / c->sector_size];
809                        len = ref_totlen(c, jeb, ref);
810
811                        spin_lock(&c->erase_completion_lock);
812                        jeb->used_size += len;
813                        jeb->unchecked_size -= len;
814                        c->used_size += len;
815                        c->unchecked_size -= len;
816                        ref->flash_offset = ref_offset(ref) | REF_NORMAL;
817                        spin_unlock(&c->erase_completion_lock);
818                }
819        }
820
821        tn->fn = jffs2_alloc_full_dnode();
822        if (!tn->fn) {
823                JFFS2_ERROR("alloc fn failed\n");
824                ret = -ENOMEM;
825                goto free_out;
826        }
827
828        tn->version = je32_to_cpu(rd->version);
829        tn->fn->ofs = je32_to_cpu(rd->offset);
830        tn->data_crc = je32_to_cpu(rd->data_crc);
831        tn->csize = csize;
832        tn->fn->raw = ref;
833        tn->overlapped = 0;
834
835        if (tn->version > rii->highest_version)
836                rii->highest_version = tn->version;
837
838        /* There was a bug where we wrote hole nodes out with
839           csize/dsize swapped. Deal with it */
840        if (rd->compr == JFFS2_COMPR_ZERO && !je32_to_cpu(rd->dsize) && csize)
841                tn->fn->size = csize;
842        else // normal case...
843                tn->fn->size = je32_to_cpu(rd->dsize);
844
845        dbg_readinode2("dnode @%08x: ver %u, offset %#04x, dsize %#04x, csize %#04x\n",
846                       ref_offset(ref), je32_to_cpu(rd->version),
847                       je32_to_cpu(rd->offset), je32_to_cpu(rd->dsize), csize);
848
849        ret = jffs2_add_tn_to_tree(c, rii, tn);
850
851        if (ret) {
852                jffs2_free_full_dnode(tn->fn);
853        free_out:
854                jffs2_free_tmp_dnode_info(tn);
855                return ret;
856        }
857#ifdef JFFS2_DBG_READINODE2_MESSAGES
858        dbg_readinode2("After adding ver %d:\n", je32_to_cpu(rd->version));
859        tn = tn_first(&rii->tn_root);
860        while (tn) {
861                dbg_readinode2("%p: v %d r 0x%x-0x%x ov %d\n",
862                               tn, tn->version, tn->fn->ofs,
863                               tn->fn->ofs+tn->fn->size, tn->overlapped);
864                tn = tn_next(tn);
865        }
866#endif
867        return 0;
868}
869
870/*
871 * Helper function for jffs2_get_inode_nodes().
872 * It is called every time an unknown node is found.
873 *
874 * Returns: 0 on success;
875 *          negative error code on failure.
876 */
877static inline int read_unknown(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *ref, struct jffs2_unknown_node *un)
878{
879        /* We don't mark unknown nodes as REF_UNCHECKED */
880        if (ref_flags(ref) == REF_UNCHECKED) {
881                JFFS2_ERROR("REF_UNCHECKED but unknown node at %#08x\n",
882                            ref_offset(ref));
883                JFFS2_ERROR("Node is {%04x,%04x,%08x,%08x}. Please report this error.\n",
884                            je16_to_cpu(un->magic), je16_to_cpu(un->nodetype),
885                            je32_to_cpu(un->totlen), je32_to_cpu(un->hdr_crc));
886                jffs2_mark_node_obsolete(c, ref);
887                return 0;
888        }
889
890        un->nodetype = cpu_to_je16(JFFS2_NODE_ACCURATE | je16_to_cpu(un->nodetype));
891
892        switch(je16_to_cpu(un->nodetype) & JFFS2_COMPAT_MASK) {
893
894        case JFFS2_FEATURE_INCOMPAT:
895                JFFS2_ERROR("unknown INCOMPAT nodetype %#04X at %#08x\n",
896                            je16_to_cpu(un->nodetype), ref_offset(ref));
897                /* EEP */
898                BUG();
899                break;
900
901        case JFFS2_FEATURE_ROCOMPAT:
902                JFFS2_ERROR("unknown ROCOMPAT nodetype %#04X at %#08x\n",
903                            je16_to_cpu(un->nodetype), ref_offset(ref));
904                BUG_ON(!(c->flags & JFFS2_SB_FLAG_RO));
905                break;
906
907        case JFFS2_FEATURE_RWCOMPAT_COPY:
908                JFFS2_NOTICE("unknown RWCOMPAT_COPY nodetype %#04X at %#08x\n",
909                             je16_to_cpu(un->nodetype), ref_offset(ref));
910                break;
911
912        case JFFS2_FEATURE_RWCOMPAT_DELETE:
913                JFFS2_NOTICE("unknown RWCOMPAT_DELETE nodetype %#04X at %#08x\n",
914                             je16_to_cpu(un->nodetype), ref_offset(ref));
915                jffs2_mark_node_obsolete(c, ref);
916                return 0;
917        }
918
919        return 0;
920}
921
922/*
923 * Helper function for jffs2_get_inode_nodes().
924 * The function detects whether more data should be read and reads it if yes.
925 *
926 * Returns: 0 on success;
927 *          negative error code on failure.
928 */
929static int read_more(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *ref,
930                     int needed_len, int *rdlen, unsigned char *buf)
931{
932        int err, to_read = needed_len - *rdlen;
933        size_t retlen;
934        uint32_t offs;
935
936        if (jffs2_is_writebuffered(c)) {
937                int rem = to_read % c->wbuf_pagesize;
938
939                if (rem)
940                        to_read += c->wbuf_pagesize - rem;
941        }
942
943        /* We need to read more data */
944        offs = ref_offset(ref) + *rdlen;
945
946        dbg_readinode("read more %d bytes\n", to_read);
947
948        err = jffs2_flash_read(c, offs, to_read, &retlen, buf + *rdlen);
949        if (err) {
950                JFFS2_ERROR("can not read %d bytes from 0x%08x, "
951                        "error code: %d.\n", to_read, offs, err);
952                return err;
953        }
954
955        if (retlen < to_read) {
956                JFFS2_ERROR("short read at %#08x: %zu instead of %d.\n",
957                                offs, retlen, to_read);
958                return -EIO;
959        }
960
961        *rdlen += to_read;
962        return 0;
963}
964
965/* Get tmp_dnode_info and full_dirent for all non-obsolete nodes associated
966   with this ino. Perform a preliminary ordering on data nodes, throwing away
967   those which are completely obsoleted by newer ones. The naïve approach we
968   use to take of just returning them _all_ in version order will cause us to
969   run out of memory in certain degenerate cases. */
970static int jffs2_get_inode_nodes(struct jffs2_sb_info *c, struct jffs2_inode_info *f,
971                                 struct jffs2_readinode_info *rii)
972{
973        struct jffs2_raw_node_ref *ref, *valid_ref;
974        unsigned char *buf = NULL;
975        union jffs2_node_union *node;
976        size_t retlen;
977        int len, err;
978
979        rii->mctime_ver = 0;
980
981        dbg_readinode("ino #%u\n", f->inocache->ino);
982
983        /* FIXME: in case of NOR and available ->point() this
984         * needs to be fixed. */
985        len = sizeof(union jffs2_node_union) + c->wbuf_pagesize;
986        buf = kmalloc(len, GFP_KERNEL);
987        if (!buf)
988                return -ENOMEM;
989
990        spin_lock(&c->erase_completion_lock);
991        valid_ref = jffs2_first_valid_node(f->inocache->nodes);
992        if (!valid_ref && f->inocache->ino != 1)
993                JFFS2_WARNING("Eep. No valid nodes for ino #%u.\n", f->inocache->ino);
994        while (valid_ref) {
995                /* We can hold a pointer to a non-obsolete node without the spinlock,
996                   but _obsolete_ nodes may disappear at any time, if the block
997                   they're in gets erased. So if we mark 'ref' obsolete while we're
998                   not holding the lock, it can go away immediately. For that reason,
999                   we find the next valid node first, before processing 'ref'.
1000                */
1001                ref = valid_ref;
1002                valid_ref = jffs2_first_valid_node(ref->next_in_ino);
1003                spin_unlock(&c->erase_completion_lock);
1004
1005                cond_resched();
1006
1007                /*
1008                 * At this point we don't know the type of the node we're going
1009                 * to read, so we do not know the size of its header. In order
1010                 * to minimize the amount of flash IO we assume the header is
1011                 * of size = JFFS2_MIN_NODE_HEADER.
1012                 */
1013                len = JFFS2_MIN_NODE_HEADER;
1014                if (jffs2_is_writebuffered(c)) {
1015                        int end, rem;
1016
1017                        /*
1018                         * We are about to read JFFS2_MIN_NODE_HEADER bytes,
1019                         * but this flash has some minimal I/O unit. It is
1020                         * possible that we'll need to read more soon, so read
1021                         * up to the next min. I/O unit, in order not to
1022                         * re-read the same min. I/O unit twice.
1023                         */
1024                        end = ref_offset(ref) + len;
1025                        rem = end % c->wbuf_pagesize;
1026                        if (rem)
1027                                end += c->wbuf_pagesize - rem;
1028                        len = end - ref_offset(ref);
1029                }
1030
1031                dbg_readinode("read %d bytes at %#08x(%d).\n", len, ref_offset(ref), ref_flags(ref));
1032
1033                /* FIXME: point() */
1034                err = jffs2_flash_read(c, ref_offset(ref), len, &retlen, buf);
1035                if (err) {
1036                        JFFS2_ERROR("can not read %d bytes from 0x%08x, error code: %d.\n", len, ref_offset(ref), err);
1037                        goto free_out;
1038                }
1039
1040                if (retlen < len) {
1041                        JFFS2_ERROR("short read at %#08x: %zu instead of %d.\n", ref_offset(ref), retlen, len);
1042                        err = -EIO;
1043                        goto free_out;
1044                }
1045
1046                node = (union jffs2_node_union *)buf;
1047
1048                /* No need to mask in the valid bit; it shouldn't be invalid */
1049                if (je32_to_cpu(node->u.hdr_crc) != crc32(0, node, sizeof(node->u)-4)) {
1050                        JFFS2_NOTICE("Node header CRC failed at %#08x. {%04x,%04x,%08x,%08x}\n",
1051                                     ref_offset(ref), je16_to_cpu(node->u.magic),
1052                                     je16_to_cpu(node->u.nodetype),
1053                                     je32_to_cpu(node->u.totlen),
1054                                     je32_to_cpu(node->u.hdr_crc));
1055                        jffs2_dbg_dump_node(c, ref_offset(ref));
1056                        jffs2_mark_node_obsolete(c, ref);
1057                        goto cont;
1058                }
1059                if (je16_to_cpu(node->u.magic) != JFFS2_MAGIC_BITMASK) {
1060                        /* Not a JFFS2 node, whinge and move on */
1061                        JFFS2_NOTICE("Wrong magic bitmask 0x%04x in node header at %#08x.\n",
1062                                     je16_to_cpu(node->u.magic), ref_offset(ref));
1063                        jffs2_mark_node_obsolete(c, ref);
1064                        goto cont;
1065                }
1066
1067                switch (je16_to_cpu(node->u.nodetype)) {
1068
1069                case JFFS2_NODETYPE_DIRENT:
1070
1071                        if (JFFS2_MIN_NODE_HEADER < sizeof(struct jffs2_raw_dirent) &&
1072                            len < sizeof(struct jffs2_raw_dirent)) {
1073                                err = read_more(c, ref, sizeof(struct jffs2_raw_dirent), &len, buf);
1074                                if (unlikely(err))
1075                                        goto free_out;
1076                        }
1077
1078                        err = read_direntry(c, ref, &node->d, retlen, rii);
1079                        if (unlikely(err))
1080                                goto free_out;
1081
1082                        break;
1083
1084                case JFFS2_NODETYPE_INODE:
1085
1086                        if (JFFS2_MIN_NODE_HEADER < sizeof(struct jffs2_raw_inode) &&
1087                            len < sizeof(struct jffs2_raw_inode)) {
1088                                err = read_more(c, ref, sizeof(struct jffs2_raw_inode), &len, buf);
1089                                if (unlikely(err))
1090                                        goto free_out;
1091                        }
1092
1093                        err = read_dnode(c, ref, &node->i, len, rii);
1094                        if (unlikely(err))
1095                                goto free_out;
1096
1097                        break;
1098
1099                default:
1100                        if (JFFS2_MIN_NODE_HEADER < sizeof(struct jffs2_unknown_node) &&
1101                            len < sizeof(struct jffs2_unknown_node)) {
1102                                err = read_more(c, ref, sizeof(struct jffs2_unknown_node), &len, buf);
1103                                if (unlikely(err))
1104                                        goto free_out;
1105                        }
1106
1107                        err = read_unknown(c, ref, &node->u);
1108                        if (unlikely(err))
1109                                goto free_out;
1110
1111                }
1112        cont:
1113                spin_lock(&c->erase_completion_lock);
1114        }
1115
1116        spin_unlock(&c->erase_completion_lock);
1117        kfree(buf);
1118
1119        f->highest_version = rii->highest_version;
1120
1121        dbg_readinode("nodes of inode #%u were read, the highest version is %u, latest_mctime %u, mctime_ver %u.\n",
1122                      f->inocache->ino, rii->highest_version, rii->latest_mctime,
1123                      rii->mctime_ver);
1124        return 0;
1125
1126 free_out:
1127        jffs2_free_tmp_dnode_info_list(&rii->tn_root);
1128        jffs2_free_full_dirent_list(rii->fds);
1129        rii->fds = NULL;
1130        kfree(buf);
1131        return err;
1132}
1133
1134static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c,
1135                                        struct jffs2_inode_info *f,
1136                                        struct jffs2_raw_inode *latest_node)
1137{
1138        struct jffs2_readinode_info rii;
1139        uint32_t crc, new_size;
1140        size_t retlen;
1141        int ret;
1142
1143        dbg_readinode("ino #%u pino/nlink is %d\n", f->inocache->ino,
1144                      f->inocache->pino_nlink);
1145
1146        memset(&rii, 0, sizeof(rii));
1147
1148        /* Grab all nodes relevant to this ino */
1149        ret = jffs2_get_inode_nodes(c, f, &rii);
1150
1151        if (ret) {
1152                JFFS2_ERROR("cannot read nodes for ino %u, returned error is %d\n", f->inocache->ino, ret);
1153                if (f->inocache->state == INO_STATE_READING)
1154                        jffs2_set_inocache_state(c, f->inocache, INO_STATE_CHECKEDABSENT);
1155                return ret;
1156        }
1157
1158        ret = jffs2_build_inode_fragtree(c, f, &rii);
1159        if (ret) {
1160                JFFS2_ERROR("Failed to build final fragtree for inode #%u: error %d\n",
1161                            f->inocache->ino, ret);
1162                if (f->inocache->state == INO_STATE_READING)
1163                        jffs2_set_inocache_state(c, f->inocache, INO_STATE_CHECKEDABSENT);
1164                jffs2_free_tmp_dnode_info_list(&rii.tn_root);
1165                /* FIXME: We could at least crc-check them all */
1166                if (rii.mdata_tn) {
1167                        jffs2_free_full_dnode(rii.mdata_tn->fn);
1168                        jffs2_free_tmp_dnode_info(rii.mdata_tn);
1169                        rii.mdata_tn = NULL;
1170                }
1171                return ret;
1172        }
1173
1174        if (rii.mdata_tn) {
1175                if (rii.mdata_tn->fn->raw == rii.latest_ref) {
1176                        f->metadata = rii.mdata_tn->fn;
1177                        jffs2_free_tmp_dnode_info(rii.mdata_tn);
1178                } else {
1179                        jffs2_kill_tn(c, rii.mdata_tn);
1180                }
1181                rii.mdata_tn = NULL;
1182        }
1183
1184        f->dents = rii.fds;
1185
1186        jffs2_dbg_fragtree_paranoia_check_nolock(f);
1187
1188        if (unlikely(!rii.latest_ref)) {
1189                /* No data nodes for this inode. */
1190                if (f->inocache->ino != 1) {
1191                        JFFS2_WARNING("no data nodes found for ino #%u\n", f->inocache->ino);
1192                        if (!rii.fds) {
1193                                if (f->inocache->state == INO_STATE_READING)
1194                                        jffs2_set_inocache_state(c, f->inocache, INO_STATE_CHECKEDABSENT);
1195                                return -EIO;
1196                        }
1197                        JFFS2_NOTICE("but it has children so we fake some modes for it\n");
1198                }
1199                latest_node->mode = cpu_to_jemode(S_IFDIR|S_IRUGO|S_IWUSR|S_IXUGO);
1200                latest_node->version = cpu_to_je32(0);
1201                latest_node->atime = latest_node->ctime = latest_node->mtime = cpu_to_je32(0);
1202                latest_node->isize = cpu_to_je32(0);
1203                latest_node->gid = cpu_to_je16(0);
1204                latest_node->uid = cpu_to_je16(0);
1205                if (f->inocache->state == INO_STATE_READING)
1206                        jffs2_set_inocache_state(c, f->inocache, INO_STATE_PRESENT);
1207                return 0;
1208        }
1209
1210        ret = jffs2_flash_read(c, ref_offset(rii.latest_ref), sizeof(*latest_node), &retlen, (void *)latest_node);
1211        if (ret || retlen != sizeof(*latest_node)) {
1212                JFFS2_ERROR("failed to read from flash: error %d, %zd of %zd bytes read\n",
1213                        ret, retlen, sizeof(*latest_node));
1214                /* FIXME: If this fails, there seems to be a memory leak. Find it. */
1215                mutex_unlock(&f->sem);
1216                jffs2_do_clear_inode(c, f);
1217                return ret?ret:-EIO;
1218        }
1219
1220        crc = crc32(0, latest_node, sizeof(*latest_node)-8);
1221        if (crc != je32_to_cpu(latest_node->node_crc)) {
1222                JFFS2_ERROR("CRC failed for read_inode of inode %u at physical location 0x%x\n",
1223                        f->inocache->ino, ref_offset(rii.latest_ref));
1224                mutex_unlock(&f->sem);
1225                jffs2_do_clear_inode(c, f);
1226                return -EIO;
1227        }
1228
1229        switch(jemode_to_cpu(latest_node->mode) & S_IFMT) {
1230        case S_IFDIR:
1231                if (rii.mctime_ver > je32_to_cpu(latest_node->version)) {
1232                        /* The times in the latest_node are actually older than
1233                           mctime in the latest dirent. Cheat. */
1234                        latest_node->ctime = latest_node->mtime = cpu_to_je32(rii.latest_mctime);
1235                }
1236                break;
1237
1238
1239        case S_IFREG:
1240                /* If it was a regular file, truncate it to the latest node's isize */
1241                new_size = jffs2_truncate_fragtree(c, &f->fragtree, je32_to_cpu(latest_node->isize));
1242                if (new_size != je32_to_cpu(latest_node->isize)) {
1243                        JFFS2_WARNING("Truncating ino #%u to %d bytes failed because it only had %d bytes to start with!\n",
1244                                      f->inocache->ino, je32_to_cpu(latest_node->isize), new_size);
1245                        latest_node->isize = cpu_to_je32(new_size);
1246                }
1247                break;
1248
1249        case S_IFLNK:
1250                /* Hack to work around broken isize in old symlink code.
1251                   Remove this when dwmw2 comes to his senses and stops
1252                   symlinks from being an entirely gratuitous special
1253                   case. */
1254                if (!je32_to_cpu(latest_node->isize))
1255                        latest_node->isize = latest_node->dsize;
1256
1257                if (f->inocache->state != INO_STATE_CHECKING) {
1258                        /* Symlink's inode data is the target path. Read it and
1259                         * keep in RAM to facilitate quick follow symlink
1260                         * operation. */
1261                        uint32_t csize = je32_to_cpu(latest_node->csize);
1262                        if (csize > JFFS2_MAX_NAME_LEN) {
1263                                mutex_unlock(&f->sem);
1264                                jffs2_do_clear_inode(c, f);
1265                                return -ENAMETOOLONG;
1266                        }
1267                        f->target = kmalloc(csize + 1, GFP_KERNEL);
1268                        if (!f->target) {
1269                                JFFS2_ERROR("can't allocate %u bytes of memory for the symlink target path cache\n", csize);
1270                                mutex_unlock(&f->sem);
1271                                jffs2_do_clear_inode(c, f);
1272                                return -ENOMEM;
1273                        }
1274
1275                        ret = jffs2_flash_read(c, ref_offset(rii.latest_ref) + sizeof(*latest_node),
1276                                               csize, &retlen, (char *)f->target);
1277
1278                        if (ret || retlen != csize) {
1279                                if (retlen != csize)
1280                                        ret = -EIO;
1281                                kfree(f->target);
1282                                f->target = NULL;
1283                                mutex_unlock(&f->sem);
1284                                jffs2_do_clear_inode(c, f);
1285                                return ret;
1286                        }
1287
1288                        f->target[csize] = '\0';
1289                        dbg_readinode("symlink's target '%s' cached\n", f->target);
1290                }
1291
1292                /* fall through... */
1293
1294        case S_IFBLK:
1295        case S_IFCHR:
1296                /* Certain inode types should have only one data node, and it's
1297                   kept as the metadata node */
1298                if (f->metadata) {
1299                        JFFS2_ERROR("Argh. Special inode #%u with mode 0%o had metadata node\n",
1300                               f->inocache->ino, jemode_to_cpu(latest_node->mode));
1301                        mutex_unlock(&f->sem);
1302                        jffs2_do_clear_inode(c, f);
1303                        return -EIO;
1304                }
1305                if (!frag_first(&f->fragtree)) {
1306                        JFFS2_ERROR("Argh. Special inode #%u with mode 0%o has no fragments\n",
1307                               f->inocache->ino, jemode_to_cpu(latest_node->mode));
1308                        mutex_unlock(&f->sem);
1309                        jffs2_do_clear_inode(c, f);
1310                        return -EIO;
1311                }
1312                /* ASSERT: f->fraglist != NULL */
1313                if (frag_next(frag_first(&f->fragtree))) {
1314                        JFFS2_ERROR("Argh. Special inode #%u with mode 0x%x had more than one node\n",
1315                               f->inocache->ino, jemode_to_cpu(latest_node->mode));
1316                        /* FIXME: Deal with it - check crc32, check for duplicate node, check times and discard the older one */
1317                        mutex_unlock(&f->sem);
1318                        jffs2_do_clear_inode(c, f);
1319                        return -EIO;
1320                }
1321                /* OK. We're happy */
1322                f->metadata = frag_first(&f->fragtree)->node;
1323                jffs2_free_node_frag(frag_first(&f->fragtree));
1324                f->fragtree = RB_ROOT;
1325                break;
1326        }
1327        if (f->inocache->state == INO_STATE_READING)
1328                jffs2_set_inocache_state(c, f->inocache, INO_STATE_PRESENT);
1329
1330        return 0;
1331}
1332
1333/* Scan the list of all nodes present for this ino, build map of versions, etc. */
1334int jffs2_do_read_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f,
1335                        uint32_t ino, struct jffs2_raw_inode *latest_node)
1336{
1337        dbg_readinode("read inode #%u\n", ino);
1338
1339 retry_inocache:
1340        spin_lock(&c->inocache_lock);
1341        f->inocache = jffs2_get_ino_cache(c, ino);
1342
1343        if (f->inocache) {
1344                /* Check its state. We may need to wait before we can use it */
1345                switch(f->inocache->state) {
1346                case INO_STATE_UNCHECKED:
1347                case INO_STATE_CHECKEDABSENT:
1348                        f->inocache->state = INO_STATE_READING;
1349                        break;
1350
1351                case INO_STATE_CHECKING:
1352                case INO_STATE_GC:
1353                        /* If it's in either of these states, we need
1354                           to wait for whoever's got it to finish and
1355                           put it back. */
1356                        dbg_readinode("waiting for ino #%u in state %d\n", ino, f->inocache->state);
1357                        sleep_on_spinunlock(&c->inocache_wq, &c->inocache_lock);
1358                        goto retry_inocache;
1359
1360                case INO_STATE_READING:
1361                case INO_STATE_PRESENT:
1362                        /* Eep. This should never happen. It can
1363                        happen if Linux calls read_inode() again
1364                        before clear_inode() has finished though. */
1365                        JFFS2_ERROR("Eep. Trying to read_inode #%u when it's already in state %d!\n", ino, f->inocache->state);
1366                        /* Fail. That's probably better than allowing it to succeed */
1367                        f->inocache = NULL;
1368                        break;
1369
1370                default:
1371                        BUG();
1372                }
1373        }
1374        spin_unlock(&c->inocache_lock);
1375
1376        if (!f->inocache && ino == 1) {
1377                /* Special case - no root inode on medium */
1378                f->inocache = jffs2_alloc_inode_cache();
1379                if (!f->inocache) {
1380                        JFFS2_ERROR("cannot allocate inocache for root inode\n");
1381                        return -ENOMEM;
1382                }
1383                dbg_readinode("creating inocache for root inode\n");
1384                memset(f->inocache, 0, sizeof(struct jffs2_inode_cache));
1385                f->inocache->ino = f->inocache->pino_nlink = 1;
1386                f->inocache->nodes = (struct jffs2_raw_node_ref *)f->inocache;
1387                f->inocache->state = INO_STATE_READING;
1388                jffs2_add_ino_cache(c, f->inocache);
1389        }
1390        if (!f->inocache) {
1391                JFFS2_ERROR("requestied to read an nonexistent ino %u\n", ino);
1392                return -ENOENT;
1393        }
1394
1395        return jffs2_do_read_inode_internal(c, f, latest_node);
1396}
1397
1398int jffs2_do_crccheck_inode(struct jffs2_sb_info *c, struct jffs2_inode_cache *ic)
1399{
1400        struct jffs2_raw_inode n;
1401        struct jffs2_inode_info *f = kzalloc(sizeof(*f), GFP_KERNEL);
1402        int ret;
1403
1404        if (!f)
1405                return -ENOMEM;
1406
1407        mutex_init(&f->sem);
1408        mutex_lock(&f->sem);
1409        f->inocache = ic;
1410
1411        ret = jffs2_do_read_inode_internal(c, f, &n);
1412        if (!ret) {
1413                mutex_unlock(&f->sem);
1414                jffs2_do_clear_inode(c, f);
1415        }
1416        jffs2_xattr_do_crccheck_inode(c, ic);
1417        kfree (f);
1418        return ret;
1419}
1420
1421void jffs2_do_clear_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f)
1422{
1423        struct jffs2_full_dirent *fd, *fds;
1424        int deleted;
1425
1426        jffs2_xattr_delete_inode(c, f->inocache);
1427        mutex_lock(&f->sem);
1428        deleted = f->inocache && !f->inocache->pino_nlink;
1429
1430        if (f->inocache && f->inocache->state != INO_STATE_CHECKING)
1431                jffs2_set_inocache_state(c, f->inocache, INO_STATE_CLEARING);
1432
1433        if (f->metadata) {
1434                if (deleted)
1435                        jffs2_mark_node_obsolete(c, f->metadata->raw);
1436                jffs2_free_full_dnode(f->metadata);
1437        }
1438
1439        jffs2_kill_fragtree(&f->fragtree, deleted?c:NULL);
1440
1441        if (f->target) {
1442                kfree(f->target);
1443                f->target = NULL;
1444        }
1445
1446        fds = f->dents;
1447        while(fds) {
1448                fd = fds;
1449                fds = fd->next;
1450                jffs2_free_full_dirent(fd);
1451        }
1452
1453        if (f->inocache && f->inocache->state != INO_STATE_CHECKING) {
1454                jffs2_set_inocache_state(c, f->inocache, INO_STATE_CHECKEDABSENT);
1455                if (f->inocache->nodes == (void *)f->inocache)
1456                        jffs2_del_ino_cache(c, f->inocache);
1457        }
1458
1459        mutex_unlock(&f->sem);
1460}
Note: See TracBrowser for help on using the repository browser.