]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
block: Fix bvec_set_folio() for very large folios
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Thu, 12 Jun 2025 14:42:53 +0000 (15:42 +0100)
committerJens Axboe <axboe@kernel.dk>
Fri, 13 Jun 2025 12:20:17 +0000 (06:20 -0600)
Similarly to 26064d3e2b4d ("block: fix adding folio to bio"), if
we attempt to add a folio that is larger than 4GB, we'll silently
truncate the offset and len.  Widen the parameters to size_t, assert
that the length is less than 4GB and set the first page that contains
the interesting data rather than the first page of the folio.

Fixes: 26db5ee15851 (block: add a bvec_set_folio helper)
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Link: https://lore.kernel.org/r/20250612144255.2850278-1-willy@infradead.org
Signed-off-by: Jens Axboe <axboe@kernel.dk>
include/linux/bvec.h

index 204b22a99c4ba61b592dcf38b3adabf3a0b50584..0a80e1f9aa201c43647afb38dc0c94d890472c13 100644 (file)
@@ -57,9 +57,12 @@ static inline void bvec_set_page(struct bio_vec *bv, struct page *page,
  * @offset:    offset into the folio
  */
 static inline void bvec_set_folio(struct bio_vec *bv, struct folio *folio,
-               unsigned int len, unsigned int offset)
+               size_t len, size_t offset)
 {
-       bvec_set_page(bv, &folio->page, len, offset);
+       unsigned long nr = offset / PAGE_SIZE;
+
+       WARN_ON_ONCE(len > UINT_MAX);
+       bvec_set_page(bv, folio_page(folio, nr), len, offset % PAGE_SIZE);
 }
 
 /**