@@ -114,8 +114,7 @@ static struct request *nvme_alloc_user_request(struct request_queue *q,
114114
115115static int nvme_map_user_request (struct request * req , u64 ubuffer ,
116116 unsigned bufflen , void __user * meta_buffer , unsigned meta_len ,
117- struct io_uring_cmd * ioucmd , unsigned int flags ,
118- unsigned int iou_issue_flags )
117+ struct iov_iter * iter , unsigned int flags )
119118{
120119 struct request_queue * q = req -> q ;
121120 struct nvme_ns * ns = q -> queuedata ;
@@ -129,37 +128,23 @@ static int nvme_map_user_request(struct request *req, u64 ubuffer,
129128 if (!nvme_ctrl_sgl_supported (ctrl ))
130129 dev_warn_once (ctrl -> device , "using unchecked data buffer\n" );
131130 if (has_metadata ) {
132- if (!supports_metadata ) {
133- ret = - EINVAL ;
134- goto out ;
135- }
131+ if (!supports_metadata )
132+ return - EINVAL ;
133+
136134 if (!nvme_ctrl_meta_sgl_supported (ctrl ))
137135 dev_warn_once (ctrl -> device ,
138136 "using unchecked metadata buffer\n" );
139137 }
140138
141- if (ioucmd && (ioucmd -> flags & IORING_URING_CMD_FIXED )) {
142- struct iov_iter iter ;
143-
144- /* fixedbufs is only for non-vectored io */
145- if (WARN_ON_ONCE (flags & NVME_IOCTL_VEC )) {
146- ret = - EINVAL ;
147- goto out ;
148- }
149- ret = io_uring_cmd_import_fixed (ubuffer , bufflen ,
150- rq_data_dir (req ), & iter , ioucmd ,
151- iou_issue_flags );
152- if (ret < 0 )
153- goto out ;
154- ret = blk_rq_map_user_iov (q , req , NULL , & iter , GFP_KERNEL );
155- } else {
139+ if (iter )
140+ ret = blk_rq_map_user_iov (q , req , NULL , iter , GFP_KERNEL );
141+ else
156142 ret = blk_rq_map_user_io (req , NULL , nvme_to_user_ptr (ubuffer ),
157143 bufflen , GFP_KERNEL , flags & NVME_IOCTL_VEC , 0 ,
158144 0 , rq_data_dir (req ));
159- }
160145
161146 if (ret )
162- goto out ;
147+ return ret ;
163148
164149 bio = req -> bio ;
165150 if (bdev )
@@ -176,8 +161,6 @@ static int nvme_map_user_request(struct request *req, u64 ubuffer,
176161out_unmap :
177162 if (bio )
178163 blk_rq_unmap_user (bio );
179- out :
180- blk_mq_free_request (req );
181164 return ret ;
182165}
183166
@@ -200,9 +183,9 @@ static int nvme_submit_user_cmd(struct request_queue *q,
200183 req -> timeout = timeout ;
201184 if (ubuffer && bufflen ) {
202185 ret = nvme_map_user_request (req , ubuffer , bufflen , meta_buffer ,
203- meta_len , NULL , flags , 0 );
186+ meta_len , NULL , flags );
204187 if (ret )
205- return ret ;
188+ goto out_free_req ;
206189 }
207190
208191 bio = req -> bio ;
@@ -218,7 +201,10 @@ static int nvme_submit_user_cmd(struct request_queue *q,
218201
219202 if (effects )
220203 nvme_passthru_end (ctrl , ns , effects , cmd , ret );
204+ return ret ;
221205
206+ out_free_req :
207+ blk_mq_free_request (req );
222208 return ret ;
223209}
224210
@@ -469,6 +455,8 @@ static int nvme_uring_cmd_io(struct nvme_ctrl *ctrl, struct nvme_ns *ns,
469455 struct request_queue * q = ns ? ns -> queue : ctrl -> admin_q ;
470456 struct nvme_uring_data d ;
471457 struct nvme_command c ;
458+ struct iov_iter iter ;
459+ struct iov_iter * map_iter = NULL ;
472460 struct request * req ;
473461 blk_opf_t rq_flags = REQ_ALLOC_CACHE ;
474462 blk_mq_req_flags_t blk_flags = 0 ;
@@ -504,6 +492,20 @@ static int nvme_uring_cmd_io(struct nvme_ctrl *ctrl, struct nvme_ns *ns,
504492 d .metadata_len = READ_ONCE (cmd -> metadata_len );
505493 d .timeout_ms = READ_ONCE (cmd -> timeout_ms );
506494
495+ if (d .data_len && (ioucmd -> flags & IORING_URING_CMD_FIXED )) {
496+ /* fixedbufs is only for non-vectored io */
497+ if (vec )
498+ return - EINVAL ;
499+
500+ ret = io_uring_cmd_import_fixed (d .addr , d .data_len ,
501+ nvme_is_write (& c ) ? WRITE : READ , & iter , ioucmd ,
502+ issue_flags );
503+ if (ret < 0 )
504+ return ret ;
505+
506+ map_iter = & iter ;
507+ }
508+
507509 if (issue_flags & IO_URING_F_NONBLOCK ) {
508510 rq_flags |= REQ_NOWAIT ;
509511 blk_flags = BLK_MQ_REQ_NOWAIT ;
@@ -517,11 +519,11 @@ static int nvme_uring_cmd_io(struct nvme_ctrl *ctrl, struct nvme_ns *ns,
517519 req -> timeout = d .timeout_ms ? msecs_to_jiffies (d .timeout_ms ) : 0 ;
518520
519521 if (d .data_len ) {
520- ret = nvme_map_user_request (req , d .addr ,
521- d . data_len , nvme_to_user_ptr (d .metadata ),
522- d . metadata_len , ioucmd , vec , issue_flags );
522+ ret = nvme_map_user_request (req , d .addr , d . data_len ,
523+ nvme_to_user_ptr (d .metadata ), d . metadata_len ,
524+ map_iter , vec );
523525 if (ret )
524- return ret ;
526+ goto out_free_req ;
525527 }
526528
527529 /* to free bio on completion, as req->bio will be null at that time */
@@ -531,6 +533,10 @@ static int nvme_uring_cmd_io(struct nvme_ctrl *ctrl, struct nvme_ns *ns,
531533 req -> end_io = nvme_uring_cmd_end_io ;
532534 blk_execute_rq_nowait (req , false);
533535 return - EIOCBQUEUED ;
536+
537+ out_free_req :
538+ blk_mq_free_request (req );
539+ return ret ;
534540}
535541
536542static bool is_ctrl_ioctl (unsigned int cmd )
0 commit comments