]> err.no Git - linux-2.6/blobdiff - fs/jffs2/scan.c
[PATCH] epoll: use unlocked wqueue operations
[linux-2.6] / fs / jffs2 / scan.c
index 87b0a416b6a0d8ff926fac5523d849c3f6402cb5..61618080b86f0a9bfe3202e39c8e452f13a21ec5 100644 (file)
@@ -67,8 +67,11 @@ static inline uint32_t EMPTY_SCAN_SIZE(uint32_t sector_size) {
 
 static int file_dirty(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb)
 {
-       int ret = jffs2_scan_dirty_space(c, jeb, jeb->free_size);
-       if (ret)
+       int ret;
+
+       if ((ret = jffs2_prealloc_raw_node_refs(c, jeb, 1)))
+               return ret;
+       if ((ret = jffs2_scan_dirty_space(c, jeb, jeb->free_size)))
                return ret;
        /* Turned wasted size into dirty, since we apparently 
           think it's recoverable now. */
@@ -244,11 +247,8 @@ int jffs2_scan_medium(struct jffs2_sb_info *c)
 
                D1(printk(KERN_DEBUG "jffs2_scan_medium(): Skipping %d bytes in nextblock to ensure page alignment\n",
                          skip));
-               c->nextblock->wasted_size += skip;
-               c->wasted_size += skip;
-
-               c->nextblock->free_size -= skip;
-               c->free_size -= skip;
+               jffs2_prealloc_raw_node_refs(c, c->nextblock, 1);
+               jffs2_scan_dirty_space(c, c->nextblock, skip);
        }
 #endif
        if (c->nr_erasing_blocks) {
@@ -295,7 +295,7 @@ int jffs2_fill_scan_buf (struct jffs2_sb_info *c, void *buf,
 int jffs2_scan_classify_jeb(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb)
 {
        if ((jeb->used_size + jeb->unchecked_size) == PAD(c->cleanmarker_size) && !jeb->dirty_size
-               && (!jeb->first_node || !jeb->first_node->next_phys) )
+           && (!jeb->first_node || !ref_next(jeb->first_node)) )
                return BLK_STATE_CLEANMARKER;
 
        /* move blocks with max 4 byte dirty space to cleanlist */
@@ -382,7 +382,7 @@ static int jffs2_scan_xref_node(struct jffs2_sb_info *c, struct jffs2_eraseblock
        }
 
        if (PAD(sizeof(struct jffs2_raw_xref)) != je32_to_cpu(rr->totlen)) {
-               JFFS2_WARNING("node length mismatch at %#08x, read=%u, calc=%u\n",
+               JFFS2_WARNING("node length mismatch at %#08x, read=%u, calc=%zd\n",
                              ofs, je32_to_cpu(rr->totlen),
                              PAD(sizeof(struct jffs2_raw_xref)));
                if ((err = jffs2_scan_dirty_space(c, jeb, je32_to_cpu(rr->totlen))))
@@ -463,7 +463,7 @@ static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblo
              
                if (!buf_size) {
                        /* XIP case. Just look, point at the summary if it's there */
-                       sm = (void *)buf + jeb->offset - sizeof(*sm);
+                       sm = (void *)buf + c->sector_size - sizeof(*sm);
                        if (je32_to_cpu(sm->magic) == JFFS2_SUM_MAGIC) {
                                sumptr = buf + je32_to_cpu(sm->offset);
                                sumlen = c->sector_size - je32_to_cpu(sm->offset);
@@ -562,6 +562,8 @@ static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblo
        if (ofs) {
                D1(printk(KERN_DEBUG "Free space at %08x ends at %08x\n", jeb->offset,
                          jeb->offset + ofs));
+               if ((err = jffs2_prealloc_raw_node_refs(c, jeb, 1)))
+                       return err;
                if ((err = jffs2_scan_dirty_space(c, jeb, ofs)))
                        return err;
        }
@@ -579,7 +581,7 @@ scan_more:
                jffs2_dbg_acct_paranoia_check_nolock(c, jeb);
 
                /* Make sure there are node refs available for use */
-               err = jffs2_prealloc_raw_node_refs(c, 2);
+               err = jffs2_prealloc_raw_node_refs(c, jeb, 2);
                if (err)
                        return err;
 
@@ -647,7 +649,7 @@ scan_more:
                        /* If we're only checking the beginning of a block with a cleanmarker,
                           bail now */
                        if (buf_ofs == jeb->offset && jeb->used_size == PAD(c->cleanmarker_size) &&
-                           c->cleanmarker_size && !jeb->dirty_size && !jeb->first_node->next_phys) {
+                           c->cleanmarker_size && !jeb->dirty_size && !ref_next(jeb->first_node)) {
                                D1(printk(KERN_DEBUG "%d bytes at start of block seems clean... assuming all clean\n", EMPTY_SCAN_SIZE(c->sector_size)));
                                return BLK_STATE_CLEANMARKER;
                        }
@@ -884,9 +886,9 @@ scan_more:
                }
        }
 
-       D1(printk(KERN_DEBUG "Block at 0x%08x: free 0x%08x, dirty 0x%08x, unchecked 0x%08x, used 0x%08x\n", jeb->offset,
-                 jeb->free_size, jeb->dirty_size, jeb->unchecked_size, jeb->used_size));
-
+       D1(printk(KERN_DEBUG "Block at 0x%08x: free 0x%08x, dirty 0x%08x, unchecked 0x%08x, used 0x%08x, wasted 0x%08x\n",
+                 jeb->offset,jeb->free_size, jeb->dirty_size, jeb->unchecked_size, jeb->used_size, jeb->wasted_size));
+       
        /* mark_node_obsolete can add to wasted !! */
        if (jeb->wasted_size) {
                jeb->dirty_size += jeb->wasted_size;