From 723b2ff40876678b49e61df34fb1d8001e34639d Mon Sep 17 00:00:00 2001
From: Joern Engel <joern@logfs.org>
Date: Sun, 28 Mar 2010 18:10:07 +0200
Subject: [LogFS] Clear PagePrivate when moving journal

do_logfs_journal_wl_pass() must call freeseg(), thereby clear
PagePrivate on all pages of the current journal segment.

Signed-off-by: Joern Engel <joern@logfs.org>
---
 fs/logfs/journal.c | 1 +
 1 file changed, 1 insertion(+)

(limited to 'fs/logfs/journal.c')

diff --git a/fs/logfs/journal.c b/fs/logfs/journal.c
index 6ad30a4c9052..15454ac7bd93 100644
--- a/fs/logfs/journal.c
+++ b/fs/logfs/journal.c
@@ -821,6 +821,7 @@ void do_logfs_journal_wl_pass(struct super_block *sb)
 		logfs_set_segment_reserved(sb, segno);
 	}
 	/* Manually move journal_area */
+	freeseg(sb, area->a_segno);
 	area->a_segno = super->s_journal_seg[0];
 	area->a_is_open = 0;
 	area->a_used_bytes = 0;
-- 
cgit v1.2.3


From 0943846ae05603efd98550f2d475e9c98191bde8 Mon Sep 17 00:00:00 2001
From: Joern Engel <joern@logfs.org>
Date: Mon, 29 Mar 2010 21:13:28 +0200
Subject: [LogFS] Move reserved segments with journal

Fixes a GC livelock.

Signed-off-by: Joern Engel <joern@logfs.org>
---
 fs/logfs/journal.c | 4 ++++
 1 file changed, 4 insertions(+)

(limited to 'fs/logfs/journal.c')

diff --git a/fs/logfs/journal.c b/fs/logfs/journal.c
index 15454ac7bd93..25b1345c4652 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);
-- 
cgit v1.2.3


From 6be7fa06eb4d721df734bd0946b5e63b27c0589b Mon Sep 17 00:00:00 2001
From: Joern Engel <joern@logfs.org>
Date: Mon, 29 Mar 2010 21:14:52 +0200
Subject: [LogFS] Erase new journal segments

If the device contains on old logfs image and the journal is moved to
segment that have never been used by the current logfs and not all
journal segments are erased before the next mount, the old content can
confuse mount code.  To prevent this, always erase the new journal
segments.

Signed-off-by: Joern Engel <joern@logfs.org>
---
 fs/logfs/journal.c | 2 ++
 1 file changed, 2 insertions(+)

(limited to 'fs/logfs/journal.c')

diff --git a/fs/logfs/journal.c b/fs/logfs/journal.c
index 25b1345c4652..d57c7b07b60b 100644
--- a/fs/logfs/journal.c
+++ b/fs/logfs/journal.c
@@ -823,6 +823,8 @@ void do_logfs_journal_wl_pass(struct super_block *sb)
 		logfs_set_segment_reserved(sb, segno);
 		err = btree_insert32(head, segno, (void *)1, GFP_KERNEL);
 		BUG_ON(err); /* mempool should prevent this */
+		err = logfs_erase_segment(sb, segno, 1);
+		BUG_ON(err); /* FIXME: remount-ro would be nicer */
 	}
 	/* Manually move journal_area */
 	freeseg(sb, area->a_segno);
-- 
cgit v1.2.3