Lines Matching refs:req
32 static void nvmet_execute_get_log_page_noop(struct nvmet_req *req) in nvmet_execute_get_log_page_noop() argument
34 nvmet_req_complete(req, nvmet_zero_sgl(req, 0, req->data_len)); in nvmet_execute_get_log_page_noop()
37 static void nvmet_execute_get_log_page_error(struct nvmet_req *req) in nvmet_execute_get_log_page_error() argument
39 struct nvmet_ctrl *ctrl = req->sq->ctrl; in nvmet_execute_get_log_page_error()
49 if (nvmet_copy_to_sgl(req, offset, &ctrl->slots[slot], in nvmet_execute_get_log_page_error()
60 nvmet_req_complete(req, 0); in nvmet_execute_get_log_page_error()
63 static u16 nvmet_get_smart_log_nsid(struct nvmet_req *req, in nvmet_get_smart_log_nsid() argument
69 ns = nvmet_find_namespace(req->sq->ctrl, req->cmd->get_log_page.nsid); in nvmet_get_smart_log_nsid()
72 le32_to_cpu(req->cmd->get_log_page.nsid)); in nvmet_get_smart_log_nsid()
73 req->error_loc = offsetof(struct nvme_rw_command, nsid); in nvmet_get_smart_log_nsid()
98 static u16 nvmet_get_smart_log_all(struct nvmet_req *req, in nvmet_get_smart_log_all() argument
106 ctrl = req->sq->ctrl; in nvmet_get_smart_log_all()
131 static void nvmet_execute_get_log_page_smart(struct nvmet_req *req) in nvmet_execute_get_log_page_smart() argument
137 if (req->data_len != sizeof(*log)) in nvmet_execute_get_log_page_smart()
144 if (req->cmd->get_log_page.nsid == cpu_to_le32(NVME_NSID_ALL)) in nvmet_execute_get_log_page_smart()
145 status = nvmet_get_smart_log_all(req, log); in nvmet_execute_get_log_page_smart()
147 status = nvmet_get_smart_log_nsid(req, log); in nvmet_execute_get_log_page_smart()
151 spin_lock_irqsave(&req->sq->ctrl->error_lock, flags); in nvmet_execute_get_log_page_smart()
152 put_unaligned_le64(req->sq->ctrl->err_counter, in nvmet_execute_get_log_page_smart()
154 spin_unlock_irqrestore(&req->sq->ctrl->error_lock, flags); in nvmet_execute_get_log_page_smart()
156 status = nvmet_copy_to_sgl(req, 0, log, sizeof(*log)); in nvmet_execute_get_log_page_smart()
160 nvmet_req_complete(req, status); in nvmet_execute_get_log_page_smart()
163 static void nvmet_execute_get_log_cmd_effects_ns(struct nvmet_req *req) in nvmet_execute_get_log_cmd_effects_ns() argument
186 status = nvmet_copy_to_sgl(req, 0, log, sizeof(*log)); in nvmet_execute_get_log_cmd_effects_ns()
190 nvmet_req_complete(req, status); in nvmet_execute_get_log_cmd_effects_ns()
193 static void nvmet_execute_get_log_changed_ns(struct nvmet_req *req) in nvmet_execute_get_log_changed_ns() argument
195 struct nvmet_ctrl *ctrl = req->sq->ctrl; in nvmet_execute_get_log_changed_ns()
199 if (req->data_len != NVME_MAX_CHANGED_NAMESPACES * sizeof(__le32)) in nvmet_execute_get_log_changed_ns()
207 status = nvmet_copy_to_sgl(req, 0, ctrl->changed_ns_list, len); in nvmet_execute_get_log_changed_ns()
209 status = nvmet_zero_sgl(req, len, req->data_len - len); in nvmet_execute_get_log_changed_ns()
211 nvmet_clear_aen_bit(req, NVME_AEN_BIT_NS_ATTR); in nvmet_execute_get_log_changed_ns()
214 nvmet_req_complete(req, status); in nvmet_execute_get_log_changed_ns()
217 static u32 nvmet_format_ana_group(struct nvmet_req *req, u32 grpid, in nvmet_format_ana_group() argument
220 struct nvmet_ctrl *ctrl = req->sq->ctrl; in nvmet_format_ana_group()
224 if (!(req->cmd->get_log_page.lsp & NVME_ANA_LOG_RGO)) { in nvmet_format_ana_group()
235 desc->state = req->port->ana_state[grpid]; in nvmet_format_ana_group()
240 static void nvmet_execute_get_log_page_ana(struct nvmet_req *req) in nvmet_execute_get_log_page_ana() argument
260 len = nvmet_format_ana_group(req, grpid, desc); in nvmet_execute_get_log_page_ana()
261 status = nvmet_copy_to_sgl(req, offset, desc, len); in nvmet_execute_get_log_page_ana()
274 nvmet_clear_aen_bit(req, NVME_AEN_BIT_ANA_CHANGE); in nvmet_execute_get_log_page_ana()
280 status = nvmet_copy_to_sgl(req, 0, &hdr, sizeof(hdr)); in nvmet_execute_get_log_page_ana()
282 nvmet_req_complete(req, status); in nvmet_execute_get_log_page_ana()
285 static void nvmet_execute_identify_ctrl(struct nvmet_req *req) in nvmet_execute_identify_ctrl() argument
287 struct nvmet_ctrl *ctrl = req->sq->ctrl; in nvmet_execute_identify_ctrl()
373 if (req->port->inline_data_size) in nvmet_execute_identify_ctrl()
380 req->port->inline_data_size) / 16); in nvmet_execute_identify_ctrl()
401 status = nvmet_copy_to_sgl(req, 0, id, sizeof(*id)); in nvmet_execute_identify_ctrl()
405 nvmet_req_complete(req, status); in nvmet_execute_identify_ctrl()
408 static void nvmet_execute_identify_ns(struct nvmet_req *req) in nvmet_execute_identify_ns() argument
414 if (le32_to_cpu(req->cmd->identify.nsid) == NVME_NSID_ALL) { in nvmet_execute_identify_ns()
415 req->error_loc = offsetof(struct nvme_identify, nsid); in nvmet_execute_identify_ns()
427 ns = nvmet_find_namespace(req->sq->ctrl, req->cmd->identify.nsid); in nvmet_execute_identify_ns()
436 switch (req->port->ana_state[ns->anagrpid]) { in nvmet_execute_identify_ns()
470 status = nvmet_copy_to_sgl(req, 0, id, sizeof(*id)); in nvmet_execute_identify_ns()
473 nvmet_req_complete(req, status); in nvmet_execute_identify_ns()
476 static void nvmet_execute_identify_nslist(struct nvmet_req *req) in nvmet_execute_identify_nslist() argument
479 struct nvmet_ctrl *ctrl = req->sq->ctrl; in nvmet_execute_identify_nslist()
481 u32 min_nsid = le32_to_cpu(req->cmd->identify.nsid); in nvmet_execute_identify_nslist()
502 status = nvmet_copy_to_sgl(req, 0, list, buf_size); in nvmet_execute_identify_nslist()
506 nvmet_req_complete(req, status); in nvmet_execute_identify_nslist()
509 static u16 nvmet_copy_ns_identifier(struct nvmet_req *req, u8 type, u8 len, in nvmet_copy_ns_identifier() argument
518 status = nvmet_copy_to_sgl(req, *off, &desc, sizeof(desc)); in nvmet_copy_ns_identifier()
523 status = nvmet_copy_to_sgl(req, *off, id, len); in nvmet_copy_ns_identifier()
531 static void nvmet_execute_identify_desclist(struct nvmet_req *req) in nvmet_execute_identify_desclist() argument
537 ns = nvmet_find_namespace(req->sq->ctrl, req->cmd->identify.nsid); in nvmet_execute_identify_desclist()
539 req->error_loc = offsetof(struct nvme_identify, nsid); in nvmet_execute_identify_desclist()
545 status = nvmet_copy_ns_identifier(req, NVME_NIDT_UUID, in nvmet_execute_identify_desclist()
552 status = nvmet_copy_ns_identifier(req, NVME_NIDT_NGUID, in nvmet_execute_identify_desclist()
559 if (sg_zero_buffer(req->sg, req->sg_cnt, NVME_IDENTIFY_DATA_SIZE - off, in nvmet_execute_identify_desclist()
565 nvmet_req_complete(req, status); in nvmet_execute_identify_desclist()
575 static void nvmet_execute_abort(struct nvmet_req *req) in nvmet_execute_abort() argument
577 nvmet_set_result(req, 1); in nvmet_execute_abort()
578 nvmet_req_complete(req, 0); in nvmet_execute_abort()
581 static u16 nvmet_write_protect_flush_sync(struct nvmet_req *req) in nvmet_write_protect_flush_sync() argument
585 if (req->ns->file) in nvmet_write_protect_flush_sync()
586 status = nvmet_file_flush(req); in nvmet_write_protect_flush_sync()
588 status = nvmet_bdev_flush(req); in nvmet_write_protect_flush_sync()
591 pr_err("write protect flush failed nsid: %u\n", req->ns->nsid); in nvmet_write_protect_flush_sync()
595 static u16 nvmet_set_feat_write_protect(struct nvmet_req *req) in nvmet_set_feat_write_protect() argument
597 u32 write_protect = le32_to_cpu(req->cmd->common.cdw11); in nvmet_set_feat_write_protect()
598 struct nvmet_subsys *subsys = req->sq->ctrl->subsys; in nvmet_set_feat_write_protect()
601 req->ns = nvmet_find_namespace(req->sq->ctrl, req->cmd->rw.nsid); in nvmet_set_feat_write_protect()
602 if (unlikely(!req->ns)) { in nvmet_set_feat_write_protect()
603 req->error_loc = offsetof(struct nvme_common_command, nsid); in nvmet_set_feat_write_protect()
610 req->ns->readonly = true; in nvmet_set_feat_write_protect()
611 status = nvmet_write_protect_flush_sync(req); in nvmet_set_feat_write_protect()
613 req->ns->readonly = false; in nvmet_set_feat_write_protect()
616 req->ns->readonly = false; in nvmet_set_feat_write_protect()
624 nvmet_ns_changed(subsys, req->ns->nsid); in nvmet_set_feat_write_protect()
629 u16 nvmet_set_feat_kato(struct nvmet_req *req) in nvmet_set_feat_kato() argument
631 u32 val32 = le32_to_cpu(req->cmd->common.cdw11); in nvmet_set_feat_kato()
633 req->sq->ctrl->kato = DIV_ROUND_UP(val32, 1000); in nvmet_set_feat_kato()
635 nvmet_set_result(req, req->sq->ctrl->kato); in nvmet_set_feat_kato()
640 u16 nvmet_set_feat_async_event(struct nvmet_req *req, u32 mask) in nvmet_set_feat_async_event() argument
642 u32 val32 = le32_to_cpu(req->cmd->common.cdw11); in nvmet_set_feat_async_event()
645 req->error_loc = offsetof(struct nvme_common_command, cdw11); in nvmet_set_feat_async_event()
649 WRITE_ONCE(req->sq->ctrl->aen_enabled, val32); in nvmet_set_feat_async_event()
650 nvmet_set_result(req, val32); in nvmet_set_feat_async_event()
655 static void nvmet_execute_set_features(struct nvmet_req *req) in nvmet_execute_set_features() argument
657 struct nvmet_subsys *subsys = req->sq->ctrl->subsys; in nvmet_execute_set_features()
658 u32 cdw10 = le32_to_cpu(req->cmd->common.cdw10); in nvmet_execute_set_features()
663 nvmet_set_result(req, in nvmet_execute_set_features()
667 status = nvmet_set_feat_kato(req); in nvmet_execute_set_features()
670 status = nvmet_set_feat_async_event(req, NVMET_AEN_CFG_ALL); in nvmet_execute_set_features()
676 status = nvmet_set_feat_write_protect(req); in nvmet_execute_set_features()
679 req->error_loc = offsetof(struct nvme_common_command, cdw10); in nvmet_execute_set_features()
684 nvmet_req_complete(req, status); in nvmet_execute_set_features()
687 static u16 nvmet_get_feat_write_protect(struct nvmet_req *req) in nvmet_get_feat_write_protect() argument
689 struct nvmet_subsys *subsys = req->sq->ctrl->subsys; in nvmet_get_feat_write_protect()
692 req->ns = nvmet_find_namespace(req->sq->ctrl, req->cmd->common.nsid); in nvmet_get_feat_write_protect()
693 if (!req->ns) { in nvmet_get_feat_write_protect()
694 req->error_loc = offsetof(struct nvme_common_command, nsid); in nvmet_get_feat_write_protect()
698 if (req->ns->readonly == true) in nvmet_get_feat_write_protect()
702 nvmet_set_result(req, result); in nvmet_get_feat_write_protect()
708 void nvmet_get_feat_kato(struct nvmet_req *req) in nvmet_get_feat_kato() argument
710 nvmet_set_result(req, req->sq->ctrl->kato * 1000); in nvmet_get_feat_kato()
713 void nvmet_get_feat_async_event(struct nvmet_req *req) in nvmet_get_feat_async_event() argument
715 nvmet_set_result(req, READ_ONCE(req->sq->ctrl->aen_enabled)); in nvmet_get_feat_async_event()
718 static void nvmet_execute_get_features(struct nvmet_req *req) in nvmet_execute_get_features() argument
720 struct nvmet_subsys *subsys = req->sq->ctrl->subsys; in nvmet_execute_get_features()
721 u32 cdw10 = le32_to_cpu(req->cmd->common.cdw10); in nvmet_execute_get_features()
747 nvmet_get_feat_async_event(req); in nvmet_execute_get_features()
750 nvmet_set_result(req, 1); in nvmet_execute_get_features()
753 nvmet_set_result(req, in nvmet_execute_get_features()
757 nvmet_get_feat_kato(req); in nvmet_execute_get_features()
761 if (!(req->cmd->common.cdw11 & cpu_to_le32(1 << 0))) { in nvmet_execute_get_features()
762 req->error_loc = in nvmet_execute_get_features()
768 status = nvmet_copy_to_sgl(req, 0, &req->sq->ctrl->hostid, in nvmet_execute_get_features()
769 sizeof(req->sq->ctrl->hostid)); in nvmet_execute_get_features()
772 status = nvmet_get_feat_write_protect(req); in nvmet_execute_get_features()
775 req->error_loc = in nvmet_execute_get_features()
781 nvmet_req_complete(req, status); in nvmet_execute_get_features()
784 void nvmet_execute_async_event(struct nvmet_req *req) in nvmet_execute_async_event() argument
786 struct nvmet_ctrl *ctrl = req->sq->ctrl; in nvmet_execute_async_event()
791 nvmet_req_complete(req, NVME_SC_ASYNC_LIMIT | NVME_SC_DNR); in nvmet_execute_async_event()
794 ctrl->async_event_cmds[ctrl->nr_async_event_cmds++] = req; in nvmet_execute_async_event()
800 void nvmet_execute_keep_alive(struct nvmet_req *req) in nvmet_execute_keep_alive() argument
802 struct nvmet_ctrl *ctrl = req->sq->ctrl; in nvmet_execute_keep_alive()
808 nvmet_req_complete(req, 0); in nvmet_execute_keep_alive()
811 u16 nvmet_parse_admin_cmd(struct nvmet_req *req) in nvmet_parse_admin_cmd() argument
813 struct nvme_command *cmd = req->cmd; in nvmet_parse_admin_cmd()
816 ret = nvmet_check_ctrl_status(req, cmd); in nvmet_parse_admin_cmd()
822 req->data_len = nvmet_get_log_page_len(cmd); in nvmet_parse_admin_cmd()
826 req->execute = nvmet_execute_get_log_page_error; in nvmet_parse_admin_cmd()
829 req->execute = nvmet_execute_get_log_page_smart; in nvmet_parse_admin_cmd()
838 req->execute = nvmet_execute_get_log_page_noop; in nvmet_parse_admin_cmd()
841 req->execute = nvmet_execute_get_log_changed_ns; in nvmet_parse_admin_cmd()
844 req->execute = nvmet_execute_get_log_cmd_effects_ns; in nvmet_parse_admin_cmd()
847 req->execute = nvmet_execute_get_log_page_ana; in nvmet_parse_admin_cmd()
852 req->data_len = NVME_IDENTIFY_DATA_SIZE; in nvmet_parse_admin_cmd()
855 req->execute = nvmet_execute_identify_ns; in nvmet_parse_admin_cmd()
858 req->execute = nvmet_execute_identify_ctrl; in nvmet_parse_admin_cmd()
861 req->execute = nvmet_execute_identify_nslist; in nvmet_parse_admin_cmd()
864 req->execute = nvmet_execute_identify_desclist; in nvmet_parse_admin_cmd()
869 req->execute = nvmet_execute_abort; in nvmet_parse_admin_cmd()
870 req->data_len = 0; in nvmet_parse_admin_cmd()
873 req->execute = nvmet_execute_set_features; in nvmet_parse_admin_cmd()
874 req->data_len = 0; in nvmet_parse_admin_cmd()
877 req->execute = nvmet_execute_get_features; in nvmet_parse_admin_cmd()
878 req->data_len = 0; in nvmet_parse_admin_cmd()
881 req->execute = nvmet_execute_async_event; in nvmet_parse_admin_cmd()
882 req->data_len = 0; in nvmet_parse_admin_cmd()
885 req->execute = nvmet_execute_keep_alive; in nvmet_parse_admin_cmd()
886 req->data_len = 0; in nvmet_parse_admin_cmd()
891 req->sq->qid); in nvmet_parse_admin_cmd()
892 req->error_loc = offsetof(struct nvme_common_command, opcode); in nvmet_parse_admin_cmd()