@@ -55,6 +55,7 @@ struct dm_table {
struct dm_target *targets;
unsigned discards_supported:1;
+ unsigned integrity_supported:1;
/*
* Indicates the rw permissions for the new logical
@@ -859,7 +860,11 @@ int dm_table_alloc_md_mempools(struct dm_table *t)
return -EINVAL;
}
- t->mempools = dm_alloc_md_mempools(type);
+ if (t->integrity_supported)
+ t->mempools = dm_alloc_md_mempools(type, 0);
+ else
+ t->mempools = dm_alloc_md_mempools(type, BIOSET_NO_INTEGRITY);
+
if (!t->mempools)
return -ENOMEM;
@@ -935,8 +940,10 @@ static int dm_table_prealloc_integrity(struct dm_table *t, struct mapped_device
struct dm_dev_internal *dd;
list_for_each_entry(dd, devices, list)
- if (bdev_get_integrity(dd->dm_dev.bdev))
+ if (bdev_get_integrity(dd->dm_dev.bdev)) {
+ t->integrity_supported = 1;
return blk_integrity_register(dm_disk(md), NULL);
+ }
return 0;
}
@@ -2643,7 +2643,7 @@ int dm_noflush_suspending(struct dm_target *ti)
}
EXPORT_SYMBOL_GPL(dm_noflush_suspending);
-struct dm_md_mempools *dm_alloc_md_mempools(unsigned type)
+struct dm_md_mempools *dm_alloc_md_mempools(unsigned type, unsigned int flags)
{
struct dm_md_mempools *pools = kmalloc(sizeof(*pools), GFP_KERNEL);
@@ -2663,7 +2663,8 @@ struct dm_md_mempools *dm_alloc_md_mempools(unsigned type)
goto free_io_pool_and_out;
pools->bs = (type == DM_TYPE_BIO_BASED) ?
- bioset_create(16, 0) : bioset_create(MIN_IOS, 0);
+ bioset_create_flags(16, 0, flags) :
+ bioset_create_flags(MIN_IOS, 0, flags);
if (!pools->bs)
goto free_tio_pool_and_out;
@@ -149,7 +149,7 @@ void dm_kcopyd_exit(void);
/*
* Mempool operations
*/
-struct dm_md_mempools *dm_alloc_md_mempools(unsigned type);
+struct dm_md_mempools *dm_alloc_md_mempools(unsigned type, unsigned int);
void dm_free_md_mempools(struct dm_md_mempools *pools);
#endif
@@ -1603,9 +1603,10 @@ void bioset_free(struct bio_set *bs)
EXPORT_SYMBOL(bioset_free);
/**
- * bioset_create - Create a bio_set
+ * bioset_create_flags - Create a bio_set
* @pool_size: Number of bio and bio_vecs to cache in the mempool
* @front_pad: Number of bytes to allocate in front of the returned bio
+ * @flags: Flags that affect memory allocation
*
* Description:
* Set up a bio_set to be used with @bio_alloc_bioset. Allows the caller
@@ -1615,7 +1616,8 @@ EXPORT_SYMBOL(bioset_free);
* Note that the bio must be embedded at the END of that structure always,
* or things will break badly.
*/
-struct bio_set *bioset_create(unsigned int pool_size, unsigned int front_pad)
+struct bio_set *bioset_create_flags(unsigned int pool_size,
+ unsigned int front_pad, unsigned int flags)
{
unsigned int back_pad = BIO_INLINE_VECS * sizeof(struct bio_vec);
struct bio_set *bs;
@@ -1636,7 +1638,8 @@ struct bio_set *bioset_create(unsigned int pool_size, unsigned int front_pad)
if (!bs->bio_pool)
goto bad;
- if (bioset_integrity_create(bs, pool_size))
+ if ((flags & BIOSET_NO_INTEGRITY) == 0 &&
+ bioset_integrity_create(bs, pool_size))
goto bad;
if (!biovec_create_pools(bs, pool_size))
@@ -1646,6 +1649,12 @@ bad:
bioset_free(bs);
return NULL;
}
+EXPORT_SYMBOL(bioset_create_flags);
+
+struct bio_set *bioset_create(unsigned int pool_size, unsigned int front_pad)
+{
+ return bioset_create_flags(pool_size, front_pad, 0);
+}
EXPORT_SYMBOL(bioset_create);
static void __init biovec_init_slabs(void)
@@ -208,7 +208,12 @@ struct bio_pair {
extern struct bio_pair *bio_split(struct bio *bi, int first_sectors);
extern void bio_pair_release(struct bio_pair *dbio);
+enum bioset_flags {
+ BIOSET_NO_INTEGRITY = (1 << 0),
+};
+
extern struct bio_set *bioset_create(unsigned int, unsigned int);
+extern struct bio_set *bioset_create_flags(unsigned int, unsigned int, unsigned int);
extern void bioset_free(struct bio_set *);
extern struct bio *bio_alloc(gfp_t, int);