From nobody Fri Apr 3 12:27:53 2026 Received: from cae.in-ulm.de (cae.in-ulm.de [217.10.14.231]) (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 80A6F322B83 for ; Fri, 20 Feb 2026 09:39:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.10.14.231 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771580356; cv=none; b=drqzulzwWVJAAcuc5yOV14N4J6Fo7NKJ55qq34UkrSEYa3djUz5yaeiU+lC4JID5lcIBEGHcN47TsW495TjwO2KuJWPwt6cfeOB6eDqWKJPst1CUFyiicmAOlYeYrNHXx/01vRa2DkVKmsa1nb+hZ4pBlIP/a6pfIv/+IOegkq4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771580356; c=relaxed/simple; bh=KlY77azg9o+WZ+GKHUdq9L/EZqwqFwaLSd+pxziXBQI=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=HnN/e/ev9lyxwYwI37chOQzlb22ig3rGvFjvGCv/3v8miliRx2rZlGTvCpmR92ri6aesaKa/rPvsmPpe4tEndkbke0/JwV2PNRrEYbrzKKfZj69p47poDRl9WB86ir4QJ+50LQxUeziwCOLDqk5Fo74k/TcIWecP9VHvQNPW/Gk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=c--e.de; spf=pass smtp.mailfrom=c--e.de; arc=none smtp.client-ip=217.10.14.231 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=c--e.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=c--e.de Received: by cae.in-ulm.de (Postfix, from userid 1000) id CD460140028; Fri, 20 Feb 2026 10:39:12 +0100 (CET) From: "Christian A. Ehrhardt" To: linux-kernel@vger.kernel.org, Andrew Morton Cc: "Christian A. Ehrhardt" , David Howells , Kees Cook , Petr Mladek , David Gow Subject: [PATCH 1/3] lib: kunit_iov_iter: Improve error detection Date: Fri, 20 Feb 2026 10:38:35 +0100 Message-Id: <20260220093837.688841-2-lk@c--e.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260220093837.688841-1-lk@c--e.de> References: <20260220093837.688841-1-lk@c--e.de> 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" In the kunit_iov_iter test prevent the kernel buffer from being a single physically contiguous region. Additionally, make sure that the test pattern written to a page in the buffer depends on the offset of the page within the buffer. Cc: David Howells Cc: Andrew Morton Signed-off-by: Christian A. Ehrhardt --- lib/tests/kunit_iov_iter.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/tests/kunit_iov_iter.c b/lib/tests/kunit_iov_iter.c index 48342736d016..c32fbdbb2544 100644 --- a/lib/tests/kunit_iov_iter.c +++ b/lib/tests/kunit_iov_iter.c @@ -13,6 +13,7 @@ #include #include #include +#include #include =20 MODULE_DESCRIPTION("iov_iter testing"); @@ -37,7 +38,7 @@ static const struct kvec_test_range kvec_test_ranges[] = =3D { =20 static inline u8 pattern(unsigned long x) { - return x & 0xff; + return (u8)x + (u8)(x >> 8) + (u8)(x >> 16); } =20 static void iov_kunit_unmap(void *data) @@ -52,6 +53,7 @@ static void *__init iov_kunit_create_buffer(struct kunit = *test, struct page **pages; unsigned long got; void *buffer; + unsigned int i; =20 pages =3D kunit_kcalloc(test, npages, sizeof(struct page *), GFP_KERNEL); KUNIT_ASSERT_NOT_ERR_OR_NULL(test, pages); @@ -62,6 +64,9 @@ static void *__init iov_kunit_create_buffer(struct kunit = *test, release_pages(pages, got); KUNIT_ASSERT_EQ(test, got, npages); } + /* Make sure that we don't get a physically contiguous buffer. */ + for (i =3D 0; i < npages / 4; ++i) + swap(pages[i], pages[i + npages/2]); =20 buffer =3D vmap(pages, npages, VM_MAP | VM_MAP_PUT_PAGES, PAGE_KERNEL); KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buffer); --=20 2.43.0 From nobody Fri Apr 3 12:27:53 2026 Received: from cae.in-ulm.de (cae.in-ulm.de [217.10.14.231]) (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 EEDCD31ED7C for ; Fri, 20 Feb 2026 09:39:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.10.14.231 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771580356; cv=none; b=dWOwKKdpKDYYXOvsyKBkrFTMhJDCL1e7JEO+vn7isHqlGdN3N83xf01dQ4B1dyeRM7XlK+QjXJ6AhyEIG8HKLcL6mSO2dWVay8VfncC/NdXotLETuKz4uCg4h095ihfbrkWjPL65XY9EAaUGQvkl0A/mpcKN8syzZ7J4pgKjdJw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771580356; c=relaxed/simple; bh=QXHgGAoosmB6rRU5PS3q9dGMjqAmqlHwGmjTU5nxlVU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=VkqUeJ+LHh1wxEoBZz65SxNnDarbrlTFFgpBiG/MNxKcSZLHhBWLf+CGcD+VdBkKQEYR+c7pZUb+MOe1fEUt5K9lKz5Z7zzMkzUSbQYSPaBORIMcjyj4Y+EzldXpMq8xFJibaIhPHAxjKkB8+8NJpSZdZsYJcRea2SVreU1K0Pc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=c--e.de; spf=pass smtp.mailfrom=c--e.de; arc=none smtp.client-ip=217.10.14.231 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=c--e.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=c--e.de Received: by cae.in-ulm.de (Postfix, from userid 1000) id 9E594140117; Fri, 20 Feb 2026 10:39:13 +0100 (CET) From: "Christian A. Ehrhardt" To: linux-kernel@vger.kernel.org, Andrew Morton Cc: "Christian A. Ehrhardt" , David Howells , Kees Cook , Petr Mladek , David Gow Subject: [PATCH 2/3] lib: kunit_iov_iter: Add tests for extract_iter_to_sg Date: Fri, 20 Feb 2026 10:38:36 +0100 Message-Id: <20260220093837.688841-3-lk@c--e.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260220093837.688841-1-lk@c--e.de> References: <20260220093837.688841-1-lk@c--e.de> 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" Add test cases that test extract_iter_to_sg. For each iterator type an iterator is loaded with a kernel buffer. The iterator is then extracted to a scatterlist and the scatterlist is copied into a scratch buffer. The test passes if the scratch buffer compares equal to the original buffer. The new tests demostrate a bug in extract_iter_to_sg for kvec iterators and one of the tests will fail. This is fixed in the next commit. Cc: David Howells Cc: Andrew Morton Signed-off-by: Christian A. Ehrhardt --- lib/tests/kunit_iov_iter.c | 140 +++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) diff --git a/lib/tests/kunit_iov_iter.c b/lib/tests/kunit_iov_iter.c index c32fbdbb2544..aa6a19ca6dad 100644 --- a/lib/tests/kunit_iov_iter.c +++ b/lib/tests/kunit_iov_iter.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include =20 @@ -1014,6 +1015,141 @@ static void __init iov_kunit_extract_pages_xarray(s= truct kunit *test) KUNIT_SUCCEED(test); } =20 +struct iov_kunit_iter_to_sg_data { + struct sg_table sgt; + u8 *buffer, *scratch; + struct page **pages; + size_t npages; +}; + +static void __init +iov_kunit_iter_to_sg_init(struct kunit *test, size_t bufsize, + struct iov_kunit_iter_to_sg_data *data) +{ + struct page **spages; + struct scatterlist *sg; + size_t i; + + data->npages =3D bufsize / PAGE_SIZE; + sg =3D kunit_kmalloc_array(test, data->npages, sizeof(*sg), GFP_KERNEL); + sg_init_table(sg, data->npages); + memset(&data->sgt, 0, sizeof(data->sgt)); + data->sgt.orig_nents =3D data->npages; + data->sgt.sgl =3D sg; + + data->buffer =3D iov_kunit_create_buffer(test, &data->pages, + data->npages); + data->scratch =3D iov_kunit_create_buffer(test, &spages, data->npages); + for (i =3D 0; i < bufsize; ++i) + data->buffer[i] =3D pattern(i); + memset(data->scratch, 0, bufsize); +} + +static void __init +iov_kunit_iter_to_sg_check(struct kunit *test, struct iov_iter *iter, + size_t bufsize, + struct iov_kunit_iter_to_sg_data *data) +{ + size_t i; + + i =3D extract_iter_to_sg(iter, bufsize, &data->sgt, + data->npages, 0); + + KUNIT_EXPECT_EQ(test, i, bufsize); + KUNIT_EXPECT_LE(test, data->sgt.nents, data->npages); + + i =3D sg_copy_to_buffer(data->sgt.sgl, data->sgt.nents, + data->scratch, bufsize); + KUNIT_EXPECT_EQ(test, i, bufsize); + + for (i =3D 0; i < bufsize; ++i) { + KUNIT_EXPECT_EQ_MSG(test, data->buffer[i], data->scratch[i], + "at i=3D%zx", i); + if (data->buffer[i] !=3D data->scratch[i]) + break; + } + + KUNIT_EXPECT_EQ(test, i, bufsize); +} + +static void __init iov_kunit_iter_to_sg_kvec(struct kunit *test) +{ + struct iov_kunit_iter_to_sg_data data; + struct iov_iter iter; + struct kvec kvec; + size_t bufsize; + + bufsize =3D 0x100000; + iov_kunit_iter_to_sg_init(test, bufsize, &data); + + kvec.iov_base =3D data.buffer; + kvec.iov_len =3D bufsize; + iov_iter_kvec(&iter, READ, &kvec, 1, bufsize); + + iov_kunit_iter_to_sg_check(test, &iter, bufsize, &data); +} + +static void __init iov_kunit_iter_to_sg_bvec(struct kunit *test) +{ + struct iov_kunit_iter_to_sg_data data; + struct page *p, *can_merge =3D NULL; + size_t i, k, bufsize; + struct bio_vec *bvec; + struct iov_iter iter; + + bufsize =3D 0x100000; + iov_kunit_iter_to_sg_init(test, bufsize, &data); + + bvec =3D kunit_kmalloc_array(test, data.npages, sizeof(*bvec), + GFP_KERNEL); + k =3D 0; + for (i =3D 0; i < data.npages; ++i) { + p =3D data.pages[i]; + if (p =3D=3D can_merge) + bvec[k-1].bv_len +=3D PAGE_SIZE; + else + bvec_set_page(&bvec[k++], p, PAGE_SIZE, 0); + can_merge =3D p + 1; + } + iov_iter_bvec(&iter, READ, bvec, k, bufsize); + + iov_kunit_iter_to_sg_check(test, &iter, bufsize, &data); +} + +static void __init iov_kunit_iter_to_sg_folioq(struct kunit *test) +{ + struct iov_kunit_iter_to_sg_data data; + struct folio_queue *folioq; + struct iov_iter iter; + size_t bufsize; + + bufsize =3D 0x100000; + iov_kunit_iter_to_sg_init(test, bufsize, &data); + + folioq =3D iov_kunit_create_folioq(test); + iov_kunit_load_folioq(test, &iter, READ, folioq, data.pages, + data.npages); + + iov_kunit_iter_to_sg_check(test, &iter, bufsize, &data); +} + +static void __init iov_kunit_iter_to_sg_xarray(struct kunit *test) +{ + struct iov_kunit_iter_to_sg_data data; + struct xarray *xarray; + struct iov_iter iter; + size_t bufsize; + + bufsize =3D 0x100000; + iov_kunit_iter_to_sg_init(test, bufsize, &data); + + xarray =3D iov_kunit_create_xarray(test); + iov_kunit_load_xarray(test, &iter, READ, xarray, data.pages, + data.npages); + + iov_kunit_iter_to_sg_check(test, &iter, bufsize, &data); +} + static struct kunit_case __refdata iov_kunit_cases[] =3D { KUNIT_CASE(iov_kunit_copy_to_kvec), KUNIT_CASE(iov_kunit_copy_from_kvec), @@ -1027,6 +1163,10 @@ static struct kunit_case __refdata iov_kunit_cases[]= =3D { KUNIT_CASE(iov_kunit_extract_pages_bvec), KUNIT_CASE(iov_kunit_extract_pages_folioq), KUNIT_CASE(iov_kunit_extract_pages_xarray), + KUNIT_CASE(iov_kunit_iter_to_sg_kvec), + KUNIT_CASE(iov_kunit_iter_to_sg_bvec), + KUNIT_CASE(iov_kunit_iter_to_sg_folioq), + KUNIT_CASE(iov_kunit_iter_to_sg_xarray), {} }; =20 --=20 2.43.0 From nobody Fri Apr 3 12:27:53 2026 Received: from cae.in-ulm.de (cae.in-ulm.de [217.10.14.231]) (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 79ED1324B19 for ; Fri, 20 Feb 2026 09:39:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.10.14.231 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771580358; cv=none; b=kpCSxpwBTHsqt4gNIMo7QzQocUz0YO5O/uOQNsgbtHJyXb33/rUWo65+fkT8zDR1NSjHHMvlEyoct3GukuAe1G35OSek+YkIoYlB3L6epmkb79jmPNHnVQqaDpJZeyL+qBBXGfIX5Kq+m6lRQ5m82ZAOMPjRSsnZwSSuYGnyg4E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771580358; c=relaxed/simple; bh=vLygAxpgoaaK8XqJg4I9fpb4dql/q/NDA7UTgPqD0Yc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=MFlsY1vqXvd2qdsXLEWvfptGZtqnkGCD0355tlSS1UqjLqVa+ocdNnpQlD3nACorOAxeR4Zg0UGWKgYY4QIvsuiTxNb3LNryD5KoUu18kNpIxLrB8qB7I/0bBNQ1P5CQxhPhcWAkga1CjMe5CU4fEWUEYlI86Xlzm1XOzOHegIU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=c--e.de; spf=pass smtp.mailfrom=c--e.de; arc=none smtp.client-ip=217.10.14.231 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=c--e.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=c--e.de Received: by cae.in-ulm.de (Postfix, from userid 1000) id D68FD14011E; Fri, 20 Feb 2026 10:39:15 +0100 (CET) From: "Christian A. Ehrhardt" To: linux-kernel@vger.kernel.org, Andrew Morton Cc: "Christian A. Ehrhardt" , David Howells , Kees Cook , Petr Mladek , David Gow Subject: [PATCH 3/3] lib: Fix length calculation in extract_kvec_to_sg Date: Fri, 20 Feb 2026 10:38:37 +0100 Message-Id: <20260220093837.688841-4-lk@c--e.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260220093837.688841-1-lk@c--e.de> References: <20260220093837.688841-1-lk@c--e.de> 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 extracting from a kvec to a scatterlist, do not cross page boundaries. The required length is already calculated but not used as intended. The previous changes to the kunit_iov_iter.c demonstrate that the patch is necessary. Cc: David Howells Cc: Andrew Morton Cc: stable@vger.kernel.org # v6.5+ Fixes: 018584697533 ("netfs: Add a function to extract an iterator into a s= catterlist") Signed-off-by: Christian A. Ehrhardt --- lib/scatterlist.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/scatterlist.c b/lib/scatterlist.c index 21bc9c1f7c06..73893ee0d92d 100644 --- a/lib/scatterlist.c +++ b/lib/scatterlist.c @@ -1249,7 +1249,7 @@ static ssize_t extract_kvec_to_sg(struct iov_iter *it= er, else page =3D virt_to_page((void *)kaddr); =20 - sg_set_page(sg, page, len, off); + sg_set_page(sg, page, seg, off); sgtable->nents++; sg++; sg_max--; --=20 2.43.0