diff options
Diffstat (limited to 'fs/bio.c')
| -rw-r--r-- | fs/bio.c | 13 |
1 files changed, 5 insertions, 8 deletions
| @@ -507,10 +507,8 @@ int bio_get_nr_vecs(struct block_device *bdev) | |||
| 507 | int nr_pages; | 507 | int nr_pages; |
| 508 | 508 | ||
| 509 | nr_pages = ((queue_max_sectors(q) << 9) + PAGE_SIZE - 1) >> PAGE_SHIFT; | 509 | nr_pages = ((queue_max_sectors(q) << 9) + PAGE_SIZE - 1) >> PAGE_SHIFT; |
| 510 | if (nr_pages > queue_max_phys_segments(q)) | 510 | if (nr_pages > queue_max_segments(q)) |
| 511 | nr_pages = queue_max_phys_segments(q); | 511 | nr_pages = queue_max_segments(q); |
| 512 | if (nr_pages > queue_max_hw_segments(q)) | ||
| 513 | nr_pages = queue_max_hw_segments(q); | ||
| 514 | 512 | ||
| 515 | return nr_pages; | 513 | return nr_pages; |
| 516 | } | 514 | } |
| @@ -557,7 +555,7 @@ static int __bio_add_page(struct request_queue *q, struct bio *bio, struct page | |||
| 557 | .bi_rw = bio->bi_rw, | 555 | .bi_rw = bio->bi_rw, |
| 558 | }; | 556 | }; |
| 559 | 557 | ||
| 560 | if (q->merge_bvec_fn(q, &bvm, prev) < len) { | 558 | if (q->merge_bvec_fn(q, &bvm, prev) != prev->bv_len) { |
| 561 | prev->bv_len -= len; | 559 | prev->bv_len -= len; |
| 562 | return 0; | 560 | return 0; |
| 563 | } | 561 | } |
| @@ -575,8 +573,7 @@ static int __bio_add_page(struct request_queue *q, struct bio *bio, struct page | |||
| 575 | * make this too complex. | 573 | * make this too complex. |
| 576 | */ | 574 | */ |
| 577 | 575 | ||
| 578 | while (bio->bi_phys_segments >= queue_max_phys_segments(q) | 576 | while (bio->bi_phys_segments >= queue_max_segments(q)) { |
| 579 | || bio->bi_phys_segments >= queue_max_hw_segments(q)) { | ||
| 580 | 577 | ||
| 581 | if (retried_segments) | 578 | if (retried_segments) |
| 582 | return 0; | 579 | return 0; |
| @@ -611,7 +608,7 @@ static int __bio_add_page(struct request_queue *q, struct bio *bio, struct page | |||
| 611 | * merge_bvec_fn() returns number of bytes it can accept | 608 | * merge_bvec_fn() returns number of bytes it can accept |
| 612 | * at this offset | 609 | * at this offset |
| 613 | */ | 610 | */ |
| 614 | if (q->merge_bvec_fn(q, &bvm, bvec) < len) { | 611 | if (q->merge_bvec_fn(q, &bvm, bvec) != bvec->bv_len) { |
| 615 | bvec->bv_page = NULL; | 612 | bvec->bv_page = NULL; |
| 616 | bvec->bv_len = 0; | 613 | bvec->bv_len = 0; |
| 617 | bvec->bv_offset = 0; | 614 | bvec->bv_offset = 0; |
