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 <lundman@lundman.net>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Alek Pinchuk <apinchuk@axcient.com>
Signed-off-by: Alan Somers <asomers@gmail.com>
Closes #11467
This commit is contained in:
Alan Somers 2021-01-13 09:30:48 -07:00 committed by Brian Behlendorf
parent 83b91ae1a4
commit ec40ce8405
1 changed files with 6 additions and 5 deletions

View File

@ -888,7 +888,7 @@ zpool_read_label(int fd, nvlist_t **config, int *num_labels)
{ {
struct stat64 statbuf; struct stat64 statbuf;
int l, count = 0; int l, count = 0;
vdev_label_t *label; vdev_phys_t *label;
nvlist_t *expected_config = NULL; nvlist_t *expected_config = NULL;
uint64_t expected_guid = 0, size; uint64_t expected_guid = 0, size;
int error; int error;
@ -905,13 +905,14 @@ zpool_read_label(int fd, nvlist_t **config, int *num_labels)
for (l = 0; l < VDEV_LABELS; l++) { for (l = 0; l < VDEV_LABELS; l++) {
uint64_t state, guid, txg; uint64_t state, guid, txg;
off_t offset = label_offset(size, l) + VDEV_SKIP_SIZE;
if (pread64(fd, label, sizeof (vdev_label_t), if (pread64(fd, label, sizeof (vdev_phys_t),
label_offset(size, l)) != sizeof (vdev_label_t)) offset) != sizeof (vdev_phys_t))
continue; continue;
if (nvlist_unpack(label->vl_vdev_phys.vp_nvlist, if (nvlist_unpack(label->vp_nvlist,
sizeof (label->vl_vdev_phys.vp_nvlist), config, 0) != 0) sizeof (label->vp_nvlist), config, 0) != 0)
continue; continue;
if (nvlist_lookup_uint64(*config, ZPOOL_CONFIG_GUID, if (nvlist_lookup_uint64(*config, ZPOOL_CONFIG_GUID,