Currently, calling erofs_bflush() multiple times is broken due to
outdated `last_mapped_block`.

Fixes: 82dee4501c5a ("erofs-utils: mkfs: enable xattr name filter feature by 
default")
Fixes: 185b0bcdef4b ("erofs-utils: optimize buffer allocation logic")
Cc: Jingbo Xu <[email protected]>
Signed-off-by: Gao Xiang <[email protected]>
---
 lib/cache.c | 26 ++++++++++++++------------
 1 file changed, 14 insertions(+), 12 deletions(-)

diff --git a/lib/cache.c b/lib/cache.c
index d6e9b47..925054a 100644
--- a/lib/cache.c
+++ b/lib/cache.c
@@ -349,6 +349,18 @@ erofs_blk_t erofs_mapbh(struct erofs_buffer_block *bb)
        return tail_blkaddr;
 }
 
+static void erofs_bfree(struct erofs_buffer_block *bb)
+{
+       DBG_BUGON(!list_empty(&bb->buffers.list));
+
+       if (bb == last_mapped_block)
+               last_mapped_block = list_prev_entry(bb, list);
+
+       list_del(&bb->mapped_list);
+       list_del(&bb->list);
+       free(bb);
+}
+
 bool erofs_bflush(struct erofs_buffer_block *bb)
 {
        const unsigned int blksiz = erofs_blksiz(&sbi);
@@ -384,13 +396,8 @@ bool erofs_bflush(struct erofs_buffer_block *bb)
                        dev_fillzero(&sbi, erofs_pos(&sbi, blkaddr) - padding,
                                     padding, true);
 
-               DBG_BUGON(!list_empty(&p->buffers.list));
-
                erofs_dbg("block %u to %u flushed", p->blkaddr, blkaddr - 1);
-
-               list_del(&p->mapped_list);
-               list_del(&p->list);
-               free(p);
+               erofs_bfree(p);
        }
        return true;
 }
@@ -412,12 +419,7 @@ void erofs_bdrop(struct erofs_buffer_head *bh, bool 
tryrevoke)
        if (!list_empty(&bb->buffers.list))
                return;
 
-       if (bb == last_mapped_block)
-               last_mapped_block = list_prev_entry(bb, list);
-
-       list_del(&bb->mapped_list);
-       list_del(&bb->list);
-       free(bb);
+       erofs_bfree(bb);
 
        if (rollback)
                tail_blkaddr = blkaddr;
-- 
2.24.4

Reply via email to