int bios_to_read = 0;
        struct bio_list bio_list;
        int ret;
-       int sectornr;
-       int stripe;
+       int total_sector_nr;
        struct bio *bio;
 
        bio_list_init(&bio_list);
                goto cleanup;
 
        atomic_set(&rbio->error, 0);
-       /*
-        * build a list of bios to read all the missing parts of this
-        * stripe
-        */
-       for (stripe = 0; stripe < rbio->real_stripes; stripe++) {
-               for_each_set_bit(sectornr, &rbio->dbitmap, rbio->stripe_nsectors) {
-                       struct sector_ptr *sector;
-                       /*
-                        * We want to find all the sectors missing from the
-                        * rbio and read them from the disk.  If * sector_in_rbio()
-                        * finds a sector in the bio list we don't need to read
-                        * it off the stripe.
-                        */
-                       sector = sector_in_rbio(rbio, stripe, sectornr, 1);
-                       if (sector)
-                               continue;
+       /* Build a list of bios to read all the missing parts. */
+       for (total_sector_nr = 0; total_sector_nr < rbio->nr_sectors;
+            total_sector_nr++) {
+               int sectornr = total_sector_nr % rbio->stripe_nsectors;
+               int stripe = total_sector_nr / rbio->stripe_nsectors;
+               struct sector_ptr *sector;
 
-                       sector = rbio_stripe_sector(rbio, stripe, sectornr);
-                       /*
-                        * The bio cache may have handed us an uptodate sector.
-                        * If so, be happy and use it.
-                        */
-                       if (sector->uptodate)
-                               continue;
+               /* No data in the vertical stripe, no need to read. */
+               if (!test_bit(sectornr, &rbio->dbitmap))
+                       continue;
 
-                       ret = rbio_add_io_sector(rbio, &bio_list, sector,
-                                                stripe, sectornr, rbio->stripe_len,
-                                                REQ_OP_READ);
-                       if (ret)
-                               goto cleanup;
-               }
+               /*
+                * We want to find all the sectors missing from the rbio and
+                * read them from the disk. If sector_in_rbio() finds a sector
+                * in the bio list we don't need to read it off the stripe.
+                */
+               sector = sector_in_rbio(rbio, stripe, sectornr, 1);
+               if (sector)
+                       continue;
+
+               sector = rbio_stripe_sector(rbio, stripe, sectornr);
+               /*
+                * The bio cache may have handed us an uptodate sector.  If so,
+                * use it.
+                */
+               if (sector->uptodate)
+                       continue;
+
+               ret = rbio_add_io_sector(rbio, &bio_list, sector, stripe,
+                                        sectornr, rbio->stripe_len, REQ_OP_READ);
+               if (ret)
+                       goto cleanup;
        }
 
        bios_to_read = bio_list_size(&bio_list);