Revert "bio: modify __bio_add_page() to accept pages that don't start a new segment"

This reverts commit 254c4407cb.

It causes crashes with cryptsetup, even after a few iterations and
updates. Drop it for now.
This commit is contained in:
Jens Axboe 2014-07-14 22:04:47 +02:00
Родитель 254c4407cb
Коммит 26a337944e
1 изменённых файлов: 24 добавлений и 30 удалений

Просмотреть файл

@ -744,7 +744,6 @@ static int __bio_add_page(struct request_queue *q, struct bio *bio, struct page
} }
} }
bio->bi_iter.bi_size += len;
goto done; goto done;
} }
@ -760,6 +759,20 @@ static int __bio_add_page(struct request_queue *q, struct bio *bio, struct page
if (bio->bi_vcnt >= bio->bi_max_vecs) if (bio->bi_vcnt >= bio->bi_max_vecs)
return 0; return 0;
/*
* we might lose a segment or two here, but rather that than
* make this too complex.
*/
while (bio->bi_phys_segments >= queue_max_segments(q)) {
if (retried_segments)
return 0;
retried_segments = 1;
blk_recount_segments(q, bio);
}
/* /*
* setup the new entry, we might clear it again later if we * setup the new entry, we might clear it again later if we
* cannot add the page * cannot add the page
@ -768,23 +781,6 @@ static int __bio_add_page(struct request_queue *q, struct bio *bio, struct page
bvec->bv_page = page; bvec->bv_page = page;
bvec->bv_len = len; bvec->bv_len = len;
bvec->bv_offset = offset; bvec->bv_offset = offset;
bio->bi_vcnt++;
bio->bi_phys_segments++;
bio->bi_iter.bi_size += len;
/*
* Perform a recount if the number of segments is greater
* than queue_max_segments(q).
*/
while (bio->bi_phys_segments > queue_max_segments(q)) {
if (retried_segments)
goto failed;
retried_segments = 1;
blk_recount_segments(q, bio);
}
/* /*
* if queue has other restrictions (eg varying max sector size * if queue has other restrictions (eg varying max sector size
@ -803,25 +799,23 @@ static int __bio_add_page(struct request_queue *q, struct bio *bio, struct page
* merge_bvec_fn() returns number of bytes it can accept * merge_bvec_fn() returns number of bytes it can accept
* at this offset * at this offset
*/ */
if (q->merge_bvec_fn(q, &bvm, bvec) < bvec->bv_len) if (q->merge_bvec_fn(q, &bvm, bvec) < bvec->bv_len) {
goto failed; bvec->bv_page = NULL;
bvec->bv_len = 0;
bvec->bv_offset = 0;
return 0;
}
} }
/* If we may be able to merge these biovecs, force a recount */ /* If we may be able to merge these biovecs, force a recount */
if (bio->bi_vcnt > 1 && (BIOVEC_PHYS_MERGEABLE(bvec-1, bvec))) if (bio->bi_vcnt && (BIOVEC_PHYS_MERGEABLE(bvec-1, bvec)))
bio->bi_flags &= ~(1 << BIO_SEG_VALID); bio->bi_flags &= ~(1 << BIO_SEG_VALID);
bio->bi_vcnt++;
bio->bi_phys_segments++;
done: done:
bio->bi_iter.bi_size += len;
return len; return len;
failed:
bvec->bv_page = NULL;
bvec->bv_len = 0;
bvec->bv_offset = 0;
bio->bi_vcnt--;
bio->bi_iter.bi_size -= len;
blk_recount_segments(q, bio);
return 0;
} }
/** /**