Commit 9b4b5a79 authored by Milan Broz's avatar Milan Broz Committed by Mike Snitzer

dm table: add flag to allow target to handle its own integrity metadata

Add DM_TARGET_INTEGRITY flag that specifies bio integrity metadata is
not inherited but implemented in the target itself.
Signed-off-by: default avatarMilan Broz <gmazyland@gmail.com>
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
parent b29d4986
...@@ -47,6 +47,7 @@ struct dm_table { ...@@ -47,6 +47,7 @@ struct dm_table {
bool integrity_supported:1; bool integrity_supported:1;
bool singleton:1; bool singleton:1;
bool all_blk_mq:1; bool all_blk_mq:1;
unsigned integrity_added:1;
/* /*
* Indicates the rw permissions for the new logical * Indicates the rw permissions for the new logical
...@@ -725,6 +726,9 @@ int dm_table_add_target(struct dm_table *t, const char *type, ...@@ -725,6 +726,9 @@ int dm_table_add_target(struct dm_table *t, const char *type,
t->immutable_target_type = tgt->type; t->immutable_target_type = tgt->type;
} }
if (dm_target_has_integrity(tgt->type))
t->integrity_added = 1;
tgt->table = t; tgt->table = t;
tgt->begin = start; tgt->begin = start;
tgt->len = len; tgt->len = len;
...@@ -1168,6 +1172,10 @@ static int dm_table_register_integrity(struct dm_table *t) ...@@ -1168,6 +1172,10 @@ static int dm_table_register_integrity(struct dm_table *t)
struct mapped_device *md = t->md; struct mapped_device *md = t->md;
struct gendisk *template_disk = NULL; 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); template_disk = dm_table_get_integrity_disk(t);
if (!template_disk) if (!template_disk)
return 0; return 0;
...@@ -1394,6 +1402,9 @@ static void dm_table_verify_integrity(struct dm_table *t) ...@@ -1394,6 +1402,9 @@ static void dm_table_verify_integrity(struct dm_table *t)
{ {
struct gendisk *template_disk = NULL; struct gendisk *template_disk = NULL;
if (t->integrity_added)
return;
if (t->integrity_supported) { if (t->integrity_supported) {
/* /*
* Verify that the original integrity profile * Verify that the original integrity profile
......
...@@ -221,6 +221,12 @@ struct target_type { ...@@ -221,6 +221,12 @@ struct target_type {
*/ */
typedef unsigned (*dm_num_write_bios_fn) (struct dm_target *ti, struct bio *bio); 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_target {
struct dm_table *table; struct dm_table *table;
struct target_type *type; struct target_type *type;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment