`nbh->off - bh->off` in erofs_bh_flush_generic_write() is
problematic due to erofs_bdrop(bh, false).

Let's avoid generic erofs_buf_write_bhops instead.

Signed-off-by: Gao Xiang <[email protected]>
---
changes since v1:
 - should use EROFS_SUPER_END instead of sb_blksize, otherwise it
   could cause overlapping.

 include/erofs/cache.h |  1 -
 lib/cache.c           | 23 -----------------------
 mkfs/main.c           |  8 +++++---
 3 files changed, 5 insertions(+), 27 deletions(-)

diff --git a/include/erofs/cache.h b/include/erofs/cache.h
index b04eb47..8c3bd46 100644
--- a/include/erofs/cache.h
+++ b/include/erofs/cache.h
@@ -80,7 +80,6 @@ static inline const int get_alignsize(int type, int *type_ret)
 
 extern const struct erofs_bhops erofs_drop_directly_bhops;
 extern const struct erofs_bhops erofs_skip_write_bhops;
-extern const struct erofs_bhops erofs_buf_write_bhops;
 
 static inline erofs_off_t erofs_btell(struct erofs_buffer_head *bh, bool end)
 {
diff --git a/lib/cache.c b/lib/cache.c
index 9eb0394..178bd5a 100644
--- a/lib/cache.c
+++ b/lib/cache.c
@@ -39,29 +39,6 @@ const struct erofs_bhops erofs_skip_write_bhops = {
        .flush = erofs_bh_flush_skip_write,
 };
 
-int erofs_bh_flush_generic_write(struct erofs_buffer_head *bh, void *buf)
-{
-       struct erofs_buffer_head *nbh = list_next_entry(bh, list);
-       erofs_off_t offset = erofs_btell(bh, false);
-
-       DBG_BUGON(nbh->off < bh->off);
-       return dev_write(buf, offset, nbh->off - bh->off);
-}
-
-static bool erofs_bh_flush_buf_write(struct erofs_buffer_head *bh)
-{
-       int err = erofs_bh_flush_generic_write(bh, bh->fsprivate);
-
-       if (err)
-               return false;
-       free(bh->fsprivate);
-       return erofs_bh_flush_generic_end(bh);
-}
-
-const struct erofs_bhops erofs_buf_write_bhops = {
-       .flush = erofs_bh_flush_buf_write,
-};
-
 /* return buffer_head of erofs super block (with size 0) */
 struct erofs_buffer_head *erofs_buffer_init(void)
 {
diff --git a/mkfs/main.c b/mkfs/main.c
index 65d3df6..12e43c8 100644
--- a/mkfs/main.c
+++ b/mkfs/main.c
@@ -580,6 +580,7 @@ int erofs_mkfs_update_super_block(struct erofs_buffer_head 
*bh,
        };
        const u32 sb_blksize = round_up(EROFS_SUPER_END, erofs_blksiz());
        char *buf;
+       int ret;
 
        *blocks         = erofs_mapbh(NULL);
        sb.blocks       = cpu_to_le32(*blocks);
@@ -601,9 +602,10 @@ int erofs_mkfs_update_super_block(struct erofs_buffer_head 
*bh,
        }
        memcpy(buf + EROFS_SUPER_OFFSET, &sb, sizeof(sb));
 
-       bh->fsprivate = buf;
-       bh->op = &erofs_buf_write_bhops;
-       return 0;
+       ret = dev_write(buf, erofs_btell(bh, false), EROFS_SUPER_END);
+       free(buf);
+       erofs_bdrop(bh, false);
+       return ret;
 }
 
 static int erofs_mkfs_superblock_csum_set(void)
-- 
2.24.4

Reply via email to