[PATCH] dm ebs: drop dirty bufio state when discarding blocks

Samuel Moelius <[email protected]>
Newsgroups dev.linux.lists.dm-devel,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
dm-ebs can discard a block while a dirty dm-bufio buffer for the
same block is still cached.  If that buffer is later written back,
stale data can be written over the discarded state.

That resurrects data that userspace explicitly discarded and breaks
the expected discard semantics of the target.

Invalidate or clean the matching bufio state when processing discards
so that old dirty buffers cannot be written back after the discard.

Assisted-by: Codex:gpt-5.5-cyber-preview
Signed-off-by: Samuel Moelius <[email protected]>
---
 drivers/md/dm-ebs-target.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/md/dm-ebs-target.c b/drivers/md/dm-ebs-target.c
index 1e52bde48b91..9fece535a0b3 100644
--- a/drivers/md/dm-ebs-target.c
+++ b/drivers/md/dm-ebs-target.c
@@ -212,8 +212,12 @@ static void __ebs_process_bios(struct work_struct *ws)
 			write = true;
 			r = __ebs_rw_bio(ec, REQ_OP_WRITE, bio);
 		} else if (bio_op(bio) == REQ_OP_DISCARD) {
-			__ebs_forget_bio(ec, bio);
-			r = __ebs_discard_bio(ec, bio);
+			if (write)
+				r = dm_bufio_write_dirty_buffers(ec->bufio);
+			if (!r) {
+				__ebs_forget_bio(ec, bio);
+				r = __ebs_discard_bio(ec, bio);
+			}
 		}
 
 		if (r < 0)
-- 
2.43.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.