From: Joern Engel Date: Mon, 29 Mar 2010 19:13:28 +0000 (+0200) Subject: [LogFS] Move reserved segments with journal X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=0943846ae05603efd98550f2d475e9c98191bde8;p=mv-sheeva.git [LogFS] Move reserved segments with journal Fixes a GC livelock. Signed-off-by: Joern Engel --- diff --git a/fs/logfs/journal.c b/fs/logfs/journal.c index 15454ac7bd9..25b1345c465 100644 --- a/fs/logfs/journal.c +++ b/fs/logfs/journal.c @@ -800,6 +800,7 @@ 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; @@ -807,6 +808,7 @@ void do_logfs_journal_wl_pass(struct super_block *sb) /* 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]); @@ -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);