Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0f8087ec authored by Martin K. Petersen's avatar Martin K. Petersen Committed by Jens Axboe
Browse files

block: Consolidate static integrity profile properties



We previously made a complete copy of a device's data integrity profile
even though several of the fields inside the blk_integrity struct are
pointers to fixed template entries in t10-pi.c.

Split the static and per-device portions so that we can reference the
template directly.

Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Reported-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarSagi Grimberg <sagig@mellanox.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent aff34e19
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -177,11 +177,11 @@ bool bio_integrity_enabled(struct bio *bio)
	if (bi == NULL)
		return false;

	if (bio_data_dir(bio) == READ && bi->verify_fn != NULL &&
	if (bio_data_dir(bio) == READ && bi->profile->verify_fn != NULL &&
	    (bi->flags & BLK_INTEGRITY_VERIFY))
		return true;

	if (bio_data_dir(bio) == WRITE && bi->generate_fn != NULL &&
	if (bio_data_dir(bio) == WRITE && bi->profile->generate_fn != NULL &&
	    (bi->flags & BLK_INTEGRITY_GENERATE))
		return true;

@@ -340,7 +340,7 @@ int bio_integrity_prep(struct bio *bio)

	/* Auto-generate integrity metadata if this is a write */
	if (bio_data_dir(bio) == WRITE)
		bio_integrity_process(bio, bi->generate_fn);
		bio_integrity_process(bio, bi->profile->generate_fn);

	return 0;
}
@@ -361,7 +361,7 @@ static void bio_integrity_verify_fn(struct work_struct *work)
	struct bio *bio = bip->bip_bio;
	struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);

	bio->bi_error = bio_integrity_process(bio, bi->verify_fn);
	bio->bi_error = bio_integrity_process(bio, bi->profile->verify_fn);

	/* Restore original bio completion handler */
	bio->bi_end_io = bip->bip_end_io;
+8 −9
Original line number Diff line number Diff line
@@ -176,10 +176,10 @@ int blk_integrity_compare(struct gendisk *gd1, struct gendisk *gd2)
		return -1;
	}

	if (strcmp(b1->name, b2->name)) {
	if (b1->profile != b2->profile) {
		printk(KERN_ERR "%s: %s/%s type %s != %s\n", __func__,
		       gd1->disk_name, gd2->disk_name,
		       b1->name, b2->name);
		       b1->profile->name, b2->profile->name);
		return -1;
	}

@@ -275,8 +275,8 @@ static ssize_t integrity_attr_store(struct kobject *kobj,

static ssize_t integrity_format_show(struct blk_integrity *bi, char *page)
{
	if (bi != NULL && bi->name != NULL)
		return sprintf(page, "%s\n", bi->name);
	if (bi != NULL && bi->profile->name != NULL)
		return sprintf(page, "%s\n", bi->profile->name);
	else
		return sprintf(page, "none\n");
}
@@ -401,7 +401,8 @@ bool blk_integrity_is_initialized(struct gendisk *disk)
{
	struct blk_integrity *bi = blk_get_integrity(disk);

	return (bi && bi->name && strcmp(bi->name, bi_unsupported_name) != 0);
	return (bi && bi->profile->name && strcmp(bi->profile->name,
						  bi_unsupported_name) != 0);
}
EXPORT_SYMBOL(blk_integrity_is_initialized);

@@ -446,14 +447,12 @@ int blk_integrity_register(struct gendisk *disk, struct blk_integrity *template)

	/* Use the provided profile as template */
	if (template != NULL) {
		bi->name = template->name;
		bi->generate_fn = template->generate_fn;
		bi->verify_fn = template->verify_fn;
		bi->profile = template->profile;
		bi->tuple_size = template->tuple_size;
		bi->tag_size = template->tag_size;
		bi->flags |= template->flags;
	} else
		bi->name = bi_unsupported_name;
		bi->profile->name = bi_unsupported_name;

	disk->queue->backing_dev_info.capabilities |= BDI_CAP_STABLE_WRITES;

+4 −12
Original line number Diff line number Diff line
@@ -160,38 +160,30 @@ static int t10_pi_type3_verify_ip(struct blk_integrity_iter *iter)
	return t10_pi_verify(iter, t10_pi_ip_fn, 3);
}

