From ff769d30aa07ca8f26c4902fe71316e425193e43 Mon Sep 17 00:00:00 2001 From: avg Date: Fri, 16 Sep 2011 08:22:48 +0000 Subject: zfstest: rename to zfsboottest and move to tools Approved by: re (kib) MFC after: 1 week --- tools/tools/zfsboottest/Makefile | 23 ++++++ tools/tools/zfsboottest/zfsboottest.c | 144 ++++++++++++++++++++++++++++++++++ 2 files changed, 167 insertions(+) create mode 100644 tools/tools/zfsboottest/Makefile create mode 100644 tools/tools/zfsboottest/zfsboottest.c (limited to 'tools') diff --git a/tools/tools/zfsboottest/Makefile b/tools/tools/zfsboottest/Makefile new file mode 100644 index 0000000..2a6f54d --- /dev/null +++ b/tools/tools/zfsboottest/Makefile @@ -0,0 +1,23 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../../../sys/boot/zfs ${.CURDIR}/../../../sys/cddl/boot/zfs + +PROG= zfsboottest +NO_MAN= + +CFLAGS= -O1 \ + -I${.CURDIR}/../../../sys/boot/zfs \ + -I${.CURDIR}/../../../sys/cddl/boot/zfs \ + -I. \ + -fdiagnostics-show-option \ + -W -Wextra -Wno-sign-compare -Wno-unused-parameter \ + -Werror + +.if ${MACHINE_CPUARCH} == "amd64" +beforedepend zfsboottest.o: machine +CLEANFILES+= machine +machine: + ln -sf ${.CURDIR}/../../../sys/i386/include machine +.endif + +.include diff --git a/tools/tools/zfsboottest/zfsboottest.c b/tools/tools/zfsboottest/zfsboottest.c new file mode 100644 index 0000000..3e32da5 --- /dev/null +++ b/tools/tools/zfsboottest/zfsboottest.c @@ -0,0 +1,144 @@ +/*- + * Copyright (c) 2010 Doug Rabson + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +/* $FreeBSD$ */ +/* + * Compile with 'cc -I. -I../../cddl/boot/zfs zfstest.c -o zfstest' + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define NBBY 8 + +void +pager_output(const char *line) +{ + fprintf(stderr, "%s", line); +} + +#include "zfsimpl.c" + +static int +vdev_read(vdev_t *vdev, void *priv, off_t off, void *buf, size_t bytes) +{ + int fd = *(int *) priv; + + if (pread(fd, buf, bytes, off) != bytes) + return (-1); + return (0); +} + +static int +zfs_read(spa_t *spa, dnode_phys_t *dn, void *buf, size_t size, off_t off) +{ + const znode_phys_t *zp = (const znode_phys_t *) dn->dn_bonus; + size_t n; + int rc; + + n = size; + if (off + n > zp->zp_size) + n = zp->zp_size - off; + + rc = dnode_read(spa, dn, off, buf, n); + if (rc) + return (-rc); + + return (n); +} + +int +main(int argc, char** argv) +{ + char buf[512]; + int fd[100]; + struct stat sb; + dnode_phys_t dn; + spa_t *spa; + int i, n, off; + + zfs_init(); + if (argc == 1) { + static char *av[] = { + "zfstest", "COPYRIGHT", + "/dev/da0p2", "/dev/da1p2", "/dev/da2p2", + NULL, + }; + argc = 5; + argv = av; + } + for (i = 2; i < argc; i++) { + fd[i] = open(argv[i], O_RDONLY); + if (fd[i] < 0) + continue; + if (vdev_probe(vdev_read, &fd[i], NULL) != 0) + close(fd[i]); + } + spa_all_status(); + + spa = STAILQ_FIRST(&zfs_pools); + if (spa == NULL) { + fprintf(stderr, "no pools\n"); + exit(1); + } + + if (zfs_mount_pool(spa)) { + fprintf(stderr, "can't mount pool\n"); + exit(1); + } + + if (zfs_lookup(spa, argv[1], &dn)) { + fprintf(stderr, "can't lookup\n"); + exit(1); + } + + if (zfs_dnode_stat(spa, &dn, &sb)) { + fprintf(stderr, "can't stat\n"); + exit(1); + } + + + off = 0; + do { + n = zfs_read(spa, &dn, buf, 512, off); + if (n < 0) { + fprintf(stderr, "zfs_read failed\n"); + exit(1); + } + write(1, buf, n); + off += n; + } while (off < sb.st_size); + + return (0); +} -- cgit v1.1