Skip to content

Commit

Permalink
[JFFS2] When retiring nextblock, allocate a node_ref for the wasted s…
Browse files Browse the repository at this point in the history
…pace

Failing to do so makes the calculated length of the last node incorrect,
when we're not using eraseblock summaries.

Signed-off-by: David Woodhouse <dwmw2@infradead.org>
  • Loading branch information
David Woodhouse committed Jun 18, 2006
1 parent 2ba72cb commit fc6612f
Showing 1 changed file with 22 additions and 4 deletions.
26 changes: 22 additions & 4 deletions fs/jffs2/nodemgmt.c
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,8 @@ static int jffs2_do_reserve_space(struct jffs2_sb_info *c, uint32_t minsize,
}
} else {
if (jeb && minsize > jeb->free_size) {
uint32_t waste;

/* Skip the end of this block and file it as having some dirty space */
/* If there's a pending write to it, flush now */

Expand All @@ -329,10 +331,26 @@ static int jffs2_do_reserve_space(struct jffs2_sb_info *c, uint32_t minsize,
goto restart;
}

c->wasted_size += jeb->free_size;
c->free_size -= jeb->free_size;
jeb->wasted_size += jeb->free_size;
jeb->free_size = 0;
spin_unlock(&c->erase_completion_lock);

ret = jffs2_prealloc_raw_node_refs(c, jeb, 1);
if (ret)
return ret;
/* Just lock it again and continue. Nothing much can change because
we hold c->alloc_sem anyway. In fact, it's not entirely clear why
we hold c->erase_completion_lock in the majority of this function...
but that's a question for another (more caffeine-rich) day. */
spin_lock(&c->erase_completion_lock);

waste = jeb->free_size;
jffs2_link_node_ref(c, jeb,
(jeb->offset + c->sector_size - waste) | REF_OBSOLETE,
waste, NULL);
/* 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;

jffs2_close_nextblock(c, jeb);
jeb = NULL;
Expand Down

0 comments on commit fc6612f

Please sign in to comment.