Merge tag 'libnvdimm-for-5.15' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdim...
[linux-2.6-microblaze.git] / drivers / md / dm.c
index 4657143..a011d09 100644 (file)
@@ -8,6 +8,7 @@
 #include "dm-core.h"
 #include "dm-rq.h"
 #include "dm-uevent.h"
+#include "dm-ima.h"
 
 #include <linux/init.h>
 #include <linux/module.h>
@@ -261,9 +262,13 @@ static void (*_exits[])(void) = {
 static int __init dm_init(void)
 {
        const int count = ARRAY_SIZE(_inits);
-
        int r, i;
 
+#if (IS_ENABLED(CONFIG_IMA) && !IS_ENABLED(CONFIG_IMA_DISABLE_HTABLE))
+       DMWARN("CONFIG_IMA_DISABLE_HTABLE is disabled."
+              " Duplicate IMA measurements will not be recorded in the IMA log.");
+#endif
+
        for (i = 0; i < count; i++) {
                r = _inits[i]();
                if (r)
@@ -271,8 +276,7 @@ static int __init dm_init(void)
        }
 
        return 0;
-
-      bad:
+bad:
        while (i--)
                _exits[i]();
 
@@ -1693,14 +1697,13 @@ static void cleanup_mapped_device(struct mapped_device *md)
                spin_lock(&_minor_lock);
                md->disk->private_data = NULL;
                spin_unlock(&_minor_lock);
-               del_gendisk(md->disk);
-       }
-
-       if (md->queue)
+               if (dm_get_md_type(md) != DM_TYPE_NONE) {
+                       dm_sysfs_exit(md);
+                       del_gendisk(md->disk);
+               }
                dm_queue_destroy_keyslot_manager(md->queue);
-
-       if (md->disk)
                blk_cleanup_disk(md->disk);
+       }
 
        cleanup_srcu_struct(&md->io_barrier);
 
@@ -1792,7 +1795,6 @@ static struct mapped_device *alloc_dev(int minor)
                        goto bad;
        }
 
-       add_disk_no_queue_reg(md->disk);
        format_dev_t(md->name, MKDEV(_major, minor));
 
        md->wq = alloc_workqueue("kdmflush", WQ_MEM_RECLAIM, 0);
@@ -1993,18 +1995,13 @@ static struct dm_table *__unbind(struct mapped_device *md)
  */
 int dm_create(int minor, struct mapped_device **result)
 {
-       int r;
        struct mapped_device *md;
 
        md = alloc_dev(minor);
        if (!md)
                return -ENXIO;
 
-       r = dm_sysfs_init(md);
-       if (r) {
-               free_dev(md);
-               return r;
-       }
+       dm_ima_reset_data(md);
 
        *result = md;
        return 0;
@@ -2056,9 +2053,9 @@ EXPORT_SYMBOL_GPL(dm_get_queue_limits);
  */
 int dm_setup_md_queue(struct mapped_device *md, struct dm_table *t)
 {
-       int r;
+       enum dm_queue_mode type = dm_table_get_type(t);
        struct queue_limits limits;
-       enum dm_queue_mode type = dm_get_md_type(md);
+       int r;
 
        switch (type) {
        case DM_TYPE_REQUEST_BASED:
@@ -2086,8 +2083,14 @@ int dm_setup_md_queue(struct mapped_device *md, struct dm_table *t)
        if (r)
                return r;
 
-       blk_register_queue(md->disk);
+       add_disk(md->disk);
 
+       r = dm_sysfs_init(md);
+       if (r) {
+               del_gendisk(md->disk);
+               return r;
+       }
+       md->type = type;
        return 0;
 }
 
@@ -2193,7 +2196,6 @@ static void __dm_destroy(struct mapped_device *md, bool wait)
                DMWARN("%s: Forcibly removing mapped_device still in use! (%d users)",
                       dm_device_name(md), atomic_read(&md->holders));
 
-       dm_sysfs_exit(md);
        dm_table_destroy(__unbind(md));
        free_dev(md);
 }