diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2019-03-16 12:36:39 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-03-16 12:36:39 -0700 |
commit | 11efae3506d882a8782bc89493a32e467defd6b9 (patch) | |
tree | 4671e72e14bb5f03e484ade6526ccfd1a40f75b8 /block | |
parent | 465c209db83e2cdaeb4a52f4e107a9fc636704db (diff) | |
parent | f6d85f04e29859dd3ea65395c05925da352dae89 (diff) | |
download | linux-11efae3506d882a8782bc89493a32e467defd6b9.tar.bz2 |
Merge tag 'for-5.1/block-post-20190315' of git://git.kernel.dk/linux-block
Pull more block layer changes from Jens Axboe:
"This is a collection of both stragglers, and fixes that came in after
I finalized the initial pull. This contains:
- An MD pull request from Song, with a few minor fixes
- Set of NVMe patches via Christoph
- Pull request from Konrad, with a few fixes for xen/blkback
- pblk fix IO calculation fix (Javier)
- Segment calculation fix for pass-through (Ming)
- Fallthrough annotation for blkcg (Mathieu)"
* tag 'for-5.1/block-post-20190315' of git://git.kernel.dk/linux-block: (25 commits)
blkcg: annotate implicit fall through
nvme-tcp: support C2HData with SUCCESS flag
nvmet: ignore EOPNOTSUPP for discard
nvme: add proper write zeroes setup for the multipath device
nvme: add proper discard setup for the multipath device
nvme: remove nvme_ns_config_oncs
nvme: disable Write Zeroes for qemu controllers
nvmet-fc: bring Disconnect into compliance with FC-NVME spec
nvmet-fc: fix issues with targetport assoc_list list walking
nvme-fc: reject reconnect if io queue count is reduced to zero
nvme-fc: fix numa_node when dev is null
nvme-fc: use nr_phys_segments to determine existence of sgl
nvme-loop: init nvmet_ctrl fatal_err_work when allocate
nvme: update comment to make the code easier to read
nvme: put ns_head ref if namespace fails allocation
nvme-trace: fix cdw10 buffer overrun
nvme: don't warn on block content change effects
nvme: add get-feature to admin cmds tracer
md: Fix failed allocation of md_register_thread
It's wrong to add len to sector_nr in raid10 reshape twice
...
Diffstat (limited to 'block')
-rw-r--r-- | block/blk-merge.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/block/blk-merge.c b/block/blk-merge.c index 22467f475ab4..1c9d4f0f96ea 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -180,7 +180,7 @@ static unsigned get_max_segment_size(struct request_queue *q, */ static bool bvec_split_segs(struct request_queue *q, struct bio_vec *bv, unsigned *nsegs, unsigned *last_seg_size, - unsigned *front_seg_size, unsigned *sectors) + unsigned *front_seg_size, unsigned *sectors, unsigned max_segs) { unsigned len = bv->bv_len; unsigned total_len = 0; @@ -190,7 +190,7 @@ static bool bvec_split_segs(struct request_queue *q, struct bio_vec *bv, * Multi-page bvec may be too big to hold in one segment, so the * current bvec has to be splitted as multiple segments. */ - while (len && new_nsegs + *nsegs < queue_max_segments(q)) { + while (len && new_nsegs + *nsegs < max_segs) { seg_size = get_max_segment_size(q, bv->bv_offset + total_len); seg_size = min(seg_size, len); @@ -240,6 +240,7 @@ static struct bio *blk_bio_segment_split(struct request_queue *q, bool do_split = true; struct bio *new = NULL; const unsigned max_sectors = get_max_io_size(q, bio); + const unsigned max_segs = queue_max_segments(q); bio_for_each_bvec(bv, bio, iter) { /* @@ -254,14 +255,14 @@ static struct bio *blk_bio_segment_split(struct request_queue *q, * Consider this a new segment if we're splitting in * the middle of this vector. */ - if (nsegs < queue_max_segments(q) && + if (nsegs < max_segs && sectors < max_sectors) { /* split in the middle of bvec */ bv.bv_len = (max_sectors - sectors) << 9; bvec_split_segs(q, &bv, &nsegs, &seg_size, &front_seg_size, - §ors); + §ors, max_segs); } goto split; } @@ -283,7 +284,7 @@ static struct bio *blk_bio_segment_split(struct request_queue *q, continue; } new_segment: - if (nsegs == queue_max_segments(q)) + if (nsegs == max_segs) goto split; bvprv = bv; @@ -296,7 +297,7 @@ new_segment: if (nsegs == 1 && seg_size > front_seg_size) front_seg_size = seg_size; } else if (bvec_split_segs(q, &bv, &nsegs, &seg_size, - &front_seg_size, §ors)) { + &front_seg_size, §ors, max_segs)) { goto split; } } @@ -415,7 +416,7 @@ new_segment: bvprv = bv; prev = 1; bvec_split_segs(q, &bv, &nr_phys_segs, &seg_size, - &front_seg_size, NULL); + &front_seg_size, NULL, UINT_MAX); } bbio = bio; } |