[PATCH 2/3] logwrites: use BLKZEROOUT if it's available

Darrick J. Wong
2025-01-16T23:31:41Z

Use the BLKZEROOUT ioctl instead of writing zeroed buffers if the kernel
supports it.

Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
---
src/log-writes/log-writes.c | 10 ++++++++++
src/log-writes/log-writes.h | 1 +
2 files changed, 11 insertions(+)

diff --git a/src/log-writes/log-writes.c b/src/log-writes/log-writes.c
index aa53473974d9e8..8f94ae5629e085 100644
--- a/src/log-writes/log-writes.c
+++ b/src/log-writes/log-writes.c
@@ -42,6 +42,7 @@ static int discard_range(struct log *log, u64 start, u64 len)

static int zero_range(struct log *log, u64 start, u64 len)
{
+ u64 range[2] = { start, len };
u64 bufsize = len;
ssize_t ret;
char *buf = NULL;
@@ -54,6 +55,15 @@ static int zero_range(struct log *log, u64 start, u64 len)
return 0;
}

+ if (!(log->flags & LOG_ZEROOUT_NOT_SUPP)) {
+ if (ioctl(log->replayfd, BLKZEROOUT, &range) < 0) {
+ if (log_writes_verbose)
+ printf(
+ "replay device doesn't support zeroout, switching to writing zeros\n");
+ log->flags |= LOG_ZEROOUT_NOT_SUPP;
+ }
+ }
+
while (!buf) {
buf = malloc(bufsize);
if (!buf)
diff --git a/src/log-writes/log-writes.h b/src/log-writes/log-writes.h
index b9f571ac3b2384..f659931634e64a 100644
--- a/src/log-writes/log-writes.h
+++ b/src/log-writes/log-writes.h
@@ -63,6 +63,7 @@ struct log_write_entry {

#define LOG_IGNORE_DISCARD (1 << 0)
#define LOG_DISCARD_NOT_SUPP (1 << 1)
+#define LOG_ZEROOUT_NOT_SUPP (1 << 2)

struct log {
int logfd;