Merge branch 'omap/dt-missed-3.4' into drivers/mmc
[firefly-linux-kernel-4.4.55.git] / drivers / md / raid1.c
index 4a40a200d7696319c59cafacfffbf9044d12743c..15dd59b84e94442c50ae164cb2ec1c130a74bc52 100644 (file)
@@ -1712,6 +1712,7 @@ static int process_checks(struct r1bio *r1_bio)
        struct r1conf *conf = mddev->private;
        int primary;
        int i;
+       int vcnt;
 
        for (primary = 0; primary < conf->raid_disks * 2; primary++)
                if (r1_bio->bios[primary]->bi_end_io == end_sync_read &&
@@ -1721,9 +1722,9 @@ static int process_checks(struct r1bio *r1_bio)
                        break;
                }
        r1_bio->read_disk = primary;
+       vcnt = (r1_bio->sectors + PAGE_SIZE / 512 - 1) >> (PAGE_SHIFT - 9);
        for (i = 0; i < conf->raid_disks * 2; i++) {
                int j;
-               int vcnt = r1_bio->sectors >> (PAGE_SHIFT- 9);
                struct bio *pbio = r1_bio->bios[primary];
                struct bio *sbio = r1_bio->bios[i];
                int size;
@@ -1738,7 +1739,7 @@ static int process_checks(struct r1bio *r1_bio)
                                s = sbio->bi_io_vec[j].bv_page;
                                if (memcmp(page_address(p),
                                           page_address(s),
-                                          PAGE_SIZE))
+                                          sbio->bi_io_vec[j].bv_len))
                                        break;
                        }
                } else
@@ -2386,8 +2387,7 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr, int *skipp
                int ok = 1;
                for (i = 0 ; i < conf->raid_disks * 2 ; i++)
                        if (r1_bio->bios[i]->bi_end_io == end_sync_write) {
-                               struct md_rdev *rdev =
-                                       rcu_dereference(conf->mirrors[i].rdev);
+                               struct md_rdev *rdev = conf->mirrors[i].rdev;
                                ok = rdev_set_badblocks(rdev, sector_nr,
                                                        min_bad, 0
                                        ) && ok;
@@ -2636,11 +2636,13 @@ static struct r1conf *setup_conf(struct mddev *mddev)
        return ERR_PTR(err);
 }
 
+static int stop(struct mddev *mddev);
 static int run(struct mddev *mddev)
 {
        struct r1conf *conf;
        int i;
        struct md_rdev *rdev;
+       int ret;
 
        if (mddev->level != 1) {
                printk(KERN_ERR "md/raid1:%s: raid level not set to mirroring (%d)\n",
@@ -2705,7 +2707,11 @@ static int run(struct mddev *mddev)
                mddev->queue->backing_dev_info.congested_data = mddev;
                blk_queue_merge_bvec(mddev->queue, raid1_mergeable_bvec);
        }
-       return md_integrity_register(mddev);
+
+       ret =  md_integrity_register(mddev);
+       if (ret)
+               stop(mddev);
+       return ret;
 }
 
 static int stop(struct mddev *mddev)