diff options
Diffstat (limited to 'drivers/md/dm-ioctl.c')
| -rw-r--r-- | drivers/md/dm-ioctl.c | 21 | 
1 files changed, 21 insertions, 0 deletions
diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c index f01096549a9..823ceba6efa 100644 --- a/drivers/md/dm-ioctl.c +++ b/drivers/md/dm-ioctl.c @@ -1047,6 +1047,19 @@ static int populate_table(struct dm_table *table,  	return dm_table_complete(table);  } +static int table_prealloc_integrity(struct dm_table *t, +				    struct mapped_device *md) +{ +	struct list_head *devices = dm_table_get_devices(t); +	struct dm_dev_internal *dd; + +	list_for_each_entry(dd, devices, list) +		if (bdev_get_integrity(dd->dm_dev.bdev)) +			return blk_integrity_register(dm_disk(md), NULL); + +	return 0; +} +  static int table_load(struct dm_ioctl *param, size_t param_size)  {  	int r; @@ -1068,6 +1081,14 @@ static int table_load(struct dm_ioctl *param, size_t param_size)  		goto out;  	} +	r = table_prealloc_integrity(t, md); +	if (r) { +		DMERR("%s: could not register integrity profile.", +		      dm_device_name(md)); +		dm_table_destroy(t); +		goto out; +	} +  	down_write(&_hash_lock);  	hc = dm_get_mdptr(md);  	if (!hc || hc->md != md) {  |