[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: David Woodhouse <dwmw2@infradead.org>
This commit is contained in:
parent
b64335f2b7
commit
0bcc099d6d
@ -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)
|
|||||||
/* 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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user