diff options
author | Jason King <jason.king@joyent.com> | 2020-02-15 05:13:52 +0000 |
---|---|---|
committer | Jason King <jason.king@joyent.com> | 2020-04-09 18:44:25 +0000 |
commit | 6c1a52e525d0ea5fb9d14658a3df5bbb615a4329 (patch) | |
tree | 3df9404a4220e7f5adc48b140c79a336fc1b5827 | |
parent | 8039bb9bfdd139f72275fafaa7280ee016d8e548 (diff) | |
download | illumos-joyent-6c1a52e525d0ea5fb9d14658a3df5bbb615a4329.tar.gz |
Fix so things are using byte units not blocks
-rw-r--r-- | usr/src/uts/common/io/vioblk/vioblk.c | 5 | ||||
-rw-r--r-- | usr/src/uts/common/os/dkioc_free_util.c | 31 |
2 files changed, 19 insertions, 17 deletions
diff --git a/usr/src/uts/common/io/vioblk/vioblk.c b/usr/src/uts/common/io/vioblk/vioblk.c index fd5b4541b8..63b1b5fcc9 100644 --- a/usr/src/uts/common/io/vioblk/vioblk.c +++ b/usr/src/uts/common/io/vioblk/vioblk.c @@ -92,7 +92,6 @@ #include "virtio.h" #include "vioblk.h" - static void vioblk_get_id(vioblk_t *); uint_t vioblk_int_handler(caddr_t, caddr_t); static uint_t vioblk_poll(vioblk_t *); @@ -640,8 +639,8 @@ vioblk_free_exts(const dkioc_free_list_ext_t *exts, size_t n_exts, for (i = 0; i < n_exts; i++, exts++, wzp++) { struct vioblk_discard_write_zeroes vdwz = { - .vdwz_sector = exts->dfle_start, - .vdwz_num_sectors = exts->dfle_length, + .vdwz_sector = exts->dfle_start >> DEV_BSHIFT, + .vdwz_num_sectors = exts->dfle_length >> DEV_BSHIFT, }; bcopy(&vdwz, wzp, sizeof (*wzp)); diff --git a/usr/src/uts/common/os/dkioc_free_util.c b/usr/src/uts/common/os/dkioc_free_util.c index 2dfb4289d4..c70a0207dc 100644 --- a/usr/src/uts/common/os/dkioc_free_util.c +++ b/usr/src/uts/common/os/dkioc_free_util.c @@ -11,7 +11,7 @@ /* * Copyright 2017 Nexenta Inc. All rights reserved. - * Copyright 2019 Joyent, Inc. + * Copyright 2020 Joyent, Inc. */ /* needed when building libzpool */ @@ -198,9 +198,11 @@ dfl_iter(const dkioc_free_list_t *dfl, const dkioc_free_align_t *dfa, earg.ea_exts = exts; /* - * Run through all the extents, calling func as the limits for - * each request are reached. The final request remains queued - * when ext_iter() returns. + * Iterate through all the extents. process_exts() will group the + * exts into acceptable chunks for 'func' and then call 'func' + * and increment earg.ea_exts. The final chunk of earg.ea_exts + * will _not_ be processed when ext_iter returns, so we call + * process_exts() on final time after ext_iter() returns. */ r = ext_iter(dfl, dfa, bshift, process_exts, &earg); if (r != 0) @@ -259,13 +261,13 @@ process_exts(const dkioc_free_list_ext_t *ext, boolean_t newreq, void *arg) } /* - * Translate the byte offset and lengths in ext into block offsets and - * lengths, with the offset aligned per dfla. + * Set *startp and *lengthp to the actual _byte_ offset and lengths + * after adjusting for dfl->dfl_offset, the starting alignment, and + * the block size requirements. */ static int ext_xlate(const dkioc_free_list_t *dfl, const dkioc_free_list_ext_t *ext, - const dkioc_free_align_t *dfa, uint_t bshift, uint64_t *startp, - uint64_t *lengthp) + const dkioc_free_align_t *dfa, uint64_t *startp, uint64_t *lengthp) { uint64_t start = dfl->dfl_offset + ext->dfle_start; uint64_t end = start + ext->dfle_length; @@ -275,8 +277,8 @@ ext_xlate(const dkioc_free_list_t *dfl, const dkioc_free_list_ext_t *ext, if (end < start || end < ext->dfle_length) return (SET_ERROR(EOVERFLOW)); - start = P2ROUNDUP(start, dfa->dfa_align) >> bshift; - end = P2ALIGN(end, dfa->dfa_bsize) >> bshift; + start = P2ROUNDUP(start, dfa->dfa_align); + end = P2ALIGN(end, dfa->dfa_bsize); *startp = start; *lengthp = (end > start) ? end - start : 0; @@ -303,7 +305,7 @@ ext_iter(const dkioc_free_list_t *dfl, const dkioc_free_align_t *dfa, uint64_t start, length; int r; - r = ext_xlate(dfl, ext, dfa, bshift, &start, &length); + r = ext_xlate(dfl, ext, dfa, &start, &length); if (r != 0) return (r); @@ -312,6 +314,7 @@ ext_iter(const dkioc_free_list_t *dfl, const dkioc_free_align_t *dfa, .dfle_start = start, .dfle_length = length }; + uint64_t len_blk = length >> bshift; if (dfa->dfa_max_ext > 0 && n_exts + 1 > dfa->dfa_max_ext) { @@ -326,7 +329,7 @@ ext_iter(const dkioc_free_list_t *dfl, const dkioc_free_align_t *dfa, } if (dfa->dfa_max_blocks > 0 && - n_blk + length > dfa->dfa_max_blocks) { + n_blk + len_blk > dfa->dfa_max_blocks) { /* * This extent puts us over the max # of * blocks in a request. If this isn't a @@ -349,7 +352,7 @@ ext_iter(const dkioc_free_list_t *dfl, const dkioc_free_align_t *dfa, */ blk_ext.dfle_length = P2ALIGN(dfa->dfa_max_blocks, - dfa->dfa_align >> bshift); + dfa->dfa_align); } r = fn(&blk_ext, newreq, arg); @@ -359,7 +362,7 @@ ext_iter(const dkioc_free_list_t *dfl, const dkioc_free_align_t *dfa, newreq = B_FALSE; n_exts++; - n_blk += blk_ext.dfle_length; + n_blk += len_blk; length -= blk_ext.dfle_length; start += blk_ext.dfle_length; |