Lines Matching refs:req
33 static u16 nvmet_passthru_override_id_ctrl(struct nvmet_req *req) in nvmet_passthru_override_id_ctrl() argument
35 struct nvmet_ctrl *ctrl = req->sq->ctrl; in nvmet_passthru_override_id_ctrl()
46 status = nvmet_copy_from_sgl(req, 0, id, sizeof(*id)); in nvmet_passthru_override_id_ctrl()
96 if (req->port->inline_data_size) in nvmet_passthru_override_id_ctrl()
110 req->port->inline_data_size) / 16); in nvmet_passthru_override_id_ctrl()
121 status = nvmet_copy_to_sgl(req, 0, id, sizeof(struct nvme_id_ctrl)); in nvmet_passthru_override_id_ctrl()
128 static u16 nvmet_passthru_override_id_ns(struct nvmet_req *req) in nvmet_passthru_override_id_ns() argument
138 status = nvmet_copy_from_sgl(req, 0, id, sizeof(struct nvme_id_ns)); in nvmet_passthru_override_id_ns()
155 status = nvmet_copy_to_sgl(req, 0, id, sizeof(*id)); in nvmet_passthru_override_id_ns()
164 struct nvmet_req *req = container_of(w, struct nvmet_req, p.work); in nvmet_passthru_execute_cmd_work() local
165 struct request *rq = req->p.rq; in nvmet_passthru_execute_cmd_work()
171 req->cmd->common.opcode == nvme_admin_identify) { in nvmet_passthru_execute_cmd_work()
172 switch (req->cmd->identify.cns) { in nvmet_passthru_execute_cmd_work()
174 nvmet_passthru_override_id_ctrl(req); in nvmet_passthru_execute_cmd_work()
177 nvmet_passthru_override_id_ns(req); in nvmet_passthru_execute_cmd_work()
183 req->cqe->result = nvme_req(rq)->result; in nvmet_passthru_execute_cmd_work()
184 nvmet_req_complete(req, status); in nvmet_passthru_execute_cmd_work()
191 struct nvmet_req *req = rq->end_io_data; in nvmet_passthru_req_done() local
193 req->cqe->result = nvme_req(rq)->result; in nvmet_passthru_req_done()
194 nvmet_req_complete(req, nvme_req(rq)->status); in nvmet_passthru_req_done()
198 static int nvmet_passthru_map_sg(struct nvmet_req *req, struct request *rq) in nvmet_passthru_map_sg() argument
204 if (req->sg_cnt > BIO_MAX_VECS) in nvmet_passthru_map_sg()
207 if (nvmet_use_inline_bvec(req)) { in nvmet_passthru_map_sg()
208 bio = &req->p.inline_bio; in nvmet_passthru_map_sg()
209 bio_init(bio, req->inline_bvec, ARRAY_SIZE(req->inline_bvec)); in nvmet_passthru_map_sg()
211 bio = bio_alloc(GFP_KERNEL, bio_max_segs(req->sg_cnt)); in nvmet_passthru_map_sg()
216 for_each_sg(req->sg, sg, req->sg_cnt, i) { in nvmet_passthru_map_sg()
219 nvmet_req_bio_put(req, bio); in nvmet_passthru_map_sg()
224 blk_rq_bio_prep(rq, bio, req->sg_cnt); in nvmet_passthru_map_sg()
229 static void nvmet_passthru_execute_cmd(struct nvmet_req *req) in nvmet_passthru_execute_cmd() argument
231 struct nvme_ctrl *ctrl = nvmet_req_subsys(req)->passthru_ctrl; in nvmet_passthru_execute_cmd()
240 if (likely(req->sq->qid != 0)) { in nvmet_passthru_execute_cmd()
241 u32 nsid = le32_to_cpu(req->cmd->common.nsid); in nvmet_passthru_execute_cmd()
251 timeout = nvmet_req_subsys(req)->io_timeout; in nvmet_passthru_execute_cmd()
253 timeout = nvmet_req_subsys(req)->admin_timeout; in nvmet_passthru_execute_cmd()
256 rq = nvme_alloc_request(q, req->cmd, 0); in nvmet_passthru_execute_cmd()
265 if (req->sg_cnt) { in nvmet_passthru_execute_cmd()
266 ret = nvmet_passthru_map_sg(req, rq); in nvmet_passthru_execute_cmd()
280 effects = nvme_command_effects(ctrl, ns, req->cmd->common.opcode); in nvmet_passthru_execute_cmd()
281 if (req->p.use_workqueue || effects) { in nvmet_passthru_execute_cmd()
282 INIT_WORK(&req->p.work, nvmet_passthru_execute_cmd_work); in nvmet_passthru_execute_cmd()
283 req->p.rq = rq; in nvmet_passthru_execute_cmd()
284 schedule_work(&req->p.work); in nvmet_passthru_execute_cmd()
286 rq->end_io_data = req; in nvmet_passthru_execute_cmd()
302 nvmet_req_complete(req, status); in nvmet_passthru_execute_cmd()
310 static void nvmet_passthru_set_host_behaviour(struct nvmet_req *req) in nvmet_passthru_set_host_behaviour() argument
312 struct nvme_ctrl *ctrl = nvmet_req_subsys(req)->passthru_ctrl; in nvmet_passthru_set_host_behaviour()
326 status = nvmet_copy_from_sgl(req, 0, &host[1], sizeof(*host)); in nvmet_passthru_set_host_behaviour()
338 nvmet_req_complete(req, status); in nvmet_passthru_set_host_behaviour()
341 static u16 nvmet_setup_passthru_command(struct nvmet_req *req) in nvmet_setup_passthru_command() argument
343 req->p.use_workqueue = false; in nvmet_setup_passthru_command()
344 req->execute = nvmet_passthru_execute_cmd; in nvmet_setup_passthru_command()
348 u16 nvmet_parse_passthru_io_cmd(struct nvmet_req *req) in nvmet_parse_passthru_io_cmd() argument
351 if (req->cmd->common.flags & ~NVME_CMD_SGL_ALL) in nvmet_parse_passthru_io_cmd()
354 switch (req->cmd->common.opcode) { in nvmet_parse_passthru_io_cmd()
369 return nvmet_setup_passthru_command(req); in nvmet_parse_passthru_io_cmd()
377 static u16 nvmet_passthru_get_set_features(struct nvmet_req *req) in nvmet_passthru_get_set_features() argument
379 switch (le32_to_cpu(req->cmd->features.fid)) { in nvmet_passthru_get_set_features()
397 return nvmet_setup_passthru_command(req); in nvmet_passthru_get_set_features()
422 u16 nvmet_parse_passthru_admin_cmd(struct nvmet_req *req) in nvmet_parse_passthru_admin_cmd() argument
425 if (req->cmd->common.flags & ~NVME_CMD_SGL_ALL) in nvmet_parse_passthru_admin_cmd()
431 if (req->cmd->common.opcode >= nvme_admin_vendor_start) in nvmet_parse_passthru_admin_cmd()
432 return nvmet_setup_passthru_command(req); in nvmet_parse_passthru_admin_cmd()
434 switch (req->cmd->common.opcode) { in nvmet_parse_passthru_admin_cmd()
436 req->execute = nvmet_execute_async_event; in nvmet_parse_passthru_admin_cmd()
444 req->execute = nvmet_execute_keep_alive; in nvmet_parse_passthru_admin_cmd()
447 switch (le32_to_cpu(req->cmd->features.fid)) { in nvmet_parse_passthru_admin_cmd()
452 req->execute = nvmet_execute_set_features; in nvmet_parse_passthru_admin_cmd()
455 req->execute = nvmet_passthru_set_host_behaviour; in nvmet_parse_passthru_admin_cmd()
458 return nvmet_passthru_get_set_features(req); in nvmet_parse_passthru_admin_cmd()
462 switch (le32_to_cpu(req->cmd->features.fid)) { in nvmet_parse_passthru_admin_cmd()
467 req->execute = nvmet_execute_get_features; in nvmet_parse_passthru_admin_cmd()
470 return nvmet_passthru_get_set_features(req); in nvmet_parse_passthru_admin_cmd()
474 switch (req->cmd->identify.cns) { in nvmet_parse_passthru_admin_cmd()
476 req->execute = nvmet_passthru_execute_cmd; in nvmet_parse_passthru_admin_cmd()
477 req->p.use_workqueue = true; in nvmet_parse_passthru_admin_cmd()
480 switch (req->cmd->identify.csi) { in nvmet_parse_passthru_admin_cmd()
482 req->execute = nvmet_passthru_execute_cmd; in nvmet_parse_passthru_admin_cmd()
483 req->p.use_workqueue = true; in nvmet_parse_passthru_admin_cmd()
488 req->execute = nvmet_passthru_execute_cmd; in nvmet_parse_passthru_admin_cmd()
489 req->p.use_workqueue = true; in nvmet_parse_passthru_admin_cmd()
492 switch (req->cmd->identify.csi) { in nvmet_parse_passthru_admin_cmd()
494 req->execute = nvmet_passthru_execute_cmd; in nvmet_parse_passthru_admin_cmd()
495 req->p.use_workqueue = true; in nvmet_parse_passthru_admin_cmd()
500 return nvmet_setup_passthru_command(req); in nvmet_parse_passthru_admin_cmd()
503 return nvmet_setup_passthru_command(req); in nvmet_parse_passthru_admin_cmd()
506 return nvmet_report_invalid_opcode(req); in nvmet_parse_passthru_admin_cmd()