Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[LogFS] Move reserved segments with journal



Fixes a GC livelock.

Signed-off-by: default avatarJoern Engel <joern@logfs.org>
parent 723b2ff4
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -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)
	/* 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)
		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);