From nobody Sat Feb 7 11:31:08 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E74B632D7F9; Fri, 19 Dec 2025 19:32:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766172741; cv=none; b=PuDQN7fHPP9ArobWCgHTJPR4hOiF9KUZ979LKwkzPgOxliJSuOKHyIYwd3R7Y1Tb0mJDTSyp1RsRL0Hxzjrb0stP5Ku8mioNftPdEVlMMKeqbSDAEd57cwLk7RfhOo1aHOZEU4ECDiH9A+OojInR8xfuK+kt1VVso5RRqO8u5Bk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766172741; c=relaxed/simple; bh=aJ29JDWgGeKr0baIrd45BwyCs+zgzacQOKf31Lp77X8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=O7S8xjxgmvRc3q4HKT48hNH3rhB/pOEzFjrnsOURiI5oL1JtfBHGEOq2oz06Abnf8HMyt+ZywjlU4bXXID3JYzg8SO88JHoPNKe6fW7Ve2nWYdQjWV7NJWrc2ZlHIn8L8RNs7g1UsoITcjJKSKqGf0pCKdtK9OwB8heBoe6H+eY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=d/cmAB8c; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="d/cmAB8c" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4499AC4AF09; Fri, 19 Dec 2025 19:32:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1766172740; bh=aJ29JDWgGeKr0baIrd45BwyCs+zgzacQOKf31Lp77X8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=d/cmAB8cLlQPkRomYHkmXdcJUb2DQtXNnhyqmDJlp2sjKuTTB8gJzQk2V5R9XnUBk WJVj2peLIWBpqgd8spON4o6JFK8ewi0xgky8uVoUNWA26YZxJlBbaouquQnEX/8tDC xmKZbZ4pKH2KuBO4PQSIQO4ZmOCS7rxpTrnl3JJFwsO3H0cDvF3Vp4R5I45SD3K3VR buS4r+vs5Mw3NR04mpf/sPqw2BT3bFqmc0+R22Sq2m7xJWu0tH/VT8t0h0ci0wY4jM JQt/nGOLFZdxxqXnDSgHYsNqf6StR9CdYwVzSblnr5ne61GtqQ9u3Fv0+hl35AjQe6 Xh+qYUN6LOZLg== From: Eric Biggers To: dm-devel@lists.linux.dev, Alasdair Kergon , Mike Snitzer , Mikulas Patocka , Benjamin Marzinski Cc: Sami Tolvanen , Eran Messeri , linux-kernel@vger.kernel.org, Eric Biggers Subject: [PATCH v2 1/7] dm-verity: move dm_verity_fec_io to mempool Date: Fri, 19 Dec 2025 11:29:03 -0800 Message-ID: <20251219192909.385494-2-ebiggers@kernel.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20251219192909.385494-1-ebiggers@kernel.org> References: <20251219192909.385494-1-ebiggers@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Currently, struct dm_verity_fec_io is allocated in the front padding of struct bio using dm_target::per_io_data_size. Unfortunately, struct dm_verity_fec_io is very large: 3096 bytes when CONFIG_64BIT=3Dy && PAGE_SIZE =3D=3D 4096, or 9240 bytes when CONFIG_64BIT=3Dy && PAGE_SIZE =3D= =3D 16384. This makes the bio size very large. Moreover, most of dm_verity_fec_io gets iterated over up to three times, even on I/O requests that don't require any error correction: 1. To zero the memory on allocation, if init_on_alloc=3D1. (This happens when the bio is allocated, not in dm-verity itself.) 2. To zero the buffers array in verity_fec_init_io(). 3. To free the buffers in verity_fec_finish_io(). Fix all of these inefficiencies by moving dm_verity_fec_io to a mempool. Replace the embedded dm_verity_fec_io with a pointer dm_verity_io::fec_io. verity_fec_init_io() initializes it to NULL, verity_fec_decode() allocates it on the first call, and verity_fec_finish_io() cleans it up. The normal case is that the pointer simply stays NULL, so the overhead becomes negligible. Reviewed-by: Sami Tolvanen Signed-off-by: Eric Biggers --- drivers/md/dm-verity-fec.c | 96 +++++++++++++++----------------------- drivers/md/dm-verity-fec.h | 14 +++++- drivers/md/dm-verity.h | 4 ++ 3 files changed, 54 insertions(+), 60 deletions(-) diff --git a/drivers/md/dm-verity-fec.c b/drivers/md/dm-verity-fec.c index c79de517afee..2c1544556a1c 100644 --- a/drivers/md/dm-verity-fec.c +++ b/drivers/md/dm-verity-fec.c @@ -16,20 +16,10 @@ bool verity_fec_is_enabled(struct dm_verity *v) { return v->fec && v->fec->dev; } =20 -/* - * Return a pointer to dm_verity_fec_io after dm_verity_io and its variable - * length fields. - */ -static inline struct dm_verity_fec_io *fec_io(struct dm_verity_io *io) -{ - return (struct dm_verity_fec_io *) - ((char *)io + io->v->ti->per_io_data_size - sizeof(struct dm_verity_fec_= io)); -} - /* * Return an interleaved offset for a byte in RS block. */ static inline u64 fec_interleave(struct dm_verity *v, u64 offset) { @@ -209,11 +199,11 @@ static int fec_read_bufs(struct dm_verity *v, struct = dm_verity_io *io, { bool is_zero; int i, j, target_index =3D -1; struct dm_buffer *buf; struct dm_bufio_client *bufio; - struct dm_verity_fec_io *fio =3D fec_io(io); + struct dm_verity_fec_io *fio =3D io->fec_io; u64 block, ileaved; u8 *bbuf, *rs_block; u8 want_digest[HASH_MAX_DIGESTSIZE]; unsigned int n, k; struct bio *bio =3D dm_bio_from_per_bio_data(io, v->ti->per_io_data_size); @@ -305,43 +295,44 @@ static int fec_read_bufs(struct dm_verity *v, struct = dm_verity_io *io, =20 return target_index; } =20 /* - * Allocate RS control structure and FEC buffers from preallocated mempool= s, - * and attempt to allocate as many extra buffers as available. + * Allocate and initialize a struct dm_verity_fec_io to use for FEC for a = bio. + * This runs the first time a block needs to be corrected for a bio. In t= he + * common case where no block needs to be corrected, this code never runs. + * + * This always succeeds, as all required allocations are done from mempool= s. + * Additional buffers are also allocated opportunistically to improve error + * correction performance, but these aren't required to succeed. */ -static int fec_alloc_bufs(struct dm_verity *v, struct dm_verity_fec_io *fi= o) +static struct dm_verity_fec_io *fec_alloc_and_init_io(struct dm_verity *v) { + struct dm_verity_fec *f =3D v->fec; + struct dm_verity_fec_io *fio; unsigned int n; =20 - if (!fio->rs) - fio->rs =3D mempool_alloc(&v->fec->rs_pool, GFP_NOIO); + fio =3D mempool_alloc(&f->fio_pool, GFP_NOIO); + fio->rs =3D mempool_alloc(&f->rs_pool, GFP_NOIO); =20 - fec_for_each_prealloc_buffer(n) { - if (fio->bufs[n]) - continue; + memset(fio->bufs, 0, sizeof(fio->bufs)); =20 - fio->bufs[n] =3D mempool_alloc(&v->fec->prealloc_pool, GFP_NOIO); - } + fec_for_each_prealloc_buffer(n) + fio->bufs[n] =3D mempool_alloc(&f->prealloc_pool, GFP_NOIO); =20 /* try to allocate the maximum number of buffers */ fec_for_each_extra_buffer(fio, n) { - if (fio->bufs[n]) - continue; - - fio->bufs[n] =3D kmem_cache_alloc(v->fec->cache, GFP_NOWAIT); + fio->bufs[n] =3D kmem_cache_alloc(f->cache, GFP_NOWAIT); /* we can manage with even one buffer if necessary */ if (unlikely(!fio->bufs[n])) break; } fio->nbufs =3D n; =20 - if (!fio->output) - fio->output =3D mempool_alloc(&v->fec->output_pool, GFP_NOIO); - - return 0; + fio->output =3D mempool_alloc(&f->output_pool, GFP_NOIO); + fio->level =3D 0; + return fio; } =20 /* * Initialize buffers and clear erasures. fec_read_bufs() assumes buffers = are * zeroed before deinterleaving. @@ -366,14 +357,10 @@ static int fec_decode_rsb(struct dm_verity *v, struct= dm_verity_io *io, const u8 *want_digest, bool use_erasures) { int r, neras =3D 0; unsigned int pos; =20 - r =3D fec_alloc_bufs(v, fio); - if (unlikely(r < 0)) - return r; - for (pos =3D 0; pos < 1 << v->data_dev_block_bits; ) { fec_init_bufs(v, fio); =20 r =3D fec_read_bufs(v, io, rsb, offset, pos, use_erasures ? &neras : NULL); @@ -406,16 +393,20 @@ static int fec_decode_rsb(struct dm_verity *v, struct= dm_verity_io *io, int verity_fec_decode(struct dm_verity *v, struct dm_verity_io *io, enum verity_block_type type, const u8 *want_digest, sector_t block, u8 *dest) { int r; - struct dm_verity_fec_io *fio =3D fec_io(io); + struct dm_verity_fec_io *fio; u64 offset, res, rsb; =20 if (!verity_fec_is_enabled(v)) return -EOPNOTSUPP; =20 + fio =3D io->fec_io; + if (!fio) + fio =3D io->fec_io =3D fec_alloc_and_init_io(v); + if (fio->level) return -EIO; =20 fio->level++; =20 @@ -461,18 +452,15 @@ int verity_fec_decode(struct dm_verity *v, struct dm_= verity_io *io, } =20 /* * Clean up per-bio data. */ -void verity_fec_finish_io(struct dm_verity_io *io) +void __verity_fec_finish_io(struct dm_verity_io *io) { unsigned int n; struct dm_verity_fec *f =3D io->v->fec; - struct dm_verity_fec_io *fio =3D fec_io(io); - - if (!verity_fec_is_enabled(io->v)) - return; + struct dm_verity_fec_io *fio =3D io->fec_io; =20 mempool_free(fio->rs, &f->rs_pool); =20 fec_for_each_prealloc_buffer(n) mempool_free(fio->bufs[n], &f->prealloc_pool); @@ -480,27 +468,13 @@ void verity_fec_finish_io(struct dm_verity_io *io) fec_for_each_extra_buffer(fio, n) if (fio->bufs[n]) kmem_cache_free(f->cache, fio->bufs[n]); =20 mempool_free(fio->output, &f->output_pool); -} - -/* - * Initialize per-bio data. - */ -void verity_fec_init_io(struct dm_verity_io *io) -{ - struct dm_verity_fec_io *fio =3D fec_io(io); - - if (!verity_fec_is_enabled(io->v)) - return; =20 - fio->rs =3D NULL; - memset(fio->bufs, 0, sizeof(fio->bufs)); - fio->nbufs =3D 0; - fio->output =3D NULL; - fio->level =3D 0; + mempool_free(fio, &f->fio_pool); + io->fec_io =3D NULL; } =20 /* * Append feature arguments and values to the status table. */ @@ -527,10 +501,11 @@ void verity_fec_dtr(struct dm_verity *v) struct dm_verity_fec *f =3D v->fec; =20 if (!verity_fec_is_enabled(v)) goto out; =20 + mempool_exit(&f->fio_pool); mempool_exit(&f->rs_pool); mempool_exit(&f->prealloc_pool); mempool_exit(&f->output_pool); kmem_cache_destroy(f->cache); =20 @@ -756,10 +731,18 @@ int verity_fec_ctr(struct dm_verity *v) if (dm_bufio_get_device_size(f->data_bufio) < v->data_blocks) { ti->error =3D "Data device is too small"; return -E2BIG; } =20 + /* Preallocate some dm_verity_fec_io structures */ + ret =3D mempool_init_kmalloc_pool(&f->fio_pool, num_online_cpus(), + sizeof(struct dm_verity_fec_io)); + if (ret) { + ti->error =3D "Cannot allocate FEC IO pool"; + return ret; + } + /* Preallocate an rs_control structure for each worker thread */ ret =3D mempool_init(&f->rs_pool, num_online_cpus(), fec_rs_alloc, fec_rs_free, (void *) v); if (ret) { ti->error =3D "Cannot allocate RS pool"; @@ -789,10 +772,7 @@ int verity_fec_ctr(struct dm_verity *v) if (ret) { ti->error =3D "Cannot allocate FEC output pool"; return ret; } =20 - /* Reserve space for our per-bio data */ - ti->per_io_data_size +=3D sizeof(struct dm_verity_fec_io); - return 0; } diff --git a/drivers/md/dm-verity-fec.h b/drivers/md/dm-verity-fec.h index 5fd267873812..b9488d1ddf14 100644 --- a/drivers/md/dm-verity-fec.h +++ b/drivers/md/dm-verity-fec.h @@ -38,10 +38,11 @@ struct dm_verity_fec { sector_t blocks; /* number of blocks covered */ sector_t rounds; /* number of interleaving rounds */ sector_t hash_blocks; /* blocks covered after v->hash_start */ unsigned char roots; /* number of parity bytes, M-N of RS(M, N) */ unsigned char rsn; /* N of RS(M, N) */ + mempool_t fio_pool; /* mempool for dm_verity_fec_io */ mempool_t rs_pool; /* mempool for fio->rs */ mempool_t prealloc_pool; /* mempool for preallocated buffers */ mempool_t output_pool; /* mempool for output */ struct kmem_cache *cache; /* cache for buffers */ atomic64_t corrected; /* corrected errors */ @@ -69,12 +70,21 @@ extern int verity_fec_decode(struct dm_verity *v, struc= t dm_verity_io *io, sector_t block, u8 *dest); =20 extern unsigned int verity_fec_status_table(struct dm_verity *v, unsigned = int sz, char *result, unsigned int maxlen); =20 -extern void verity_fec_finish_io(struct dm_verity_io *io); -extern void verity_fec_init_io(struct dm_verity_io *io); +extern void __verity_fec_finish_io(struct dm_verity_io *io); +static inline void verity_fec_finish_io(struct dm_verity_io *io) +{ + if (unlikely(io->fec_io)) + __verity_fec_finish_io(io); +} + +static inline void verity_fec_init_io(struct dm_verity_io *io) +{ + io->fec_io =3D NULL; +} =20 extern bool verity_is_fec_opt_arg(const char *arg_name); extern int verity_fec_parse_opt_args(struct dm_arg_set *as, struct dm_verity *v, unsigned int *argc, const char *arg_name); diff --git a/drivers/md/dm-verity.h b/drivers/md/dm-verity.h index f975a9e5c5d6..4ad7ce3dae0a 100644 --- a/drivers/md/dm-verity.h +++ b/drivers/md/dm-verity.h @@ -102,10 +102,14 @@ struct dm_verity_io { sector_t block; unsigned int n_blocks; bool in_bh; bool had_mismatch; =20 +#ifdef CONFIG_DM_VERITY_FEC + struct dm_verity_fec_io *fec_io; +#endif + struct work_struct work; struct work_struct bh_work; =20 u8 tmp_digest[HASH_MAX_DIGESTSIZE]; =20 --=20 2.52.0 From nobody Sat Feb 7 11:31:08 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B92DD33EAED; Fri, 19 Dec 2025 19:32:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766172741; cv=none; b=P9Vuv1FTYQdoRKjsMFvI7KFC3tln8L/HoAic3W1zxUpfOfOWkje7sN/+YYiVU1NGChf7M7IT9bijOc4msIaK21kXrCl2tlupcc6MlmsBtmaZRt90pc6oaZqhcPZIQl8cM/VxCc4k2EhdHnQAmyZwh8qrkIHIz59UsPdEn9LA2UE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766172741; c=relaxed/simple; bh=27WRA6yZr/IoPqa8Uc7rKXp4/CC43O1x1GaZvzI01JA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OsNVJvOIg3KY5fQ5hjCqT0PdmM445ZoHQbzDb2aDU4VDgk841HZuFGD0ZBPgKrlcewDPB1FBvvY4q/cirXfG44IvLqd5mK4yqEzWd93GDlXVIr9xOmbLRDVuungDLgnwYSMq5G8yWFYK/+XOG3fvlTa8XtshCaHD0xqwRPqdS+o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=l4ixIwLM; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="l4ixIwLM" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A8747C19421; Fri, 19 Dec 2025 19:32:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1766172740; bh=27WRA6yZr/IoPqa8Uc7rKXp4/CC43O1x1GaZvzI01JA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=l4ixIwLMFLip+jnlxxVRwYVm3Q8VlQVKh7PXFvAiI/cRSXHZEJro5Yo2jPo8sZdVJ hLLaECPUipXkbT6l2LcETfBT3co1rbbsfRj4lkq0PguNUQeXd3a38qLa2AIIltupZb dj/aTPHZ95VtyhjY2LFsF0eJ/S3axZHgGKfH0L2hnQCupF65n+QfK3bNdBaKPic8i+ R9Pb4m/3ydkowKR6bKApVwk31dvwk2jlCm0PbbpKsnYVIBzl24n6O0PoOLZUSOHHG8 vwfByvr8/hmBWHTQ8PHQX7Klqv2lDCofzznfjug08flGnen+0ez7V48z1yJkSGWJIX A9vOKyAu0VDMw== From: Eric Biggers To: dm-devel@lists.linux.dev, Alasdair Kergon , Mike Snitzer , Mikulas Patocka , Benjamin Marzinski Cc: Sami Tolvanen , Eran Messeri , linux-kernel@vger.kernel.org, Eric Biggers Subject: [PATCH v2 2/7] dm-verity: make dm_verity_fec_io::bufs variable-length Date: Fri, 19 Dec 2025 11:29:04 -0800 Message-ID: <20251219192909.385494-3-ebiggers@kernel.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20251219192909.385494-1-ebiggers@kernel.org> References: <20251219192909.385494-1-ebiggers@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When correcting a data block, the FEC code performs optimally when it has enough buffers to hold all the needed RS blocks. That number of buffers is '1 << (v->data_dev_block_bits - DM_VERITY_FEC_BUF_RS_BITS)'. However, since v->data_dev_block_bits isn't a compile-time constant, the code actually used PAGE_SHIFT instead. With the traditional PAGE_SIZE =3D=3D data_block_size =3D=3D 4096, this was fine. However, when PAGE_SIZE > data_block_size, this wastes space. E.g., with data_block_size =3D=3D 4096 && PAGE_SIZE =3D=3D 16384, struct dm_verity_fec_io is 9240 bytes, when in fact only 3096 bytes are needed. Fix this by making dm_verity_fec_io::bufs a variable-length array. This makes the macros DM_VERITY_FEC_BUF_MAX and fec_for_each_extra_buffer() no longer apply, so remove them. For consistency, and because DM_VERITY_FEC_BUF_PREALLOC is fixed at 1 and was already assumed to be 1 (considering that mempool_alloc() shouldn't be called in a loop), also remove the related macros DM_VERITY_FEC_BUF_PREALLOC and fec_for_each_prealloc_buffer(). Signed-off-by: Eric Biggers Reviewed-by: Sami Tolvanen --- drivers/md/dm-verity-fec.c | 44 +++++++++++++++++++------------------- drivers/md/dm-verity-fec.h | 15 +++++++------ 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/drivers/md/dm-verity-fec.c b/drivers/md/dm-verity-fec.c index 2c1544556a1c..6d0b5b4b2699 100644 --- a/drivers/md/dm-verity-fec.c +++ b/drivers/md/dm-verity-fec.c @@ -8,10 +8,22 @@ #include "dm-verity-fec.h" #include =20 #define DM_MSG_PREFIX "verity-fec" =20 +/* + * When correcting a data block, the FEC code performs optimally when it c= an + * collect all the associated RS blocks at the same time. As each byte is= part + * of a different RS block, there are '1 << data_dev_block_bits' RS blocks. + * There are '1 << DM_VERITY_FEC_BUF_RS_BITS' RS blocks per buffer, so that + * gives '1 << (data_dev_block_bits - DM_VERITY_FEC_BUF_RS_BITS)' buffers. + */ +static inline unsigned int fec_max_nbufs(struct dm_verity *v) +{ + return 1 << (v->data_dev_block_bits - DM_VERITY_FEC_BUF_RS_BITS); +} + /* * If error correction has been configured, returns true. */ bool verity_fec_is_enabled(struct dm_verity *v) { @@ -57,18 +69,10 @@ static u8 *fec_read_parity(struct dm_verity *v, u64 rsb= , int index, } =20 return res; } =20 -/* Loop over each preallocated buffer slot. */ -#define fec_for_each_prealloc_buffer(__i) \ - for (__i =3D 0; __i < DM_VERITY_FEC_BUF_PREALLOC; __i++) - -/* Loop over each extra buffer slot. */ -#define fec_for_each_extra_buffer(io, __i) \ - for (__i =3D DM_VERITY_FEC_BUF_PREALLOC; __i < DM_VERITY_FEC_BUF_MAX; __i= ++) - /* Loop over each allocated buffer. */ #define fec_for_each_buffer(io, __i) \ for (__i =3D 0; __i < (io)->nbufs; __i++) =20 /* Loop over each RS block in each allocated buffer. */ @@ -305,24 +309,22 @@ static int fec_read_bufs(struct dm_verity *v, struct = dm_verity_io *io, * Additional buffers are also allocated opportunistically to improve error * correction performance, but these aren't required to succeed. */ static struct dm_verity_fec_io *fec_alloc_and_init_io(struct dm_verity *v) { + const unsigned int max_nbufs =3D fec_max_nbufs(v); struct dm_verity_fec *f =3D v->fec; struct dm_verity_fec_io *fio; unsigned int n; =20 fio =3D mempool_alloc(&f->fio_pool, GFP_NOIO); fio->rs =3D mempool_alloc(&f->rs_pool, GFP_NOIO); =20 - memset(fio->bufs, 0, sizeof(fio->bufs)); - - fec_for_each_prealloc_buffer(n) - fio->bufs[n] =3D mempool_alloc(&f->prealloc_pool, GFP_NOIO); + fio->bufs[0] =3D mempool_alloc(&f->prealloc_pool, GFP_NOIO); =20 /* try to allocate the maximum number of buffers */ - fec_for_each_extra_buffer(fio, n) { + for (n =3D 1; n < max_nbufs; n++) { fio->bufs[n] =3D kmem_cache_alloc(f->cache, GFP_NOWAIT); /* we can manage with even one buffer if necessary */ if (unlikely(!fio->bufs[n])) break; } @@ -460,16 +462,14 @@ void __verity_fec_finish_io(struct dm_verity_io *io) struct dm_verity_fec *f =3D io->v->fec; struct dm_verity_fec_io *fio =3D io->fec_io; =20 mempool_free(fio->rs, &f->rs_pool); =20 - fec_for_each_prealloc_buffer(n) - mempool_free(fio->bufs[n], &f->prealloc_pool); + mempool_free(fio->bufs[0], &f->prealloc_pool); =20 - fec_for_each_extra_buffer(fio, n) - if (fio->bufs[n]) - kmem_cache_free(f->cache, fio->bufs[n]); + for (n =3D 1; n < fio->nbufs; n++) + kmem_cache_free(f->cache, fio->bufs[n]); =20 mempool_free(fio->output, &f->output_pool); =20 mempool_free(fio, &f->fio_pool); io->fec_io =3D NULL; @@ -733,11 +733,12 @@ int verity_fec_ctr(struct dm_verity *v) return -E2BIG; } =20 /* Preallocate some dm_verity_fec_io structures */ ret =3D mempool_init_kmalloc_pool(&f->fio_pool, num_online_cpus(), - sizeof(struct dm_verity_fec_io)); + struct_size((struct dm_verity_fec_io *)0, + bufs, fec_max_nbufs(v))); if (ret) { ti->error =3D "Cannot allocate FEC IO pool"; return ret; } =20 @@ -755,13 +756,12 @@ int verity_fec_ctr(struct dm_verity *v) if (!f->cache) { ti->error =3D "Cannot create FEC buffer cache"; return -ENOMEM; } =20 - /* Preallocate DM_VERITY_FEC_BUF_PREALLOC buffers for each thread */ - ret =3D mempool_init_slab_pool(&f->prealloc_pool, num_online_cpus() * - DM_VERITY_FEC_BUF_PREALLOC, + /* Preallocate one buffer for each thread */ + ret =3D mempool_init_slab_pool(&f->prealloc_pool, num_online_cpus(), f->cache); if (ret) { ti->error =3D "Cannot allocate FEC buffer prealloc pool"; return ret; } diff --git a/drivers/md/dm-verity-fec.h b/drivers/md/dm-verity-fec.h index b9488d1ddf14..571097438311 100644 --- a/drivers/md/dm-verity-fec.h +++ b/drivers/md/dm-verity-fec.h @@ -15,15 +15,11 @@ #define DM_VERITY_FEC_RSM 255 #define DM_VERITY_FEC_MAX_RSN 253 #define DM_VERITY_FEC_MIN_RSN 231 /* ~10% space overhead */ =20 /* buffers for deinterleaving and decoding */ -#define DM_VERITY_FEC_BUF_PREALLOC 1 /* buffers to preallocate */ #define DM_VERITY_FEC_BUF_RS_BITS 4 /* 1 << RS blocks per buffer */ -/* we need buffers for at most 1 << block size RS blocks */ -#define DM_VERITY_FEC_BUF_MAX \ - (1 << (PAGE_SHIFT - DM_VERITY_FEC_BUF_RS_BITS)) =20 #define DM_VERITY_OPT_FEC_DEV "use_fec_from_device" #define DM_VERITY_OPT_FEC_BLOCKS "fec_blocks" #define DM_VERITY_OPT_FEC_START "fec_start" #define DM_VERITY_OPT_FEC_ROOTS "fec_roots" @@ -50,14 +46,21 @@ struct dm_verity_fec { =20 /* per-bio data */ struct dm_verity_fec_io { struct rs_control *rs; /* Reed-Solomon state */ int erasures[DM_VERITY_FEC_MAX_RSN]; /* erasures for decode_rs8 */ - u8 *bufs[DM_VERITY_FEC_BUF_MAX]; /* bufs for deinterleaving */ - unsigned int nbufs; /* number of buffers allocated */ u8 *output; /* buffer for corrected output */ unsigned int level; /* recursion level */ + unsigned int nbufs; /* number of buffers allocated */ + /* + * Buffers for deinterleaving RS blocks. Each buffer has space for + * the data bytes of (1 << DM_VERITY_FEC_BUF_RS_BITS) RS blocks. The + * array length is fec_max_nbufs(v), and we try to allocate that many + * buffers. However, in low-memory situations we may be unable to + * allocate all buffers. 'nbufs' holds the number actually allocated. + */ + u8 *bufs[]; }; =20 #ifdef CONFIG_DM_VERITY_FEC =20 /* each feature parameter requires a value */ --=20 2.52.0 From nobody Sat Feb 7 11:31:08 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B935C33F362; Fri, 19 Dec 2025 19:32:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766172741; cv=none; b=PkgTZ2v61oE5BNwaOpVxle33rEuniylx5ygz+rMbSE1FVcCbMPnnu60fDGmJz7ptkAwALfXjSN0XFIipZ3Mp+PtMiJQvVSnPycnyeCeesFQ+k39K91hJJ62v4QL7IEEL/7r8dWVKrRIUK2CiDG2rbw+uWQ/yy6fdTHCfH4ZtHLY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766172741; c=relaxed/simple; bh=LmmFlr953M8IRsBIKTkkWj/SBPzFpM1N2TqWgEjBuyo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=t5OWfTOo1bPIUscsyFERUQBQnQkpf/AWW/P+3jIhANewO9g5rWNmmjQzBfYBqCQ+eZGvq4ddn1vFOOzh6+gqflIEvqZzqHmy3ZEXgFuwTvgmKYIz9WZi/2IZKnvrBgCLgjlWDqaqqEzTJer+VKyLNLbFK0NA6sUHjlS2D/I/9C0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=UBriTbYF; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="UBriTbYF" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1710DC116B1; Fri, 19 Dec 2025 19:32:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1766172741; bh=LmmFlr953M8IRsBIKTkkWj/SBPzFpM1N2TqWgEjBuyo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UBriTbYFn2RVJHkxR+X2WGg9z+FwYt//w8StA37cJCPaAkPf4hkiGtduptb/zfNbn QsBgYMlDMtmVCKUSCk5zrTTKcqWDJoyHd/aM5HLEWVwq9F5h9cwixWzJZvrvx9A69+ GD3jvZT89k210B2BJlrOy5cYReFnUh8DZnRnmInZl0P+F9eIn3DAvLGVNc69r04UGA jfVLigQRLAZaoGpsvtMoQDpatMtl1PkPM7rd2gPxciJOV1mFeb99yvjPkNiiw3mrOY yAKmjJYr+i/lEGl09sctVrAv6hiLg9O+5s5ZyOqRSdoAUDnpShXez9bMuHwHV0fRT4 wwgevLXC54Ldg== From: Eric Biggers To: dm-devel@lists.linux.dev, Alasdair Kergon , Mike Snitzer , Mikulas Patocka , Benjamin Marzinski Cc: Sami Tolvanen , Eran Messeri , linux-kernel@vger.kernel.org, Eric Biggers Subject: [PATCH v2 3/7] dm-verity: remove unnecessary condition for verity_fec_finish_io() Date: Fri, 19 Dec 2025 11:29:05 -0800 Message-ID: <20251219192909.385494-4-ebiggers@kernel.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20251219192909.385494-1-ebiggers@kernel.org> References: <20251219192909.385494-1-ebiggers@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Make verity_finish_io() call verity_fec_finish_io() unconditionally, instead of skipping it when 'in_bh' is true. Although FEC can't have been done when 'in_bh' is true, verity_fec_finish_io() is a no-op when FEC wasn't done. An earlier change also made verity_fec_finish_io() very lightweight when FEC wasn't done. So it should just be called unconditionally. Reviewed-by: Sami Tolvanen Signed-off-by: Eric Biggers --- drivers/md/dm-verity-target.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/md/dm-verity-target.c b/drivers/md/dm-verity-target.c index 5c17472d7896..c9f5602a42c6 100644 --- a/drivers/md/dm-verity-target.c +++ b/drivers/md/dm-verity-target.c @@ -617,12 +617,11 @@ static void verity_finish_io(struct dm_verity_io *io,= blk_status_t status) struct bio *bio =3D dm_bio_from_per_bio_data(io, v->ti->per_io_data_size); =20 bio->bi_end_io =3D io->orig_bi_end_io; bio->bi_status =3D status; =20 - if (!static_branch_unlikely(&use_bh_wq_enabled) || !io->in_bh) - verity_fec_finish_io(io); + verity_fec_finish_io(io); =20 if (unlikely(status !=3D BLK_STS_OK) && unlikely(!(bio->bi_opf & REQ_RAHEAD)) && !io->had_mismatch && !verity_is_system_shutting_down()) { --=20 2.52.0 From nobody Sat Feb 7 11:31:08 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 330FD341064; Fri, 19 Dec 2025 19:32:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766172742; cv=none; b=UV1ZIXHI/iSw83EeAlLpv84grU6/BK/x6YlrGOqQK2HMd3gGANXykD+SVG8iHmyt/mU6pFIQX0KyJz5iAghK+QPbzxRBYwE87F4qtR9bk8WmwB1TvqvJg2VuNieS/IMvC4MwyS+LS06r5cC+1oZS9jftG5nKoQmtArIit2GuYJ8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766172742; c=relaxed/simple; bh=kPsjF/dWVSwkT2udSNrV5NqQ02RSAP3NxDsJkhrY2dA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Eabb1VR/X8Nss2kkYzdfbfASiNOdZgdir3Uq2z37WoUJOnvBSb4lfk1KyzyUKqBt3vKLb6av/cWvHSIaHSdJC29L8JvLPJd6vGffp2IjHStMJ09QeKnPgivClwPctLUdSKtKkx/VkUFYuJsOzqtFOO+ceviLk8MnwzaUErA0ww4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=u0d8OXTt; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="u0d8OXTt" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7C66EC19424; Fri, 19 Dec 2025 19:32:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1766172741; bh=kPsjF/dWVSwkT2udSNrV5NqQ02RSAP3NxDsJkhrY2dA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=u0d8OXTt98x3oFhlQdvgtS4yGRc4dYBs1MHEzlEQHQpKMmHzpjDXQboePMBH1knyd S3LNeTIUzr3FOjizkKTItKlZw6x91QZGZ3BB4XNdyKK+T+jGcYtFrVKBHiB+Rl9tPT yQd9yzoNBRUTD9IgDZGgvfTQ254ROWxrkyjawQR2f+bnuOrRqOotlkThPGEd10Sm2W ykcFUV9OXO6jVF0p4/1m8/dD36GXdfbM7NRBOTVEyh0o75fdFY/7i/s3GdBU99uKf8 Sf81srdEiMQpI8cNqVo1uH/FVIAWsNAYvZuytLMKN4nrapv+a2T0mDB8jK+pLweged MGMu3YCu6+THg== From: Eric Biggers To: dm-devel@lists.linux.dev, Alasdair Kergon , Mike Snitzer , Mikulas Patocka , Benjamin Marzinski Cc: Sami Tolvanen , Eran Messeri , linux-kernel@vger.kernel.org, Eric Biggers Subject: [PATCH v2 4/7] dm-verity: remove unnecessary ifdef around verity_fec_decode() Date: Fri, 19 Dec 2025 11:29:06 -0800 Message-ID: <20251219192909.385494-5-ebiggers@kernel.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20251219192909.385494-1-ebiggers@kernel.org> References: <20251219192909.385494-1-ebiggers@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Since verity_fec_decode() has a !CONFIG_DM_VERITY_FEC stub, it can just be called unconditionally, similar to the other calls in the same file. Reviewed-by: Sami Tolvanen Signed-off-by: Eric Biggers --- drivers/md/dm-verity-target.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/md/dm-verity-target.c b/drivers/md/dm-verity-target.c index c9f5602a42c6..777a0ebe8536 100644 --- a/drivers/md/dm-verity-target.c +++ b/drivers/md/dm-verity-target.c @@ -433,15 +433,13 @@ static int verity_handle_data_hash_mismatch(struct dm= _verity *v, if (verity_recheck(v, io, want_digest, blkno, data) =3D=3D 0) { if (v->validated_blocks) set_bit(blkno, v->validated_blocks); return 0; } -#if defined(CONFIG_DM_VERITY_FEC) if (verity_fec_decode(v, io, DM_VERITY_BLOCK_TYPE_DATA, want_digest, blkno, data) =3D=3D 0) return 0; -#endif if (bio->bi_status) return -EIO; /* Error correction failed; Just return error */ =20 if (verity_handle_err(v, DM_VERITY_BLOCK_TYPE_DATA, blkno)) { io->had_mismatch =3D true; --=20 2.52.0 From nobody Sat Feb 7 11:31:08 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 49854341642; Fri, 19 Dec 2025 19:32:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766172742; cv=none; b=ue028QPhOZBNfrpoZpcHXeLlzPTQN+jBW1T7v/ncF0ikTOnqzoeQ1SnaOm1G/0Guow27Z3hTXI0Mwp3fv46DVxg45YdEpiz7HpFB+G5gflnkQE2i9yRu+ObGpyn8XHbCnQFnPeqdNZMjbt526zMeRNwIpCefl9OWAMKBRJbSSOc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766172742; c=relaxed/simple; bh=p+4sMTAzKSmcINpoG41dphGOVe1Sj+e0jZ75a+8LR8g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GASKAdrtXjxhYZPWBps6eUWZHYHbTc2Y24gmSCZiwvJP1OakllW/lTNkxvn6rqe7COTrQ3ja7B5x7NkQsU7+35Z9eHcnbWKgiEN7yTWeitZiYMHUDa+3VnRgZ5qQkTRR4GoSEDLHdUdSFd5L45iPKO7FSZgIjAl2GZgB/oTpjhc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Wu7vyLL1; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Wu7vyLL1" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E04A2C16AAE; Fri, 19 Dec 2025 19:32:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1766172742; bh=p+4sMTAzKSmcINpoG41dphGOVe1Sj+e0jZ75a+8LR8g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Wu7vyLL14yN82+kA2G9PWzbQXpvUT0KI0h8iB7PJwO903B8fQohJh93Z2FJaVLP+7 fz6DkKtVygD1D0tJPVe7yHB8IolZ2qYJMlVyfl0ZZbaOoKMl/Ts93h8g0n9MpNEY9u 4j9hjhzGs9W5re7tW3EqePk3CWNT/B9mM/Y7oOr1BH5QrpLA/rq2fthrG9hNInVcTP ozQetw4E65v3LTe+Ozm876OM7xmJ/t14GR+n6a31gDYlwKfK1rGlD1T2aJBVmtSlF0 GZw2+TuOgj8kDOZX558Vme6PlsT1EH6ss6zNqoMMuh6UBehZLIbIfEekwUFBjaKnxT usf4AHWkdUHfw== From: Eric Biggers To: dm-devel@lists.linux.dev, Alasdair Kergon , Mike Snitzer , Mikulas Patocka , Benjamin Marzinski Cc: Sami Tolvanen , Eran Messeri , linux-kernel@vger.kernel.org, Eric Biggers Subject: [PATCH v2 5/7] dm-verity: make verity_fec_is_enabled() an inline function Date: Fri, 19 Dec 2025 11:29:07 -0800 Message-ID: <20251219192909.385494-6-ebiggers@kernel.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20251219192909.385494-1-ebiggers@kernel.org> References: <20251219192909.385494-1-ebiggers@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" verity_fec_is_enabled() is very short and is called in quite a few places, so make it an inline function. Reviewed-by: Sami Tolvanen Signed-off-by: Eric Biggers --- drivers/md/dm-verity-fec.c | 8 -------- drivers/md/dm-verity-fec.h | 6 +++++- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/drivers/md/dm-verity-fec.c b/drivers/md/dm-verity-fec.c index 6d0b5b4b2699..ef9970b889aa 100644 --- a/drivers/md/dm-verity-fec.c +++ b/drivers/md/dm-verity-fec.c @@ -20,18 +20,10 @@ static inline unsigned int fec_max_nbufs(struct dm_verity *v) { return 1 << (v->data_dev_block_bits - DM_VERITY_FEC_BUF_RS_BITS); } =20 -/* - * If error correction has been configured, returns true. - */ -bool verity_fec_is_enabled(struct dm_verity *v) -{ - return v->fec && v->fec->dev; -} - /* * Return an interleaved offset for a byte in RS block. */ static inline u64 fec_interleave(struct dm_verity *v, u64 offset) { diff --git a/drivers/md/dm-verity-fec.h b/drivers/md/dm-verity-fec.h index 571097438311..35d28d9f8a9b 100644 --- a/drivers/md/dm-verity-fec.h +++ b/drivers/md/dm-verity-fec.h @@ -64,11 +64,15 @@ struct dm_verity_fec_io { #ifdef CONFIG_DM_VERITY_FEC =20 /* each feature parameter requires a value */ #define DM_VERITY_OPTS_FEC 8 =20 -extern bool verity_fec_is_enabled(struct dm_verity *v); +/* Returns true if forward error correction is enabled. */ +static inline bool verity_fec_is_enabled(struct dm_verity *v) +{ + return v->fec && v->fec->dev; +} =20 extern int verity_fec_decode(struct dm_verity *v, struct dm_verity_io *io, enum verity_block_type type, const u8 *want_digest, sector_t block, u8 *dest); =20 --=20 2.52.0 From nobody Sat Feb 7 11:31:08 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E9D0A33A9DF; Fri, 19 Dec 2025 19:32:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766172743; cv=none; b=KjrA6lVkuH8n7gJrRRc9OYVnScaKKgcBhRW5dCI9PUTY5/A5C74d30tr8n19WpEV05E4JeaOKAnjeoSeRML+qPWjdaXv+qQhMJrNBcHS3WluyGfw+ABJD1dAAH+VjWupFglY43d6hKpE+H05r0H70bHS773XD37njALurX431KA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766172743; c=relaxed/simple; bh=AdXX+unAYpqoYbNBMazn5BVkgrnIfOitLZAS4+aSFwg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nQe0jYnygoijf8Wh6QfWLyLX/fltxXDw28Dao2OAnAe8coZmY5zL0QKqklIwKmDGYOv7AcUHX6oW1089Bmt+Jxqj0Xckv11nQvBToUlltsGNVSirJHZ+McwN/3av1TA0V2aosyYX2qwwhigeDSUSJH+ggNDCh3xp/G7rAvU1dKU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=QJUFrFLr; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="QJUFrFLr" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4F40DC4CEF1; Fri, 19 Dec 2025 19:32:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1766172742; bh=AdXX+unAYpqoYbNBMazn5BVkgrnIfOitLZAS4+aSFwg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QJUFrFLrhe0x80sJh7/xhNu0X87e4ARTb8hIsciUvH3V7GLehLvU/1C/XA6Hf8rUC xShscnpJpbogeQlucDwIJFXj7CR249X0R4jJclLH2o3HxbiL5Md2kZETxUiMYfTNDq w/ylHC/+qQdlRMT+t3xhpGiKz8R/Ye/J0SAGINBjCCrBlgxDdSR3J59d3K5OV2blng YV4vf2/+urXPgGiq6gSo3DReQUoxmCaAVFto6+Y1XoMZiR5TLOKQFpRFdKC4ozDMVu 6Kuo1OzmH0mQ61560cjcbvM+QhWc73B8rmawOcJ0DUK+k7SbIPTnkyPJXFyyGa87QM 3HDws4xVPy1og== From: Eric Biggers To: dm-devel@lists.linux.dev, Alasdair Kergon , Mike Snitzer , Mikulas Patocka , Benjamin Marzinski Cc: Sami Tolvanen , Eran Messeri , linux-kernel@vger.kernel.org, Eric Biggers Subject: [PATCH v2 6/7] dm-verity: correctly handle dm_bufio_client_create() failure Date: Fri, 19 Dec 2025 11:29:08 -0800 Message-ID: <20251219192909.385494-7-ebiggers@kernel.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20251219192909.385494-1-ebiggers@kernel.org> References: <20251219192909.385494-1-ebiggers@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" If either of the calls to dm_bufio_client_create() in verity_fec_ctr() fails, then dm_bufio_client_destroy() is later called with an ERR_PTR() argument. That causes a crash. Fix this. Fixes: a739ff3f543a ("dm verity: add support for forward error correction") Reviewed-by: Sami Tolvanen Signed-off-by: Eric Biggers --- drivers/md/dm-verity-fec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/md/dm-verity-fec.c b/drivers/md/dm-verity-fec.c index ef9970b889aa..7583607a8aa6 100644 --- a/drivers/md/dm-verity-fec.c +++ b/drivers/md/dm-verity-fec.c @@ -499,13 +499,13 @@ void verity_fec_dtr(struct dm_verity *v) mempool_exit(&f->rs_pool); mempool_exit(&f->prealloc_pool); mempool_exit(&f->output_pool); kmem_cache_destroy(f->cache); =20 - if (f->data_bufio) + if (!IS_ERR_OR_NULL(f->data_bufio)) dm_bufio_client_destroy(f->data_bufio); - if (f->bufio) + if (!IS_ERR_OR_NULL(f->bufio)) dm_bufio_client_destroy(f->bufio); =20 if (f->dev) dm_put_device(v->ti, f->dev); out: --=20 2.52.0 From nobody Sat Feb 7 11:31:08 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 689F933B6F9; Fri, 19 Dec 2025 19:32:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766172743; cv=none; b=eRzqf4bxBsSZXckg2AbqkleRzzRPsyBIuPx+X8SeN021TTpLRhKUhFqvx3OUE4/myOhFY5rC5aTkykRquO0Lw/7g8U8VC45Judegf7L+L3k3sAOWj5GeAekjfB9HfBtmu22ruxEupFgtbzemzUsIiUbczijNUhhsG7lxRgj2aUc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766172743; c=relaxed/simple; bh=IJehVVJZ76CUbe3T7t0EQZ6LBqx+1Md312+l+dSi2Lo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZNrYAfSoyr5DiXoTcjH/Vd9JTlO6tr1h9Ikeipz3MYIhvBuY23qRqPNAq30SVNsrvnhJnXOdtstPFaULFVD0D5LUm0VqFpxapXyEotbcK0cUvIX5gvc4X9eJzG7XfssRDW4Gcdqhaug3d1ojSFCy3ZeD7UvqrClQorLaRD5ICgQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=PYX+mrKp; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="PYX+mrKp" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B2B77C116B1; Fri, 19 Dec 2025 19:32:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1766172743; bh=IJehVVJZ76CUbe3T7t0EQZ6LBqx+1Md312+l+dSi2Lo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PYX+mrKpjfyfqmwnwV8PM7el5jCS8SfZeIy+cBVpq+hFpUtvms32bShqr905dZTtc TP9WCpOO29hWfrkqsCV42p5Q2BAUZOcOUqO0zTchVyWgB/9T4NY627HjH3J1smq582 XCOkFOhjkdFK1ohwZLRd0HjkAjMZM9/7JeCVuViuLsN2mXiZWJe74nHiZUgkBDTZQb BEzZuEz3Z4gYX64X+3wpiwOibIwQOmKtSTORydlurKXddjAvs9ceklBDu1CLhd+1Pu 59I/mBGf1oZMUnZOepNYSoDQkx0LHG2YkjNefQiyOJ3mfMQgAExaItm/wLSvuI/enk fPtAfqYJJtdUw== From: Eric Biggers To: dm-devel@lists.linux.dev, Alasdair Kergon , Mike Snitzer , Mikulas Patocka , Benjamin Marzinski Cc: Sami Tolvanen , Eran Messeri , linux-kernel@vger.kernel.org, Eric Biggers Subject: [PATCH v2 7/7] dm-verity: allow REED_SOLOMON to be 'm' if DM_VERITY is 'm' Date: Fri, 19 Dec 2025 11:29:09 -0800 Message-ID: <20251219192909.385494-8-ebiggers@kernel.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20251219192909.385494-1-ebiggers@kernel.org> References: <20251219192909.385494-1-ebiggers@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The dm-verity kconfig options make the common mistake of selecting a dependency from a bool "sub-option" rather than the main tristate option. This unnecessarily forces the dependency to built-in ('y'). Fix this by moving the selections of REED_SOLOMON and REED_SOLOMON_DEC8 into DM_VERITY, conditional on DM_VERITY_FEC. This allows REED_SOLOMON to be 'm' if DM_VERITY is 'm'. Reviewed-by: Sami Tolvanen Signed-off-by: Eric Biggers --- drivers/md/Kconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/md/Kconfig b/drivers/md/Kconfig index 239c1744a926..c58a9a8ea54e 100644 --- a/drivers/md/Kconfig +++ b/drivers/md/Kconfig @@ -547,10 +547,12 @@ config DM_VERITY depends on BLK_DEV_DM select CRYPTO select CRYPTO_HASH select CRYPTO_LIB_SHA256 select DM_BUFIO + select REED_SOLOMON if DM_VERITY_FEC + select REED_SOLOMON_DEC8 if DM_VERITY_FEC help This device-mapper target creates a read-only device that transparently validates the data on one underlying device against a pre-generated tree of cryptographic checksums stored on a second device. @@ -596,12 +598,10 @@ config DM_VERITY_VERIFY_ROOTHASH_SIG_PLATFORM_KEYRING If unsure, say N. =20 config DM_VERITY_FEC bool "Verity forward error correction support" depends on DM_VERITY - select REED_SOLOMON - select REED_SOLOMON_DEC8 help Add forward error correction support to dm-verity. This option makes it possible to use pre-generated error correction data to recover from corrupted blocks. =20 --=20 2.52.0