@@ -105,8 +105,6 @@ struct ublk_uring_cmd_pdu {
105105 */
106106 struct ublk_queue * ubq ;
107107
108- struct ublk_auto_buf_reg buf ;
109-
110108 u16 tag ;
111109};
112110
@@ -159,7 +157,10 @@ struct ublk_uring_cmd_pdu {
159157
160158struct ublk_io {
161159 /* userspace buffer address from io cmd */
162- __u64 addr ;
160+ union {
161+ __u64 addr ;
162+ struct ublk_auto_buf_reg buf ;
163+ };
163164 unsigned int flags ;
164165 int res ;
165166
@@ -187,8 +188,6 @@ struct ublk_io {
187188 /* Count of buffers registered on task and not yet unregistered */
188189 unsigned task_registered_buffers ;
189190
190- /* auto-registered buffer, valid if UBLK_IO_FLAG_AUTO_BUF_REG is set */
191- u16 buf_index ;
192191 void * buf_ctx_handle ;
193192} ____cacheline_aligned_in_smp ;
194193
@@ -1216,13 +1215,12 @@ ublk_auto_buf_reg_fallback(const struct ublk_queue *ubq, struct ublk_io *io)
12161215static bool ublk_auto_buf_reg (const struct ublk_queue * ubq , struct request * req ,
12171216 struct ublk_io * io , unsigned int issue_flags )
12181217{
1219- struct ublk_uring_cmd_pdu * pdu = ublk_get_uring_cmd_pdu (io -> cmd );
12201218 int ret ;
12211219
12221220 ret = io_buffer_register_bvec (io -> cmd , req , ublk_io_release ,
1223- pdu -> buf .index , issue_flags );
1221+ io -> buf .index , issue_flags );
12241222 if (ret ) {
1225- if (pdu -> buf .flags & UBLK_AUTO_BUF_REG_FALLBACK ) {
1223+ if (io -> buf .flags & UBLK_AUTO_BUF_REG_FALLBACK ) {
12261224 ublk_auto_buf_reg_fallback (ubq , io );
12271225 return true;
12281226 }
@@ -1232,8 +1230,6 @@ static bool ublk_auto_buf_reg(const struct ublk_queue *ubq, struct request *req,
12321230
12331231 io -> task_registered_buffers = 1 ;
12341232 io -> buf_ctx_handle = io_uring_cmd_ctx_handle (io -> cmd );
1235- /* store buffer index in request payload */
1236- io -> buf_index = pdu -> buf .index ;
12371233 io -> flags |= UBLK_IO_FLAG_AUTO_BUF_REG ;
12381234 return true;
12391235}
@@ -2005,16 +2001,14 @@ static inline int ublk_check_cmd_op(u32 cmd_op)
20052001 return 0 ;
20062002}
20072003
2008- static inline int ublk_set_auto_buf_reg (struct io_uring_cmd * cmd )
2004+ static inline int ublk_set_auto_buf_reg (struct ublk_io * io , struct io_uring_cmd * cmd )
20092005{
2010- struct ublk_uring_cmd_pdu * pdu = ublk_get_uring_cmd_pdu (cmd );
2011-
2012- pdu -> buf = ublk_sqe_addr_to_auto_buf_reg (READ_ONCE (cmd -> sqe -> addr ));
2006+ io -> buf = ublk_sqe_addr_to_auto_buf_reg (READ_ONCE (cmd -> sqe -> addr ));
20132007
2014- if (pdu -> buf .reserved0 || pdu -> buf .reserved1 )
2008+ if (io -> buf .reserved0 || io -> buf .reserved1 )
20152009 return - EINVAL ;
20162010
2017- if (pdu -> buf .flags & ~UBLK_AUTO_BUF_REG_F_MASK )
2011+ if (io -> buf .flags & ~UBLK_AUTO_BUF_REG_F_MASK )
20182012 return - EINVAL ;
20192013 return 0 ;
20202014}
@@ -2037,10 +2031,10 @@ static int ublk_handle_auto_buf_reg(struct ublk_io *io,
20372031 * this ublk request gets stuck.
20382032 */
20392033 if (io -> buf_ctx_handle == io_uring_cmd_ctx_handle (cmd ))
2040- * buf_idx = io -> buf_index ;
2034+ * buf_idx = io -> buf . index ;
20412035 }
20422036
2043- return ublk_set_auto_buf_reg (cmd );
2037+ return ublk_set_auto_buf_reg (io , cmd );
20442038}
20452039
20462040/* Once we return, `io->req` can't be used any more */
0 commit comments