Lines Matching +full:cmd +full:- +full:timeout +full:- +full:ms
1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2011-2014, Intel Corporation.
4 * Copyright (c) 2017-2021 Christoph Hellwig.
8 #include <linux/io_uring/cmd.h>
32 if (c->common.opcode >= nvme_cmd_vendor_start || in nvme_cmd_allowed()
33 c->common.opcode == nvme_fabrics_command) in nvme_cmd_allowed()
43 if (c->common.opcode == nvme_admin_identify) { in nvme_cmd_allowed()
44 switch (c->identify.cns) { in nvme_cmd_allowed()
61 effects = nvme_command_effects(ns->ctrl, ns, c->common.opcode); in nvme_cmd_allowed()
90 * ignoring the upper bits in the compat case to match behaviour of 32-bit
101 struct nvme_command *cmd, blk_opf_t rq_flags, in nvme_alloc_user_request() argument
106 req = blk_mq_alloc_request(q, nvme_req_op(cmd) | rq_flags, blk_flags); in nvme_alloc_user_request()
109 nvme_init_request(req, cmd); in nvme_alloc_user_request()
110 nvme_req(req)->flags |= NVME_REQ_USERCMD; in nvme_alloc_user_request()
118 struct request_queue *q = req->q; in nvme_map_user_request()
119 struct nvme_ns *ns = q->queuedata; in nvme_map_user_request()
120 struct block_device *bdev = ns ? ns->disk->part0 : NULL; in nvme_map_user_request()
124 if (ioucmd && (ioucmd->flags & IORING_URING_CMD_FIXED)) { in nvme_map_user_request()
127 /* fixedbufs is only for non-vectored io */ in nvme_map_user_request()
129 return -EINVAL; in nvme_map_user_request()
144 bio = req->bio; in nvme_map_user_request()
152 req->cmd_flags |= REQ_INTEGRITY; in nvme_map_user_request()
167 struct nvme_command *cmd, u64 ubuffer, unsigned bufflen, in nvme_submit_user_cmd() argument
169 u64 *result, unsigned timeout, unsigned int flags) in nvme_submit_user_cmd() argument
171 struct nvme_ns *ns = q->queuedata; in nvme_submit_user_cmd()
178 req = nvme_alloc_user_request(q, cmd, 0, 0); in nvme_submit_user_cmd()
182 req->timeout = timeout; in nvme_submit_user_cmd()
190 bio = req->bio; in nvme_submit_user_cmd()
191 ctrl = nvme_req(req)->ctrl; in nvme_submit_user_cmd()
193 effects = nvme_passthru_start(ctrl, ns, cmd->common.opcode); in nvme_submit_user_cmd()
196 *result = le64_to_cpu(nvme_req(req)->result.u64); in nvme_submit_user_cmd()
202 nvme_passthru_end(ctrl, ns, effects, cmd, ret); in nvme_submit_user_cmd()
215 return -EFAULT; in nvme_submit_io()
217 return -EINVAL; in nvme_submit_io()
225 return -EINVAL; in nvme_submit_io()
228 length = (io.nblocks + 1) << ns->head->lba_shift; in nvme_submit_io()
231 (ns->head->ms == ns->head->pi_size)) { in nvme_submit_io()
237 return -EINVAL; in nvme_submit_io()
241 meta_len = (io.nblocks + 1) * ns->head->ms; in nvme_submit_io()
245 if (ns->head->features & NVME_NS_EXT_LBAS) { in nvme_submit_io()
250 return -EINVAL; in nvme_submit_io()
256 c.rw.nsid = cpu_to_le32(ns->head->ns_id); in nvme_submit_io()
265 return nvme_submit_user_cmd(ns->queue, &c, io.addr, length, metadata, in nvme_submit_io()
272 if (ns && nsid != ns->head->ns_id) { in nvme_validate_passthru_nsid()
273 dev_err(ctrl->device, in nvme_validate_passthru_nsid()
274 "%s: nsid (%u) in cmd does not match nsid (%u)" in nvme_validate_passthru_nsid()
276 current->comm, nsid, ns->head->ns_id); in nvme_validate_passthru_nsid()
287 struct nvme_passthru_cmd cmd; in nvme_user_cmd() local
289 unsigned timeout = 0; in nvme_user_cmd() local
293 if (copy_from_user(&cmd, ucmd, sizeof(cmd))) in nvme_user_cmd()
294 return -EFAULT; in nvme_user_cmd()
295 if (cmd.flags) in nvme_user_cmd()
296 return -EINVAL; in nvme_user_cmd()
297 if (!nvme_validate_passthru_nsid(ctrl, ns, cmd.nsid)) in nvme_user_cmd()
298 return -EINVAL; in nvme_user_cmd()
301 c.common.opcode = cmd.opcode; in nvme_user_cmd()
302 c.common.flags = cmd.flags; in nvme_user_cmd()
303 c.common.nsid = cpu_to_le32(cmd.nsid); in nvme_user_cmd()
304 c.common.cdw2[0] = cpu_to_le32(cmd.cdw2); in nvme_user_cmd()
305 c.common.cdw2[1] = cpu_to_le32(cmd.cdw3); in nvme_user_cmd()
306 c.common.cdw10 = cpu_to_le32(cmd.cdw10); in nvme_user_cmd()
307 c.common.cdw11 = cpu_to_le32(cmd.cdw11); in nvme_user_cmd()
308 c.common.cdw12 = cpu_to_le32(cmd.cdw12); in nvme_user_cmd()
309 c.common.cdw13 = cpu_to_le32(cmd.cdw13); in nvme_user_cmd()
310 c.common.cdw14 = cpu_to_le32(cmd.cdw14); in nvme_user_cmd()
311 c.common.cdw15 = cpu_to_le32(cmd.cdw15); in nvme_user_cmd()
314 return -EACCES; in nvme_user_cmd()
316 if (cmd.timeout_ms) in nvme_user_cmd()
317 timeout = msecs_to_jiffies(cmd.timeout_ms); in nvme_user_cmd()
319 status = nvme_submit_user_cmd(ns ? ns->queue : ctrl->admin_q, &c, in nvme_user_cmd()
320 cmd.addr, cmd.data_len, nvme_to_user_ptr(cmd.metadata), in nvme_user_cmd()
321 cmd.metadata_len, 0, &result, timeout, 0); in nvme_user_cmd()
324 if (put_user(result, &ucmd->result)) in nvme_user_cmd()
325 return -EFAULT; in nvme_user_cmd()
335 struct nvme_passthru_cmd64 cmd; in nvme_user_cmd64() local
337 unsigned timeout = 0; in nvme_user_cmd64() local
340 if (copy_from_user(&cmd, ucmd, sizeof(cmd))) in nvme_user_cmd64()
341 return -EFAULT; in nvme_user_cmd64()
342 if (cmd.flags) in nvme_user_cmd64()
343 return -EINVAL; in nvme_user_cmd64()
344 if (!nvme_validate_passthru_nsid(ctrl, ns, cmd.nsid)) in nvme_user_cmd64()
345 return -EINVAL; in nvme_user_cmd64()
348 c.common.opcode = cmd.opcode; in nvme_user_cmd64()
349 c.common.flags = cmd.flags; in nvme_user_cmd64()
350 c.common.nsid = cpu_to_le32(cmd.nsid); in nvme_user_cmd64()
351 c.common.cdw2[0] = cpu_to_le32(cmd.cdw2); in nvme_user_cmd64()
352 c.common.cdw2[1] = cpu_to_le32(cmd.cdw3); in nvme_user_cmd64()
353 c.common.cdw10 = cpu_to_le32(cmd.cdw10); in nvme_user_cmd64()
354 c.common.cdw11 = cpu_to_le32(cmd.cdw11); in nvme_user_cmd64()
355 c.common.cdw12 = cpu_to_le32(cmd.cdw12); in nvme_user_cmd64()
356 c.common.cdw13 = cpu_to_le32(cmd.cdw13); in nvme_user_cmd64()
357 c.common.cdw14 = cpu_to_le32(cmd.cdw14); in nvme_user_cmd64()
358 c.common.cdw15 = cpu_to_le32(cmd.cdw15); in nvme_user_cmd64()
361 return -EACCES; in nvme_user_cmd64()
363 if (cmd.timeout_ms) in nvme_user_cmd64()
364 timeout = msecs_to_jiffies(cmd.timeout_ms); in nvme_user_cmd64()
366 status = nvme_submit_user_cmd(ns ? ns->queue : ctrl->admin_q, &c, in nvme_user_cmd64()
367 cmd.addr, cmd.data_len, nvme_to_user_ptr(cmd.metadata), in nvme_user_cmd64()
368 cmd.metadata_len, 0, &cmd.result, timeout, flags); in nvme_user_cmd64()
371 if (put_user(cmd.result, &ucmd->result)) in nvme_user_cmd64()
372 return -EFAULT; in nvme_user_cmd64()
400 return (struct nvme_uring_cmd_pdu *)&ioucmd->pdu; in nvme_uring_cmd_pdu()
408 if (pdu->bio) in nvme_uring_task_cb()
409 blk_rq_unmap_user(pdu->bio); in nvme_uring_task_cb()
410 io_uring_cmd_done(ioucmd, pdu->status, pdu->result, issue_flags); in nvme_uring_task_cb()
416 struct io_uring_cmd *ioucmd = req->end_io_data; in nvme_uring_cmd_end_io()
419 if (nvme_req(req)->flags & NVME_REQ_CANCELLED) in nvme_uring_cmd_end_io()
420 pdu->status = -EINTR; in nvme_uring_cmd_end_io()
422 pdu->status = nvme_req(req)->status; in nvme_uring_cmd_end_io()
423 pdu->result = le64_to_cpu(nvme_req(req)->result.u64); in nvme_uring_cmd_end_io()
441 const struct nvme_uring_cmd *cmd = io_uring_sqe_cmd(ioucmd->sqe); in nvme_uring_cmd_io() local
442 struct request_queue *q = ns ? ns->queue : ctrl->admin_q; in nvme_uring_cmd_io()
450 c.common.opcode = READ_ONCE(cmd->opcode); in nvme_uring_cmd_io()
451 c.common.flags = READ_ONCE(cmd->flags); in nvme_uring_cmd_io()
453 return -EINVAL; in nvme_uring_cmd_io()
456 c.common.nsid = cpu_to_le32(cmd->nsid); in nvme_uring_cmd_io()
458 return -EINVAL; in nvme_uring_cmd_io()
460 c.common.cdw2[0] = cpu_to_le32(READ_ONCE(cmd->cdw2)); in nvme_uring_cmd_io()
461 c.common.cdw2[1] = cpu_to_le32(READ_ONCE(cmd->cdw3)); in nvme_uring_cmd_io()
464 c.common.cdw10 = cpu_to_le32(READ_ONCE(cmd->cdw10)); in nvme_uring_cmd_io()
465 c.common.cdw11 = cpu_to_le32(READ_ONCE(cmd->cdw11)); in nvme_uring_cmd_io()
466 c.common.cdw12 = cpu_to_le32(READ_ONCE(cmd->cdw12)); in nvme_uring_cmd_io()
467 c.common.cdw13 = cpu_to_le32(READ_ONCE(cmd->cdw13)); in nvme_uring_cmd_io()
468 c.common.cdw14 = cpu_to_le32(READ_ONCE(cmd->cdw14)); in nvme_uring_cmd_io()
469 c.common.cdw15 = cpu_to_le32(READ_ONCE(cmd->cdw15)); in nvme_uring_cmd_io()
471 if (!nvme_cmd_allowed(ns, &c, 0, ioucmd->file->f_mode & FMODE_WRITE)) in nvme_uring_cmd_io()
472 return -EACCES; in nvme_uring_cmd_io()
474 d.metadata = READ_ONCE(cmd->metadata); in nvme_uring_cmd_io()
475 d.addr = READ_ONCE(cmd->addr); in nvme_uring_cmd_io()
476 d.data_len = READ_ONCE(cmd->data_len); in nvme_uring_cmd_io()
477 d.metadata_len = READ_ONCE(cmd->metadata_len); in nvme_uring_cmd_io()
478 d.timeout_ms = READ_ONCE(cmd->timeout_ms); in nvme_uring_cmd_io()
490 req->timeout = d.timeout_ms ? msecs_to_jiffies(d.timeout_ms) : 0; in nvme_uring_cmd_io()
500 /* to free bio on completion, as req->bio will be null at that time */ in nvme_uring_cmd_io()
501 pdu->bio = req->bio; in nvme_uring_cmd_io()
502 pdu->req = req; in nvme_uring_cmd_io()
503 req->end_io_data = ioucmd; in nvme_uring_cmd_io()
504 req->end_io = nvme_uring_cmd_end_io; in nvme_uring_cmd_io()
506 return -EIOCBQUEUED; in nvme_uring_cmd_io()
509 static bool is_ctrl_ioctl(unsigned int cmd) in is_ctrl_ioctl() argument
511 if (cmd == NVME_IOCTL_ADMIN_CMD || cmd == NVME_IOCTL_ADMIN64_CMD) in is_ctrl_ioctl()
513 if (is_sed_ioctl(cmd)) in is_ctrl_ioctl()
518 static int nvme_ctrl_ioctl(struct nvme_ctrl *ctrl, unsigned int cmd, in nvme_ctrl_ioctl() argument
521 switch (cmd) { in nvme_ctrl_ioctl()
527 return sed_ioctl(ctrl->opal_dev, cmd, argp); in nvme_ctrl_ioctl()
549 static int nvme_ns_ioctl(struct nvme_ns *ns, unsigned int cmd, in nvme_ns_ioctl() argument
552 switch (cmd) { in nvme_ns_ioctl()
555 return ns->head->ns_id; in nvme_ns_ioctl()
557 return nvme_user_cmd(ns->ctrl, ns, argp, flags, open_for_write); in nvme_ns_ioctl()
559 * struct nvme_user_io can have different padding on some 32-bit ABIs. in nvme_ns_ioctl()
572 return nvme_user_cmd64(ns->ctrl, ns, argp, flags, in nvme_ns_ioctl()
575 return -ENOTTY; in nvme_ns_ioctl()
580 unsigned int cmd, unsigned long arg) in nvme_ioctl() argument
582 struct nvme_ns *ns = bdev->bd_disk->private_data; in nvme_ioctl()
590 if (is_ctrl_ioctl(cmd)) in nvme_ioctl()
591 return nvme_ctrl_ioctl(ns->ctrl, cmd, argp, open_for_write); in nvme_ioctl()
592 return nvme_ns_ioctl(ns, cmd, argp, flags, open_for_write); in nvme_ioctl()
595 long nvme_ns_chr_ioctl(struct file *file, unsigned int cmd, unsigned long arg) in nvme_ns_chr_ioctl() argument
598 container_of(file_inode(file)->i_cdev, struct nvme_ns, cdev); in nvme_ns_chr_ioctl()
599 bool open_for_write = file->f_mode & FMODE_WRITE; in nvme_ns_chr_ioctl()
602 if (is_ctrl_ioctl(cmd)) in nvme_ns_chr_ioctl()
603 return nvme_ctrl_ioctl(ns->ctrl, cmd, argp, open_for_write); in nvme_ns_chr_ioctl()
604 return nvme_ns_ioctl(ns, cmd, argp, 0, open_for_write); in nvme_ns_chr_ioctl()
613 return -EOPNOTSUPP; in nvme_uring_cmd_checks()
620 struct nvme_ctrl *ctrl = ns->ctrl; in nvme_ns_uring_cmd()
623 BUILD_BUG_ON(sizeof(struct nvme_uring_cmd_pdu) > sizeof(ioucmd->pdu)); in nvme_ns_uring_cmd()
629 switch (ioucmd->cmd_op) { in nvme_ns_uring_cmd()
637 ret = -ENOTTY; in nvme_ns_uring_cmd()
645 struct nvme_ns *ns = container_of(file_inode(ioucmd->file)->i_cdev, in nvme_ns_chr_uring_cmd()
656 struct request *req = pdu->req; in nvme_ns_chr_uring_cmd_iopoll()
663 static int nvme_ns_head_ctrl_ioctl(struct nvme_ns *ns, unsigned int cmd, in nvme_ns_head_ctrl_ioctl() argument
666 __releases(&head->srcu) in nvme_ns_head_ctrl_ioctl()
668 struct nvme_ctrl *ctrl = ns->ctrl; in nvme_ns_head_ctrl_ioctl()
671 nvme_get_ctrl(ns->ctrl); in nvme_ns_head_ctrl_ioctl()
672 srcu_read_unlock(&head->srcu, srcu_idx); in nvme_ns_head_ctrl_ioctl()
673 ret = nvme_ctrl_ioctl(ns->ctrl, cmd, argp, open_for_write); in nvme_ns_head_ctrl_ioctl()
680 unsigned int cmd, unsigned long arg) in nvme_ns_head_ioctl() argument
682 struct nvme_ns_head *head = bdev->bd_disk->private_data; in nvme_ns_head_ioctl()
686 int srcu_idx, ret = -EWOULDBLOCK; in nvme_ns_head_ioctl()
692 srcu_idx = srcu_read_lock(&head->srcu); in nvme_ns_head_ioctl()
702 if (is_ctrl_ioctl(cmd)) in nvme_ns_head_ioctl()
703 return nvme_ns_head_ctrl_ioctl(ns, cmd, argp, head, srcu_idx, in nvme_ns_head_ioctl()
706 ret = nvme_ns_ioctl(ns, cmd, argp, flags, open_for_write); in nvme_ns_head_ioctl()
708 srcu_read_unlock(&head->srcu, srcu_idx); in nvme_ns_head_ioctl()
712 long nvme_ns_head_chr_ioctl(struct file *file, unsigned int cmd, in nvme_ns_head_chr_ioctl() argument
715 bool open_for_write = file->f_mode & FMODE_WRITE; in nvme_ns_head_chr_ioctl()
716 struct cdev *cdev = file_inode(file)->i_cdev; in nvme_ns_head_chr_ioctl()
721 int srcu_idx, ret = -EWOULDBLOCK; in nvme_ns_head_chr_ioctl()
723 srcu_idx = srcu_read_lock(&head->srcu); in nvme_ns_head_chr_ioctl()
728 if (is_ctrl_ioctl(cmd)) in nvme_ns_head_chr_ioctl()
729 return nvme_ns_head_ctrl_ioctl(ns, cmd, argp, head, srcu_idx, in nvme_ns_head_chr_ioctl()
732 ret = nvme_ns_ioctl(ns, cmd, argp, 0, open_for_write); in nvme_ns_head_chr_ioctl()
734 srcu_read_unlock(&head->srcu, srcu_idx); in nvme_ns_head_chr_ioctl()
741 struct cdev *cdev = file_inode(ioucmd->file)->i_cdev; in nvme_ns_head_chr_uring_cmd()
743 int srcu_idx = srcu_read_lock(&head->srcu); in nvme_ns_head_chr_uring_cmd()
745 int ret = -EINVAL; in nvme_ns_head_chr_uring_cmd()
749 srcu_read_unlock(&head->srcu, srcu_idx); in nvme_ns_head_chr_uring_cmd()
756 struct nvme_ctrl *ctrl = ioucmd->file->private_data; in nvme_dev_uring_cmd()
761 return -EOPNOTSUPP; in nvme_dev_uring_cmd()
767 switch (ioucmd->cmd_op) { in nvme_dev_uring_cmd()
775 ret = -ENOTTY; in nvme_dev_uring_cmd()
787 down_read(&ctrl->namespaces_rwsem); in nvme_dev_user_cmd()
788 if (list_empty(&ctrl->namespaces)) { in nvme_dev_user_cmd()
789 ret = -ENOTTY; in nvme_dev_user_cmd()
793 ns = list_first_entry(&ctrl->namespaces, struct nvme_ns, list); in nvme_dev_user_cmd()
794 if (ns != list_last_entry(&ctrl->namespaces, struct nvme_ns, list)) { in nvme_dev_user_cmd()
795 dev_warn(ctrl->device, in nvme_dev_user_cmd()
797 ret = -EINVAL; in nvme_dev_user_cmd()
801 dev_warn(ctrl->device, in nvme_dev_user_cmd()
803 kref_get(&ns->kref); in nvme_dev_user_cmd()
804 up_read(&ctrl->namespaces_rwsem); in nvme_dev_user_cmd()
811 up_read(&ctrl->namespaces_rwsem); in nvme_dev_user_cmd()
815 long nvme_dev_ioctl(struct file *file, unsigned int cmd, in nvme_dev_ioctl() argument
818 bool open_for_write = file->f_mode & FMODE_WRITE; in nvme_dev_ioctl()
819 struct nvme_ctrl *ctrl = file->private_data; in nvme_dev_ioctl()
822 switch (cmd) { in nvme_dev_ioctl()
831 return -EACCES; in nvme_dev_ioctl()
832 dev_warn(ctrl->device, "resetting controller\n"); in nvme_dev_ioctl()
836 return -EACCES; in nvme_dev_ioctl()
840 return -EACCES; in nvme_dev_ioctl()
844 return -ENOTTY; in nvme_dev_ioctl()