erofs-utils: lib: fix `last_mapped_block` in erofs_bflush()
authorGao Xiang <hsiangkao@linux.alibaba.com>
Fri, 1 Sep 2023 03:16:34 +0000 (11:16 +0800)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Fri, 1 Sep 2023 17:56:41 +0000 (01:56 +0800)
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")
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Reviewed-by: Jingbo Xu <jefflexu@linux.alibaba.com>
Link: https://lore.kernel.org/r/20230901031634.115999-1-hsiangkao@linux.alibaba.com
lib/cache.c

index d6e9b4702d59f27729e1636f3284bfb60edc8c6c..925054a1d434076c3e1accf228ed5e0804a66db4 100644 (file)
@@ -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;