]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/md/multipath.c
dm: fix thaw_bdev
[linux-2.6-omap-h63xx.git] / drivers / md / multipath.c
index a6260f0e3b9e57bf756ac32c8e75f15c37d47f12..b35731cceac671ee647e108174a44cacfa82c381 100644 (file)
@@ -82,21 +82,17 @@ static void multipath_end_bh_io (struct multipath_bh *mp_bh, int err)
        struct bio *bio = mp_bh->master_bio;
        multipath_conf_t *conf = mddev_to_conf(mp_bh->mddev);
 
-       bio_endio(bio, bio->bi_size, err);
+       bio_endio(bio, err);
        mempool_free(mp_bh, conf->pool);
 }
 
-static int multipath_end_request(struct bio *bio, unsigned int bytes_done,
-                                int error)
+static void multipath_end_request(struct bio *bio, int error)
 {
        int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
        struct multipath_bh * mp_bh = (struct multipath_bh *)(bio->bi_private);
        multipath_conf_t *conf = mddev_to_conf(mp_bh->mddev);
        mdk_rdev_t *rdev = conf->multipaths[mp_bh->path].rdev;
 
-       if (bio->bi_size)
-               return 1;
-
        if (uptodate)
                multipath_end_bh_io(mp_bh, 0);
        else if (!bio_rw_ahead(bio)) {
@@ -112,7 +108,6 @@ static int multipath_end_request(struct bio *bio, unsigned int bytes_done,
        } else
                multipath_end_bh_io(mp_bh, error);
        rdev_dec_pending(rdev, conf->mddev);
-       return 0;
 }
 
 static void unplug_slaves(mddev_t *mddev)
@@ -125,7 +120,7 @@ static void unplug_slaves(mddev_t *mddev)
                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);
+                       struct request_queue *r_queue = bdev_get_queue(rdev->bdev);
 
                        atomic_inc(&rdev->nr_pending);
                        rcu_read_unlock();
@@ -140,13 +135,13 @@ static void unplug_slaves(mddev_t *mddev)
        rcu_read_unlock();
 }
 
-static void multipath_unplug(request_queue_t *q)
+static void multipath_unplug(struct request_queue *q)
 {
        unplug_slaves(q->queuedata);
 }
 
 
-static int multipath_make_request (request_queue_t *q, struct bio * bio)
+static int multipath_make_request (struct request_queue *q, struct bio * bio)
 {
        mddev_t *mddev = q->queuedata;
        multipath_conf_t *conf = mddev_to_conf(mddev);
@@ -155,7 +150,7 @@ static int multipath_make_request (request_queue_t *q, struct bio * bio)
        const int rw = bio_data_dir(bio);
 
        if (unlikely(bio_barrier(bio))) {
-               bio_endio(bio, bio->bi_size, -EOPNOTSUPP);
+               bio_endio(bio, -EOPNOTSUPP);
                return 0;
        }
 
@@ -169,7 +164,7 @@ static int multipath_make_request (request_queue_t *q, struct bio * bio)
 
        mp_bh->path = multipath_map(conf);
        if (mp_bh->path < 0) {
-               bio_endio(bio, bio->bi_size, -EIO);
+               bio_endio(bio, -EIO);
                mempool_free(mp_bh, conf->pool);
                return 0;
        }
@@ -199,35 +194,6 @@ static void multipath_status (struct seq_file *seq, mddev_t *mddev)
        seq_printf (seq, "]");
 }
 
-static int multipath_issue_flush(request_queue_t *q, struct gendisk *disk,
-                                sector_t *error_sector)
-{
-       mddev_t *mddev = q->queuedata;
-       multipath_conf_t *conf = mddev_to_conf(mddev);
-       int i, ret = 0;
-
-       rcu_read_lock();
-       for (i=0; i<mddev->raid_disks && ret == 0; i++) {
-               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);
-
-                       if (!r_queue->issue_flush_fn)
-                               ret = -EOPNOTSUPP;
-                       else {
-                               atomic_inc(&rdev->nr_pending);
-                               rcu_read_unlock();
-                               ret = r_queue->issue_flush_fn(r_queue, bdev->bd_disk,
-                                                             error_sector);
-                               rdev_dec_pending(rdev, mddev);
-                               rcu_read_lock();
-                       }
-               }
-       }
-       rcu_read_unlock();
-       return ret;
-}
 static int multipath_congested(void *data, int bits)
 {
        mddev_t *mddev = data;
@@ -238,7 +204,7 @@ static int multipath_congested(void *data, int bits)
        for (i = 0; i < mddev->raid_disks ; i++) {
                mdk_rdev_t *rdev = rcu_dereference(conf->multipaths[i].rdev);
                if (rdev && !test_bit(Faulty, &rdev->flags)) {
-                       request_queue_t *q = bdev_get_queue(rdev->bdev);
+                       struct request_queue *q = bdev_get_queue(rdev->bdev);
 
                        ret |= bdi_congested(&q->backing_dev_info, bits);
                        /* Just like multipath_map, we just check the
@@ -277,6 +243,7 @@ static void multipath_error (mddev_t *mddev, mdk_rdev_t *rdev)
                        set_bit(Faulty, &rdev->flags);
                        set_bit(MD_CHANGE_DEVS, &mddev->flags);
                        conf->working_disks--;
+                       mddev->degraded++;
                        printk(KERN_ALERT "multipath: IO failure on %s,"
                                " disabling IO path. \n Operation continuing"
                                " on %d IO paths.\n",
@@ -336,6 +303,7 @@ static int multipath_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
                                blk_queue_max_sectors(mddev->queue, PAGE_SIZE>>9);
 
                        conf->working_disks++;
+                       mddev->degraded--;
                        rdev->raid_disk = path;
                        set_bit(In_sync, &rdev->flags);
                        rcu_assign_pointer(p->rdev, rdev);
@@ -530,7 +498,6 @@ static int multipath_run (mddev_t *mddev)
        mddev->array_size = mddev->size;
 
        mddev->queue->unplug_fn = multipath_unplug;
-       mddev->queue->issue_flush_fn = multipath_issue_flush;
        mddev->queue->backing_dev_info.congested_fn = multipath_congested;
        mddev->queue->backing_dev_info.congested_data = mddev;