@@ -50,6 +50,9 @@ void nvmet_bdev_set_limits(struct block_device *bdev, struct nvme_id_ns *id)
int nvmet_bdev_ns_enable(struct nvmet_ns *ns)
{
int ret;
+#ifdef CONFIG_BLK_DEV_INTEGRITY
+ struct blk_integrity *bi;
+#endif
ns->bdev = blkdev_get_by_path(ns->device_path,
FMODE_READ | FMODE_WRITE, NULL);
@@ -64,6 +67,25 @@ int nvmet_bdev_ns_enable(struct nvmet_ns *ns)
}
ns->size = i_size_read(ns->bdev->bd_inode);
ns->blksize_shift = blksize_bits(bdev_logical_block_size(ns->bdev));
+
+ ns->prot_type = 0;
+ ns->ms = 0;
+#ifdef CONFIG_BLK_DEV_INTEGRITY
+ bi = bdev_get_integrity(ns->bdev);
+ if (bi) {
+ ns->ms = bi->tuple_size;
+ if (bi->profile == &t10_pi_type1_crc)
+ ns->prot_type = NVME_NS_DPS_PI_TYPE1;
+ else if (bi->profile == &t10_pi_type3_crc)
+ ns->prot_type = NVME_NS_DPS_PI_TYPE3;
+ else
+ /* Unsupported metadata type */
+ ns->ms = 0;
+ }
+
+ pr_debug("ms %d pi_type %d\n", ns->ms, ns->prot_type);
+#endif
+
return 0;
}
@@ -19,6 +19,7 @@
#include <linux/rcupdate.h>
#include <linux/blkdev.h>
#include <linux/radix-tree.h>
+#include <linux/t10-pi.h>
#define NVMET_ASYNC_EVENTS 4
#define NVMET_ERROR_LOG_SLOTS 128
@@ -77,6 +78,8 @@ struct nvmet_ns {
int use_p2pmem;
struct pci_dev *p2p_dev;
+ int prot_type;
+ int ms;
};
static inline struct nvmet_ns *to_nvmet_ns(struct config_item *item)