summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr/src/boot/Makefile.version2
-rw-r--r--usr/src/boot/lib/libstand/zfs/zfsimpl.c27
2 files changed, 23 insertions, 6 deletions
diff --git a/usr/src/boot/Makefile.version b/usr/src/boot/Makefile.version
index 612360ac32..30e5014dea 100644
--- a/usr/src/boot/Makefile.version
+++ b/usr/src/boot/Makefile.version
@@ -33,4 +33,4 @@ LOADER_VERSION = 1.1
# Use date like formatting here, YYYY.MM.DD.XX, without leading zeroes.
# The version is processed from left to right, the version number can only
# be increased.
-BOOT_VERSION = $(LOADER_VERSION)-2019.10.19.1
+BOOT_VERSION = $(LOADER_VERSION)-2019.10.26.1
diff --git a/usr/src/boot/lib/libstand/zfs/zfsimpl.c b/usr/src/boot/lib/libstand/zfs/zfsimpl.c
index 458fc1ec1e..9958d5ea4b 100644
--- a/usr/src/boot/lib/libstand/zfs/zfsimpl.c
+++ b/usr/src/boot/lib/libstand/zfs/zfsimpl.c
@@ -838,12 +838,17 @@ vdev_indirect_remap(vdev_t *vd, uint64_t offset, uint64_t asize, void *arg)
list_t stack;
spa_t *spa = vd->spa;
zio_t *zio = arg;
+ remap_segment_t *rs;
list_create(&stack, sizeof (remap_segment_t),
offsetof(remap_segment_t, rs_node));
- for (remap_segment_t *rs = rs_alloc(vd, offset, asize, 0);
- rs != NULL; rs = list_remove_head(&stack)) {
+ rs = rs_alloc(vd, offset, asize, 0);
+ if (rs == NULL) {
+ printf("vdev_indirect_remap: out of memory.\n");
+ zio->io_error = ENOMEM;
+ }
+ for ( ; rs != NULL; rs = list_remove_head(&stack)) {
vdev_t *v = rs->rs_vd;
uint64_t num_entries = 0;
/* vdev_indirect_mapping_t *vim = v->v_mapping; */
@@ -851,6 +856,9 @@ vdev_indirect_remap(vdev_t *vd, uint64_t offset, uint64_t asize, void *arg)
vdev_indirect_mapping_duplicate_adjacent_entries(v,
rs->rs_offset, rs->rs_asize, &num_entries);
+ if (num_entries == 0)
+ zio->io_error = ENOMEM;
+
for (uint64_t i = 0; i < num_entries; i++) {
vdev_indirect_mapping_entry_phys_t *m = &mapping[i];
uint64_t size = DVA_GET_ASIZE(&m->vimep_dst);
@@ -863,9 +871,18 @@ vdev_indirect_remap(vdev_t *vd, uint64_t offset, uint64_t asize, void *arg)
vdev_t *dst_v = vdev_lookup_top(spa, dst_vdev);
if (dst_v->v_read == vdev_indirect_read) {
- list_insert_head(&stack,
- rs_alloc(dst_v, dst_offset + inner_offset,
- inner_size, rs->rs_split_offset));
+ remap_segment_t *o;
+
+ o = rs_alloc(dst_v, dst_offset + inner_offset,
+ inner_size, rs->rs_split_offset);
+ if (o == NULL) {
+ printf("vdev_indirect_remap: "
+ "out of memory.\n");
+ zio->io_error = ENOMEM;
+ break;
+ }
+
+ list_insert_head(&stack, o);
}
vdev_indirect_gather_splits(rs->rs_split_offset, dst_v,
dst_offset + inner_offset,