Skip to content

Commit 8d61ece

Browse files
Ming Leiaxboe
authored andcommitted
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>
1 parent 3035b9b commit 8d61ece

1 file changed

Lines changed: 22 additions & 18 deletions

File tree

drivers/block/ublk_drv.c

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
158163
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;
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

20352036
static 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

Comments
 (0)