Skip to content

Commit

Permalink
Revert "bio: limit bio max size"
Browse files Browse the repository at this point in the history
This reverts commit cd2c754.

Alex reports that the commit causes corruption with LUKS on ext4. Revert
it for now so that this can be investigated properly.

Link: https://lore.kernel.org/linux-block/1620493841.bxdq8r5haw.none@localhost/
Reported-by: Alex Xu (Hello71) <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
axboe committed May 9, 2021
1 parent cf7b39a commit 35c820e
Show file tree
Hide file tree
Showing 4 changed files with 3 additions and 21 deletions.
13 changes: 2 additions & 11 deletions block/bio.c
Original file line number Diff line number Diff line change
Expand Up @@ -255,13 +255,6 @@ void bio_init(struct bio *bio, struct bio_vec *table,
}
EXPORT_SYMBOL(bio_init);

unsigned int bio_max_size(struct bio *bio)
{
struct block_device *bdev = bio->bi_bdev;

return bdev ? bdev->bd_disk->queue->limits.bio_max_bytes : UINT_MAX;
}

/**
* bio_reset - reinitialize a bio
* @bio: bio to reset
Expand Down Expand Up @@ -873,7 +866,7 @@ bool __bio_try_merge_page(struct bio *bio, struct page *page,
struct bio_vec *bv = &bio->bi_io_vec[bio->bi_vcnt - 1];

if (page_is_mergeable(bv, page, len, off, same_page)) {
if (bio->bi_iter.bi_size > bio_max_size(bio) - len) {
if (bio->bi_iter.bi_size > UINT_MAX - len) {
*same_page = false;
return false;
}
Expand Down Expand Up @@ -1002,7 +995,6 @@ static int __bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter)
{
unsigned short nr_pages = bio->bi_max_vecs - bio->bi_vcnt;
unsigned short entries_left = bio->bi_max_vecs - bio->bi_vcnt;
unsigned int bytes_left = bio_max_size(bio) - bio->bi_iter.bi_size;
struct bio_vec *bv = bio->bi_io_vec + bio->bi_vcnt;
struct page **pages = (struct page **)bv;
bool same_page = false;
Expand All @@ -1018,8 +1010,7 @@ static int __bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter)
BUILD_BUG_ON(PAGE_PTRS_PER_BVEC < 2);
pages += entries_left * (PAGE_PTRS_PER_BVEC - 1);

size = iov_iter_get_pages(iter, pages, bytes_left, nr_pages,
&offset);
size = iov_iter_get_pages(iter, pages, LONG_MAX, nr_pages, &offset);
if (unlikely(size <= 0))
return size ? size : -EFAULT;

Expand Down
5 changes: 0 additions & 5 deletions block/blk-settings.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ EXPORT_SYMBOL_GPL(blk_queue_rq_timeout);
*/
void blk_set_default_limits(struct queue_limits *lim)
{
lim->bio_max_bytes = UINT_MAX;
lim->max_segments = BLK_MAX_SEGMENTS;
lim->max_discard_segments = 1;
lim->max_integrity_segments = 0;
Expand Down Expand Up @@ -140,10 +139,6 @@ void blk_queue_max_hw_sectors(struct request_queue *q, unsigned int max_hw_secto
limits->logical_block_size >> SECTOR_SHIFT);
limits->max_sectors = max_sectors;

if (check_shl_overflow(max_sectors, SECTOR_SHIFT,
&limits->bio_max_bytes))
limits->bio_max_bytes = UINT_MAX;

q->backing_dev_info->io_pages = max_sectors >> (PAGE_SHIFT - 9);
}
EXPORT_SYMBOL(blk_queue_max_hw_sectors);
Expand Down
4 changes: 1 addition & 3 deletions include/linux/bio.h
Original file line number Diff line number Diff line change
Expand Up @@ -106,8 +106,6 @@ static inline void *bio_data(struct bio *bio)
return NULL;
}

extern unsigned int bio_max_size(struct bio *bio);

/**
* bio_full - check if the bio is full
* @bio: bio to check
Expand All @@ -121,7 +119,7 @@ static inline bool bio_full(struct bio *bio, unsigned len)
if (bio->bi_vcnt >= bio->bi_max_vecs)
return true;

if (bio->bi_iter.bi_size > bio_max_size(bio) - len)
if (bio->bi_iter.bi_size > UINT_MAX - len)
return true;

return false;
Expand Down
2 changes: 0 additions & 2 deletions include/linux/blkdev.h
Original file line number Diff line number Diff line change
Expand Up @@ -327,8 +327,6 @@ enum blk_bounce {
};

struct queue_limits {
unsigned int bio_max_bytes;

enum blk_bounce bounce;
unsigned long seg_boundary_mask;
unsigned long virt_boundary_mask;
Expand Down

0 comments on commit 35c820e

Please sign in to comment.