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(¶m, 0, sizeof(param)); 160b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o ext2fs_blocks_count_set(¶m, blocks); 161b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o param.s_inodes_count = inodes; 162b8ad88b3e746b0c37dfb61e0fe7ad7a7636f9537Theodore Ts'o 16346f100707c3cd07e271b0c6f5523ec6ca1ac4416Theodore Ts'o retval = ext2fs_initialize("test fs", flags, ¶m, 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