Commit 08d33390 authored by Jens Axboe's avatar Jens Axboe
Browse files

Merge tag 'nvme-6.18-2025-10-30' of git://git.infradead.org/nvme into block-6.18

Pull NVMe fixes from Keith:

"- Target side authentication fixup (Hannes)
 - Peer-to-peer metadata fixup (Keith)"

* tag 'nvme-6.18-2025-10-30' of git://git.infradead.org/nvme:
  nvme-pci: use blk_map_iter for p2p metadata
  nvmet-auth: update sc_c in host response
parents 0b39ca45 0194b65a
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -1042,7 +1042,7 @@ static blk_status_t nvme_map_data(struct request *req)
	return nvme_pci_setup_data_prp(req, &iter);
}

static blk_status_t nvme_pci_setup_meta_sgls(struct request *req)
static blk_status_t nvme_pci_setup_meta_iter(struct request *req)
{
	struct nvme_queue *nvmeq = req->mq_hctx->driver_data;
	unsigned int entries = req->nr_integrity_segments;
@@ -1072,8 +1072,12 @@ static blk_status_t nvme_pci_setup_meta_sgls(struct request *req)
	 * descriptor provides an explicit length, so we're relying on that
	 * mechanism to catch any misunderstandings between the application and
	 * device.
	 *
	 * P2P DMA also needs to use the blk_dma_iter method, so mptr setup
	 * leverages this routine when that happens.
	 */
	if (entries == 1 && !(nvme_req(req)->flags & NVME_REQ_USERCMD)) {
	if (!nvme_ctrl_meta_sgl_supported(&dev->ctrl) ||
	    (entries == 1 && !(nvme_req(req)->flags & NVME_REQ_USERCMD))) {
		iod->cmd.common.metadata = cpu_to_le64(iter.addr);
		iod->meta_total_len = iter.len;
		iod->meta_dma = iter.addr;
@@ -1114,6 +1118,9 @@ static blk_status_t nvme_pci_setup_meta_mptr(struct request *req)
	struct nvme_queue *nvmeq = req->mq_hctx->driver_data;
	struct bio_vec bv = rq_integrity_vec(req);

	if (is_pci_p2pdma_page(bv.bv_page))
		return nvme_pci_setup_meta_iter(req);

	iod->meta_dma = dma_map_bvec(nvmeq->dev->dev, &bv, rq_dma_dir(req), 0);
	if (dma_mapping_error(nvmeq->dev->dev, iod->meta_dma))
		return BLK_STS_IOERR;
@@ -1128,7 +1135,7 @@ static blk_status_t nvme_map_metadata(struct request *req)

	if ((iod->cmd.common.flags & NVME_CMD_SGL_METABUF) &&
	    nvme_pci_metadata_use_sgls(req))
		return nvme_pci_setup_meta_sgls(req);
		return nvme_pci_setup_meta_iter(req);
	return nvme_pci_setup_meta_mptr(req);
}

+3 −2
Original line number Diff line number Diff line
@@ -298,7 +298,7 @@ int nvmet_auth_host_hash(struct nvmet_req *req, u8 *response,
	const char *hash_name;
	u8 *challenge = req->sq->dhchap_c1;
	struct nvme_dhchap_key *transformed_key;
	u8 buf[4];
	u8 buf[4], sc_c = ctrl->concat ? 1 : 0;
	int ret;

	hash_name = nvme_auth_hmac_name(ctrl->shash_id);
@@ -367,13 +367,14 @@ int nvmet_auth_host_hash(struct nvmet_req *req, u8 *response,
	ret = crypto_shash_update(shash, buf, 2);
	if (ret)
		goto out;
	memset(buf, 0, 4);
	*buf = sc_c;
	ret = crypto_shash_update(shash, buf, 1);
	if (ret)
		goto out;
	ret = crypto_shash_update(shash, "HostHost", 8);
	if (ret)
		goto out;
	memset(buf, 0, 4);
	ret = crypto_shash_update(shash, ctrl->hostnqn, strlen(ctrl->hostnqn));
	if (ret)
		goto out;