From 5d5a9127609bdd486ee77179de209a5207a46069 Mon Sep 17 00:00:00 2001 From: Akira Hayakawa Date: Wed, 21 Oct 2026 02:12:26 +0000 Subject: [PATCH] fix: Fix builds with the dm-io non-retryable error interface Based on a patch by Troy Mitchell . https://salsa.debian.org/debian/dm-writeboost/-/merge_requests/6 Suggested-by: Troy Mitchell Signed-off-by: Akira Hayakawa --- src/Makefile | 3 +++ src/dm-writeboost-daemon.c | 5 +++-- src/dm-writeboost-metadata.c | 3 ++- src/dm-writeboost-target.c | 19 +++++++++++++++++-- src/dm-writeboost.h | 13 +++++++++++++ 5 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/Makefile b/src/Makefile index fe48cbd..530f82f 100644 --- a/src/Makefile +++ b/src/Makefile @@ -8,6 +8,9 @@ wb_dm_io_header := $(srctree)/include/linux/dm-io.h # added the IO priority parameter in v6.9-rc1. # The dm-io ioprio argument is also backported to stable kernels. ccflags-y += -DDM_IO_HAS_IOPRIO=$(if $(shell grep -w ioprio $(wb_dm_io_header)),1,0) + +# The dm-io unsupported-error bitmap is also backported to stable kernels. +ccflags-y += -DDM_IO_HAS_UNSUP=$(if $(shell grep -w sync_unsup_bits $(wb_dm_io_header)),1,0) endif obj-m := dm-writeboost.o diff --git a/src/dm-writeboost-daemon.c b/src/dm-writeboost-daemon.c index 7ba961c..ed0bdc0 100644 --- a/src/dm-writeboost-daemon.c +++ b/src/dm-writeboost-daemon.c @@ -165,6 +165,7 @@ static void writeback_endio(unsigned long error, void *context) if (atomic_dec_and_test(&wb->writeback_io_count)) wake_up(&wb->writeback_io_wait_queue); } +WB_IO_NOTIFY_COMPAT(writeback_endio); static void submit_writeback_io(struct wb_device *wb, struct writeback_io *writeback_io) { @@ -174,7 +175,7 @@ static void submit_writeback_io(struct wb_device *wb, struct writeback_io *write struct dm_io_request io_req_w = { WB_IO_WRITE, .client = wb->io_client, - .notify.fn = writeback_endio, + .notify.fn = WB_IO_NOTIFY(writeback_endio), .notify.context = wb, .mem.type = DM_IO_VMA, .mem.ptr.addr = writeback_io->data, @@ -199,7 +200,7 @@ static void submit_writeback_io(struct wb_device *wb, struct writeback_io *write io_req_w = (struct dm_io_request) { WB_IO_WRITE, .client = wb->io_client, - .notify.fn = writeback_endio, + .notify.fn = WB_IO_NOTIFY(writeback_endio), .notify.context = wb, .mem.type = DM_IO_VMA, .mem.ptr.addr = writeback_io->data + (i << 9), diff --git a/src/dm-writeboost-metadata.c b/src/dm-writeboost-metadata.c index a7d53df..83b1fef 100644 --- a/src/dm-writeboost-metadata.c +++ b/src/dm-writeboost-metadata.c @@ -419,6 +419,7 @@ static void format_segmd_endio(unsigned long error, void *__context) context->err = 1; atomic64_dec(&context->count); } +WB_IO_NOTIFY_COMPAT(format_segmd_endio); struct zeroing_context { int error; @@ -479,7 +480,7 @@ static int format_all_segment_headers(struct wb_device *wb) struct dm_io_request io_req_seg = { WB_IO_WRITE, .client = wb->io_client, - .notify.fn = format_segmd_endio, + .notify.fn = WB_IO_NOTIFY(format_segmd_endio), .notify.context = &context, .mem.type = DM_IO_KMEM, .mem.ptr.addr = buf, diff --git a/src/dm-writeboost-target.c b/src/dm-writeboost-target.c index eeadfd6..88040bc 100644 --- a/src/dm-writeboost-target.c +++ b/src/dm-writeboost-target.c @@ -26,7 +26,21 @@ #include "linux/sort.h" -#if DM_IO_HAS_IOPRIO +#if DM_IO_HAS_UNSUP +static int dm_io_compat(struct dm_io_request *io_req, unsigned num_regions, + struct dm_io_region *regions, unsigned long *error_bits) +{ + unsigned long io_error_bits = 0, unsup_bits = 0; + int r; + + r = dm_io(io_req, num_regions, regions, &io_error_bits, &unsup_bits, + IOPRIO_DEFAULT); + if (error_bits) + *error_bits = io_error_bits | unsup_bits; + return r; +} +#define DM_IO(arg1, arg2, arg3, arg4) dm_io_compat(arg1, arg2, arg3, arg4) +#elif DM_IO_HAS_IOPRIO #define DM_IO(arg1, arg2, arg3, arg4) dm_io(arg1, arg2, arg3, arg4, IOPRIO_DEFAULT) #else #define DM_IO(arg1, arg2, arg3, arg4) dm_io(arg1, arg2, arg3, arg4) @@ -1274,6 +1288,7 @@ static void read_backing_async_callback(unsigned long error, void *context) read_backing_async_callback_onstack(error, ctx); kfree(ctx); } +WB_IO_NOTIFY_COMPAT(read_backing_async_callback); static int read_backing_async(struct wb_device *wb, struct bio *bio) { @@ -1296,7 +1311,7 @@ static int read_backing_async(struct wb_device *wb, struct bio *bio) .client = wb->io_client, .mem.type = DM_IO_BIO, .mem.ptr.bio = bio, - .notify.fn = read_backing_async_callback, + .notify.fn = WB_IO_NOTIFY(read_backing_async_callback), .notify.context = ctx }; region = (struct dm_io_region) { diff --git a/src/dm-writeboost.h b/src/dm-writeboost.h index 692b17d..fef681b 100644 --- a/src/dm-writeboost.h +++ b/src/dm-writeboost.h @@ -37,6 +37,19 @@ #include #include +/* Preserve the old combined error bitmap for dm-io completion handlers. */ +#if DM_IO_HAS_UNSUP +#define WB_IO_NOTIFY(fn) fn##_compat +#define WB_IO_NOTIFY_COMPAT(fn) \ +static void fn##_compat(unsigned long error, unsigned long unsup, void *context) \ +{ \ + fn(error | unsup, context); \ +} +#else +#define WB_IO_NOTIFY(fn) fn +#define WB_IO_NOTIFY_COMPAT(fn) +#endif + /*----------------------------------------------------------------------------*/ #define SUB_ID(x, y) ((x) > (y) ? (x) - (y) : 0)