@@ -155,12 +155,13 @@ struct ublk_uring_cmd_pdu {
155155 */
156156#define UBLK_REFCOUNT_INIT (REFCOUNT_MAX / 2)
157157
158+ union ublk_io_buf {
159+ __u64 addr ;
160+ struct ublk_auto_buf_reg auto_reg ;
161+ };
162+
158163struct ublk_io {
159- /* userspace buffer address from io cmd */
160- union {
161- __u64 addr ;
162- struct ublk_auto_buf_reg buf ;
163- };
164+ union ublk_io_buf buf ;
164165 unsigned int flags ;
165166 int res ;
166167
@@ -498,7 +499,7 @@ static blk_status_t ublk_setup_iod_zoned(struct ublk_queue *ubq,
498499 iod -> op_flags = ublk_op | ublk_req_build_flags (req );
499500 iod -> nr_sectors = blk_rq_sectors (req );
500501 iod -> start_sector = blk_rq_pos (req );
501- iod -> addr = io -> addr ;
502+ iod -> addr = io -> buf . addr ;
502503
503504 return BLK_STS_OK ;
504505}
@@ -981,7 +982,7 @@ static unsigned int ublk_map_io(const struct ublk_queue *ubq,
981982 struct iov_iter iter ;
982983 const int dir = ITER_DEST ;
983984
984- import_ubuf (dir , u64_to_user_ptr (io -> addr ), rq_bytes , & iter );
985+ import_ubuf (dir , u64_to_user_ptr (io -> buf . addr ), rq_bytes , & iter );
985986 return ublk_copy_user_pages (req , 0 , & iter , dir );
986987 }
987988 return rq_bytes ;
@@ -1002,7 +1003,7 @@ static unsigned int ublk_unmap_io(bool need_map,
10021003
10031004 WARN_ON_ONCE (io -> res > rq_bytes );
10041005
1005- import_ubuf (dir , u64_to_user_ptr (io -> addr ), io -> res , & iter );
1006+ import_ubuf (dir , u64_to_user_ptr (io -> buf . addr ), io -> res , & iter );
10061007 return ublk_copy_user_pages (req , 0 , & iter , dir );
10071008 }
10081009 return rq_bytes ;
@@ -1068,7 +1069,7 @@ static blk_status_t ublk_setup_iod(struct ublk_queue *ubq, struct request *req)
10681069 iod -> op_flags = ublk_op | ublk_req_build_flags (req );
10691070 iod -> nr_sectors = blk_rq_sectors (req );
10701071 iod -> start_sector = blk_rq_pos (req );
1071- iod -> addr = io -> addr ;
1072+ iod -> addr = io -> buf . addr ;
10721073
10731074 return BLK_STS_OK ;
10741075}
@@ -1182,9 +1183,9 @@ static bool ublk_auto_buf_reg(const struct ublk_queue *ubq, struct request *req,
11821183 int ret ;
11831184
11841185 ret = io_buffer_register_bvec (cmd , req , ublk_io_release ,
1185- io -> buf .index , issue_flags );
1186+ io -> buf .auto_reg . index , issue_flags );
11861187 if (ret ) {
1187- if (io -> buf .flags & UBLK_AUTO_BUF_REG_FALLBACK ) {
1188+ if (io -> buf .auto_reg . flags & UBLK_AUTO_BUF_REG_FALLBACK ) {
11881189 ublk_auto_buf_reg_fallback (ubq , io );
11891190 return true;
11901191 }
@@ -1473,7 +1474,7 @@ static void ublk_queue_reinit(struct ublk_device *ub, struct ublk_queue *ubq)
14731474 */
14741475 io -> flags &= UBLK_IO_FLAG_CANCELED ;
14751476 io -> cmd = NULL ;
1476- io -> addr = 0 ;
1477+ io -> buf . addr = 0 ;
14771478
14781479 /*
14791480 * old task is PF_EXITING, put it now
@@ -2034,13 +2035,16 @@ static inline int ublk_check_cmd_op(u32 cmd_op)
20342035
20352036static inline int ublk_set_auto_buf_reg (struct ublk_io * io , struct io_uring_cmd * cmd )
20362037{
2037- io -> buf = ublk_sqe_addr_to_auto_buf_reg (READ_ONCE (cmd -> sqe -> addr ));
2038+ struct ublk_auto_buf_reg buf ;
2039+
2040+ buf = ublk_sqe_addr_to_auto_buf_reg (READ_ONCE (cmd -> sqe -> addr ));
20382041
2039- if (io -> buf .reserved0 || io -> buf .reserved1 )
2042+ if (buf .reserved0 || buf .reserved1 )
20402043 return - EINVAL ;
20412044
2042- if (io -> buf .flags & ~UBLK_AUTO_BUF_REG_F_MASK )
2045+ if (buf .flags & ~UBLK_AUTO_BUF_REG_F_MASK )
20432046 return - EINVAL ;
2047+ io -> buf .auto_reg = buf ;
20442048 return 0 ;
20452049}
20462050
@@ -2062,7 +2066,7 @@ static int ublk_handle_auto_buf_reg(struct ublk_io *io,
20622066 * this ublk request gets stuck.
20632067 */
20642068 if (io -> buf_ctx_handle == io_uring_cmd_ctx_handle (cmd ))
2065- * buf_idx = io -> buf .index ;
2069+ * buf_idx = io -> buf .auto_reg . index ;
20662070 }
20672071
20682072 return ublk_set_auto_buf_reg (io , cmd );
@@ -2090,7 +2094,7 @@ ublk_config_io_buf(const struct ublk_device *ub, struct ublk_io *io,
20902094 if (ublk_dev_support_auto_buf_reg (ub ))
20912095 return ublk_handle_auto_buf_reg (io , cmd , buf_idx );
20922096
2093- io -> addr = buf_addr ;
2097+ io -> buf . addr = buf_addr ;
20942098 return 0 ;
20952099}
20962100
@@ -2287,7 +2291,7 @@ static bool ublk_get_data(const struct ublk_queue *ubq, struct ublk_io *io,
22872291 */
22882292 io -> flags &= ~UBLK_IO_FLAG_NEED_GET_DATA ;
22892293 /* update iod->addr because ublksrv may have passed a new io buffer */
2290- ublk_get_iod (ubq , req -> tag )-> addr = io -> addr ;
2294+ ublk_get_iod (ubq , req -> tag )-> addr = io -> buf . addr ;
22912295 pr_devel ("%s: update iod->addr: qid %d tag %d io_flags %x addr %llx\n" ,
22922296 __func__ , ubq -> q_id , req -> tag , io -> flags ,
22932297 ublk_get_iod (ubq , req -> tag )-> addr );
0 commit comments