Commit 7b7fdb8e authored by Christoph Hellwig's avatar Christoph Hellwig

nvme: replace the "bool vec" arguments with flags in the ioctl path

To prepare for passing down more information, replace the boolean
vec argument with a more extensible flags one.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarKeith Busch <kbusch@kernel.org>
Reviewed-by: default avatarKanchan Joshi <joshi.k@samsung.com>
Reviewed-by: default avatarChaitanya Kulkarni <kch@nvidia.com>
parent 2fa1dc86
...@@ -8,6 +8,10 @@ ...@@ -8,6 +8,10 @@
#include <linux/io_uring.h> #include <linux/io_uring.h>
#include "nvme.h" #include "nvme.h"
enum {
NVME_IOCTL_VEC = (1 << 0),
};
static bool nvme_cmd_allowed(struct nvme_ns *ns, struct nvme_command *c, static bool nvme_cmd_allowed(struct nvme_ns *ns, struct nvme_command *c,
fmode_t mode) fmode_t mode)
{ {
...@@ -150,7 +154,7 @@ static struct request *nvme_alloc_user_request(struct request_queue *q, ...@@ -150,7 +154,7 @@ static struct request *nvme_alloc_user_request(struct request_queue *q,
static int nvme_map_user_request(struct request *req, u64 ubuffer, static int nvme_map_user_request(struct request *req, u64 ubuffer,
unsigned bufflen, void __user *meta_buffer, unsigned meta_len, unsigned bufflen, void __user *meta_buffer, unsigned meta_len,
u32 meta_seed, void **metap, struct io_uring_cmd *ioucmd, u32 meta_seed, void **metap, struct io_uring_cmd *ioucmd,
bool vec) unsigned int flags)
{ {
struct request_queue *q = req->q; struct request_queue *q = req->q;
struct nvme_ns *ns = q->queuedata; struct nvme_ns *ns = q->queuedata;
...@@ -163,7 +167,7 @@ static int nvme_map_user_request(struct request *req, u64 ubuffer, ...@@ -163,7 +167,7 @@ static int nvme_map_user_request(struct request *req, u64 ubuffer,
struct iov_iter iter; struct iov_iter iter;
/* fixedbufs is only for non-vectored io */ /* fixedbufs is only for non-vectored io */
if (WARN_ON_ONCE(vec)) if (WARN_ON_ONCE(flags & NVME_IOCTL_VEC))
return -EINVAL; return -EINVAL;
ret = io_uring_cmd_import_fixed(ubuffer, bufflen, ret = io_uring_cmd_import_fixed(ubuffer, bufflen,
rq_data_dir(req), &iter, ioucmd); rq_data_dir(req), &iter, ioucmd);
...@@ -172,8 +176,8 @@ static int nvme_map_user_request(struct request *req, u64 ubuffer, ...@@ -172,8 +176,8 @@ static int nvme_map_user_request(struct request *req, u64 ubuffer,
ret = blk_rq_map_user_iov(q, req, NULL, &iter, GFP_KERNEL); ret = blk_rq_map_user_iov(q, req, NULL, &iter, GFP_KERNEL);
} else { } else {
ret = blk_rq_map_user_io(req, NULL, nvme_to_user_ptr(ubuffer), ret = blk_rq_map_user_io(req, NULL, nvme_to_user_ptr(ubuffer),
bufflen, GFP_KERNEL, vec, 0, 0, bufflen, GFP_KERNEL, flags & NVME_IOCTL_VEC, 0,
rq_data_dir(req)); 0, rq_data_dir(req));
} }
if (ret) if (ret)
...@@ -203,9 +207,9 @@ static int nvme_map_user_request(struct request *req, u64 ubuffer, ...@@ -203,9 +207,9 @@ static int nvme_map_user_request(struct request *req, u64 ubuffer,
} }
static int nvme_submit_user_cmd(struct request_queue *q, static int nvme_submit_user_cmd(struct request_queue *q,
struct nvme_command *cmd, u64 ubuffer, struct nvme_command *cmd, u64 ubuffer, unsigned bufflen,
unsigned bufflen, void __user *meta_buffer, unsigned meta_len, void __user *meta_buffer, unsigned meta_len, u32 meta_seed,
u32 meta_seed, u64 *result, unsigned timeout, bool vec) u64 *result, unsigned timeout, unsigned int flags)
{ {
struct nvme_ctrl *ctrl; struct nvme_ctrl *ctrl;
struct request *req; struct request *req;
...@@ -221,7 +225,7 @@ static int nvme_submit_user_cmd(struct request_queue *q, ...@@ -221,7 +225,7 @@ static int nvme_submit_user_cmd(struct request_queue *q,
req->timeout = timeout; req->timeout = timeout;
if (ubuffer && bufflen) { if (ubuffer && bufflen) {
ret = nvme_map_user_request(req, ubuffer, bufflen, meta_buffer, ret = nvme_map_user_request(req, ubuffer, bufflen, meta_buffer,
meta_len, meta_seed, &meta, NULL, vec); meta_len, meta_seed, &meta, NULL, flags);
if (ret) if (ret)
return ret; return ret;
} }
...@@ -304,10 +308,8 @@ static int nvme_submit_io(struct nvme_ns *ns, struct nvme_user_io __user *uio) ...@@ -304,10 +308,8 @@ static int nvme_submit_io(struct nvme_ns *ns, struct nvme_user_io __user *uio)
c.rw.apptag = cpu_to_le16(io.apptag); c.rw.apptag = cpu_to_le16(io.apptag);
c.rw.appmask = cpu_to_le16(io.appmask); c.rw.appmask = cpu_to_le16(io.appmask);
return nvme_submit_user_cmd(ns->queue, &c, return nvme_submit_user_cmd(ns->queue, &c, io.addr, length, metadata,
io.addr, length, meta_len, lower_32_bits(io.slba), NULL, 0, 0);
metadata, meta_len, lower_32_bits(io.slba), NULL, 0,
false);
} }
static bool nvme_validate_passthru_nsid(struct nvme_ctrl *ctrl, static bool nvme_validate_passthru_nsid(struct nvme_ctrl *ctrl,
...@@ -360,9 +362,8 @@ static int nvme_user_cmd(struct nvme_ctrl *ctrl, struct nvme_ns *ns, ...@@ -360,9 +362,8 @@ static int nvme_user_cmd(struct nvme_ctrl *ctrl, struct nvme_ns *ns,
timeout = msecs_to_jiffies(cmd.timeout_ms); timeout = msecs_to_jiffies(cmd.timeout_ms);
status = nvme_submit_user_cmd(ns ? ns->queue : ctrl->admin_q, &c, status = nvme_submit_user_cmd(ns ? ns->queue : ctrl->admin_q, &c,
cmd.addr, cmd.data_len, cmd.addr, cmd.data_len, nvme_to_user_ptr(cmd.metadata),
nvme_to_user_ptr(cmd.metadata), cmd.metadata_len, cmd.metadata_len, 0, &result, timeout, 0);
0, &result, timeout, false);
if (status >= 0) { if (status >= 0) {
if (put_user(result, &ucmd->result)) if (put_user(result, &ucmd->result))
...@@ -373,8 +374,8 @@ static int nvme_user_cmd(struct nvme_ctrl *ctrl, struct nvme_ns *ns, ...@@ -373,8 +374,8 @@ static int nvme_user_cmd(struct nvme_ctrl *ctrl, struct nvme_ns *ns,
} }
static int nvme_user_cmd64(struct nvme_ctrl *ctrl, struct nvme_ns *ns, static int nvme_user_cmd64(struct nvme_ctrl *ctrl, struct nvme_ns *ns,
struct nvme_passthru_cmd64 __user *ucmd, bool vec, struct nvme_passthru_cmd64 __user *ucmd, unsigned int flags,
fmode_t mode) fmode_t mode)
{ {
struct nvme_passthru_cmd64 cmd; struct nvme_passthru_cmd64 cmd;
struct nvme_command c; struct nvme_command c;
...@@ -408,9 +409,8 @@ static int nvme_user_cmd64(struct nvme_ctrl *ctrl, struct nvme_ns *ns, ...@@ -408,9 +409,8 @@ static int nvme_user_cmd64(struct nvme_ctrl *ctrl, struct nvme_ns *ns,
timeout = msecs_to_jiffies(cmd.timeout_ms); timeout = msecs_to_jiffies(cmd.timeout_ms);
status = nvme_submit_user_cmd(ns ? ns->queue : ctrl->admin_q, &c, status = nvme_submit_user_cmd(ns ? ns->queue : ctrl->admin_q, &c,
cmd.addr, cmd.data_len, cmd.addr, cmd.data_len, nvme_to_user_ptr(cmd.metadata),
nvme_to_user_ptr(cmd.metadata), cmd.metadata_len, cmd.metadata_len, 0, &cmd.result, timeout, flags);
0, &cmd.result, timeout, vec);
if (status >= 0) { if (status >= 0) {
if (put_user(cmd.result, &ucmd->result)) if (put_user(cmd.result, &ucmd->result))
...@@ -643,7 +643,7 @@ static int nvme_ctrl_ioctl(struct nvme_ctrl *ctrl, unsigned int cmd, ...@@ -643,7 +643,7 @@ static int nvme_ctrl_ioctl(struct nvme_ctrl *ctrl, unsigned int cmd,
case NVME_IOCTL_ADMIN_CMD: case NVME_IOCTL_ADMIN_CMD:
return nvme_user_cmd(ctrl, NULL, argp, mode); return nvme_user_cmd(ctrl, NULL, argp, mode);
case NVME_IOCTL_ADMIN64_CMD: case NVME_IOCTL_ADMIN64_CMD:
return nvme_user_cmd64(ctrl, NULL, argp, false, mode); return nvme_user_cmd64(ctrl, NULL, argp, 0, mode);
default: default:
return sed_ioctl(ctrl->opal_dev, cmd, argp); return sed_ioctl(ctrl->opal_dev, cmd, argp);
} }
...@@ -670,6 +670,8 @@ struct nvme_user_io32 { ...@@ -670,6 +670,8 @@ struct nvme_user_io32 {
static int nvme_ns_ioctl(struct nvme_ns *ns, unsigned int cmd, static int nvme_ns_ioctl(struct nvme_ns *ns, unsigned int cmd,
void __user *argp, fmode_t mode) void __user *argp, fmode_t mode)
{ {
unsigned int flags = 0;
switch (cmd) { switch (cmd) {
case NVME_IOCTL_ID: case NVME_IOCTL_ID:
force_successful_syscall_return(); force_successful_syscall_return();
...@@ -686,10 +688,11 @@ static int nvme_ns_ioctl(struct nvme_ns *ns, unsigned int cmd, ...@@ -686,10 +688,11 @@ static int nvme_ns_ioctl(struct nvme_ns *ns, unsigned int cmd,
#endif #endif
case NVME_IOCTL_SUBMIT_IO: case NVME_IOCTL_SUBMIT_IO:
return nvme_submit_io(ns, argp); return nvme_submit_io(ns, argp);
case NVME_IOCTL_IO64_CMD:
return nvme_user_cmd64(ns->ctrl, ns, argp, false, mode);
case NVME_IOCTL_IO64_CMD_VEC: case NVME_IOCTL_IO64_CMD_VEC:
return nvme_user_cmd64(ns->ctrl, ns, argp, true, mode); flags |= NVME_IOCTL_VEC;
fallthrough;
case NVME_IOCTL_IO64_CMD:
return nvme_user_cmd64(ns->ctrl, ns, argp, flags, mode);
default: default:
return -ENOTTY; return -ENOTTY;
} }
...@@ -962,7 +965,7 @@ long nvme_dev_ioctl(struct file *file, unsigned int cmd, ...@@ -962,7 +965,7 @@ long nvme_dev_ioctl(struct file *file, unsigned int cmd,
case NVME_IOCTL_ADMIN_CMD: case NVME_IOCTL_ADMIN_CMD:
return nvme_user_cmd(ctrl, NULL, argp, file->f_mode); return nvme_user_cmd(ctrl, NULL, argp, file->f_mode);
case NVME_IOCTL_ADMIN64_CMD: case NVME_IOCTL_ADMIN64_CMD:
return nvme_user_cmd64(ctrl, NULL, argp, false, file->f_mode); return nvme_user_cmd64(ctrl, NULL, argp, 0, file->f_mode);
case NVME_IOCTL_IO_CMD: case NVME_IOCTL_IO_CMD:
return nvme_dev_user_cmd(ctrl, argp, file->f_mode); return nvme_dev_user_cmd(ctrl, argp, file->f_mode);
case NVME_IOCTL_RESET: case NVME_IOCTL_RESET:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment