This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / drivers / md / raid10.c
index 6c3fde9..e589b83 100644 (file)
@@ -594,7 +594,7 @@ static void unplug_slaves(mddev_t *mddev)
                                r_queue->unplug_fn(r_queue);
 
                        spin_lock_irqsave(&conf->device_lock, flags);
-                       atomic_dec(&rdev->nr_pending);
+                       rdev_dec_pending(rdev, mddev);
                }
        }
        spin_unlock_irqrestore(&conf->device_lock, flags);
@@ -1233,8 +1233,8 @@ static void raid10d(mddev_t *mddev)
                        int mirror;
                        bio = r10_bio->devs[r10_bio->read_slot].bio;
                        r10_bio->devs[r10_bio->read_slot].bio = NULL;
+                       bio_put(bio);
                        mirror = read_balance(conf, r10_bio);
-                       r10_bio->devs[r10_bio->read_slot].bio = bio;
                        if (mirror == -1) {
                                printk(KERN_ALERT "raid10: %s: unrecoverable I/O"
                                       " read error for block %llu\n",
@@ -1248,15 +1248,14 @@ static void raid10d(mddev_t *mddev)
                                               " another mirror\n",
                                               bdevname(rdev->bdev,b),
                                               (unsigned long long)r10_bio->sector);
-                               bio->bi_bdev = rdev->bdev;
+                               bio = bio_clone(r10_bio->master_bio, GFP_NOIO);
+                               r10_bio->devs[r10_bio->read_slot].bio = bio;
                                bio->bi_sector = r10_bio->devs[r10_bio->read_slot].addr
                                        + rdev->data_offset;
-                               bio->bi_next = NULL;
-                               bio->bi_flags &= (1<<BIO_CLONED);
-                               bio->bi_flags |= 1 << BIO_UPTODATE;
-                               bio->bi_idx = 0;
-                               bio->bi_size = r10_bio->sectors << 9;
+                               bio->bi_bdev = rdev->bdev;
                                bio->bi_rw = READ;
+                               bio->bi_private = r10_bio;
+                               bio->bi_end_io = raid10_end_read_request;
                                unplug = 1;
                                generic_make_request(bio);
                        }
@@ -1493,9 +1492,10 @@ static int sync_request(mddev_t *mddev, sector_t sector_nr, int go_faster)
                        for (i=0; i<conf->copies; i++) {
                                int d = r10_bio->devs[i].devnum;
                                if (r10_bio->devs[i].bio->bi_end_io)
-                                       atomic_dec(&conf->mirrors[d].rdev->nr_pending);
+                                       rdev_dec_pending(conf->mirrors[d].rdev, mddev);
                        }
                        put_buf(r10_bio);
+                       biolist = NULL;
                        goto giveup;
                }
        }
@@ -1557,7 +1557,7 @@ static int sync_request(mddev_t *mddev, sector_t sector_nr, int go_faster)
                }
        }
 
-       return nr_sectors;
+       return sectors_skipped + nr_sectors;
  giveup:
        /* There is nowhere to write, so all non-sync
         * drives must be failed, so try the next chunk...