struct blk_integrity t10_pi_type1_crc = {
struct blk_integrity_profile t10_pi_type1_crc = {
	.name			= "T10-DIF-TYPE1-CRC",
	.generate_fn		= t10_pi_type1_generate_crc,
	.verify_fn		= t10_pi_type1_verify_crc,
	.tuple_size		= sizeof(struct t10_pi_tuple),
	.tag_size		= 0,
};
EXPORT_SYMBOL(t10_pi_type1_crc);

struct blk_integrity t10_pi_type1_ip = {
struct blk_integrity_profile t10_pi_type1_ip = {
	.name			= "T10-DIF-TYPE1-IP",
	.generate_fn		= t10_pi_type1_generate_ip,
	.verify_fn		= t10_pi_type1_verify_ip,
	.tuple_size		= sizeof(struct t10_pi_tuple),
	.tag_size		= 0,
};
EXPORT_SYMBOL(t10_pi_type1_ip);

struct blk_integrity t10_pi_type3_crc = {
struct blk_integrity_profile t10_pi_type3_crc = {
	.name			= "T10-DIF-TYPE3-CRC",
	.generate_fn		= t10_pi_type3_generate_crc,
	.verify_fn		= t10_pi_type3_verify_crc,
	.tuple_size		= sizeof(struct t10_pi_tuple),
	.tag_size		= 0,
};
EXPORT_SYMBOL(t10_pi_type3_crc);

struct blk_integrity t10_pi_type3_ip = {
struct blk_integrity_profile t10_pi_type3_ip = {
	.name			= "T10-DIF-TYPE3-IP",
	.generate_fn		= t10_pi_type3_generate_ip,
	.verify_fn		= t10_pi_type3_verify_ip,
	.tuple_size		= sizeof(struct t10_pi_tuple),
	.tag_size		= 0,
};
EXPORT_SYMBOL(t10_pi_type3_ip);
+7 −4
Original line number Diff line number Diff line
@@ -399,19 +399,22 @@ static int nd_pi_nop_generate_verify(struct blk_integrity_iter *iter)

int nd_integrity_init(struct gendisk *disk, unsigned long meta_size)
{
	struct blk_integrity integrity = {
	struct blk_integrity bi;
	static struct blk_integrity_profile profile = {
		.name = "ND-PI-NOP",
		.generate_fn = nd_pi_nop_generate_verify,
		.verify_fn = nd_pi_nop_generate_verify,
		.tuple_size = meta_size,
		.tag_size = meta_size,
	};
	int ret;

	if (meta_size == 0)
		return 0;

	ret = blk_integrity_register(disk, &integrity);
	bi.profile = &profile;
	bi.tuple_size = meta_size;
	bi.tag_size = meta_size;

	ret = blk_integrity_register(disk, &bi);
	if (ret)
		return ret;

+4 −4
Original line number Diff line number Diff line
@@ -558,7 +558,7 @@ static int nvme_noop_generate(struct blk_integrity_iter *iter)
	return 0;
}

struct blk_integrity nvme_meta_noop = {
struct blk_integrity_profile nvme_meta_noop = {
	.name			= "NVME_META_NOOP",
	.generate_fn		= nvme_noop_generate,
	.verify_fn		= nvme_noop_verify,
@@ -570,14 +570,14 @@ static void nvme_init_integrity(struct nvme_ns *ns)

	switch (ns->pi_type) {
	case NVME_NS_DPS_PI_TYPE3:
		integrity = t10_pi_type3_crc;
		integrity.profile = &t10_pi_type3_crc;
		break;
	case NVME_NS_DPS_PI_TYPE1:
	case NVME_NS_DPS_PI_TYPE2:
		integrity = t10_pi_type1_crc;
		integrity.profile = &t10_pi_type1_crc;
		break;
	default:
		integrity = nvme_meta_noop;
		integrity.profile = &nvme_meta_noop;
		break;
	}
	integrity.tuple_size = ns->ms;
Loading