Commit 0bcc099d authored by David Woodhouse's avatar David Woodhouse

[JFFS2] File node reference for wasted space when flushing wbuf

Next step in ongoing campaign to file a struct jffs2_raw_node_ref for every
piece of dirty space in the system, so that __totlen can be killed off....
Signed-off-by: default avatarDavid Woodhouse <dwmw2@infradead.org>
parent b64335f2
...@@ -481,11 +481,11 @@ static int __jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad) ...@@ -481,11 +481,11 @@ static int __jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad)
return ret; return ret;
} }
spin_lock(&c->erase_completion_lock);
/* Adjust free size of the block if we padded. */ /* Adjust free size of the block if we padded. */
if (pad) { if (pad) {
struct jffs2_eraseblock *jeb; struct jffs2_eraseblock *jeb;
struct jffs2_raw_node_ref *ref;
uint32_t waste = c->wbuf_pagesize - c->wbuf_len;
jeb = &c->blocks[c->wbuf_ofs / c->sector_size]; jeb = &c->blocks[c->wbuf_ofs / c->sector_size];
...@@ -495,18 +495,29 @@ static int __jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad) ...@@ -495,18 +495,29 @@ static int __jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad)
/* wbuf_pagesize - wbuf_len is the amount of space that's to be /* wbuf_pagesize - wbuf_len is the amount of space that's to be
padded. If there is less free space in the block than that, padded. If there is less free space in the block than that,
something screwed up */ something screwed up */
if (jeb->free_size < (c->wbuf_pagesize - c->wbuf_len)) { if (jeb->free_size < waste) {
printk(KERN_CRIT "jffs2_flush_wbuf(): Accounting error. wbuf at 0x%08x has 0x%03x bytes, 0x%03x left.\n", printk(KERN_CRIT "jffs2_flush_wbuf(): Accounting error. wbuf at 0x%08x has 0x%03x bytes, 0x%03x left.\n",
c->wbuf_ofs, c->wbuf_len, c->wbuf_pagesize-c->wbuf_len); c->wbuf_ofs, c->wbuf_len, waste);
printk(KERN_CRIT "jffs2_flush_wbuf(): But free_size for block at 0x%08x is only 0x%08x\n", printk(KERN_CRIT "jffs2_flush_wbuf(): But free_size for block at 0x%08x is only 0x%08x\n",
jeb->offset, jeb->free_size); jeb->offset, jeb->free_size);
BUG(); BUG();
} }
jeb->free_size -= (c->wbuf_pagesize - c->wbuf_len); ref = jffs2_alloc_raw_node_ref();
c->free_size -= (c->wbuf_pagesize - c->wbuf_len); if (!ref)
jeb->wasted_size += (c->wbuf_pagesize - c->wbuf_len); return -ENOMEM;
c->wasted_size += (c->wbuf_pagesize - c->wbuf_len); ref->flash_offset = c->wbuf_ofs + c->wbuf_len;
} ref->flash_offset |= REF_OBSOLETE;
spin_lock(&c->erase_completion_lock);
jffs2_link_node_ref(c, jeb, ref, waste);
/* FIXME: that made it count as dirty. Convert to wasted */
jeb->dirty_size -= waste;
c->dirty_size -= waste;
jeb->wasted_size += waste;
c->wasted_size += waste;
} else
spin_lock(&c->erase_completion_lock);
/* Stick any now-obsoleted blocks on the erase_pending_list */ /* Stick any now-obsoleted blocks on the erase_pending_list */
jffs2_refile_wbuf_blocks(c); jffs2_refile_wbuf_blocks(c);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment