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

Commit 1c05cf90 authored by Logan Gunthorpe's avatar Logan Gunthorpe Committed by Christoph Hellwig
Browse files

nvmet: convert from kmap to nvmet_copy_from_sgl

This is safer as it doesn't rely on the data being stored in
a single page in an sgl.

It also aids our effort to start phasing out users of sg_page. See [1].

For this we kmalloc some memory, copy to it and free at the end. Note:
we can't allocate this memory on the stack as the kbuild test robot
reports some frame size overflows on i386.

[1] https://lwn.net/Articles/720053/



Signed-off-by: default avatarLogan Gunthorpe <logang@deltatee.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarMax Gurtovoy <maxg@mellanox.com>
Signed-off-by: default avatarSagi Grimberg <sagi@grimberg.me>
parent f9f38e33
Loading
Loading
Loading
Loading
+25 −7
Original line number Diff line number Diff line
@@ -122,7 +122,15 @@ static void nvmet_execute_admin_connect(struct nvmet_req *req)
	struct nvmet_ctrl *ctrl = NULL;
	u16 status = 0;

	d = kmap(sg_page(req->sg)) + req->sg->offset;
	d = kmalloc(sizeof(*d), GFP_KERNEL);
	if (!d) {
		status = NVME_SC_INTERNAL;
		goto complete;
	}

	status = nvmet_copy_from_sgl(req, 0, d, sizeof(*d));
	if (status)
		goto out;

	/* zero out initial completion result, assign values as needed */
	req->rsp->result.u32 = 0;
@@ -158,7 +166,8 @@ static void nvmet_execute_admin_connect(struct nvmet_req *req)
	req->rsp->result.u16 = cpu_to_le16(ctrl->cntlid);

out:
	kunmap(sg_page(req->sg));
	kfree(d);
complete:
	nvmet_req_complete(req, status);
}

@@ -170,7 +179,15 @@ static void nvmet_execute_io_connect(struct nvmet_req *req)
	u16 qid = le16_to_cpu(c->qid);
	u16 status = 0;

	d = kmap(sg_page(req->sg)) + req->sg->offset;
	d = kmalloc(sizeof(*d), GFP_KERNEL);
	if (!d) {
		status = NVME_SC_INTERNAL;
		goto complete;
	}

	status = nvmet_copy_from_sgl(req, 0, d, sizeof(*d));
	if (status)
		goto out;

	/* zero out initial completion result, assign values as needed */
	req->rsp->result.u32 = 0;
@@ -205,7 +222,8 @@ static void nvmet_execute_io_connect(struct nvmet_req *req)
	pr_info("adding queue %d to ctrl %d.\n", qid, ctrl->cntlid);

out:
	kunmap(sg_page(req->sg));
	kfree(d);
complete:
	nvmet_req_complete(req, status);
	return;