Merge tag 'for-4.16/dm-changes' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-block.git] / drivers / md / dm.c
index 148087932679db5b2cb84e233e9b29ba7c833281..d6de00f367efdde4137055dfa4c82fefcbcd1f9a 100644 (file)
@@ -1006,7 +1006,15 @@ int dm_set_target_max_io_len(struct dm_target *ti, sector_t len)
                return -EINVAL;
        }
 
-       ti->max_io_len = (uint32_t) len;
+       /*
+        * BIO based queue uses its own splitting. When multipage bvecs
+        * is switched on, size of the incoming bio may be too big to
+        * be handled in some targets, such as crypt.
+        *
+        * When these targets are ready for the big bio, we can remove
+        * the limit.
+        */
+       ti->max_io_len = min_t(uint32_t, len, BIO_MAX_PAGES * PAGE_SIZE);
 
        return 0;
 }
@@ -1862,7 +1870,7 @@ static struct mapped_device *alloc_dev(int minor)
                goto bad;
        md->dax_dev = dax_dev;
 
-       add_disk(md->disk);
+       add_disk_no_queue_reg(md->disk);
        format_dev_t(md->name, MKDEV(_major, minor));
 
        md->wq = alloc_workqueue("kdmflush", WQ_MEM_RECLAIM, 0);
@@ -2135,6 +2143,7 @@ EXPORT_SYMBOL_GPL(dm_get_queue_limits);
 int dm_setup_md_queue(struct mapped_device *md, struct dm_table *t)
 {
        int r;
+       struct queue_limits limits;
        enum dm_queue_mode type = dm_get_md_type(md);
 
        switch (type) {
@@ -2167,6 +2176,14 @@ int dm_setup_md_queue(struct mapped_device *md, struct dm_table *t)
                break;
        }
 
+       r = dm_calculate_queue_limits(t, &limits);
+       if (r) {
+               DMERR("Cannot calculate initial queue limits");
+               return r;
+       }
+       dm_table_set_restrictions(t, md->queue, &limits);
+       blk_register_queue(md->disk);
+
        return 0;
 }