diff options
| author | Jens Axboe <axboe@fb.com> | 2014-07-14 16:04:47 -0400 |
|---|---|---|
| committer | Jens Axboe <axboe@fb.com> | 2014-07-14 16:04:47 -0400 |
| commit | 26a337944e73d88838642a09689fdf40daf00069 (patch) | |
| tree | f9c44bc06c67b67448950624da3ea80b5d4b3bd2 /block | |
| parent | 254c4407cb84a6dec90336054615b0f0e996bb7c (diff) | |
Revert "bio: modify __bio_add_page() to accept pages that don't start a new segment"
This reverts commit 254c4407cb84a6dec90336054615b0f0e996bb7c.
It causes crashes with cryptsetup, even after a few iterations and
updates. Drop it for now.
Diffstat (limited to 'block')
| -rw-r--r-- | block/bio.c | 52 |
1 files changed, 23 insertions, 29 deletions
diff --git a/block/bio.c b/block/bio.c index fb12df9af0fc..0ec61c9e536c 100644 --- a/block/bio.c +++ b/block/bio.c | |||
| @@ -744,7 +744,6 @@ static int __bio_add_page(struct request_queue *q, struct bio *bio, struct page | |||
| 744 | } | 744 | } |
| 745 | } | 745 | } |
| 746 | 746 | ||
| 747 | bio->bi_iter.bi_size += len; | ||
| 748 | goto done; | 747 | goto done; |
| 749 | } | 748 | } |
| 750 | 749 | ||
| @@ -761,32 +760,29 @@ static int __bio_add_page(struct request_queue *q, struct bio *bio, struct page | |||
| 761 | return 0; | 760 | return 0; |
| 762 | 761 | ||
| 763 | /* | 762 | /* |
| 764 | * setup the new entry, we might clear it again later if we | 763 | * we might lose a segment or two here, but rather that than |
| 765 | * cannot add the page | 764 | * make this too complex. |
| 766 | */ | ||
| 767 | bvec = &bio->bi_io_vec[bio->bi_vcnt]; | ||
| 768 | bvec->bv_page = page; | ||
| 769 | bvec->bv_len = len; | ||
| 770 | bvec->bv_offset = offset; | ||
| 771 | bio->bi_vcnt++; | ||
| 772 | bio->bi_phys_segments++; | ||
| 773 | bio->bi_iter.bi_size += len; | ||
| 774 | |||
| 775 | /* | ||
| 776 | * Perform a recount if the number of segments is greater | ||
| 777 | * than queue_max_segments(q). | ||
| 778 | */ | 765 | */ |
| 779 | 766 | ||
| 780 | while (bio->bi_phys_segments > queue_max_segments(q)) { | 767 | while (bio->bi_phys_segments >= queue_max_segments(q)) { |
| 781 | 768 | ||
| 782 | if (retried_segments) | 769 | if (retried_segments) |
| 783 | goto failed; | 770 | return 0; |
| 784 | 771 | ||
| 785 | retried_segments = 1; | 772 | retried_segments = 1; |
| 786 | blk_recount_segments(q, bio); | 773 | blk_recount_segments(q, bio); |
| 787 | } | 774 | } |
| 788 | 775 | ||
| 789 | /* | 776 | /* |
| 777 | * setup the new entry, we might clear it again later if we | ||
| 778 | * cannot add the page | ||
| 779 | */ | ||
| 780 | bvec = &bio->bi_io_vec[bio->bi_vcnt]; | ||
| 781 | bvec->bv_page = page; | ||
| 782 | bvec->bv_len = len; | ||
| 783 | bvec->bv_offset = offset; | ||
| 784 | |||
| 785 | /* | ||
| 790 | * if queue has other restrictions (eg varying max sector size | 786 | * if queue has other restrictions (eg varying max sector size |
| 791 | * depending on offset), it can specify a merge_bvec_fn in the | 787 | * depending on offset), it can specify a merge_bvec_fn in the |
| 792 | * queue to get further control | 788 | * queue to get further control |
| @@ -803,25 +799,23 @@ static int __bio_add_page(struct request_queue *q, struct bio *bio, struct page | |||
| 803 | * merge_bvec_fn() returns number of bytes it can accept | 799 | * merge_bvec_fn() returns number of bytes it can accept |
| 804 | * at this offset | 800 | * at this offset |
| 805 | */ | 801 | */ |
| 806 | if (q->merge_bvec_fn(q, &bvm, bvec) < bvec->bv_len) | 802 | if (q->merge_bvec_fn(q, &bvm, bvec) < bvec->bv_len) { |
| 807 | goto failed; | 803 | bvec->bv_page = NULL; |
| 804 | bvec->bv_len = 0; | ||
| 805 | bvec->bv_offset = 0; | ||
| 806 | return 0; | ||
| 807 | } | ||
| 808 | } | 808 | } |
| 809 | 809 | ||
| 810 | /* If we may be able to merge these biovecs, force a recount */ | 810 | /* If we may be able to merge these biovecs, force a recount */ |
| 811 | if (bio->bi_vcnt > 1 && (BIOVEC_PHYS_MERGEABLE(bvec-1, bvec))) | 811 | if (bio->bi_vcnt && (BIOVEC_PHYS_MERGEABLE(bvec-1, bvec))) |
| 812 | bio->bi_flags &= ~(1 << BIO_SEG_VALID); | 812 | bio->bi_flags &= ~(1 << BIO_SEG_VALID); |
| 813 | 813 | ||
| 814 | bio->bi_vcnt++; | ||
| 815 | bio->bi_phys_segments++; | ||
| 814 | done: | 816 | done: |
| 817 | bio->bi_iter.bi_size += len; | ||
| 815 | return len; | 818 | return len; |
| 816 | |||
| 817 | failed: | ||
| 818 | bvec->bv_page = NULL; | ||
| 819 | bvec->bv_len = 0; | ||
| 820 | bvec->bv_offset = 0; | ||
| 821 | bio->bi_vcnt--; | ||
| 822 | bio->bi_iter.bi_size -= len; | ||
| 823 | blk_recount_segments(q, bio); | ||
| 824 | return 0; | ||
| 825 | } | 819 | } |
| 826 | 820 | ||
| 827 | /** | 821 | /** |
