summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorAlan Somers <[email protected]>2021-01-13 09:30:48 -0700
committerBrian Behlendorf <[email protected]>2021-01-21 11:18:32 -0800
commitec40ce84058628ca943d5fe5328d8a1df8198616 (patch)
tree179086e6c6d1658c7faa8b77f17a72188c8f0803 /lib
parent83b91ae1a4faeaa720dc93a7660b755a04632f68 (diff)
libzutil: don't read extraneous data in zpool_read_label
zpool_read_label doesn't need the full labels including uberblocks. It only needs the vdev_phys_t. This reduces by half the amount of data read to check for a label, speeding up "zpool import", "zpool labelclear", etc. Originally committed as https://cgit.freebsd.org/src/commit/?id=63f8025d6acab1b334373ddd33f940a69b3b54cc Obtained from: FreeBSD Sponsored by: Spectra Logic Corp, Axcient Reviewed-by: Jorgen Lundman <[email protected]> Reviewed-by: Brian Behlendorf <[email protected]> Reviewed-by: Alek Pinchuk <[email protected]> Signed-off-by: Alan Somers <[email protected]> Closes #11467
Diffstat (limited to 'lib')
-rw-r--r--lib/libzutil/zutil_import.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/lib/libzutil/zutil_import.c b/lib/libzutil/zutil_import.c
index 3a1827294..bf914d37c 100644
--- a/lib/libzutil/zutil_import.c
+++ b/lib/libzutil/zutil_import.c
@@ -888,7 +888,7 @@ zpool_read_label(int fd, nvlist_t **config, int *num_labels)
{
struct stat64 statbuf;
int l, count = 0;
- vdev_label_t *label;
+ vdev_phys_t *label;
nvlist_t *expected_config = NULL;
uint64_t expected_guid = 0, size;
int error;
@@ -905,13 +905,14 @@ zpool_read_label(int fd, nvlist_t **config, int *num_labels)
for (l = 0; l < VDEV_LABELS; l++) {
uint64_t state, guid, txg;
+ off_t offset = label_offset(size, l) + VDEV_SKIP_SIZE;
- if (pread64(fd, label, sizeof (vdev_label_t),
- label_offset(size, l)) != sizeof (vdev_label_t))
+ if (pread64(fd, label, sizeof (vdev_phys_t),
+ offset) != sizeof (vdev_phys_t))
continue;
- if (nvlist_unpack(label->vl_vdev_phys.vp_nvlist,
- sizeof (label->vl_vdev_phys.vp_nvlist), config, 0) != 0)
+ if (nvlist_unpack(label->vp_nvlist,
+ sizeof (label->vp_nvlist), config, 0) != 0)
continue;
if (nvlist_lookup_uint64(*config, ZPOOL_CONFIG_GUID,