Skip to content

Commit

Permalink
[LogFS] Move reserved segments with journal
Browse files Browse the repository at this point in the history
Fixes a GC livelock.

Signed-off-by: Joern Engel <joern@logfs.org>
  • Loading branch information
Joern Engel committed Mar 29, 2010
1 parent 723b2ff commit 0943846
Showing 1 changed file with 4 additions and 0 deletions.
4 changes: 4 additions & 0 deletions fs/logfs/journal.c
Original file line number Diff line number Diff line change
Expand Up @@ -800,13 +800,15 @@ void do_logfs_journal_wl_pass(struct super_block *sb)
{
struct logfs_super *super = logfs_super(sb);
struct logfs_area *area = super->s_journal_area;
struct btree_head32 *head = &super->s_reserved_segments;
u32 segno, ec;
int i, err;

log_journal("Journal requires wear-leveling.\n");
/* Drop old segments */
journal_for_each(i)
if (super->s_journal_seg[i]) {
btree_remove32(head, super->s_journal_seg[i]);
logfs_set_segment_unreserved(sb,
super->s_journal_seg[i],
super->s_journal_ec[i]);
Expand All @@ -819,6 +821,8 @@ void do_logfs_journal_wl_pass(struct super_block *sb)
super->s_journal_seg[i] = segno;
super->s_journal_ec[i] = ec;
logfs_set_segment_reserved(sb, segno);
err = btree_insert32(head, segno, (void *)1, GFP_KERNEL);
BUG_ON(err); /* mempool should prevent this */
}
/* Manually move journal_area */
freeseg(sb, area->a_segno);
Expand Down

0 comments on commit 0943846

Please sign in to comment.