diff options
author | Alan Somers <[email protected]> | 2021-01-13 09:30:48 -0700 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2021-01-21 11:18:32 -0800 |
commit | ec40ce84058628ca943d5fe5328d8a1df8198616 (patch) | |
tree | 179086e6c6d1658c7faa8b77f17a72188c8f0803 /lib | |
parent | 83b91ae1a4faeaa720dc93a7660b755a04632f68 (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.c | 11 |
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, |