From f14d06b22bdad244259633617208960843968d32 Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Tue, 2 Jan 2024 15:23:08 -0600 Subject: [PATCH] Fixed incorrect condition preventing left fragment coalescing The condition for checking if the left fragment could be coalesced was wrong, preventing a common coalescing chance in linear rewrites, and leaving a weird 1-flush-sized alignment issue in the fragments: Was: lfsr_data_size(&bptr.data) < lfs->cfg->fragment_size Should be: fragment_end - (bid-(weight-1)) <= lfs->cfg->fragment_size This was correct for the right fragment coalescing, not sure how the left ended up messed up. (Actually I do know why, the math here is dense, complex, and subtle, a nasty combo.) --- lfs.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/lfs.c b/lfs.c index d9da8319..02769499 100644 --- a/lfs.c +++ b/lfs.c @@ -10380,10 +10380,9 @@ static int lfsr_ftree_flush(lfs_t *lfs, lfsr_ftree_t *ftree, } // can we coalesce? - if (bid-(weight-1) + lfsr_data_size(&bptr.data) - >= fragment_start - && lfsr_data_size(&bptr.data) - < lfs->cfg->fragment_size) { + if (bid-(weight-1) + lfsr_data_size(&bptr.data) >= fragment_start + && fragment_end - (bid-(weight-1)) + <= lfs->cfg->fragment_size) { // coalesce, but truncate to our fragment size // TODO this is a bit of a hacky way to prepend data... LFS_ASSERT(data_count == 1); @@ -10405,8 +10404,7 @@ static int lfsr_ftree_flush(lfs_t *lfs, lfsr_ftree_t *ftree, // note this may the same as our left sibling if (fragment_end < lfsr_ftree_size(ftree) // don't bother to lookup right if fragment is already full - && fragment_end - fragment_start - < lfs->cfg->fragment_size) { + && fragment_end - fragment_start < lfs->cfg->fragment_size) { lfsr_bid_t bid; lfsr_tag_t tag; lfsr_bid_t weight; @@ -10420,8 +10418,7 @@ static int lfsr_ftree_flush(lfs_t *lfs, lfsr_ftree_t *ftree, } // can we coalesce? - if (fragment_end < bid-(weight-1) - + lfsr_data_size(&bptr.data) + if (fragment_end < bid-(weight-1) + lfsr_data_size(&bptr.data) && bid-(weight-1) + lfsr_data_size(&bptr.data) - fragment_start <= lfs->cfg->fragment_size) {