From ad1ee2b10d746846424375ecef3e13a95d200172 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Wed, 3 Sep 2003 11:11:33 -0700 Subject: [PATCH] [PATCH] Fix odd code in bio_add_page From: Neil Brown With the current code in bio_add_page, if fail_segments is ever set, it stays set, so bio_add_page will eventually fail having recounted the segmentation once. I don't think this is intended. This patch changes the code to allow success if the recounting the segments helps. (Jens has acked this) --- fs/bio.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/fs/bio.c b/fs/bio.c index d80b7d19dc087..b02019be46684 100644 --- a/fs/bio.c +++ b/fs/bio.c @@ -296,7 +296,7 @@ int bio_add_page(struct bio *bio, struct page *page, unsigned int len, unsigned int offset) { request_queue_t *q = bdev_get_queue(bio->bi_bdev); - int fail_segments = 0, retried_segments = 0; + int retried_segments = 0; struct bio_vec *bvec; /* @@ -315,18 +315,15 @@ int bio_add_page(struct bio *bio, struct page *page, unsigned int len, * we might lose a segment or two here, but rather that than * make this too complex. */ -retry_segments: - if (bio_phys_segments(q, bio) >= q->max_phys_segments - || bio_hw_segments(q, bio) >= q->max_hw_segments) - fail_segments = 1; - if (fail_segments) { + while (bio_phys_segments(q, bio) >= q->max_phys_segments + || bio_hw_segments(q, bio) >= q->max_hw_segments) { + if (retried_segments) return 0; bio->bi_flags &= ~(1 << BIO_SEG_VALID); retried_segments = 1; - goto retry_segments; } /* -- 2.53.0