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 <[email protected]>
+ * Copyright (c) 2015 Xin LI <[email protected]>
  * 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);
 }
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to