1b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o/*
2b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o * tst_bitmaps.c
3b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o *
4b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o * Copyright (C) 2011 Theodore Ts'o.
5b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o *
6b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o * %Begin-Header%
7b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o * This file may be redistributed under the terms of the GNU Library
8b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o * General Public License, version 2.
9b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o * %End-Header%
10b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o */
11b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
12b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o#include "config.h"
13b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o#include <unistd.h>
14b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o#include <stdlib.h>
15b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o#include <stdio.h>
16b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o#ifdef HAVE_GETOPT_H
17b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o#include <getopt.h>
18b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o#endif
19b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o#include <string.h>
20b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o#include <fcntl.h>
21b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o#include <time.h>
22b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o#include <sys/stat.h>
23b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o#include <sys/types.h>
24b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o#include "ss/ss.h"
25b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
26b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o#include "ext2_fs.h"
27b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o#include "ext2fs.h"
28b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o#include "ext2fsP.h"
29b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
30b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'oextern ss_request_table tst_bitmaps_cmds;
31b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
32b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'ostatic char subsystem_name[] = "tst_bitmaps";
33b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'ostatic char version[] = "1.0";
34b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
35b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'oext2_filsys	test_fs;
36b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'oint		exit_status = 0;
37b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
38b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'ostatic int source_file(const char *cmd_file, int sci_idx)
39b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o{
40b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	FILE		*f;
41b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	char		buf[256];
42b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	char		*cp;
43b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	int		retval;
44b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	int 		noecho;
45b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
46b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (strcmp(cmd_file, "-") == 0)
47b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		f = stdin;
48b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	else {
49b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		f = fopen(cmd_file, "r");
50b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		if (!f) {
51b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			perror(cmd_file);
52b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			exit(1);
53b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		}
54b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	}
55b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	fflush(stdout);
56b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	fflush(stderr);
57b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	setbuf(stdout, NULL);
58b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	setbuf(stderr, NULL);
59b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	while (!feof(f)) {
60b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		if (fgets(buf, sizeof(buf), f) == NULL)
61b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			break;
62b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		if (buf[0] == '#')
63b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			continue;
64b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		noecho = 0;
65b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		if (buf[0] == '-') {
66b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			noecho = 1;
67b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			buf[0] = ' ';
68b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		}
69b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		cp = strchr(buf, '\n');
70b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		if (cp)
71b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			*cp = 0;
72b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		cp = strchr(buf, '\r');
73b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		if (cp)
74b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			*cp = 0;
75b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		if (!noecho)
76b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			printf("%s: %s\n", subsystem_name, buf);
77b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		retval = ss_execute_line(sci_idx, buf);
78b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		if (retval) {
79b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			ss_perror(sci_idx, retval, buf);
80b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			exit_status++;
81b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		}
82b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	}
83b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	return exit_status;
84b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o}
85b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
86b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
87b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o/*
88b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o * This function resets the libc getopt() function, which keeps
89b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o * internal state.  Bad design!  Stupid libc API designers!  No
90b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o * biscuit!
91b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o *
92b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o * BSD-derived getopt() functions require that optind be reset to 1 in
93b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o * order to reset getopt() state.  This used to be generally accepted
94b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o * way of resetting getopt().  However, glibc's getopt()
95b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o * has additional getopt() state beyond optind, and requires that
96b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o * optind be set zero to reset its state.  So the unfortunate state of
97b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o * affairs is that BSD-derived versions of getopt() misbehave if
98b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o * optind is set to 0 in order to reset getopt(), and glibc's getopt()
99b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o * will core dump if optind is set 1 in order to reset getopt().
100b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o *
101b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o * More modern versions of BSD require that optreset be set to 1 in
102b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o * order to reset getopt().   Sigh.  Standards, anyone?
103b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o *
104b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o * We hide the hair here.
105b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o */
106b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'ovoid reset_getopt(void)
107b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o{
108b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o#if defined(__GLIBC__) || defined(__linux__)
109b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	optind = 0;
110b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o#else
111b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	optind = 1;
112b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o#endif
113b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o#ifdef HAVE_OPTRESET
114b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	optreset = 1;		/* Makes BSD getopt happy */
115b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o#endif
116b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o}
117b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
118b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o/*
119b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o * This function will convert a string to an unsigned long, printing
120b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o * an error message if it fails, and returning success or failure in err.
121b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o */
122b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'ounsigned long parse_ulong(const char *str, const char *cmd,
123b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			  const char *descr, int *err)
124b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o{
125b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	char		*tmp;
126b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	unsigned long	ret;
127b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
128b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	ret = strtoul(str, &tmp, 0);
129b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (*tmp == 0) {
130b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		if (err)
131b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			*err = 0;
132b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return ret;
133b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	}
134b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	com_err(cmd, 0, "Bad %s - %s", descr, str);
135b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (err)
136b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		*err = 1;
137b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	else
138b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		exit(1);
139b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	return 0;
140b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o}
141b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
142b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
143b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'oint check_fs_open(char *name)
144b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o{
145b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (!test_fs) {
146b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		com_err(name, 0, "Filesystem not open");
147b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return 1;
148b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	}
149b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	return 0;
150b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o}
151b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
152b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'ostatic void setup_filesystem(const char *name,
153b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			     unsigned int blocks, unsigned int inodes,
15446f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o			     unsigned int type, int flags)
155b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o{
156b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	struct ext2_super_block param;
157b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	errcode_t retval;
158b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
159b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	memset(&param, 0, sizeof(param));
160b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	ext2fs_blocks_count_set(&param, blocks);
161b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	param.s_inodes_count = inodes;
162b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
16346f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	retval = ext2fs_initialize("test fs", flags, &param,
164b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o				   test_io_manager, &test_fs);
165b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
166b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (retval) {
167b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		com_err(name, retval, "while initializing filesystem");
168b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
169b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	}
170b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	test_fs->default_bitmap_type = type;
171b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	ext2fs_free_block_bitmap(test_fs->block_map);
172b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	test_fs->block_map = 0;
173b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	ext2fs_free_inode_bitmap(test_fs->inode_map);
174b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	test_fs->inode_map = 0;
175b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	retval = ext2fs_allocate_block_bitmap(test_fs, "block bitmap",
176b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o					      &test_fs->block_map);
177b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (retval) {
178b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		com_err(name, retval, "while allocating block bitmap");
179b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		goto errout;
180b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	}
181b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	retval = ext2fs_allocate_inode_bitmap(test_fs, "inode bitmap",
182b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o					      &test_fs->inode_map);
183b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (retval) {
184b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		com_err(name, retval, "while allocating inode bitmap");
185b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		goto errout;
186b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	}
187b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	return;
188b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
189b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'oerrout:
19047fee2ef6a23ae06f680336ffde57caa64604a4cLukas Czerner	ext2fs_close_free(&test_fs);
191b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o}
192b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
193b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'ovoid setup_cmd(int argc, char **argv)
194b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o{
19500eb0eee0addfd3b7ede98b85e00dff1547838a0Andreas Dilger	int		c, err;
196b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	unsigned int	blocks = 128;
197b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	unsigned int	inodes = 0;
198b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	unsigned int	type = EXT2FS_BMAP64_BITARRAY;
19946f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	int		flags = EXT2_FLAG_64BITS;
200b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
20147fee2ef6a23ae06f680336ffde57caa64604a4cLukas Czerner	if (test_fs)
20247fee2ef6a23ae06f680336ffde57caa64604a4cLukas Czerner		ext2fs_close_free(&test_fs);
203b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
204b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	reset_getopt();
20546f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	while ((c = getopt(argc, argv, "b:i:lt:")) != EOF) {
206b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		switch (c) {
207b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		case 'b':
208b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			blocks = parse_ulong(optarg, argv[0],
209b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o					     "number of blocks", &err);
210b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			if (err)
211b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o				return;
212b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			break;
213b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		case 'i':
214b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			inodes = parse_ulong(optarg, argv[0],
215b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o					     "number of blocks", &err);
216b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			if (err)
217b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o				return;
218b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			break;
21946f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o		case 'l':	/* Legacy bitmaps */
22046f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o			flags = 0;
22146f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o			break;
222b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		case 't':
223b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			type = parse_ulong(optarg, argv[0],
224b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o					   "bitmap backend type", &err);
225b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			if (err)
226b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o				return;
227b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			break;
228b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		default:
229b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			fprintf(stderr, "%s: usage: setup [-b blocks] "
230b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o				"[-i inodes] [-t type]\n", argv[0]);
231b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			return;
232b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		}
233b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	}
23446f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	setup_filesystem(argv[0], blocks, inodes, type, flags);
235b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o}
236b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
237b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'ovoid close_cmd(int argc, char **argv)
238b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o{
239b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (check_fs_open(argv[0]))
240b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
241b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
24247fee2ef6a23ae06f680336ffde57caa64604a4cLukas Czerner	ext2fs_close_free(&test_fs);
243b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o}
244b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
245b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
246b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'ovoid dump_bitmap(ext2fs_generic_bitmap bmap, unsigned int start, unsigned num)
247b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o{
248b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	unsigned char	*buf;
249b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	errcode_t	retval;
250b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	int		i, len = (num - start + 7) / 8;
251b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
252b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	buf = malloc(len);
253b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (!buf) {
254b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		com_err("dump_bitmap", 0, "couldn't allocate buffer");
255b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
256b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	}
257b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	memset(buf, 0, len);
258b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	retval = ext2fs_get_generic_bmap_range(bmap, (__u64) start, num, buf);
259b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (retval) {
260b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		com_err("dump_bitmap", retval,
261b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			"while calling ext2fs_generic_bmap_range");
262b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		free(buf);
263b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
264b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	}
265b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	for (i=0; i < len; i++)
266b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		printf("%02x", buf[i]);
267b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	printf("\n");
268c6b006ea6c9fec7f3f33347a52efc396063bcd26Theodore Ts'o	printf("bits set: %u\n", ext2fs_bitcount(buf, len));
269b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	free(buf);
270b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o}
271b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
272b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'ovoid dump_inode_bitmap_cmd(int argc, char **argv)
273b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o{
274b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (check_fs_open(argv[0]))
275b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
276b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
277b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	printf("inode bitmap: ");
278b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	dump_bitmap(test_fs->inode_map, 1, test_fs->super->s_inodes_count);
279b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o}
280b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
281b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'ovoid dump_block_bitmap_cmd(int argc, char **argv)
282b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o{
283b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (check_fs_open(argv[0]))
284b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
285b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
286b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	printf("block bitmap: ");
287b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	dump_bitmap(test_fs->block_map, test_fs->super->s_first_data_block,
288b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		    test_fs->super->s_blocks_count);
289b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o}
290b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
291b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'ovoid do_setb(int argc, char *argv[])
292b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o{
293b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	unsigned int block, num;
294b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	int err;
295b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	int test_result, op_result;
296b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
297b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (check_fs_open(argv[0]))
298b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
299b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
300b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (argc != 2 && argc != 3) {
301b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		com_err(argv[0], 0, "Usage: setb <block> [num]");
302b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
303b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	}
304b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
305b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	block = parse_ulong(argv[1], argv[0], "block", &err);
306b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (err)
307b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
308b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
309b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (argc == 3) {
310b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		num = parse_ulong(argv[2], argv[0], "num", &err);
311b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		if (err)
312b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			return;
313b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
314b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		ext2fs_mark_block_bitmap_range2(test_fs->block_map,
315b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o						block, num);
316b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		printf("Marking blocks %u to %u\n", block, block + num - 1);
317b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
318b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	}
319b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
320b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	test_result = ext2fs_test_block_bitmap2(test_fs->block_map, block);
321b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	op_result = ext2fs_mark_block_bitmap2(test_fs->block_map, block);
322b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	printf("Setting block %u, was %s before\n", block, op_result ?
323b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	       "set" : "clear");
324b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (!test_result != !op_result)
325b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		com_err(argv[0], 0, "*ERROR* test_result different! (%d, %d)",
326b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			test_result, op_result);
327b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o}
328b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
329b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'ovoid do_clearb(int argc, char *argv[])
330b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o{
331b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	unsigned int block, num;
332b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	int err;
333b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	int test_result, op_result;
334b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
335b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (check_fs_open(argv[0]))
336b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
337b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
338b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (argc != 2 && argc != 3) {
339b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		com_err(argv[0], 0, "Usage: clearb <block> [num]");
340b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
341b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	}
342b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
343b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	block = parse_ulong(argv[1], argv[0], "block", &err);
344b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (err)
345b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
346b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
347b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (argc == 3) {
348b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		num = parse_ulong(argv[2], argv[0], "num", &err);
349b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		if (err)
350b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			return;
351b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
352b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		ext2fs_unmark_block_bitmap_range2(test_fs->block_map,
353b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o						block, num);
354b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		printf("Clearing blocks %u to %u\n", block, block + num - 1);
355b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
356b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	}
357b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
358b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	test_result = ext2fs_test_block_bitmap2(test_fs->block_map, block);
359b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	op_result = ext2fs_unmark_block_bitmap2(test_fs->block_map, block);
360b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	printf("Clearing block %u, was %s before\n", block, op_result ?
361b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	       "set" : "clear");
362b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (!test_result != !op_result)
363b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		com_err(argv[0], 0, "*ERROR* test_result different! (%d, %d)",
364b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			test_result, op_result);
365b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o}
366b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
367b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'ovoid do_testb(int argc, char *argv[])
368b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o{
369b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	unsigned int block, num;
370b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	int err;
37100eb0eee0addfd3b7ede98b85e00dff1547838a0Andreas Dilger	int test_result;
372b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
373b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (check_fs_open(argv[0]))
374b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
375b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
376b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (argc != 2 && argc != 3) {
377b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		com_err(argv[0], 0, "Usage: testb <block> [num]");
378b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
379b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	}
380b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
381b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	block = parse_ulong(argv[1], argv[0], "block", &err);
382b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (err)
383b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
384b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
385b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (argc == 3) {
386b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		num = parse_ulong(argv[2], argv[0], "num", &err);
387b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		if (err)
388b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			return;
389b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
390b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		test_result =
391b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			ext2fs_test_block_bitmap_range2(test_fs->block_map,
392b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o							block, num);
393b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		printf("Blocks %u to %u are %sall clear.\n",
394b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		       block, block + num - 1, test_result ? "" : "NOT ");
395b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
396b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	}
397b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
398b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	test_result = ext2fs_test_block_bitmap2(test_fs->block_map, block);
399b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	printf("Block %u is %s\n", block, test_result ? "set" : "clear");
400b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o}
401b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
40246f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'ovoid do_ffzb(int argc, char *argv[])
40346f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o{
40446f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	unsigned int start, end;
40546f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	int err;
40646f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	errcode_t retval;
40746f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	blk64_t out;
40846f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o
40946f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	if (check_fs_open(argv[0]))
41046f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o		return;
41146f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o
41246f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	if (argc != 3 && argc != 3) {
41346f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o		com_err(argv[0], 0, "Usage: ffzb <start> <end>");
41446f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o		return;
41546f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	}
41646f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o
41746f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	start = parse_ulong(argv[1], argv[0], "start", &err);
41846f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	if (err)
41946f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o		return;
42046f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o
42146f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	end = parse_ulong(argv[2], argv[0], "end", &err);
42246f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	if (err)
42346f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o		return;
42446f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o
42546f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	retval = ext2fs_find_first_zero_block_bitmap2(test_fs->block_map,
42646f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o						      start, end, &out);
42746f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	if (retval) {
42846f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o		printf("ext2fs_find_first_zero_block_bitmap2() returned %s\n",
42946f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o		       error_message(retval));
43046f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o		return;
43146f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	}
43246f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	printf("First unmarked block is %llu\n", out);
43346f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o}
43446f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o
435dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'ovoid do_ffsb(int argc, char *argv[])
436dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o{
437dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	unsigned int start, end;
438dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	int err;
439dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	errcode_t retval;
440dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	blk64_t out;
441dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o
442dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	if (check_fs_open(argv[0]))
443dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o		return;
444dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o
445dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	if (argc != 3 && argc != 3) {
446dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o		com_err(argv[0], 0, "Usage: ffsb <start> <end>");
447dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o		return;
448dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	}
449dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o
450dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	start = parse_ulong(argv[1], argv[0], "start", &err);
451dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	if (err)
452dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o		return;
453dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o
454dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	end = parse_ulong(argv[2], argv[0], "end", &err);
455dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	if (err)
456dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o		return;
457dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o
458dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	retval = ext2fs_find_first_set_block_bitmap2(test_fs->block_map,
459dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o						      start, end, &out);
460dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	if (retval) {
461dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o		printf("ext2fs_find_first_set_block_bitmap2() returned %s\n",
462dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o		       error_message(retval));
463dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o		return;
464dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	}
465dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	printf("First marked block is %llu\n", out);
466dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o}
467dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o
46846f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o
469b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'ovoid do_zerob(int argc, char *argv[])
470b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o{
471b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (check_fs_open(argv[0]))
472b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
473b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
474b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	printf("Clearing block bitmap.\n");
475b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	ext2fs_clear_block_bitmap(test_fs->block_map);
476b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o}
477b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
478b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'ovoid do_seti(int argc, char *argv[])
479b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o{
480b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	unsigned int inode;
481b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	int err;
482b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	int test_result, op_result;
483b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
484b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (check_fs_open(argv[0]))
485b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
486b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
487b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (argc != 2) {
488b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		com_err(argv[0], 0, "Usage: seti <inode>");
489b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
490b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	}
491b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
492b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	inode = parse_ulong(argv[1], argv[0], "inode", &err);
493b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (err)
494b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
495b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
496b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	test_result = ext2fs_test_inode_bitmap2(test_fs->inode_map, inode);
497b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	op_result = ext2fs_mark_inode_bitmap2(test_fs->inode_map, inode);
498b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	printf("Setting inode %u, was %s before\n", inode, op_result ?
499b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	       "set" : "clear");
500b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (!test_result != !op_result) {
501b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		com_err(argv[0], 0, "*ERROR* test_result different! (%d, %d)",
502b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			test_result, op_result);
503b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		exit_status++;
504b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	}
505b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o}
506b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
507b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'ovoid do_cleari(int argc, char *argv[])
508b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o{
509b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	unsigned int inode;
510b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	int err;
511b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	int test_result, op_result;
512b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
513b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (check_fs_open(argv[0]))
514b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
515b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
516b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (argc != 2) {
517b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		com_err(argv[0], 0, "Usage: clearb <inode>");
518b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
519b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	}
520b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
521b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	inode = parse_ulong(argv[1], argv[0], "inode", &err);
522b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (err)
523b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
524b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
525b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	test_result = ext2fs_test_inode_bitmap2(test_fs->inode_map, inode);
526b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	op_result = ext2fs_unmark_inode_bitmap2(test_fs->inode_map, inode);
527b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	printf("Clearing inode %u, was %s before\n", inode, op_result ?
528b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	       "set" : "clear");
529b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (!test_result != !op_result) {
530b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		com_err(argv[0], 0, "*ERROR* test_result different! (%d, %d)",
531b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			test_result, op_result);
532b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		exit_status++;
533b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	}
534b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o}
535b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
536b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'ovoid do_testi(int argc, char *argv[])
537b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o{
538b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	unsigned int inode;
539b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	int err;
54000eb0eee0addfd3b7ede98b85e00dff1547838a0Andreas Dilger	int test_result;
541b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
542b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (check_fs_open(argv[0]))
543b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
544b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
545b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (argc != 2) {
546b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		com_err(argv[0], 0, "Usage: testb <inode>");
547b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
548b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	}
549b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
550b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	inode = parse_ulong(argv[1], argv[0], "inode", &err);
551b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (err)
552b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
553b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
554b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	test_result = ext2fs_test_inode_bitmap2(test_fs->inode_map, inode);
555b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	printf("Inode %u is %s\n", inode, test_result ? "set" : "clear");
556b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o}
557b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
55846f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'ovoid do_ffzi(int argc, char *argv[])
55946f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o{
56046f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	unsigned int start, end;
56146f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	int err;
56246f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	errcode_t retval;
56346f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	ext2_ino_t out;
56446f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o
56546f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	if (check_fs_open(argv[0]))
56646f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o		return;
56746f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o
56846f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	if (argc != 3 && argc != 3) {
56946f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o		com_err(argv[0], 0, "Usage: ffzi <start> <end>");
57046f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o		return;
57146f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	}
57246f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o
57346f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	start = parse_ulong(argv[1], argv[0], "start", &err);
57446f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	if (err)
57546f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o		return;
57646f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o
57746f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	end = parse_ulong(argv[2], argv[0], "end", &err);
57846f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	if (err)
57946f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o		return;
58046f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o
58146f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	retval = ext2fs_find_first_zero_inode_bitmap2(test_fs->inode_map,
58246f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o						      start, end, &out);
58346f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	if (retval) {
58446f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o		printf("ext2fs_find_first_zero_inode_bitmap2() returned %s\n",
58546f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o		       error_message(retval));
58646f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o		return;
58746f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	}
58846f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	printf("First unmarked inode is %u\n", out);
58946f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o}
59046f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o
591dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'ovoid do_ffsi(int argc, char *argv[])
592dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o{
593dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	unsigned int start, end;
594dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	int err;
595dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	errcode_t retval;
596dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	ext2_ino_t out;
597dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o
598dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	if (check_fs_open(argv[0]))
599dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o		return;
600dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o
601dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	if (argc != 3 && argc != 3) {
602dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o		com_err(argv[0], 0, "Usage: ffsi <start> <end>");
603dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o		return;
604dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	}
605dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o
606dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	start = parse_ulong(argv[1], argv[0], "start", &err);
607dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	if (err)
608dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o		return;
609dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o
610dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	end = parse_ulong(argv[2], argv[0], "end", &err);
611dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	if (err)
612dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o		return;
613dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o
614dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	retval = ext2fs_find_first_set_inode_bitmap2(test_fs->inode_map,
615dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o						     start, end, &out);
616dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	if (retval) {
617dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o		printf("ext2fs_find_first_set_inode_bitmap2() returned %s\n",
618dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o		       error_message(retval));
619dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o		return;
620dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	}
621dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o	printf("First marked inode is %u\n", out);
622dff0b6a333821ec28bfa029ffbc0dffb46c43170Theodore Ts'o}
62346f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o
624b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'ovoid do_zeroi(int argc, char *argv[])
625b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o{
626b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (check_fs_open(argv[0]))
627b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		return;
628b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
629b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	printf("Clearing inode bitmap.\n");
630b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	ext2fs_clear_inode_bitmap(test_fs->inode_map);
631b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o}
632b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
633b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'oint main(int argc, char **argv)
634b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o{
635b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	unsigned int	blocks = 128;
636b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	unsigned int	inodes = 0;
637b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	unsigned int	type = EXT2FS_BMAP64_BITARRAY;
638b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	int		c, err, code;
639b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	char		*request = (char *)NULL;
640b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	char		*cmd_file = 0;
641b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	int		sci_idx;
64246f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	int		flags = EXT2_FLAG_64BITS;
643b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
644b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	add_error_table(&et_ss_error_table);
645b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	add_error_table(&et_ext2_error_table);
64646f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	while ((c = getopt (argc, argv, "b:i:lt:R:f:")) != EOF) {
647b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		switch (c) {
648b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		case 'b':
649b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			blocks = parse_ulong(optarg, argv[0],
650b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o					     "number of blocks", &err);
651b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			if (err)
652ab3f5c5aad6310be1d1891c05f1bc8cf7ccf0cefTheodore Ts'o				exit(1);
653b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			break;
654b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		case 'i':
655b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			inodes = parse_ulong(optarg, argv[0],
656b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o					     "number of blocks", &err);
657b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			if (err)
658ab3f5c5aad6310be1d1891c05f1bc8cf7ccf0cefTheodore Ts'o				exit(1);
659b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			break;
66046f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o		case 'l':	/* Legacy bitmaps */
66146f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o			flags = 0;
66246f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o			break;
663b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		case 't':
664b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			type = parse_ulong(optarg, argv[0],
665b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o					   "bitmap backend type", &err);
666b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			if (err)
667ab3f5c5aad6310be1d1891c05f1bc8cf7ccf0cefTheodore Ts'o				exit(1);
668b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			break;
669b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		case 'R':
670b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			request = optarg;
671b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			break;
672b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		case 'f':
673b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			cmd_file = optarg;
674b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			break;
675b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		default:
676b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			com_err(argv[0], 0, "Usage: %s [-R request] "
677b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o				"[-f cmd_file]", subsystem_name);
678b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			exit(1);
679b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		}
680b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	}
681b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
682b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	sci_idx = ss_create_invocation(subsystem_name, version,
683b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o				       (char *)NULL, &tst_bitmaps_cmds, &code);
684b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (code) {
685b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		ss_perror(sci_idx, code, "creating invocation");
686b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		exit(1);
687b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	}
688b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
689b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	(void) ss_add_request_table (sci_idx, &ss_std_requests, 1, &code);
690b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (code) {
691b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		ss_perror(sci_idx, code, "adding standard requests");
692b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		exit (1);
693b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	}
694b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
695b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	printf("%s %s.  Type '?' for a list of commands.\n\n",
696b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	       subsystem_name, version);
697b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
69846f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o	setup_filesystem(argv[0], blocks, inodes, type, flags);
699b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
700b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	if (request) {
701b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		code = ss_execute_line(sci_idx, request);
702b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		if (code) {
703b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			ss_perror(sci_idx, code, request);
704b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o			exit_status++;
705b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		}
706b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	} else if (cmd_file) {
707b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		exit_status = source_file(cmd_file, sci_idx);
708b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	} else {
709b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o		ss_listen(sci_idx);
710b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	}
711b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
712b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o	exit(exit_status);
713b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o}
714b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o
715