]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/md/md.c
crypto: ccp - Fix AES XTS error for request sizes above 4096
[karo-tx-linux.git] / drivers / md / md.c
index 61aacab424cf1860dbb5651f5a4fc6c9f7188027..c57fdf847b4767bb86c8b42548fe221785fd9b2e 100644 (file)
@@ -293,6 +293,8 @@ static blk_qc_t md_make_request(struct request_queue *q, struct bio *bio)
         * go away inside make_request
         */
        sectors = bio_sectors(bio);
+       /* bio could be mergeable after passing to underlayer */
+       bio->bi_rw &= ~REQ_NOMERGE;
        mddev->pers->make_request(mddev, bio);
 
        cpu = part_stat_lock();
@@ -2017,28 +2019,32 @@ int md_integrity_register(struct mddev *mddev)
 }
 EXPORT_SYMBOL(md_integrity_register);
 
-/* Disable data integrity if non-capable/non-matching disk is being added */
-void md_integrity_add_rdev(struct md_rdev *rdev, struct mddev *mddev)
+/*
+ * Attempt to add an rdev, but only if it is consistent with the current
+ * integrity profile
+ */
+int md_integrity_add_rdev(struct md_rdev *rdev, struct mddev *mddev)
 {
        struct blk_integrity *bi_rdev;
        struct blk_integrity *bi_mddev;
+       char name[BDEVNAME_SIZE];
 
        if (!mddev->gendisk)
-               return;
+               return 0;
 
        bi_rdev = bdev_get_integrity(rdev->bdev);
        bi_mddev = blk_get_integrity(mddev->gendisk);
 
        if (!bi_mddev) /* nothing to do */
-               return;
-       if (rdev->raid_disk < 0) /* skip spares */
-               return;
-       if (bi_rdev && blk_integrity_compare(mddev->gendisk,
-                                            rdev->bdev->bd_disk) >= 0)
-               return;
-       WARN_ON_ONCE(!mddev->suspended);
-       printk(KERN_NOTICE "disabling data integrity on %s\n", mdname(mddev));
-       blk_integrity_unregister(mddev->gendisk);
+               return 0;
+
+       if (blk_integrity_compare(mddev->gendisk, rdev->bdev->bd_disk) != 0) {
+               printk(KERN_NOTICE "%s: incompatible integrity profile for %s\n",
+                               mdname(mddev), bdevname(rdev->bdev, name));
+               return -ENXIO;
+       }
+
+       return 0;
 }
 EXPORT_SYMBOL(md_integrity_add_rdev);