]> xenbits.xensource.com Git - people/julieng/freebsd.git/commitdiff
Eliminate unneeded copying of vdev data, goto, etc. and add a note
authordelphij <delphij@FreeBSD.org>
Thu, 17 Sep 2015 20:55:47 +0000 (20:55 +0000)
committerdelphij <delphij@FreeBSD.org>
Thu, 17 Sep 2015 20:55:47 +0000 (20:55 +0000)
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

usr.sbin/fstyp/Makefile
usr.sbin/fstyp/zfs.c

index 2ef858abea243606feda137b7fda53efa7bbdd7f..bd981df8e9a33c3700a159527673806ceb247658 100644 (file)
@@ -11,7 +11,7 @@ SRCS +=       zfs.c
 
 MAN=   fstyp.8
 
-WARNS?=        0
+WARNS?=        2
 
 .include <src.opts.mk>
 
index af3965ec04766d81c69e7b0e8ec968fda1760187..1c9ca4d52f7d558e1c2601f25d0a213e819ad0d7 100644 (file)
@@ -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);
 }