[PATCH] erofs-utils: lib: cache: pass abort semantics down to .flush()

Gao Xiang hsiangkao at linux.alibaba.com
Wed Feb 4 14:00:55 AEDT 2026


This allows flushers to skip actual writes directly.

Signed-off-by: Gao Xiang <hsiangkao at linux.alibaba.com>
---
 lib/cache.c          | 13 +++++++------
 lib/inode.c          | 32 +++++++++++++++++++-------------
 lib/liberofs_cache.h |  2 +-
 3 files changed, 27 insertions(+), 20 deletions(-)

diff --git a/lib/cache.c b/lib/cache.c
index f23dbb06264a..4c7c3863275b 100644
--- a/lib/cache.c
+++ b/lib/cache.c
@@ -10,7 +10,8 @@
 #include "erofs/print.h"
 #include "liberofs_cache.h"
 
-static int erofs_bh_flush_drop_directly(struct erofs_buffer_head *bh)
+static int erofs_bh_flush_drop_directly(struct erofs_buffer_head *bh,
+					bool abort)
 {
 	return erofs_bh_flush_generic_end(bh);
 }
@@ -19,7 +20,7 @@ const struct erofs_bhops erofs_drop_directly_bhops = {
 	.flush = erofs_bh_flush_drop_directly,
 };
 
-static int erofs_bh_flush_skip_write(struct erofs_buffer_head *bh)
+static int erofs_bh_flush_skip_write(struct erofs_buffer_head *bh, bool abort)
 {
 	return -EBUSY;
 }
@@ -449,7 +450,7 @@ static void erofs_bfree(struct erofs_buffer_block *bb)
 }
 
 static int __erofs_bflush(struct erofs_bufmgr *bmgr,
-			  struct erofs_buffer_block *bb, bool forget)
+			  struct erofs_buffer_block *bb, bool abort)
 {
 	struct erofs_sb_info *sbi = bmgr->sbi;
 	const unsigned int blksiz = erofs_blksiz(sbi);
@@ -470,7 +471,7 @@ static int __erofs_bflush(struct erofs_bufmgr *bmgr,
 
 		list_for_each_entry_safe(bh, nbh, &p->buffers.list, list) {
 			if (bh->op == &erofs_skip_write_bhops) {
-				if (!forget) {
+				if (!abort) {
 					skip = true;
 					continue;
 				}
@@ -478,8 +479,8 @@ static int __erofs_bflush(struct erofs_bufmgr *bmgr,
 			}
 
 			/* flush and remove bh */
-			ret = bh->op->flush(bh);
-			if (__erofs_unlikely(ret == -EBUSY && !forget)) {
+			ret = bh->op->flush(bh, abort);
+			if (__erofs_unlikely(ret == -EBUSY && !abort)) {
 				skip = true;
 				continue;
 			}
diff --git a/lib/inode.c b/lib/inode.c
index e3ee79a04a04..7d20fbdda6e6 100644
--- a/lib/inode.c
+++ b/lib/inode.c
@@ -897,20 +897,23 @@ int erofs_iflush(struct erofs_inode *inode)
 		if (ret != inode->extent_isize)
 			return ret < 0 ? ret : -EIO;
 	}
-	if (bh) {
-		inode->bh = NULL;
-		erofs_iput(inode);
-		return erofs_bh_flush_generic_end(bh);
-	}
 	return 0;
 }
 
-static int erofs_bh_flush_write_inode(struct erofs_buffer_head *bh)
+static int erofs_bh_flush_write_inode(struct erofs_buffer_head *bh, bool abort)
 {
 	struct erofs_inode *inode = bh->fsprivate;
+	int ret;
 
 	DBG_BUGON(inode->bh != bh);
-	return erofs_iflush(inode);
+	if (!abort) {
+		ret = erofs_iflush(inode);
+		if (ret)
+			return ret;
+	}
+	inode->bh = NULL;
+	erofs_iput(inode);
+	return erofs_bh_flush_generic_end(bh);
 }
 
 static struct erofs_bhops erofs_write_inode_bhops = {
@@ -1050,7 +1053,7 @@ noinline:
 	return 0;
 }
 
-static int erofs_bh_flush_write_inline(struct erofs_buffer_head *bh)
+static int erofs_bh_flush_write_inline(struct erofs_buffer_head *bh, bool abort)
 {
 	struct erofs_inode *const inode = bh->fsprivate;
 	struct erofs_sb_info *sbi = inode->sbi;
@@ -1059,11 +1062,14 @@ static int erofs_bh_flush_write_inline(struct erofs_buffer_head *bh)
 	const erofs_off_t off = erofs_btell(bh, false);
 	int ret;
 
-	ret = erofs_io_pwrite(ibmgr->vf, inode->idata, off, inode->idata_size);
-	if (ret < 0)
-		return ret;
-	if (ret != inode->idata_size)
-		return -EIO;
+	if (!abort) {
+		ret = erofs_io_pwrite(ibmgr->vf, inode->idata, off,
+				      inode->idata_size);
+		if (ret < 0)
+			return ret;
+		if (ret != inode->idata_size)
+			return -EIO;
+	}
 	free(inode->idata);
 	inode->idata = NULL;
 
diff --git a/lib/liberofs_cache.h b/lib/liberofs_cache.h
index 215b320da0fd..baac609fb49f 100644
--- a/lib/liberofs_cache.h
+++ b/lib/liberofs_cache.h
@@ -30,7 +30,7 @@ struct erofs_buffer_block;
 #define DEVT		5
 
 struct erofs_bhops {
-	int (*flush)(struct erofs_buffer_head *bh);
+	int (*flush)(struct erofs_buffer_head *bh, bool abort);
 };
 
 struct erofs_buffer_head {
-- 
2.43.5



More information about the Linux-erofs mailing list