zfsboottest.c revision 225529
1210650Sdfr/*-
2210650Sdfr * Copyright (c) 2010 Doug Rabson
3210650Sdfr * All rights reserved.
4210650Sdfr *
5210650Sdfr * Redistribution and use in source and binary forms, with or without
6210650Sdfr * modification, are permitted provided that the following conditions
7210650Sdfr * are met:
8210650Sdfr * 1. Redistributions of source code must retain the above copyright
9210650Sdfr *    notice, this list of conditions and the following disclaimer.
10210650Sdfr * 2. Redistributions in binary form must reproduce the above copyright
11210650Sdfr *    notice, this list of conditions and the following disclaimer in the
12210650Sdfr *    documentation and/or other materials provided with the distribution.
13210650Sdfr *
14210650Sdfr * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15210650Sdfr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16210650Sdfr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17210650Sdfr * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18210650Sdfr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19210650Sdfr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20210650Sdfr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21210650Sdfr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22210650Sdfr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23210650Sdfr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24210650Sdfr * SUCH DAMAGE.
25210650Sdfr */
26210650Sdfr/* $FreeBSD: head/sys/boot/zfs/zfstest.c 225529 2011-09-13 14:01:35Z avg $ */
27210650Sdfr/*
28210650Sdfr * Compile with 'cc -I. -I../../cddl/boot/zfs zfstest.c -o zfstest'
29210650Sdfr */
30210650Sdfr
31210650Sdfr#include <sys/param.h>
32210650Sdfr#include <sys/queue.h>
33225529Savg#include <errno.h>
34210650Sdfr#include <fcntl.h>
35210650Sdfr#include <stdint.h>
36210650Sdfr#include <stdio.h>
37210650Sdfr#include <string.h>
38210650Sdfr#include <stdarg.h>
39210650Sdfr#include <stddef.h>
40210650Sdfr#include <stdlib.h>
41225529Savg#include <unistd.h>
42210650Sdfr
43210650Sdfr#define NBBY 8
44210650Sdfr
45210650Sdfrvoid
46210650Sdfrpager_output(const char *line)
47210650Sdfr{
48225529Savg	fprintf(stderr, "%s", line);
49210650Sdfr}
50210650Sdfr
51210650Sdfr#include "zfsimpl.c"
52210650Sdfr
53210650Sdfrstatic int
54210650Sdfrvdev_read(vdev_t *vdev, void *priv, off_t off, void *buf, size_t bytes)
55210650Sdfr{
56210650Sdfr	int fd = *(int *) priv;
57210650Sdfr
58210650Sdfr	if (pread(fd, buf, bytes, off) != bytes)
59225529Savg		return (-1);
60225529Savg	return (0);
61210650Sdfr}
62210650Sdfr
63210650Sdfrstatic int
64210650Sdfrzfs_read(spa_t *spa, dnode_phys_t *dn, void *buf, size_t size, off_t off)
65210650Sdfr{
66210650Sdfr	const znode_phys_t *zp = (const znode_phys_t *) dn->dn_bonus;
67210650Sdfr	size_t n;
68210650Sdfr	int rc;
69210650Sdfr
70210650Sdfr	n = size;
71210650Sdfr	if (off + n > zp->zp_size)
72210650Sdfr		n = zp->zp_size - off;
73225529Savg
74210650Sdfr	rc = dnode_read(spa, dn, off, buf, n);
75210650Sdfr	if (rc)
76225529Savg		return (-rc);
77210650Sdfr
78210650Sdfr	return (n);
79210650Sdfr}
80210650Sdfr
81210650Sdfrint
82210650Sdfrmain(int argc, char** argv)
83210650Sdfr{
84225529Savg	char buf[512];
85225529Savg	int fd[100];
86225529Savg	struct stat sb;
87225529Savg	dnode_phys_t dn;
88225529Savg	spa_t *spa;
89210650Sdfr	int i, n, off;
90210650Sdfr
91210650Sdfr	zfs_init();
92210650Sdfr	if (argc == 1) {
93210650Sdfr		static char *av[] = {
94225529Savg			"zfstest", "COPYRIGHT",
95225529Savg			"/dev/da0p2", "/dev/da1p2", "/dev/da2p2",
96210650Sdfr			NULL,
97210650Sdfr		};
98225529Savg		argc = 5;
99210650Sdfr		argv = av;
100210650Sdfr	}
101225529Savg	for (i = 2; i < argc; i++) {
102210650Sdfr		fd[i] = open(argv[i], O_RDONLY);
103210650Sdfr		if (fd[i] < 0)
104210650Sdfr			continue;
105210650Sdfr		if (vdev_probe(vdev_read, &fd[i], NULL) != 0)
106210650Sdfr			close(fd[i]);
107210650Sdfr	}
108210650Sdfr	spa_all_status();
109210650Sdfr
110210650Sdfr	spa = STAILQ_FIRST(&zfs_pools);
111225529Savg	if (spa == NULL) {
112225529Savg		fprintf(stderr, "no pools\n");
113210650Sdfr		exit(1);
114225529Savg	}
115210650Sdfr
116225529Savg	if (zfs_mount_pool(spa)) {
117225529Savg		fprintf(stderr, "can't mount pool\n");
118210650Sdfr		exit(1);
119225529Savg	}
120210650Sdfr
121225529Savg	if (zfs_lookup(spa, argv[1], &dn)) {
122225529Savg		fprintf(stderr, "can't lookup\n");
123225529Savg		exit(1);
124225529Savg	}
125225529Savg
126225529Savg	if (zfs_dnode_stat(spa, &dn, &sb)) {
127225529Savg		fprintf(stderr, "can't stat\n");
128225529Savg		exit(1);
129225529Savg	}
130225529Savg
131225529Savg
132210650Sdfr	off = 0;
133210650Sdfr	do {
134210650Sdfr		n = zfs_read(spa, &dn, buf, 512, off);
135225529Savg		if (n < 0) {
136225529Savg			fprintf(stderr, "zfs_read failed\n");
137225529Savg			exit(1);
138225529Savg		}
139210650Sdfr		write(1, buf, n);
140210650Sdfr		off += n;
141225529Savg	} while (off < sb.st_size);
142225529Savg
143225529Savg	return (0);
144210650Sdfr}
145