summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorToomas Soome <tsoome@me.com>2020-06-26 21:19:32 +0300
committerToomas Soome <tsoome@me.com>2020-06-27 18:13:55 +0300
commit9117d17eb29235fc103fe0fa874b149d3f8a9a0e (patch)
treed052183132b8ec1917132714ff8fa52792dda672 /usr/src
parent9b9e3196fde9c0f47c8cc4ab00f3bc5b539ceaca (diff)
downloadillumos-joyent-9117d17eb29235fc103fe0fa874b149d3f8a9a0e.tar.gz
12901 loader: can not read zfs pool with slog removed
Reviewed by: Yuri Pankov <ypankov@tintri.com> Reviewed by: Patrick Mooney <pmooney@pfmooney.com> Approved by: Robert Mustacchi <rm@fingolfin.org>
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/boot/Makefile.version2
-rw-r--r--usr/src/boot/lib/libstand/zfs/zfsimpl.c14
2 files changed, 13 insertions, 3 deletions
diff --git a/usr/src/boot/Makefile.version b/usr/src/boot/Makefile.version
index f48764b495..190a1148e6 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)-2020.06.10.1
+BOOT_VERSION = $(LOADER_VERSION)-2020.06.26.1
diff --git a/usr/src/boot/lib/libstand/zfs/zfsimpl.c b/usr/src/boot/lib/libstand/zfs/zfsimpl.c
index ce3180d493..4b3d64de60 100644
--- a/usr/src/boot/lib/libstand/zfs/zfsimpl.c
+++ b/usr/src/boot/lib/libstand/zfs/zfsimpl.c
@@ -996,6 +996,13 @@ vdev_disk_read(vdev_t *vdev, const blkptr_t *bp, void *buf,
offset + VDEV_LABEL_START_SIZE, bytes));
}
+static int
+vdev_missing_read(vdev_t *vdev __unused, const blkptr_t *bp __unused,
+ void *buf __unused, off_t offset __unused, size_t bytes __unused)
+{
+
+ return (ENOTSUP);
+}
static int
vdev_mirror_read(vdev_t *vdev, const blkptr_t *bp, void *buf,
@@ -1135,9 +1142,10 @@ vdev_init(uint64_t guid, const unsigned char *nvlist, vdev_t **vdevp)
#endif
memcmp(type, VDEV_TYPE_RAIDZ, len) != 0 &&
memcmp(type, VDEV_TYPE_INDIRECT, len) != 0 &&
- memcmp(type, VDEV_TYPE_REPLACING, len) != 0) {
+ memcmp(type, VDEV_TYPE_REPLACING, len) != 0 &&
+ memcmp(type, VDEV_TYPE_HOLE, len) != 0) {
printf("ZFS: can only boot from disk, mirror, raidz1, "
- "raidz2 and raidz3 vdevs\n");
+ "raidz2 and raidz3 vdevs, got: %.*s\n", len, type);
return (EIO);
}
@@ -1168,6 +1176,8 @@ vdev_init(uint64_t guid, const unsigned char *nvlist, vdev_t **vdevp)
DATA_TYPE_UINT64,
NULL, &vic->vic_prev_indirect_vdev, NULL);
}
+ } else if (memcmp(type, VDEV_TYPE_HOLE, len) == 0) {
+ vdev = vdev_create(guid, vdev_missing_read);
} else {
vdev = vdev_create(guid, vdev_disk_read);
}