**/
 struct bio *bio_alloc_bioset(gfp_t gfp_mask, int nr_iovecs, struct bio_set *bs)
 {
+       struct bio_vec *bvl = NULL;
        struct bio *bio = NULL;
-       void *uninitialized_var(p);
+       unsigned long idx = 0;
+       void *p = NULL;
 
        if (bs) {
                p = mempool_alloc(bs->bio_pool, gfp_mask);
-
-               if (p)
-                       bio = p + bs->front_pad;
-       } else
+               if (!p)
+                       goto err;
+               bio = p + bs->front_pad;
+       } else {
                bio = kmalloc(sizeof(*bio), gfp_mask);
+               if (!bio)
+                       goto err;
+       }
 
-       if (likely(bio)) {
-               struct bio_vec *bvl = NULL;
-
-               bio_init(bio);
-               if (likely(nr_iovecs)) {
-                       unsigned long uninitialized_var(idx);
-
-                       if (nr_iovecs <= BIO_INLINE_VECS) {
-                               idx = 0;
-                               bvl = bio->bi_inline_vecs;
-                               nr_iovecs = BIO_INLINE_VECS;
-                       } else {
-                               bvl = bvec_alloc_bs(gfp_mask, nr_iovecs, &idx,
-                                                       bs);
-                               nr_iovecs = bvec_nr_vecs(idx);
-                       }
-                       if (unlikely(!bvl)) {
-                               if (bs)
-                                       mempool_free(p, bs->bio_pool);
-                               else
-                                       kfree(bio);
-                               bio = NULL;
-                               goto out;
-                       }
-                       bio->bi_flags |= idx << BIO_POOL_OFFSET;
-                       bio->bi_max_vecs = nr_iovecs;
-               }
-               bio->bi_io_vec = bvl;
+       bio_init(bio);
+
+       if (unlikely(!nr_iovecs))
+               goto out_set;
+
+       if (nr_iovecs <= BIO_INLINE_VECS) {
+               bvl = bio->bi_inline_vecs;
+               nr_iovecs = BIO_INLINE_VECS;
+       } else {
+               bvl = bvec_alloc_bs(gfp_mask, nr_iovecs, &idx, bs);
+               if (unlikely(!bvl))
+                       goto err_free;
+
+               nr_iovecs = bvec_nr_vecs(idx);
        }
-out:
+       bio->bi_flags |= idx << BIO_POOL_OFFSET;
+       bio->bi_max_vecs = nr_iovecs;
+out_set:
+       bio->bi_io_vec = bvl;
+
        return bio;
+
+err_free:
+       if (bs)
+               mempool_free(p, bs->bio_pool);
+       else
+               kfree(bio);
+err:
+       return NULL;
 }
 
 struct bio *bio_alloc(gfp_t gfp_mask, int nr_iovecs)