Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

ublk: add `union ublk_io_buf` with improved naming

Add `union ublk_io_buf` for naming the anonymous union of struct ublk_io's
addr and buf fields, meantime apply it to `struct ublk_io` for storing either
ublk auto buffer register data or ublk server io buffer address.

The union uses clear field names:
- `addr`: for regular ublk server io buffer addresses
- `auto_reg`: for ublk auto buffer registration data

This eliminates confusing access patterns and improves code readability.

Reviewed-by: Caleb Sander Mateos <csander@purestorage.com>
Signed-off-by: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

Ming Lei and committed by
Jens Axboe
8d61ece1 3035b9b4

+22 -18
+22 -18
drivers/block/ublk_drv.c
··· 155 155 */ 156 156 #define UBLK_REFCOUNT_INIT (REFCOUNT_MAX / 2) 157 157 158 + union ublk_io_buf { 159 + __u64 addr; 160 + struct ublk_auto_buf_reg auto_reg; 161 + }; 162 + 158 163 struct 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; 164 165 unsigned int flags; 165 166 int res; 166 167 ··· 499 498 iod->op_flags = ublk_op | ublk_req_build_flags(req); 500 499 iod->nr_sectors = blk_rq_sectors(req); 501 500 iod->start_sector = blk_rq_pos(req); 502 - iod->addr = io->addr; 501 + iod->addr = io->buf.addr; 503 502 504 503 return BLK_STS_OK; 505 504 } ··· 982 981 struct iov_iter iter; 983 982 const int dir = ITER_DEST; 984 983 985 - import_ubuf(dir, u64_to_user_ptr(io->addr), rq_bytes, &iter); 984 + import_ubuf(dir, u64_to_user_ptr(io->buf.addr), rq_bytes, &iter); 986 985 return ublk_copy_user_pages(req, 0, &iter, dir); 987 986 } 988 987 return rq_bytes; ··· 1003 1002 1004 1003 WARN_ON_ONCE(io->res > rq_bytes); 1005 1004 1006 - import_ubuf(dir, u64_to_user_ptr(io->addr), io->res, &iter); 1005 + import_ubuf(dir, u64_to_user_ptr(io->buf.addr), io->res, &iter); 1007 1006 return ublk_copy_user_pages(req, 0, &iter, dir); 1008 1007 } 1009 1008 return rq_bytes; ··· 1069 1068 iod->op_flags = ublk_op | ublk_req_build_flags(req); 1070 1069 iod->nr_sectors = blk_rq_sectors(req); 1071 1070 iod->start_sector = blk_rq_pos(req); 1072 - iod->addr = io->addr; 1071 + iod->addr = io->buf.addr; 1073 1072 1074 1073 return BLK_STS_OK; 1075 1074 } ··· 1183 1182 int ret; 1184 1183 1185 1184 ret = io_buffer_register_bvec(cmd, req, ublk_io_release, 1186 - io->buf.index, issue_flags); 1185 + io->buf.auto_reg.index, issue_flags); 1187 1186 if (ret) { 1188 - if (io->buf.flags & UBLK_AUTO_BUF_REG_FALLBACK) { 1187 + if (io->buf.auto_reg.flags & UBLK_AUTO_BUF_REG_FALLBACK) { 1189 1188 ublk_auto_buf_reg_fallback(ubq, io); 1190 1189 return true; 1191 1190 } ··· 1474 1473 */ 1475 1474 io->flags &= UBLK_IO_FLAG_CANCELED; 1476 1475 io->cmd = NULL; 1477 - io->addr = 0; 1476 + io->buf.addr = 0; 1478 1477 1479 1478 /* 1480 1479 * old task is PF_EXITING, put it now ··· 2035 2034 2036 2035 static inline int ublk_set_auto_buf_reg(struct ublk_io *io, struct io_uring_cmd *cmd) 2037 2036 { 2038 - io->buf = ublk_sqe_addr_to_auto_buf_reg(READ_ONCE(cmd->sqe->addr)); 2037 + struct ublk_auto_buf_reg buf; 2039 2038 2040 - if (io->buf.reserved0 || io->buf.reserved1) 2039 + buf = ublk_sqe_addr_to_auto_buf_reg(READ_ONCE(cmd->sqe->addr)); 2040 + 2041 + if (buf.reserved0 || buf.reserved1) 2041 2042 return -EINVAL; 2042 2043 2043 - if (io->buf.flags & ~UBLK_AUTO_BUF_REG_F_MASK) 2044 + if (buf.flags & ~UBLK_AUTO_BUF_REG_F_MASK) 2044 2045 return -EINVAL; 2046 + io->buf.auto_reg = buf; 2045 2047 return 0; 2046 2048 } 2047 2049 ··· 2066 2062 * this ublk request gets stuck. 2067 2063 */ 2068 2064 if (io->buf_ctx_handle == io_uring_cmd_ctx_handle(cmd)) 2069 - *buf_idx = io->buf.index; 2065 + *buf_idx = io->buf.auto_reg.index; 2070 2066 } 2071 2067 2072 2068 return ublk_set_auto_buf_reg(io, cmd); ··· 2094 2090 if (ublk_dev_support_auto_buf_reg(ub)) 2095 2091 return ublk_handle_auto_buf_reg(io, cmd, buf_idx); 2096 2092 2097 - io->addr = buf_addr; 2093 + io->buf.addr = buf_addr; 2098 2094 return 0; 2099 2095 } 2100 2096 ··· 2291 2287 */ 2292 2288 io->flags &= ~UBLK_IO_FLAG_NEED_GET_DATA; 2293 2289 /* update iod->addr because ublksrv may have passed a new io buffer */ 2294 - ublk_get_iod(ubq, req->tag)->addr = io->addr; 2290 + ublk_get_iod(ubq, req->tag)->addr = io->buf.addr; 2295 2291 pr_devel("%s: update iod->addr: qid %d tag %d io_flags %x addr %llx\n", 2296 2292 __func__, ubq->q_id, req->tag, io->flags, 2297 2293 ublk_get_iod(ubq, req->tag)->addr);