summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/fs/zfs/dsl_scan.c
diff options
context:
space:
mode:
authorPaul Dagnelie <pcd@delphix.com>2020-01-03 21:55:31 +0000
committerDan McDonald <danmcd@joyent.com>2020-01-06 14:44:07 -0500
commitbfb9edc9bd178b0ce7fa2fbe1fc66e18e316af4e (patch)
treeee8adf4224d3efff7ad6c5667cd3616adf0fa9ca /usr/src/uts/common/fs/zfs/dsl_scan.c
parentda9bf00574dd2845efcb9b791f4b44ecf1d1548c (diff)
downloadillumos-joyent-bfb9edc9bd178b0ce7fa2fbe1fc66e18e316af4e.tar.gz
12143 scan code should check the return value of zfs_btree_first
Portions contributed by: Kody Kantor <kody.kantor@joyent.com> Reviewed by: Sara Hartse <sara.hartse@delphix.com> Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed by: Matt Ahrens <matt@delphix.com> Reviewed by: Jason King <jason.king@joyent.com> Reviewed by: Toomas Soome <tsoome@me.com> Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com> Approved by: Dan McDonald <danmcd@joyent.com>
Diffstat (limited to 'usr/src/uts/common/fs/zfs/dsl_scan.c')
-rw-r--r--usr/src/uts/common/fs/zfs/dsl_scan.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/usr/src/uts/common/fs/zfs/dsl_scan.c b/usr/src/uts/common/fs/zfs/dsl_scan.c
index 81c7d599a4..b619719ba9 100644
--- a/usr/src/uts/common/fs/zfs/dsl_scan.c
+++ b/usr/src/uts/common/fs/zfs/dsl_scan.c
@@ -2848,13 +2848,23 @@ scan_io_queue_fetch_ext(dsl_scan_io_queue_t *queue)
if (zfs_scan_issue_strategy == 1) {
return (range_tree_first(rt));
} else if (zfs_scan_issue_strategy == 2) {
+ /*
+ * We need to get the original entry in the by_addr
+ * tree so we can modify it.
+ */
range_seg_t *size_rs =
zfs_btree_first(&queue->q_exts_by_size, NULL);
+ if (size_rs == NULL)
+ return (NULL);
uint64_t start = rs_get_start(size_rs, rt);
uint64_t size = rs_get_end(size_rs, rt) - start;
range_seg_t *addr_rs = range_tree_find(rt, start,
size);
ASSERT3P(addr_rs, !=, NULL);
+ ASSERT3U(rs_get_start(size_rs, rt), ==,
+ rs_get_start(addr_rs, rt));
+ ASSERT3U(rs_get_end(size_rs, rt), ==,
+ rs_get_end(addr_rs, rt));
return (addr_rs);
}
}
@@ -2871,12 +2881,21 @@ scan_io_queue_fetch_ext(dsl_scan_io_queue_t *queue)
if (scn->scn_checkpointing) {
return (range_tree_first(rt));
} else if (scn->scn_clearing) {
+ /*
+ * We need to get the original entry in the by_addr
+ * tree so we can modify it.
+ */
range_seg_t *size_rs = zfs_btree_first(&queue->q_exts_by_size,
NULL);
+ if (size_rs == NULL)
+ return (NULL);
uint64_t start = rs_get_start(size_rs, rt);
uint64_t size = rs_get_end(size_rs, rt) - start;
range_seg_t *addr_rs = range_tree_find(rt, start, size);
ASSERT3P(addr_rs, !=, NULL);
+ ASSERT3U(rs_get_start(size_rs, rt), ==, rs_get_start(addr_rs,
+ rt));
+ ASSERT3U(rs_get_end(size_rs, rt), ==, rs_get_end(addr_rs, rt));
return (addr_rs);
} else {
return (NULL);