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
This commit is contained in:
Xin LI 2015-09-17 20:55:47 +00:00
parent 0a70ef0276
commit 4b43341dea
2 changed files with 25 additions and 20 deletions

View File

@ -11,7 +11,7 @@ SRCS += zfs.c
MAN= fstyp.8
WARNS?= 0
WARNS?= 2
.include <src.opts.mk>

View 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:
nvlist_free(config);
free(zpool_ptr);
vdev_phys = &(vdev_label->vl_vdev_phys);
return (1);
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(vdev_label);
return (err);
}