Skip to content

Commit cd683de

Browse files
calebsanderkeithbusch
authored andcommitted
nvme/ioctl: move blk_mq_free_request() out of nvme_map_user_request()
The callers of nvme_map_user_request() (nvme_submit_user_cmd() and nvme_uring_cmd_io()) allocate the request, so have them free it if nvme_map_user_request() fails. Signed-off-by: Caleb Sander Mateos <csander@purestorage.com> Reviewed-by: Jens Axboe <axboe@kernel.dk> Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com> Signed-off-by: Keith Busch <kbusch@kernel.org>
1 parent eada754 commit cd683de

File tree

1 file changed

+17
-14
lines changed

1 file changed

+17
-14
lines changed

drivers/nvme/host/ioctl.c

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -129,10 +129,9 @@ static int nvme_map_user_request(struct request *req, u64 ubuffer,
129129
if (!nvme_ctrl_sgl_supported(ctrl))
130130
dev_warn_once(ctrl->device, "using unchecked data buffer\n");
131131
if (has_metadata) {
132-
if (!supports_metadata) {
133-
ret = -EINVAL;
134-
goto out;
135-
}
132+
if (!supports_metadata)
133+
return -EINVAL;
134+
136135
if (!nvme_ctrl_meta_sgl_supported(ctrl))
137136
dev_warn_once(ctrl->device,
138137
"using unchecked metadata buffer\n");
@@ -142,15 +141,14 @@ static int nvme_map_user_request(struct request *req, u64 ubuffer,
142141
struct iov_iter iter;
143142

144143
/* fixedbufs is only for non-vectored io */
145-
if (flags & NVME_IOCTL_VEC) {
146-
ret = -EINVAL;
147-
goto out;
148-
}
144+
if (flags & NVME_IOCTL_VEC)
145+
return -EINVAL;
146+
149147
ret = io_uring_cmd_import_fixed(ubuffer, bufflen,
150148
rq_data_dir(req), &iter, ioucmd,
151149
iou_issue_flags);
152150
if (ret < 0)
153-
goto out;
151+
return ret;
154152
ret = blk_rq_map_user_iov(q, req, NULL, &iter, GFP_KERNEL);
155153
} else {
156154
ret = blk_rq_map_user_io(req, NULL, nvme_to_user_ptr(ubuffer),
@@ -159,7 +157,7 @@ static int nvme_map_user_request(struct request *req, u64 ubuffer,
159157
}
160158

161159
if (ret)
162-
goto out;
160+
return ret;
163161

164162
bio = req->bio;
165163
if (bdev)
@@ -176,8 +174,6 @@ static int nvme_map_user_request(struct request *req, u64 ubuffer,
176174
out_unmap:
177175
if (bio)
178176
blk_rq_unmap_user(bio);
179-
out:
180-
blk_mq_free_request(req);
181177
return ret;
182178
}
183179

@@ -202,7 +198,7 @@ static int nvme_submit_user_cmd(struct request_queue *q,
202198
ret = nvme_map_user_request(req, ubuffer, bufflen, meta_buffer,
203199
meta_len, NULL, flags, 0);
204200
if (ret)
205-
return ret;
201+
goto out_free_req;
206202
}
207203

208204
bio = req->bio;
@@ -218,7 +214,10 @@ static int nvme_submit_user_cmd(struct request_queue *q,
218214

219215
if (effects)
220216
nvme_passthru_end(ctrl, ns, effects, cmd, ret);
217+
return ret;
221218

219+
out_free_req:
220+
blk_mq_free_request(req);
222221
return ret;
223222
}
224223

@@ -521,7 +520,7 @@ static int nvme_uring_cmd_io(struct nvme_ctrl *ctrl, struct nvme_ns *ns,
521520
d.data_len, nvme_to_user_ptr(d.metadata),
522521
d.metadata_len, ioucmd, vec, issue_flags);
523522
if (ret)
524-
return ret;
523+
goto out_free_req;
525524
}
526525

527526
/* to free bio on completion, as req->bio will be null at that time */
@@ -531,6 +530,10 @@ static int nvme_uring_cmd_io(struct nvme_ctrl *ctrl, struct nvme_ns *ns,
531530
req->end_io = nvme_uring_cmd_end_io;
532531
blk_execute_rq_nowait(req, false);
533532
return -EIOCBQUEUED;
533+
534+
out_free_req:
535+
blk_mq_free_request(req);
536+
return ret;
534537
}
535538

536539
static bool is_ctrl_ioctl(unsigned int cmd)

0 commit comments

Comments
 (0)