Message ID | 1465281416-28355-8-git-send-email-nab@linux-iscsi.org (mailing list archive) |
---|---|
State | Not Applicable, archived |
Headers | show |
FYI: NVMf requires metadata to be interleaved in the data, and you need to indicate that in the Identify data. Note that this is only a requirement for the on the wire format and for the way the Namespaces are exposed at the protocol level as RDMA HCA and FB HBAs should still be able to handle our separate SGL. -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thu, 2016-06-09 at 15:52 +0200, Christoph Hellwig wrote: > FYI: NVMf requires metadata to be interleaved in the data, and you > need to indicate that in the Identify data. Note that this is only > a requirement for the on the wire format and for the way the Namespaces are > exposed at the protocol level as RDMA HCA and FB HBAs should still > be able to handle our separate SGL. Btw, nvmet needs something similar for controller creation, like how target_port_op works with target_alloc_session(), so hw capabilities can signal to host controllers when PI should be enabled for a namespace, but actual namespace backends don't support it. Eg: TARGET_PROT_DOUT_STRIP and TARGET_PROT_DIN_INSERT ops -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/nvme/target/admin-cmd.c b/drivers/nvme/target/admin-cmd.c index 240e323..3a808dc 100644 --- a/drivers/nvme/target/admin-cmd.c +++ b/drivers/nvme/target/admin-cmd.c @@ -200,6 +200,7 @@ static void nvmet_execute_identify_ns(struct nvmet_req *req) { struct nvmet_ns *ns; struct nvme_id_ns *id; + struct se_device *dev; u16 status = 0; ns = nvmet_find_namespace(req->sq->ctrl, req->cmd->identify.nsid); @@ -228,6 +229,22 @@ static void nvmet_execute_identify_ns(struct nvmet_req *req) id->nlbaf = 0; id->flbas = 0; + /* Populate bits for T10-PI from se_device backend */ + rcu_read_lock(); + dev = rcu_dereference(ns->dev); + if (dev && dev->dev_attrib.pi_prot_type) { + int pi_prot_type = dev->dev_attrib.pi_prot_type; + + id->lbaf[0].ms = cpu_to_le16(sizeof(struct t10_pi_tuple)); + printk("nvmet_set_id_ns: ms: %u\n", id->lbaf[0].ms); + + if (pi_prot_type == 1) + id->dps = NVME_NS_DPC_PI_TYPE1; + else if (pi_prot_type == 3) + id->dps = NVME_NS_DPC_PI_TYPE3; + } + rcu_read_unlock(); + /* * Our namespace might always be shared. Not just with other * controllers, but also with any other user of the block device.