svn commit: r287937 - head/usr.sbin/fstyp
Xin LI
delphij at FreeBSD.org
Thu Sep 17 20:55:48 UTC 2015
Author: delphij
Date: Thu Sep 17 20:55:47 2015
New Revision: 287937
URL: https://svnweb.freebsd.org/changeset/base/287937
Log:
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
Modified:
head/usr.sbin/fstyp/Makefile
head/usr.sbin/fstyp/zfs.c
Modified: head/usr.sbin/fstyp/Makefile
==============================================================================
--- head/usr.sbin/fstyp/Makefile Thu Sep 17 20:48:42 2015 (r287936)
+++ head/usr.sbin/fstyp/Makefile Thu Sep 17 20:55:47 2015 (r287937)
@@ -11,7 +11,7 @@ SRCS += zfs.c
MAN= fstyp.8
-WARNS?= 0
+WARNS?= 2
.include <src.opts.mk>
Modified: head/usr.sbin/fstyp/zfs.c
==============================================================================
--- head/usr.sbin/fstyp/zfs.c Thu Sep 17 20:48:42 2015 (r287936)
+++ head/usr.sbin/fstyp/zfs.c Thu Sep 17 20:55:47 2015 (r287937)
@@ -1,5 +1,6 @@
/*-
* Copyright (c) 2015 Allan Jude <allanjude at FreeBSD.org>
+ * Copyright (c) 2015 Xin LI <delphij at 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);
}
More information about the svn-src-head
mailing list