Commit 0943846a authored by Joern Engel's avatar Joern Engel

[LogFS] Move reserved segments with journal

Fixes a GC livelock.
Signed-off-by: default avatarJoern Engel <joern@logfs.org>
parent 723b2ff4
...@@ -800,6 +800,7 @@ void do_logfs_journal_wl_pass(struct super_block *sb) ...@@ -800,6 +800,7 @@ void do_logfs_journal_wl_pass(struct super_block *sb)
{ {
struct logfs_super *super = logfs_super(sb); struct logfs_super *super = logfs_super(sb);
struct logfs_area *area = super->s_journal_area; struct logfs_area *area = super->s_journal_area;
struct btree_head32 *head = &super->s_reserved_segments;
u32 segno, ec; u32 segno, ec;
int i, err; int i, err;
...@@ -807,6 +808,7 @@ void do_logfs_journal_wl_pass(struct super_block *sb) ...@@ -807,6 +808,7 @@ void do_logfs_journal_wl_pass(struct super_block *sb)
/* Drop old segments */ /* Drop old segments */
journal_for_each(i) journal_for_each(i)
if (super->s_journal_seg[i]) { if (super->s_journal_seg[i]) {
btree_remove32(head, super->s_journal_seg[i]);
logfs_set_segment_unreserved(sb, logfs_set_segment_unreserved(sb,
super->s_journal_seg[i], super->s_journal_seg[i],
super->s_journal_ec[i]); super->s_journal_ec[i]);
...@@ -819,6 +821,8 @@ void do_logfs_journal_wl_pass(struct super_block *sb) ...@@ -819,6 +821,8 @@ void do_logfs_journal_wl_pass(struct super_block *sb)
super->s_journal_seg[i] = segno; super->s_journal_seg[i] = segno;
super->s_journal_ec[i] = ec; super->s_journal_ec[i] = ec;
logfs_set_segment_reserved(sb, segno); 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 */ /* Manually move journal_area */
freeseg(sb, area->a_segno); freeseg(sb, area->a_segno);
......
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