summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason King <jason.king@joyent.com>2020-02-15 05:13:52 +0000
committerJason King <jason.king@joyent.com>2020-04-09 18:44:25 +0000
commit6c1a52e525d0ea5fb9d14658a3df5bbb615a4329 (patch)
tree3df9404a4220e7f5adc48b140c79a336fc1b5827
parent8039bb9bfdd139f72275fafaa7280ee016d8e548 (diff)
downloadillumos-joyent-6c1a52e525d0ea5fb9d14658a3df5bbb615a4329.tar.gz
Fix so things are using byte units not blocks
-rw-r--r--usr/src/uts/common/io/vioblk/vioblk.c5
-rw-r--r--usr/src/uts/common/os/dkioc_free_util.c31
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;