[LogFS] Move reserved segments with journal
Fixes a GC livelock. Signed-off-by: Joern Engel <joern@logfs.org>
This commit is contained in:
Родитель
723b2ff408
Коммит
0943846ae0
|
@ -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);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче