]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/md/multipath.c
Merge with /pub/scm/linux/kernel/git/torvalds/linux-2.6.git
[linux-2.6-omap-h63xx.git] / drivers / md / multipath.c
index 286342375fb7f84d5d400e28755e4347f7e99035..145cdc5ad008090e67cabe449e10d8cac5395ff1 100644 (file)
@@ -38,7 +38,7 @@
 static mdk_personality_t multipath_personality;
 
 
-static void *mp_pool_alloc(unsigned int __nocast gfp_flags, void *data)
+static void *mp_pool_alloc(gfp_t gfp_flags, void *data)
 {
        struct multipath_bh *mpb;
        mpb = kmalloc(sizeof(*mpb), gfp_flags);
@@ -63,8 +63,8 @@ static int multipath_map (multipath_conf_t *conf)
 
        rcu_read_lock();
        for (i = 0; i < disks; i++) {
-               mdk_rdev_t *rdev = conf->multipaths[i].rdev;
-               if (rdev && rdev->in_sync) {
+               mdk_rdev_t *rdev = rcu_dereference(conf->multipaths[i].rdev);
+               if (rdev && test_bit(In_sync, &rdev->flags)) {
                        atomic_inc(&rdev->nr_pending);
                        rcu_read_unlock();
                        return i;
@@ -139,8 +139,9 @@ static void unplug_slaves(mddev_t *mddev)
 
        rcu_read_lock();
        for (i=0; i<mddev->raid_disks; i++) {
-               mdk_rdev_t *rdev = conf->multipaths[i].rdev;
-               if (rdev && !rdev->faulty && atomic_read(&rdev->nr_pending)) {
+               mdk_rdev_t *rdev = rcu_dereference(conf->multipaths[i].rdev);
+               if (rdev && !test_bit(Faulty, &rdev->flags)
+                   && atomic_read(&rdev->nr_pending)) {
                        request_queue_t *r_queue = bdev_get_queue(rdev->bdev);
 
                        atomic_inc(&rdev->nr_pending);
@@ -168,6 +169,7 @@ static int multipath_make_request (request_queue_t *q, struct bio * bio)
        multipath_conf_t *conf = mddev_to_conf(mddev);
        struct multipath_bh * mp_bh;
        struct multipath_info *multipath;
+       const int rw = bio_data_dir(bio);
 
        if (unlikely(bio_barrier(bio))) {
                bio_endio(bio, bio->bi_size, -EOPNOTSUPP);
@@ -179,13 +181,8 @@ static int multipath_make_request (request_queue_t *q, struct bio * bio)
        mp_bh->master_bio = bio;
        mp_bh->mddev = mddev;
 
-       if (bio_data_dir(bio)==WRITE) {
-               disk_stat_inc(mddev->gendisk, writes);
-               disk_stat_add(mddev->gendisk, write_sectors, bio_sectors(bio));
-       } else {
-               disk_stat_inc(mddev->gendisk, reads);
-               disk_stat_add(mddev->gendisk, read_sectors, bio_sectors(bio));
-       }
+       disk_stat_inc(mddev->gendisk, ios[rw]);
+       disk_stat_add(mddev->gendisk, sectors[rw], bio_sectors(bio));
 
        mp_bh->path = multipath_map(conf);
        if (mp_bh->path < 0) {
@@ -215,7 +212,7 @@ static void multipath_status (struct seq_file *seq, mddev_t *mddev)
        for (i = 0; i < conf->raid_disks; i++)
                seq_printf (seq, "%s",
                               conf->multipaths[i].rdev && 
-                              conf->multipaths[i].rdev->in_sync ? "U" : "_");
+                              test_bit(In_sync, &conf->multipaths[i].rdev->flags) ? "U" : "_");
        seq_printf (seq, "]");
 }
 
@@ -228,8 +225,8 @@ static int multipath_issue_flush(request_queue_t *q, struct gendisk *disk,
 
        rcu_read_lock();
        for (i=0; i<mddev->raid_disks && ret == 0; i++) {
-               mdk_rdev_t *rdev = conf->multipaths[i].rdev;
-               if (rdev && !rdev->faulty) {
+               mdk_rdev_t *rdev = rcu_dereference(conf->multipaths[i].rdev);
+               if (rdev && !test_bit(Faulty, &rdev->flags)) {
                        struct block_device *bdev = rdev->bdev;
                        request_queue_t *r_queue = bdev_get_queue(bdev);
 
@@ -269,10 +266,10 @@ static void multipath_error (mddev_t *mddev, mdk_rdev_t *rdev)
                /*
                 * Mark disk as unusable
                 */
-               if (!rdev->faulty) {
+               if (!test_bit(Faulty, &rdev->flags)) {
                        char b[BDEVNAME_SIZE];
-                       rdev->in_sync = 0;
-                       rdev->faulty = 1;
+                       clear_bit(In_sync, &rdev->flags);
+                       set_bit(Faulty, &rdev->flags);
                        mddev->sb_dirty = 1;
                        conf->working_disks--;
                        printk(KERN_ALERT "multipath: IO failure on %s,"
@@ -302,7 +299,7 @@ static void print_multipath_conf (multipath_conf_t *conf)
                tmp = conf->multipaths + i;
                if (tmp->rdev)
                        printk(" disk%d, o:%d, dev:%s\n",
-                               i,!tmp->rdev->faulty,
+                               i,!test_bit(Faulty, &tmp->rdev->flags),
                               bdevname(tmp->rdev->bdev,b));
        }
 }
@@ -334,8 +331,8 @@ static int multipath_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
 
                        conf->working_disks++;
                        rdev->raid_disk = path;
-                       rdev->in_sync = 1;
-                       p->rdev = rdev;
+                       set_bit(In_sync, &rdev->flags);
+                       rcu_assign_pointer(p->rdev, rdev);
                        found = 1;
                }
 
@@ -354,7 +351,7 @@ static int multipath_remove_disk(mddev_t *mddev, int number)
 
        rdev = p->rdev;
        if (rdev) {
-               if (rdev->in_sync ||
+               if (test_bit(In_sync, &rdev->flags) ||
                    atomic_read(&rdev->nr_pending)) {
                        printk(KERN_ERR "hot-remove-disk, slot %d is identified"                                " but is still operational!\n", number);
                        err = -EBUSY;
@@ -486,7 +483,7 @@ static int multipath_run (mddev_t *mddev)
                    mddev->queue->max_sectors > (PAGE_SIZE>>9))
                        blk_queue_max_sectors(mddev->queue, PAGE_SIZE>>9);
 
-               if (!rdev->faulty) 
+               if (!test_bit(Faulty, &rdev->flags))
                        conf->working_disks++;
        }