Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

block: pass a maxlen argument to bio_iov_iter_bounce

Allow the file system to limit the size processed in a single
bounce operation. This is needed when generating integrity data
so that the size of a single integrity segment can't overflow.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Anuj Gupta <anuj20.g@samsung.com>
Reviewed-by: Kanchan Joshi <joshi.k@samsung.com>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Tested-by: Anuj Gupta <anuj20.g@samsung.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

Christoph Hellwig and committed by
Jens Axboe
a9aa6045 0bde8a12

+12 -9
+10 -7
block/bio.c
··· 1327 1327 } 1328 1328 } 1329 1329 1330 - static int bio_iov_iter_bounce_write(struct bio *bio, struct iov_iter *iter) 1330 + static int bio_iov_iter_bounce_write(struct bio *bio, struct iov_iter *iter, 1331 + size_t maxlen) 1331 1332 { 1332 - size_t total_len = iov_iter_count(iter); 1333 + size_t total_len = min(maxlen, iov_iter_count(iter)); 1333 1334 1334 1335 if (WARN_ON_ONCE(bio_flagged(bio, BIO_CLONED))) 1335 1336 return -EINVAL; ··· 1368 1367 return 0; 1369 1368 } 1370 1369 1371 - static int bio_iov_iter_bounce_read(struct bio *bio, struct iov_iter *iter) 1370 + static int bio_iov_iter_bounce_read(struct bio *bio, struct iov_iter *iter, 1371 + size_t maxlen) 1372 1372 { 1373 - size_t len = min(iov_iter_count(iter), SZ_1M); 1373 + size_t len = min3(iov_iter_count(iter), maxlen, SZ_1M); 1374 1374 struct folio *folio; 1375 1375 1376 1376 folio = folio_alloc_greedy(GFP_KERNEL, &len); ··· 1410 1408 * bio_iov_iter_bounce - bounce buffer data from an iter into a bio 1411 1409 * @bio: bio to send 1412 1410 * @iter: iter to read from / write into 1411 + * @maxlen: maximum size to bounce 1413 1412 * 1414 1413 * Helper for direct I/O implementations that need to bounce buffer because 1415 1414 * we need to checksum the data or perform other operations that require ··· 1418 1415 * copies the data into it. Needs to be paired with bio_iov_iter_unbounce() 1419 1416 * called on completion. 1420 1417 */ 1421 - int bio_iov_iter_bounce(struct bio *bio, struct iov_iter *iter) 1418 + int bio_iov_iter_bounce(struct bio *bio, struct iov_iter *iter, size_t maxlen) 1422 1419 { 1423 1420 if (op_is_write(bio_op(bio))) 1424 - return bio_iov_iter_bounce_write(bio, iter); 1425 - return bio_iov_iter_bounce_read(bio, iter); 1421 + return bio_iov_iter_bounce_write(bio, iter, maxlen); 1422 + return bio_iov_iter_bounce_read(bio, iter, maxlen); 1426 1423 } 1427 1424 1428 1425 static void bvec_unpin(struct bio_vec *bv, bool mark_dirty)
+1 -1
fs/iomap/direct-io.c
··· 338 338 bio->bi_end_io = iomap_dio_bio_end_io; 339 339 340 340 if (dio->flags & IOMAP_DIO_BOUNCE) 341 - ret = bio_iov_iter_bounce(bio, dio->submit.iter); 341 + ret = bio_iov_iter_bounce(bio, dio->submit.iter, BIO_MAX_SIZE); 342 342 else 343 343 ret = bio_iov_iter_get_pages(bio, dio->submit.iter, 344 344 alignment - 1);
+1 -1
include/linux/bio.h
··· 474 474 extern void bio_set_pages_dirty(struct bio *bio); 475 475 extern void bio_check_pages_dirty(struct bio *bio); 476 476 477 - int bio_iov_iter_bounce(struct bio *bio, struct iov_iter *iter); 477 + int bio_iov_iter_bounce(struct bio *bio, struct iov_iter *iter, size_t maxlen); 478 478 void bio_iov_iter_unbounce(struct bio *bio, bool is_error, bool mark_dirty); 479 479 480 480 extern void bio_copy_data_iter(struct bio *dst, struct bvec_iter *dst_iter,