de-spaghettify this function. Signed-off-by: Andrew Morton --- 25-akpm/fs/bio.c | 40 ++++++++++++++++++---------------------- 1 files changed, 18 insertions(+), 22 deletions(-) diff -puN fs/bio.c~bio_alloc-cleanup fs/bio.c --- 25/fs/bio.c~bio_alloc-cleanup 2004-09-15 21:52:09.818667280 -0700 +++ 25-akpm/fs/bio.c 2004-09-15 21:53:39.268068904 -0700 @@ -137,33 +137,29 @@ inline void bio_init(struct bio *bio) **/ struct bio *bio_alloc(int gfp_mask, int nr_iovecs) { - struct bio_vec *bvl = NULL; - unsigned long idx; - struct bio *bio; - - bio = mempool_alloc(bio_pool, gfp_mask); - if (unlikely(!bio)) - goto out; + struct bio *bio = mempool_alloc(bio_pool, gfp_mask); - bio_init(bio); + if (likely(bio)) { + struct bio_vec *bvl = NULL; - if (unlikely(!nr_iovecs)) - goto noiovec; - - bvl = bvec_alloc(gfp_mask, nr_iovecs, &idx); - if (bvl) { - bio->bi_flags |= idx << BIO_POOL_OFFSET; - bio->bi_max_vecs = bvec_array[idx].nr_vecs; -noiovec: + bio_init(bio); + if (likely(nr_iovecs)) { + unsigned long idx; + + bvl = bvec_alloc(gfp_mask, nr_iovecs, &idx); + if (unlikely(!bvl)) { + mempool_free(bio, bio_pool); + bio = NULL; + goto out; + } + bio->bi_flags |= idx << BIO_POOL_OFFSET; + bio->bi_max_vecs = bvec_array[idx].nr_vecs; + } bio->bi_io_vec = bvl; bio->bi_destructor = bio_destructor; -out: - return bio; } - - mempool_free(bio, bio_pool); - bio = NULL; - goto out; +out: + return bio; } /** _