summaryrefslogtreecommitdiffstats
path: root/usr.sbin
diff options
context:
space:
mode:
authordelphij <delphij@FreeBSD.org>2015-09-17 20:55:47 +0000
committerdelphij <delphij@FreeBSD.org>2015-09-17 20:55:47 +0000
commit89dceb6a3f2d6adfd62cc825ef458d334e78023f (patch)
tree15a92c5fcdfa03500c34f9112042a57324893b3e /usr.sbin
parentb02391f85f13244faff8a452e699366889c0a28f (diff)
downloadFreeBSD-src-89dceb6a3f2d6adfd62cc825ef458d334e78023f.zip
FreeBSD-src-89dceb6a3f2d6adfd62cc825ef458d334e78023f.tar.gz
Eliminate unneeded copying of vdev data, goto, etc. and add a note
that checksum of vdev label should be checked (which is not done currently). No functional change. While I'm there, raise WARNS to 2. Reviewed by: allanjude MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D3508
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/fstyp/Makefile2
-rw-r--r--usr.sbin/fstyp/zfs.c41
2 files changed, 24 insertions, 19 deletions
diff --git a/usr.sbin/fstyp/Makefile b/usr.sbin/fstyp/Makefile
index 2ef858a..bd981df 100644
--- a/usr.sbin/fstyp/Makefile
+++ b/usr.sbin/fstyp/Makefile
@@ -11,7 +11,7 @@ SRCS += zfs.c
MAN= fstyp.8
-WARNS?= 0
+WARNS?= 2
.include <src.opts.mk>
diff --git a/usr.sbin/fstyp/zfs.c b/usr.sbin/fstyp/zfs.c
index af3965e..1c9ca4d 100644
--- a/usr.sbin/fstyp/zfs.c
+++ b/usr.sbin/fstyp/zfs.c
@@ -1,5 +1,6 @@
/*-
* Copyright (c) 2015 Allan Jude <allanjude@FreeBSD.org>
+ * Copyright (c) 2015 Xin LI <delphij@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -42,29 +43,33 @@ __FBSDID("$FreeBSD$");
int
fstyp_zfs(FILE *fp, char *label, size_t labelsize)
{
- vdev_label_t *zpool_ptr = NULL;
- vdev_label_t zpool_label;
- char *buf = zpool_label.vl_vdev_phys.vp_nvlist;
+ vdev_label_t *vdev_label = NULL;
+ vdev_phys_t *vdev_phys;
char *zpool_name = NULL;
- size_t buflen = sizeof (zpool_label.vl_vdev_phys.vp_nvlist);
nvlist_t *config = NULL;
+ int err = 0;
- zpool_ptr = (vdev_label_t *)read_buf(fp, 0, sizeof(zpool_label));
- if (zpool_ptr == NULL)
+ /*
+ * Read in the first ZFS vdev label ("L0"), located at the beginning
+ * of the vdev and extract the pool name from it.
+ *
+ * TODO: the checksum of label should be validated.
+ */
+ vdev_label = (vdev_label_t *)read_buf(fp, 0, sizeof(*vdev_label));
+ if (vdev_label == NULL)
return (1);
- zpool_label = *zpool_ptr;
- if (nvlist_unpack(buf, buflen, &config, 0) != 0)
- goto zfserr;
- if (nvlist_lookup_string(config, "name", &zpool_name) != 0)
- goto zfserr;
- strlcpy(label, zpool_name, labelsize);
- nvlist_free(config);
- free(zpool_ptr);
- return (0);
-zfserr:
+ vdev_phys = &(vdev_label->vl_vdev_phys);
+
+ if ((nvlist_unpack(vdev_phys->vp_nvlist, sizeof(vdev_phys->vp_nvlist),
+ &config, 0)) == 0 &&
+ (nvlist_lookup_string(config, "name", &zpool_name) == 0)) {
+ strlcpy(label, zpool_name, labelsize);
+ } else
+ err = 1;
+
nvlist_free(config);
- free(zpool_ptr);
+ free(vdev_label);
- return (1);
+ return (err);
}
OpenPOWER on IntegriCloud