dm table: add flag to allow target to handle its own integrity metadata
authorMilan Broz <gmazyland@gmail.com>
Wed, 4 Jan 2017 19:23:51 +0000 (20:23 +0100)
committerMike Snitzer <snitzer@redhat.com>
Tue, 7 Mar 2017 18:28:32 +0000 (13:28 -0500)
Add DM_TARGET_INTEGRITY flag that specifies bio integrity metadata is
not inherited but implemented in the target itself.

Signed-off-by: Milan Broz <gmazyland@gmail.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
drivers/md/dm-table.c
include/linux/device-mapper.h

index 3ad16d9c9d5aae956afc7b3c7ab820b4f52de4ed..b0600840e734a7ba3d7e184c968cb9e8bb78457d 100644 (file)
@@ -47,6 +47,7 @@ struct dm_table {
        bool integrity_supported:1;
        bool singleton:1;
        bool all_blk_mq:1;
+       unsigned integrity_added:1;
 
        /*
         * Indicates the rw permissions for the new logical
@@ -725,6 +726,9 @@ int dm_table_add_target(struct dm_table *t, const char *type,
                t->immutable_target_type = tgt->type;
        }
 
+       if (dm_target_has_integrity(tgt->type))
+               t->integrity_added = 1;
+
        tgt->table = t;
        tgt->begin = start;
        tgt->len = len;
@@ -1168,6 +1172,10 @@ static int dm_table_register_integrity(struct dm_table *t)
        struct mapped_device *md = t->md;
        struct gendisk *template_disk = NULL;
 
+       /* If target handles integrity itself do not register it here. */
+       if (t->integrity_added)
+               return 0;
+
        template_disk = dm_table_get_integrity_disk(t);
        if (!template_disk)
                return 0;
@@ -1394,6 +1402,9 @@ static void dm_table_verify_integrity(struct dm_table *t)
 {
        struct gendisk *template_disk = NULL;
 
+       if (t->integrity_added)
+               return;
+
        if (t->integrity_supported) {
                /*
                 * Verify that the original integrity profile
index a7e6903866fdc98689bb5189cffd4b8cb7a715fa..874462153f143ecc09c85b0f48b69013fcc1e777 100644 (file)
@@ -221,6 +221,12 @@ struct target_type {
  */
 typedef unsigned (*dm_num_write_bios_fn) (struct dm_target *ti, struct bio *bio);
 
+/*
+ * A target implements own bio data integrity.
+ */
+#define DM_TARGET_INTEGRITY            0x00000010
+#define dm_target_has_integrity(type)  ((type)->features & DM_TARGET_INTEGRITY)
+
 struct dm_target {
        struct dm_table *table;
        struct target_type *type;