io_u: fix offset calculation in randtrimwrite
authorJungwon Lee <jjung1.lee@samsung.com>
Thu, 26 Jun 2025 05:10:25 +0000 (14:10 +0900)
committerMinwoo Im <minwoo.im@samsung.com>
Sun, 29 Jun 2025 23:19:37 +0000 (08:19 +0900)
For randtrimwrite, we should issue trim + write pair and those offsets
should be same.

This works good for cases without `offset=` option, but not for cases
with `offset=` option.  In cases with `offset=` option, it's necessary
to subtract `file_offset`, which is value of `offset=` option, when
calculationg offset of write.

This is a bit confusing because `last_start` is an actual offset that
has already been issued through trim.  However, `last_start` is the
value to which `file_offset` is added.  Since we add back `file_offset`
later on after calling `get_next_block` in `get_next_offset`,
`last_start` should be adjusted.

Signed-off-by: Jungwon Lee <jjung1.lee@samsung.com>
Signed-off-by: Minwoo Im <minwoo.im@samsung.com>
[+ updated commit title]

io_u.c

diff --git a/io_u.c b/io_u.c
index 70a1183794c53e6274f4de7f852737f0746e9a70..360bd774dd6f7d886d2ad587ed86c918e64a8559 100644 (file)
--- a/io_u.c
+++ b/io_u.c
@@ -431,7 +431,7 @@ static int get_next_block(struct thread_data *td, struct io_u *io_u,
        if (td_randtrimwrite(td) && ddir == DDIR_WRITE) {
                /* don't mark randommap for these writes */
                io_u_set(td, io_u, IO_U_F_BUSY_OK);
-               offset = f->last_start[DDIR_TRIM];
+               offset = f->last_start[DDIR_TRIM] - f->file_offset;
                *is_random = true;
                ret = 0;
        } else if (rw_seq) {