13839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* 23839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * debugfs.c --- a program which allows you to attach an ext2fs 33839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * filesystem and play with it. 43839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 53839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Copyright (C) 1993 Theodore Ts'o. This file may be redistributed 63839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * under the terms of the GNU Public License. 7efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * 83839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Modifications by Robert Sanders <gt8134b@prism.gatech.edu> 93839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 11d1154eb460efe588eaed3d439c1caaca149fa362Theodore Ts'o#include "config.h" 123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <stdio.h> 133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <unistd.h> 143839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <stdlib.h> 153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <ctype.h> 163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <string.h> 173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <time.h> 18491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong#include <libgen.h> 1950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef HAVE_GETOPT_H 203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <getopt.h> 21efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o#else 2250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern int optind; 2350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern char *optarg; 2450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif 2550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#ifdef HAVE_ERRNO_H 2650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#include <errno.h> 2750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif 2850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#include <fcntl.h> 2995e97131a0e96ad2c30c67d1c167dc586619486bMike Frysinger#ifdef HAVE_SYS_SYSMACROS_H 3095e97131a0e96ad2c30c67d1c167dc586619486bMike Frysinger#include <sys/sysmacros.h> 3195e97131a0e96ad2c30c67d1c167dc586619486bMike Frysinger#endif 323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "debugfs.h" 34fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o#include "uuid/uuid.h" 35f68aa41476b0d7f43e85413fd08d7cfc8f916ea6Theodore Ts'o#include "e2p/e2p.h" 363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 37ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o#include <ext2fs/ext2_ext_attr.h> 38ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o 39818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o#include "../version.h" 4003efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger#include "jfs_user.h" 4199ceb8ec1acd7f38da289966b9984b3ffa1914a9Theodore Ts'o#include "support/plausible.h" 42818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o 43355ffb2ff566229b8bc3f5f7557e91edff5a767aRobert Yang#ifndef BUFSIZ 44355ffb2ff566229b8bc3f5f7557e91edff5a767aRobert Yang#define BUFSIZ 8192 45355ffb2ff566229b8bc3f5f7557e91edff5a767aRobert Yang#endif 46355ffb2ff566229b8bc3f5f7557e91edff5a767aRobert Yang 471fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o#ifdef CONFIG_JBD_DEBUG /* Enabled by configure --enable-jbd-debug */ 481fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'oint journal_enable_debug = -1; 491fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o#endif 501fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o 5149ce6cb5cee956a478a3704c92619de1c7f204d5Theodore Ts'oss_request_table *extra_cmds; 522d328bb76d2d63bdfdba923b54c28bd686bd8fecTheodore Ts'oconst char *debug_prog_name; 53bee7b67ce92bb912fccc0dcce3c71c186c2a988bTheodore Ts'oint sci_idx; 543839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 55ba08cb996a10a8f5e72625ed054cb029571d84e0Theodore Ts'oext2_filsys current_fs; 5675fc42f1a1fa98a722540e6a2761be17126dd080Theodore Ts'oquota_ctx_t current_qctx; 57b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'oext2_ino_t root, cwd; 583839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 59491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wongstatic int debugfs_setup_tdb(const char *device_name, char *undo_file, 60491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong io_manager *io_ptr) 61491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong{ 62491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong errcode_t retval = ENOMEM; 63491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong char *tdb_dir = NULL, *tdb_file = NULL; 64491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong char *dev_name, *tmp_name; 65491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong 66491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong /* (re)open a specific undo file */ 67491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong if (undo_file && undo_file[0] != 0) { 68b0851392244e2a87cad67739d86c7489d4db3222Darrick J. Wong retval = set_undo_io_backing_manager(*io_ptr); 69b0851392244e2a87cad67739d86c7489d4db3222Darrick J. Wong if (retval) 70b0851392244e2a87cad67739d86c7489d4db3222Darrick J. Wong goto err; 71491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong *io_ptr = undo_io_manager; 72491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong retval = set_undo_io_backup_file(undo_file); 73491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong if (retval) 74491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong goto err; 75491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong printf("Overwriting existing filesystem; this can be undone " 76491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong "using the command:\n" 77491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong " e2undo %s %s\n\n", 78491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong undo_file, device_name); 79b0851392244e2a87cad67739d86c7489d4db3222Darrick J. Wong return retval; 80491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong } 81491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong 82491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong /* 83491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong * Configuration via a conf file would be 84491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong * nice 85491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong */ 861fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o tdb_dir = ss_safe_getenv("E2FSPROGS_UNDO_DIR"); 87b0851392244e2a87cad67739d86c7489d4db3222Darrick J. Wong if (!tdb_dir) 88b0851392244e2a87cad67739d86c7489d4db3222Darrick J. Wong tdb_dir = "/var/lib/e2fsprogs"; 89491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong 90b0851392244e2a87cad67739d86c7489d4db3222Darrick J. Wong if (!strcmp(tdb_dir, "none") || (tdb_dir[0] == 0) || 91b0851392244e2a87cad67739d86c7489d4db3222Darrick J. Wong access(tdb_dir, W_OK)) 92491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong return 0; 93491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong 94491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong tmp_name = strdup(device_name); 95491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong if (!tmp_name) 96491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong goto errout; 97491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong dev_name = basename(tmp_name); 98b0851392244e2a87cad67739d86c7489d4db3222Darrick J. Wong tdb_file = malloc(strlen(tdb_dir) + 9 + strlen(dev_name) + 7 + 1); 99491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong if (!tdb_file) { 100491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong free(tmp_name); 101491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong goto errout; 102491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong } 103491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong sprintf(tdb_file, "%s/debugfs-%s.e2undo", tdb_dir, dev_name); 104491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong free(tmp_name); 105491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong 106491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong if ((unlink(tdb_file) < 0) && (errno != ENOENT)) { 107491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong retval = errno; 108b0851392244e2a87cad67739d86c7489d4db3222Darrick J. Wong com_err("debugfs", retval, 109b0851392244e2a87cad67739d86c7489d4db3222Darrick J. Wong "while trying to delete %s", tdb_file); 110491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong goto errout; 111491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong } 112491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong 113b0851392244e2a87cad67739d86c7489d4db3222Darrick J. Wong retval = set_undo_io_backing_manager(*io_ptr); 114b0851392244e2a87cad67739d86c7489d4db3222Darrick J. Wong if (retval) 115b0851392244e2a87cad67739d86c7489d4db3222Darrick J. Wong goto errout; 116491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong *io_ptr = undo_io_manager; 117491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong retval = set_undo_io_backup_file(tdb_file); 118491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong if (retval) 119491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong goto errout; 120491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong printf("Overwriting existing filesystem; this can be undone " 121491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong "using the command:\n" 122491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong " e2undo %s %s\n\n", tdb_file, device_name); 123491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong 124491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong free(tdb_file); 125491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong return 0; 126491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wongerrout: 127491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong free(tdb_file); 128491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wongerr: 129491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong com_err("debugfs", retval, "while trying to setup undo file\n"); 130491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong return retval; 131491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong} 132491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong 133048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Hensonstatic void open_filesystem(char *device, int open_flags, blk64_t superblock, 134048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson blk64_t blocksize, int catastrophic, 135491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong char *data_filename, char *undo_file) 1363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 1373839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o int retval; 1381ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o io_channel data_io = 0; 139491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong io_manager io_ptr = unix_io_manager; 1402e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o 1412e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o if (superblock != 0 && blocksize == 0) { 1422e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o com_err(device, 0, "if you specify the superblock, you must also specify the block size"); 1432e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o current_fs = NULL; 1442e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o return; 1452e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o } 1462e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o 1471ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o if (data_filename) { 1481ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o if ((open_flags & EXT2_FLAG_IMAGE_FILE) == 0) { 149efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o com_err(device, 0, 1501ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o "The -d option is only valid when reading an e2image file"); 1511ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o current_fs = NULL; 1521ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o return; 1531ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o } 1541ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o retval = unix_io_manager->open(data_filename, 0, &data_io); 1551ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o if (retval) { 1561ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o com_err(data_filename, 0, "while opening data source"); 1571ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o current_fs = NULL; 1581ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o return; 1591ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o } 1601ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o } 1611ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o 1622e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o if (catastrophic && (open_flags & EXT2_FLAG_RW)) { 1632e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o com_err(device, 0, 1642e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o "opening read-only because of catastrophic mode"); 1652e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o open_flags &= ~EXT2_FLAG_RW; 1662e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o } 1670f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger if (catastrophic) 1680f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger open_flags |= EXT2_FLAG_SKIP_MMP; 169efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 170491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong if (undo_file) { 171491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong retval = debugfs_setup_tdb(device, undo_file, &io_ptr); 172491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong if (retval) 173491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong exit(1); 174491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong } 175491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong 1762e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o retval = ext2fs_open(device, open_flags, superblock, blocksize, 177491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong io_ptr, ¤t_fs); 1783839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) { 1793839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o com_err(device, retval, "while opening filesystem"); 180c8b20b40ebf0278b2d100a964a32d8e13046f437Darrick J. Wong if (retval == EXT2_ET_BAD_MAGIC) 181c8b20b40ebf0278b2d100a964a32d8e13046f437Darrick J. Wong check_plausibility(device, CHECK_FS_EXIST, NULL); 182fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o current_fs = NULL; 1833839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 1843839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 18524dea55494ea753dbc8e4d965345cd2a7144d4fdTheodore Ts'o current_fs->default_bitmap_type = EXT2FS_BMAP64_RBTREE; 1862e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o 1872e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o if (catastrophic) 1882e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o com_err(device, 0, "catastrophic mode - not reading inode or group bitmaps"); 1892e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o else { 1902e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o retval = ext2fs_read_inode_bitmap(current_fs); 1912e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o if (retval) { 1922e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o com_err(device, retval, "while reading inode bitmap"); 1932e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o goto errout; 1942e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o } 1952e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o retval = ext2fs_read_block_bitmap(current_fs); 1962e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o if (retval) { 1972e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o com_err(device, retval, "while reading block bitmap"); 1982e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o goto errout; 1992e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o } 2003839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 2011ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o 2021ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o if (data_io) { 2031ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o retval = ext2fs_set_data_io(current_fs, data_io); 2041ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o if (retval) { 205efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o com_err(device, retval, 2061ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o "while setting data source"); 2071ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o goto errout; 2081ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o } 2091ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o } 2101ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o 2113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o root = cwd = EXT2_ROOT_INO; 2123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 2133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 2143839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oerrout: 21547fee2ef6a23ae06f680336ffde57caa64604a4cLukas Czerner retval = ext2fs_close_free(¤t_fs); 2163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) 2173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o com_err(device, retval, "while trying to close filesystem"); 2183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 2193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 2203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid do_open_filesys(int argc, char **argv) 2213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 222e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o int c, err; 2232e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o int catastrophic = 0; 224048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson blk64_t superblock = 0; 225048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson blk64_t blocksize = 0; 22603b9dca63a75731711071e0a7ddef0475d6daf3aEric Sandeen int open_flags = EXT2_FLAG_SOFTSUPP_FEATURES | EXT2_FLAG_64BITS; 227b0d17e0d47f072c208633f8cad0fbe123faf2876Theodore Ts'o char *data_filename = 0; 228491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong char *undo_file = NULL; 229efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 23088494bb6d440f703db98b6cc4452f63d7aa392b9Theodore Ts'o reset_getopt(); 231491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong while ((c = getopt(argc, argv, "iwfecb:s:d:Dz:")) != EOF) { 2323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o switch (c) { 23359cf7e0da802aa8f560434bd521c30f5bb5d3e21Theodore Ts'o case 'i': 23459cf7e0da802aa8f560434bd521c30f5bb5d3e21Theodore Ts'o open_flags |= EXT2_FLAG_IMAGE_FILE; 23559cf7e0da802aa8f560434bd521c30f5bb5d3e21Theodore Ts'o break; 2363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o case 'w': 237e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#ifdef READ_ONLY 238e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o goto print_usage; 239e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#else 240d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o open_flags |= EXT2_FLAG_RW; 241e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#endif /* READ_ONLY */ 242d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o break; 243d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o case 'f': 244d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o open_flags |= EXT2_FLAG_FORCE; 2453839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o break; 24698eb44bdb5749f323a858d71bf5e7f0eddb61191Theodore Ts'o case 'e': 24798eb44bdb5749f323a858d71bf5e7f0eddb61191Theodore Ts'o open_flags |= EXT2_FLAG_EXCLUSIVE; 24898eb44bdb5749f323a858d71bf5e7f0eddb61191Theodore Ts'o break; 2492e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o case 'c': 2502e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o catastrophic = 1; 2512e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o break; 2521ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o case 'd': 2531ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o data_filename = optarg; 2541ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o break; 2550fd68e0241e944545d43045593e82b0fb7317797Theodore Ts'o case 'D': 2560fd68e0241e944545d43045593e82b0fb7317797Theodore Ts'o open_flags |= EXT2_FLAG_DIRECT_IO; 2570fd68e0241e944545d43045593e82b0fb7317797Theodore Ts'o break; 2582e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o case 'b': 259e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o blocksize = parse_ulong(optarg, argv[0], 260e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o "block size", &err); 261e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (err) 2622e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o return; 2632e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o break; 2642e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o case 's': 265a25fffae5cbdb9349fa3c358c9714584e9de7b33Eric Whitney err = strtoblk(argv[0], optarg, 266a25fffae5cbdb9349fa3c358c9714584e9de7b33Eric Whitney "superblock block number", &superblock); 267e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (err) 2682e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o return; 2692e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o break; 270491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong case 'z': 271491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong undo_file = optarg; 272491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong break; 2733839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o default: 2749b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o goto print_usage; 2753839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 2763839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 2773839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (optind != argc-1) { 2789b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o goto print_usage; 2793839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 2803839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (check_fs_not_open(argv[0])) 2813839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 2822e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o open_filesystem(argv[optind], open_flags, 283efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o superblock, blocksize, catastrophic, 284491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong data_filename, undo_file); 2859b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o return; 2869b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o 2879b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'oprint_usage: 2885093775ab446d375ea753218c364be31cf82f3ccZheng Liu fprintf(stderr, "%s: Usage: open [-s superblock] [-b blocksize] " 2895093775ab446d375ea753218c364be31cf82f3ccZheng Liu "[-d image_filename] [-c] [-i] [-f] [-e] [-D] " 290e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#ifndef READ_ONLY 291e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o "[-w] " 292e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#endif 293e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o "<device>\n", argv[0]); 2942e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o} 2952e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o 2962e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'ovoid do_lcd(int argc, char **argv) 2972e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o{ 29857a1cbb643237b168bd4151aff3d3bad28bbc326Theodore Ts'o if (argc != 2) { 29957a1cbb643237b168bd4151aff3d3bad28bbc326Theodore Ts'o com_err(argv[0], 0, "Usage: %s %s", argv[0], "<native dir>"); 3002e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o return; 30157a1cbb643237b168bd4151aff3d3bad28bbc326Theodore Ts'o } 3022e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o 3032e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o if (chdir(argv[1]) == -1) { 3042e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o com_err(argv[0], errno, 3052e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o "while trying to change native directory to %s", 3062e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o argv[1]); 3072e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o return; 3082e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o } 3093839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 3103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 31150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'ostatic void close_filesystem(NOARGS) 3123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 3133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o int retval; 314efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 315fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o if (current_fs->flags & EXT2_FLAG_IB_DIRTY) { 316fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o retval = ext2fs_write_inode_bitmap(current_fs); 3173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) 3189b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o com_err("ext2fs_write_inode_bitmap", retval, 0); 3193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 320fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o if (current_fs->flags & EXT2_FLAG_BB_DIRTY) { 321fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o retval = ext2fs_write_block_bitmap(current_fs); 3223839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) 3239b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o com_err("ext2fs_write_block_bitmap", retval, 0); 3243839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 32575fc42f1a1fa98a722540e6a2761be17126dd080Theodore Ts'o if (current_qctx) 32675fc42f1a1fa98a722540e6a2761be17126dd080Theodore Ts'o quota_release_context(¤t_qctx); 32747fee2ef6a23ae06f680336ffde57caa64604a4cLukas Czerner retval = ext2fs_close_free(¤t_fs); 3283839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) 3299b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o com_err("ext2fs_close", retval, 0); 3303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 3313839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 3323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 3333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid do_close_filesys(int argc, char **argv) 3343839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 3356dce532867a0f8d6a99a2c6fe049de411dc109f2Theodore Ts'o int c; 3366dce532867a0f8d6a99a2c6fe049de411dc109f2Theodore Ts'o 3376dce532867a0f8d6a99a2c6fe049de411dc109f2Theodore Ts'o if (check_fs_open(argv[0])) 3383839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 3396dce532867a0f8d6a99a2c6fe049de411dc109f2Theodore Ts'o 3406dce532867a0f8d6a99a2c6fe049de411dc109f2Theodore Ts'o reset_getopt(); 3416dce532867a0f8d6a99a2c6fe049de411dc109f2Theodore Ts'o while ((c = getopt (argc, argv, "a")) != EOF) { 3426dce532867a0f8d6a99a2c6fe049de411dc109f2Theodore Ts'o switch (c) { 3436dce532867a0f8d6a99a2c6fe049de411dc109f2Theodore Ts'o case 'a': 3446dce532867a0f8d6a99a2c6fe049de411dc109f2Theodore Ts'o current_fs->flags &= ~EXT2_FLAG_MASTER_SB_ONLY; 3456dce532867a0f8d6a99a2c6fe049de411dc109f2Theodore Ts'o break; 3466dce532867a0f8d6a99a2c6fe049de411dc109f2Theodore Ts'o default: 3476dce532867a0f8d6a99a2c6fe049de411dc109f2Theodore Ts'o goto print_usage; 3486dce532867a0f8d6a99a2c6fe049de411dc109f2Theodore Ts'o } 3496dce532867a0f8d6a99a2c6fe049de411dc109f2Theodore Ts'o } 3506dce532867a0f8d6a99a2c6fe049de411dc109f2Theodore Ts'o 3516dce532867a0f8d6a99a2c6fe049de411dc109f2Theodore Ts'o if (argc > optind) { 3526dce532867a0f8d6a99a2c6fe049de411dc109f2Theodore Ts'o print_usage: 3536dce532867a0f8d6a99a2c6fe049de411dc109f2Theodore Ts'o com_err(0, 0, "Usage: close_filesys [-a]"); 3546dce532867a0f8d6a99a2c6fe049de411dc109f2Theodore Ts'o return; 3556dce532867a0f8d6a99a2c6fe049de411dc109f2Theodore Ts'o } 3566dce532867a0f8d6a99a2c6fe049de411dc109f2Theodore Ts'o 3573839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o close_filesystem(); 3583839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 3593839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 360e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#ifndef READ_ONLY 3613839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid do_init_filesys(int argc, char **argv) 3623839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 3633839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o struct ext2_super_block param; 3643839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o errcode_t retval; 365e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o int err; 366fe56188b07668758c28912b6eaf31abb498a9e82Darrick J. Wong blk64_t blocks; 367efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 368e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (common_args_process(argc, argv, 3, 3, "initialize", 36957d4fb66d237fd8b734d2aa6b13502fac9c6e5a3Darrick J. Wong "<device> <blocks>", CHECK_FS_NOTOPEN)) 3703839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 3713839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 3723839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o memset(¶m, 0, sizeof(struct ext2_super_block)); 373a25fffae5cbdb9349fa3c358c9714584e9de7b33Eric Whitney err = strtoblk(argv[0], argv[2], "blocks count", &blocks); 374fe56188b07668758c28912b6eaf31abb498a9e82Darrick J. Wong if (err) 375fe56188b07668758c28912b6eaf31abb498a9e82Darrick J. Wong return; 376fe56188b07668758c28912b6eaf31abb498a9e82Darrick J. Wong ext2fs_blocks_count_set(¶m, blocks); 377fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o retval = ext2fs_initialize(argv[1], 0, ¶m, 378fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o unix_io_manager, ¤t_fs); 3793839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) { 3803839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o com_err(argv[1], retval, "while initializing filesystem"); 381fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o current_fs = NULL; 3823839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 3833839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 3843839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o root = cwd = EXT2_ROOT_INO; 3853839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 3863839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 3873839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 3885dd8f963d04fa4099a003cb3b13ffae05ab29210Theodore Ts'ostatic void print_features(struct ext2_super_block * s, FILE *f) 389d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o{ 390d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o int i, j, printed=0; 391092c3dec39301ac61367b710d995f74b523948c2Theodore Ts'o __u32 *mask = &s->s_feature_compat, m; 392d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o 393777ebb3e51b1c7ec0d7c5a457ef04d40f61b6c30Theodore Ts'o fputs("Filesystem features:", f); 394d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o for (i=0; i <3; i++,mask++) { 395d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o for (j=0,m=1; j < 32; j++, m<<=1) { 396d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o if (*mask & m) { 397d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o fprintf(f, " %s", e2p_feature2string(i, m)); 398d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o printed++; 399d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o } 400d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o } 401d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o } 402d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o if (printed == 0) 403777ebb3e51b1c7ec0d7c5a457ef04d40f61b6c30Theodore Ts'o fputs("(none)", f); 404777ebb3e51b1c7ec0d7c5a457ef04d40f61b6c30Theodore Ts'o fputs("\n", f); 405d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o} 4063cebf9c1029ca983ebbbae79f7905a02d087ff98Theodore Ts'o#endif /* READ_ONLY */ 407d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o 408732c8cd58ff30ffae0d3276c411a08920717a46cTheodore Ts'ostatic void print_bg_opts(ext2_filsys fs, dgrp_t group, int mask, 409f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o const char *str, int *first, FILE *f) 410f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o{ 411cd65a24e756b8f6770a5961fd94c67eb00dd7baaTheodore Ts'o if (ext2fs_bg_flags_test(fs, group, mask)) { 412f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o if (*first) { 413f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o fputs(" [", f); 414f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o *first = 0; 415f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o } else 416f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o fputs(", ", f); 417f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o fputs(str, f); 418f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o } 419f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o} 420f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o 4213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid do_show_super_stats(int argc, char *argv[]) 4223839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 4232418dfd7b934ee6bf3dc9a0aa4ffee8b37f4384fTheodore Ts'o const char *units ="block"; 424544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o dgrp_t i; 4253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o FILE *out; 426d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o int c, header_only = 0; 4278fdf29117f922419bd5b3f741e5d554b1d5b8893Jose R. Santos int numdirs = 0, first, gdt_csum; 4288fdf29117f922419bd5b3f741e5d554b1d5b8893Jose R. Santos 42988494bb6d440f703db98b6cc4452f63d7aa392b9Theodore Ts'o reset_getopt(); 430d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o while ((c = getopt (argc, argv, "h")) != EOF) { 431d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o switch (c) { 432d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o case 'h': 433d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o header_only++; 434d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o break; 435d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o default: 4369b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o goto print_usage; 437d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o } 438d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o } 439d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o if (optind != argc) { 4409b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o goto print_usage; 4413839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 4423839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (check_fs_open(argv[0])) 4433839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 4443839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o out = open_pager(); 445bd09eff9b2caaa3539c3ed119a067782714bffa2Theodore Ts'o 4464ee26699823c945b1894880f53cea3b45b5e3a20Darrick J. Wong if (ext2fs_has_feature_bigalloc(current_fs->super)) 4472418dfd7b934ee6bf3dc9a0aa4ffee8b37f4384fTheodore Ts'o units = "cluster"; 4482418dfd7b934ee6bf3dc9a0aa4ffee8b37f4384fTheodore Ts'o 449bd09eff9b2caaa3539c3ed119a067782714bffa2Theodore Ts'o list_super2(current_fs->super, out); 45034be9609de977fe2e041c7b48fb9d4d0d6878bb1Theodore Ts'o for (i=0; i < current_fs->group_desc_count; i++) 451048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson numdirs += ext2fs_bg_used_dirs_count(current_fs, i); 45234be9609de977fe2e041c7b48fb9d4d0d6878bb1Theodore Ts'o fprintf(out, "Directories: %d\n", numdirs); 453efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 454d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o if (header_only) { 455d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o close_pager(out); 456d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o return; 457d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o } 458efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 4595b58dc2304f06953e1d8314ea570cc3befec95bcDarrick J. Wong gdt_csum = ext2fs_has_group_desc_csum(current_fs); 460048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson for (i = 0; i < current_fs->group_desc_count; i++) { 461048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson fprintf(out, " Group %2d: block bitmap at %llu, " 462048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson "inode bitmap at %llu, " 463048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson "inode table at %llu\n" 4642418dfd7b934ee6bf3dc9a0aa4ffee8b37f4384fTheodore Ts'o " %u free %s%s, " 465048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson "%u free %s, " 466048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson "%u used %s%s", 467048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson i, ext2fs_block_bitmap_loc(current_fs, i), 468048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson ext2fs_inode_bitmap_loc(current_fs, i), 469048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson ext2fs_inode_table_loc(current_fs, i), 4702418dfd7b934ee6bf3dc9a0aa4ffee8b37f4384fTheodore Ts'o ext2fs_bg_free_blocks_count(current_fs, i), units, 471048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson ext2fs_bg_free_blocks_count(current_fs, i) != 1 ? 4722418dfd7b934ee6bf3dc9a0aa4ffee8b37f4384fTheodore Ts'o "s" : "", 473048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson ext2fs_bg_free_inodes_count(current_fs, i), 474048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson ext2fs_bg_free_inodes_count(current_fs, i) != 1 ? 475048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson "inodes" : "inode", 476048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson ext2fs_bg_used_dirs_count(current_fs, i), 477048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson ext2fs_bg_used_dirs_count(current_fs, i) != 1 ? "directories" 478048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson : "directory", gdt_csum ? ", " : "\n"); 4798fdf29117f922419bd5b3f741e5d554b1d5b8893Jose R. Santos if (gdt_csum) 480048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson fprintf(out, "%u unused %s\n", 481048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson ext2fs_bg_itable_unused(current_fs, i), 482048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson ext2fs_bg_itable_unused(current_fs, i) != 1 ? 483048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson "inodes" : "inode"); 484f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o first = 1; 485732c8cd58ff30ffae0d3276c411a08920717a46cTheodore Ts'o print_bg_opts(current_fs, i, EXT2_BG_INODE_UNINIT, "Inode not init", 486f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o &first, out); 487732c8cd58ff30ffae0d3276c411a08920717a46cTheodore Ts'o print_bg_opts(current_fs, i, EXT2_BG_BLOCK_UNINIT, "Block not init", 488f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o &first, out); 4898fdf29117f922419bd5b3f741e5d554b1d5b8893Jose R. Santos if (gdt_csum) { 4908fdf29117f922419bd5b3f741e5d554b1d5b8893Jose R. Santos fprintf(out, "%sChecksum 0x%04x", 491048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson first ? " [":", ", ext2fs_bg_checksum(current_fs, i)); 4928fdf29117f922419bd5b3f741e5d554b1d5b8893Jose R. Santos first = 0; 4938fdf29117f922419bd5b3f741e5d554b1d5b8893Jose R. Santos } 494f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o if (!first) 495f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o fputs("]\n", out); 496f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o } 4973839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o close_pager(out); 4989b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o return; 4999b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'oprint_usage: 5009b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o fprintf(stderr, "%s: Usage: show_super [-h]\n", argv[0]); 5013839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 5023839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 503e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#ifndef READ_ONLY 504efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'ovoid do_dirty_filesys(int argc EXT2FS_ATTR((unused)), 505544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o char **argv EXT2FS_ATTR((unused))) 50621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o{ 50721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o if (check_fs_open(argv[0])) 50821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o return; 509601002bd2a144da02165529743a4b1621cfe9ae3Theodore Ts'o if (check_fs_read_write(argv[0])) 510601002bd2a144da02165529743a4b1621cfe9ae3Theodore Ts'o return; 511601002bd2a144da02165529743a4b1621cfe9ae3Theodore Ts'o 512601002bd2a144da02165529743a4b1621cfe9ae3Theodore Ts'o if (argv[1] && !strcmp(argv[1], "-clean")) 513601002bd2a144da02165529743a4b1621cfe9ae3Theodore Ts'o current_fs->super->s_state |= EXT2_VALID_FS; 514601002bd2a144da02165529743a4b1621cfe9ae3Theodore Ts'o else 515601002bd2a144da02165529743a4b1621cfe9ae3Theodore Ts'o current_fs->super->s_state &= ~EXT2_VALID_FS; 51621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o ext2fs_mark_super_dirty(current_fs); 51721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o} 518e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#endif /* READ_ONLY */ 51921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 5203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ostruct list_blocks_struct { 52189e25cfdbf206d6840dc92385ee839dd850294dbAndreas Dilger FILE *f; 52289e25cfdbf206d6840dc92385ee839dd850294dbAndreas Dilger e2_blkcnt_t total; 523048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson blk64_t first_block, last_block; 52489e25cfdbf206d6840dc92385ee839dd850294dbAndreas Dilger e2_blkcnt_t first_bcnt, last_bcnt; 52589e25cfdbf206d6840dc92385ee839dd850294dbAndreas Dilger e2_blkcnt_t first; 5263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}; 5273839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 5280a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'ostatic void finish_range(struct list_blocks_struct *lb) 5290a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o{ 5300a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o if (lb->first_block == 0) 5310a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o return; 5320a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o if (lb->first) 5330a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o lb->first = 0; 5340a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o else 53580bfaa3e40ae6ab00cc3d4d1f4c0eeefce0b1a96Theodore Ts'o fprintf(lb->f, ", "); 5360a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o if (lb->first_block == lb->last_block) 537048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson fprintf(lb->f, "(%lld):%llu", 538de8f3a76218255e443ba57dec5d74850180fa75dAndreas Dilger (long long)lb->first_bcnt, lb->first_block); 5390a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o else 540048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson fprintf(lb->f, "(%lld-%lld):%llu-%llu", 541de8f3a76218255e443ba57dec5d74850180fa75dAndreas Dilger (long long)lb->first_bcnt, (long long)lb->last_bcnt, 542de8f3a76218255e443ba57dec5d74850180fa75dAndreas Dilger lb->first_block, lb->last_block); 5430a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o lb->first_block = 0; 5440a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o} 5450a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o 546efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'ostatic int list_blocks_proc(ext2_filsys fs EXT2FS_ATTR((unused)), 547048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson blk64_t *blocknr, e2_blkcnt_t blockcnt, 548048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson blk64_t ref_block EXT2FS_ATTR((unused)), 549efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o int ref_offset EXT2FS_ATTR((unused)), 550544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o void *private) 5513839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 5523839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o struct list_blocks_struct *lb = (struct list_blocks_struct *) private; 5533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 5540a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o lb->total++; 5550a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o if (blockcnt >= 0) { 5560a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o /* 5570a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o * See if we can add on to the existing range (if it exists) 5580a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o */ 5590a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o if (lb->first_block && 5600a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o (lb->last_block+1 == *blocknr) && 5610a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o (lb->last_bcnt+1 == blockcnt)) { 5620a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o lb->last_block = *blocknr; 5630a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o lb->last_bcnt = blockcnt; 5640a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o return 0; 5650a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o } 5660a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o /* 5670a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o * Start a new range. 5680a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o */ 5690a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o finish_range(lb); 5700a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o lb->first_block = lb->last_block = *blocknr; 5710a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o lb->first_bcnt = lb->last_bcnt = blockcnt; 5720a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o return 0; 5730a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o } 5740a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o /* 5750a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o * Not a normal block. Always force a new range. 5760a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o */ 5770a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o finish_range(lb); 5780a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o if (lb->first) 5790a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o lb->first = 0; 5800a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o else 5812c4a540636142a936889bbe4b85a2b9c56bfa458Theodore Ts'o fprintf(lb->f, ", "); 582a5eef73b6419e19bc8b66ed476fcf516952a4c67Theodore Ts'o if (blockcnt == -1) 583048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson fprintf(lb->f, "(IND):%llu", (unsigned long long) *blocknr); 584a5eef73b6419e19bc8b66ed476fcf516952a4c67Theodore Ts'o else if (blockcnt == -2) 585048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson fprintf(lb->f, "(DIND):%llu", (unsigned long long) *blocknr); 586a5eef73b6419e19bc8b66ed476fcf516952a4c67Theodore Ts'o else if (blockcnt == -3) 587048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson fprintf(lb->f, "(TIND):%llu", (unsigned long long) *blocknr); 5883839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return 0; 5893839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 5903839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 591efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'ostatic void internal_dump_inode_extra(FILE *out, 592de8f3a76218255e443ba57dec5d74850180fa75dAndreas Dilger const char *prefix EXT2FS_ATTR((unused)), 593efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o ext2_ino_t inode_num EXT2FS_ATTR((unused)), 5949b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o struct ext2_inode_large *inode) 595ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o{ 5968deb80a5d1078cbe43eaffcdeebf0a1a549d6a54Takashi Sato fprintf(out, "Size of extra inode fields: %u\n", inode->i_extra_isize); 597ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o if (inode->i_extra_isize > EXT2_INODE_SIZE(current_fs->super) - 598ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o EXT2_GOOD_OLD_INODE_SIZE) { 599ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o fprintf(stderr, "invalid inode->i_extra_isize (%u)\n", 600ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o inode->i_extra_isize); 601ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o return; 602ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o } 6035beff1c0cfaf59a80bbd86a4b1436b39133b2abfDarrick J. Wong} 6045beff1c0cfaf59a80bbd86a4b1436b39133b2abfDarrick J. Wong 6055e4f070952bb4472e28a925f591b551baf2db278Theodore Ts'ostatic void dump_blocks(FILE *f, const char *prefix, ext2_ino_t inode) 6063839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 6073839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o struct list_blocks_struct lb; 6083839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 609da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o fprintf(f, "%sBLOCKS:\n%s", prefix, prefix); 6103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o lb.total = 0; 6110a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o lb.first_block = 0; 6123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o lb.f = f; 6130a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o lb.first = 1; 614048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson ext2fs_block_iterate3(current_fs, inode, BLOCK_FLAG_READ_ONLY, NULL, 615048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson list_blocks_proc, (void *)&lb); 6160a3db93a1c6e76086553b27192612f8616df4c4cTheodore Ts'o finish_range(&lb); 6173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (lb.total) 618de8f3a76218255e443ba57dec5d74850180fa75dAndreas Dilger fprintf(f, "\n%sTOTAL: %lld\n", prefix, (long long)lb.total); 6193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o fprintf(f,"\n"); 6203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 6213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 622187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'ostatic int int_log10(unsigned long long arg) 623187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o{ 624187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o int l = 0; 625187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o 626187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o arg = arg / 10; 627187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o while (arg) { 628187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o l++; 629187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o arg = arg / 10; 630187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o } 631187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o return l; 632187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o} 633187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o 634187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o#define DUMP_LEAF_EXTENTS 0x01 635187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o#define DUMP_NODE_EXTENTS 0x02 636187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o#define DUMP_EXTENT_TABLE 0x04 637187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o 638187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'ostatic void dump_extents(FILE *f, const char *prefix, ext2_ino_t ino, 639187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o int flags, int logical_width, int physical_width) 640187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o{ 641187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o ext2_extent_handle_t handle; 642187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o struct ext2fs_extent extent; 643187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o struct ext2_extent_info info; 644187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o int op = EXT2_EXTENT_ROOT; 645187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o unsigned int printed = 0; 646187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o errcode_t errcode; 647187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o 648187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o errcode = ext2fs_extent_open(current_fs, ino, &handle); 649187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o if (errcode) 650187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o return; 651187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o 652187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o if (flags & DUMP_EXTENT_TABLE) 653187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o fprintf(f, "Level Entries %*s %*s Length Flags\n", 654187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o (logical_width*2)+3, "Logical", 655187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o (physical_width*2)+3, "Physical"); 656187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o else 657187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o fprintf(f, "%sEXTENTS:\n%s", prefix, prefix); 658187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o 659187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o while (1) { 660187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o errcode = ext2fs_extent_get(handle, op, &extent); 661187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o 662187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o if (errcode) 663187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o break; 664187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o 665187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o op = EXT2_EXTENT_NEXT; 666187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o 667187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o if (extent.e_flags & EXT2_EXTENT_FLAGS_SECOND_VISIT) 668187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o continue; 669187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o 670187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o if (extent.e_flags & EXT2_EXTENT_FLAGS_LEAF) { 671187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o if ((flags & DUMP_LEAF_EXTENTS) == 0) 672187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o continue; 673187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o } else { 674187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o if ((flags & DUMP_NODE_EXTENTS) == 0) 675187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o continue; 676187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o } 677187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o 678187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o errcode = ext2fs_extent_get_info(handle, &info); 679187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o if (errcode) 680187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o continue; 681187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o 682187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o if (!(extent.e_flags & EXT2_EXTENT_FLAGS_LEAF)) { 683187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o if (extent.e_flags & EXT2_EXTENT_FLAGS_SECOND_VISIT) 684187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o continue; 685187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o 686187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o if (flags & DUMP_EXTENT_TABLE) { 687187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o fprintf(f, "%2d/%2d %3d/%3d %*llu - %*llu " 688187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o "%*llu%*s %6u\n", 689187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o info.curr_level, info.max_depth, 690187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o info.curr_entry, info.num_entries, 691187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o logical_width, 692187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o extent.e_lblk, 693187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o logical_width, 694187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o extent.e_lblk + (extent.e_len - 1), 695187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o physical_width, 696187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o extent.e_pblk, 697187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o physical_width+3, "", extent.e_len); 698187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o continue; 699187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o } 700187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o 701a9468442350b4c1e6e029493bfbc1a840b1f7efeTheodore Ts'o fprintf(f, "%s(ETB%d):%lld", 702c4b87b8c4ff6f3efff86f96dbef3ed050a712354Theodore Ts'o printed ? ", " : "", info.curr_level, 703187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o extent.e_pblk); 704187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o printed = 1; 705187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o continue; 706187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o } 707187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o 708187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o if (flags & DUMP_EXTENT_TABLE) { 709187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o fprintf(f, "%2d/%2d %3d/%3d %*llu - %*llu " 710187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o "%*llu - %*llu %6u %s\n", 711187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o info.curr_level, info.max_depth, 712187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o info.curr_entry, info.num_entries, 713187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o logical_width, 714187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o extent.e_lblk, 715187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o logical_width, 716187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o extent.e_lblk + (extent.e_len - 1), 717187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o physical_width, 718187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o extent.e_pblk, 719187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o physical_width, 720187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o extent.e_pblk + (extent.e_len - 1), 721187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o extent.e_len, 722187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o extent.e_flags & EXT2_EXTENT_FLAGS_UNINIT ? 723187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o "Uninit" : ""); 724187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o continue; 725187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o } 726187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o 727187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o if (extent.e_len == 0) 728187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o continue; 729187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o else if (extent.e_len == 1) 730187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o fprintf(f, 731a9468442350b4c1e6e029493bfbc1a840b1f7efeTheodore Ts'o "%s(%lld%s):%lld", 732187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o printed ? ", " : "", 733187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o extent.e_lblk, 734187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o extent.e_flags & EXT2_EXTENT_FLAGS_UNINIT ? 735a9468442350b4c1e6e029493bfbc1a840b1f7efeTheodore Ts'o "[u]" : "", 736187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o extent.e_pblk); 737187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o else 738187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o fprintf(f, 739a9468442350b4c1e6e029493bfbc1a840b1f7efeTheodore Ts'o "%s(%lld-%lld%s):%lld-%lld", 740187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o printed ? ", " : "", 741187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o extent.e_lblk, 742187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o extent.e_lblk + (extent.e_len - 1), 743187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o extent.e_flags & EXT2_EXTENT_FLAGS_UNINIT ? 744a9468442350b4c1e6e029493bfbc1a840b1f7efeTheodore Ts'o "[u]" : "", 745187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o extent.e_pblk, 746187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o extent.e_pblk + (extent.e_len - 1)); 747187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o printed = 1; 748187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o } 749187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o if (printed) 750187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o fprintf(f, "\n"); 7518a6cc1aebd7e9b2e6d6624fa1f8539888da25fe4Darrick J. Wong ext2fs_extent_free(handle); 752187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o} 7533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 754133e94627b01823d2555450ddd1d95401ff2227aZheng Liustatic void dump_inline_data(FILE *out, const char *prefix, ext2_ino_t inode_num) 755133e94627b01823d2555450ddd1d95401ff2227aZheng Liu{ 756133e94627b01823d2555450ddd1d95401ff2227aZheng Liu errcode_t retval; 757133e94627b01823d2555450ddd1d95401ff2227aZheng Liu size_t size; 758133e94627b01823d2555450ddd1d95401ff2227aZheng Liu 759133e94627b01823d2555450ddd1d95401ff2227aZheng Liu retval = ext2fs_inline_data_size(current_fs, inode_num, &size); 760133e94627b01823d2555450ddd1d95401ff2227aZheng Liu if (!retval) 7617ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong fprintf(out, "%sSize of inline data: %zu\n", prefix, size); 7627ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong} 7637ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong 7647ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wongstatic void dump_fast_link(FILE *out, ext2_ino_t inode_num, 7657ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong struct ext2_inode *inode, const char *prefix) 7667ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong{ 7677ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong errcode_t retval = 0; 7687ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong char *buf; 7697ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong size_t size; 7707ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong 7717ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong if (inode->i_flags & EXT4_INLINE_DATA_FL) { 7727ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong retval = ext2fs_inline_data_size(current_fs, inode_num, &size); 7737ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong if (retval) 7747ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong goto out; 7757ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong 7767ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong retval = ext2fs_get_memzero(size + 1, &buf); 7777ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong if (retval) 7787ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong goto out; 7797ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong 7807ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong retval = ext2fs_inline_data_get(current_fs, inode_num, 7817ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong inode, buf, &size); 7827ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong if (retval) 7837ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong goto out; 7847ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong fprintf(out, "%sFast link dest: \"%.*s\"\n", prefix, 7857ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong (int)size, buf); 7867ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong 7877ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong retval = ext2fs_free_mem(&buf); 7887ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong if (retval) 7897ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong goto out; 7907ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong } else { 791df0b907ec1625b058814f42119c9a736f2c34c96Theodore Ts'o size_t sz = EXT2_I_SIZE(inode); 7927ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong 7937ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong if (sz > sizeof(inode->i_block)) 7947ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong sz = sizeof(inode->i_block); 795df0b907ec1625b058814f42119c9a736f2c34c96Theodore Ts'o fprintf(out, "%sFast link dest: \"%.*s\"\n", prefix, (int) sz, 7967ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong (char *)inode->i_block); 7977ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong } 7987ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wongout: 7997ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong if (retval) 8007ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong com_err(__func__, retval, "while dumping link destination"); 801133e94627b01823d2555450ddd1d95401ff2227aZheng Liu} 802133e94627b01823d2555450ddd1d95401ff2227aZheng Liu 8035e4f070952bb4472e28a925f591b551baf2db278Theodore Ts'ovoid internal_dump_inode(FILE *out, const char *prefix, 804da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o ext2_ino_t inode_num, struct ext2_inode *inode, 805da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o int do_dump_blocks) 8063839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 80750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o const char *i_type; 808fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o char frag, fsize; 809fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o int os = current_fs->super->s_creator_os; 810a16031c639c1965c7a35eb9ac9b2d45798efe7e9Theodore Ts'o struct ext2_inode_large *large_inode; 811a16031c639c1965c7a35eb9ac9b2d45798efe7e9Theodore Ts'o int is_large_inode = 0; 812a16031c639c1965c7a35eb9ac9b2d45798efe7e9Theodore Ts'o 813a16031c639c1965c7a35eb9ac9b2d45798efe7e9Theodore Ts'o if (EXT2_INODE_SIZE(current_fs->super) > EXT2_GOOD_OLD_INODE_SIZE) 814a16031c639c1965c7a35eb9ac9b2d45798efe7e9Theodore Ts'o is_large_inode = 1; 815a16031c639c1965c7a35eb9ac9b2d45798efe7e9Theodore Ts'o large_inode = (struct ext2_inode_large *) inode; 816a16031c639c1965c7a35eb9ac9b2d45798efe7e9Theodore Ts'o 817da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (LINUX_S_ISDIR(inode->i_mode)) i_type = "directory"; 818da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o else if (LINUX_S_ISREG(inode->i_mode)) i_type = "regular"; 819da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o else if (LINUX_S_ISLNK(inode->i_mode)) i_type = "symlink"; 820da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o else if (LINUX_S_ISBLK(inode->i_mode)) i_type = "block special"; 821da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o else if (LINUX_S_ISCHR(inode->i_mode)) i_type = "character special"; 822da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o else if (LINUX_S_ISFIFO(inode->i_mode)) i_type = "FIFO"; 823da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o else if (LINUX_S_ISSOCK(inode->i_mode)) i_type = "socket"; 8243839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o else i_type = "bad type"; 825da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o fprintf(out, "%sInode: %u Type: %s ", prefix, inode_num, i_type); 826a16031c639c1965c7a35eb9ac9b2d45798efe7e9Theodore Ts'o fprintf(out, "%sMode: %04o Flags: 0x%x\n", 827a16031c639c1965c7a35eb9ac9b2d45798efe7e9Theodore Ts'o prefix, inode->i_mode & 0777, inode->i_flags); 828a16031c639c1965c7a35eb9ac9b2d45798efe7e9Theodore Ts'o if (is_large_inode && large_inode->i_extra_isize >= 24) { 829efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o fprintf(out, "%sGeneration: %u Version: 0x%08x:%08x\n", 830a16031c639c1965c7a35eb9ac9b2d45798efe7e9Theodore Ts'o prefix, inode->i_generation, large_inode->i_version_hi, 831a16031c639c1965c7a35eb9ac9b2d45798efe7e9Theodore Ts'o inode->osd1.linux1.l_i_version); 832a16031c639c1965c7a35eb9ac9b2d45798efe7e9Theodore Ts'o } else { 833efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o fprintf(out, "%sGeneration: %u Version: 0x%08x\n", prefix, 834a16031c639c1965c7a35eb9ac9b2d45798efe7e9Theodore Ts'o inode->i_generation, inode->osd1.linux1.l_i_version); 835a16031c639c1965c7a35eb9ac9b2d45798efe7e9Theodore Ts'o } 836f3d9ac36a021aab3d84ef7759790839f9a65a1bfTheodore Ts'o fprintf(out, "%sUser: %5d Group: %5d", 8375113a6e32b298671c86ae7da097bcd24540cebc9Eric Sandeen prefix, inode_uid(*inode), inode_gid(*inode)); 838f3d9ac36a021aab3d84ef7759790839f9a65a1bfTheodore Ts'o if (is_large_inode && large_inode->i_extra_isize >= 32) 839f3d9ac36a021aab3d84ef7759790839f9a65a1bfTheodore Ts'o fprintf(out, " Project: %5d", large_inode->i_projid); 840f3d9ac36a021aab3d84ef7759790839f9a65a1bfTheodore Ts'o fputs(" Size: ", out); 8410bd0e5932046401049502ee99529b984d7cd316eAndreas Dilger if (LINUX_S_ISREG(inode->i_mode)) 8420bd0e5932046401049502ee99529b984d7cd316eAndreas Dilger fprintf(out, "%llu\n", EXT2_I_SIZE(inode)); 8430bd0e5932046401049502ee99529b984d7cd316eAndreas Dilger else 8441a6bb6274fc0a0fff9072dd63b39e716cb94d4edAndreas Dilger fprintf(out, "%d\n", inode->i_size); 8455d17119d14fe1276936c85d7986695a4543b1aa1Theodore Ts'o if (os == EXT2_OS_HURD) 84662c06f790c4920ec2721515e36d599751f6d4d2dTheodore Ts'o fprintf(out, 847da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o "%sFile ACL: %d Directory ACL: %d Translator: %d\n", 848da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o prefix, 849da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o inode->i_file_acl, LINUX_S_ISDIR(inode->i_mode) ? inode->i_dir_acl : 0, 850da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o inode->osd1.hurd1.h_i_translator); 85162c06f790c4920ec2721515e36d599751f6d4d2dTheodore Ts'o else 85281624c3c7b4784f6651e807994db4792a49112ebTheodore Ts'o fprintf(out, "%sFile ACL: %llu Directory ACL: %d\n", 853da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o prefix, 85481624c3c7b4784f6651e807994db4792a49112ebTheodore Ts'o inode->i_file_acl | ((long long) 85581624c3c7b4784f6651e807994db4792a49112ebTheodore Ts'o (inode->osd2.linux2.l_i_file_acl_high) << 32), 85681624c3c7b4784f6651e807994db4792a49112ebTheodore Ts'o LINUX_S_ISDIR(inode->i_mode) ? inode->i_dir_acl : 0); 857c0495d96fd1f7015e7beb3d9363cbe949d133173Theodore Ts'o if (os != EXT2_OS_HURD) 8585d17119d14fe1276936c85d7986695a4543b1aa1Theodore Ts'o fprintf(out, "%sLinks: %d Blockcount: %llu\n", 859efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o prefix, inode->i_links_count, 860efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o (((unsigned long long) 861efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o inode->osd2.linux2.l_i_blocks_hi << 32)) + 8625d17119d14fe1276936c85d7986695a4543b1aa1Theodore Ts'o inode->i_blocks); 8635d17119d14fe1276936c85d7986695a4543b1aa1Theodore Ts'o else 8645d17119d14fe1276936c85d7986695a4543b1aa1Theodore Ts'o fprintf(out, "%sLinks: %d Blockcount: %u\n", 8655d17119d14fe1276936c85d7986695a4543b1aa1Theodore Ts'o prefix, inode->i_links_count, inode->i_blocks); 866fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o switch (os) { 867fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o case EXT2_OS_HURD: 868da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o frag = inode->osd2.hurd2.h_i_frag; 869da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o fsize = inode->osd2.hurd2.h_i_fsize; 870fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o break; 871fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o default: 872fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o frag = fsize = 0; 873fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o } 874da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o fprintf(out, "%sFragment: Address: %d Number: %d Size: %d\n", 875da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o prefix, inode->i_faddr, frag, fsize); 876a16031c639c1965c7a35eb9ac9b2d45798efe7e9Theodore Ts'o if (is_large_inode && large_inode->i_extra_isize >= 24) { 877efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o fprintf(out, "%s ctime: 0x%08x:%08x -- %s", prefix, 878a16031c639c1965c7a35eb9ac9b2d45798efe7e9Theodore Ts'o inode->i_ctime, large_inode->i_ctime_extra, 879188960ea4b830ec69607aab3068537ce55f44be4Theodore Ts'o inode_time_to_string(inode->i_ctime, 880188960ea4b830ec69607aab3068537ce55f44be4Theodore Ts'o large_inode->i_ctime_extra)); 881efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o fprintf(out, "%s atime: 0x%08x:%08x -- %s", prefix, 882a16031c639c1965c7a35eb9ac9b2d45798efe7e9Theodore Ts'o inode->i_atime, large_inode->i_atime_extra, 883188960ea4b830ec69607aab3068537ce55f44be4Theodore Ts'o inode_time_to_string(inode->i_atime, 884188960ea4b830ec69607aab3068537ce55f44be4Theodore Ts'o large_inode->i_atime_extra)); 885a16031c639c1965c7a35eb9ac9b2d45798efe7e9Theodore Ts'o fprintf(out, "%s mtime: 0x%08x:%08x -- %s", prefix, 886a16031c639c1965c7a35eb9ac9b2d45798efe7e9Theodore Ts'o inode->i_mtime, large_inode->i_mtime_extra, 887188960ea4b830ec69607aab3068537ce55f44be4Theodore Ts'o inode_time_to_string(inode->i_mtime, 888188960ea4b830ec69607aab3068537ce55f44be4Theodore Ts'o large_inode->i_mtime_extra)); 889a16031c639c1965c7a35eb9ac9b2d45798efe7e9Theodore Ts'o fprintf(out, "%scrtime: 0x%08x:%08x -- %s", prefix, 890a16031c639c1965c7a35eb9ac9b2d45798efe7e9Theodore Ts'o large_inode->i_crtime, large_inode->i_crtime_extra, 891188960ea4b830ec69607aab3068537ce55f44be4Theodore Ts'o inode_time_to_string(large_inode->i_crtime, 892188960ea4b830ec69607aab3068537ce55f44be4Theodore Ts'o large_inode->i_crtime_extra)); 893188960ea4b830ec69607aab3068537ce55f44be4Theodore Ts'o if (inode->i_dtime) 89422137497fa13c1e38fdae96f43eb827c0f46692bTheodore Ts'o fprintf(out, "%s dtime: 0x%08x:(%08x) -- %s", prefix, 895188960ea4b830ec69607aab3068537ce55f44be4Theodore Ts'o large_inode->i_dtime, large_inode->i_ctime_extra, 896188960ea4b830ec69607aab3068537ce55f44be4Theodore Ts'o inode_time_to_string(inode->i_dtime, 897188960ea4b830ec69607aab3068537ce55f44be4Theodore Ts'o large_inode->i_ctime_extra)); 898a16031c639c1965c7a35eb9ac9b2d45798efe7e9Theodore Ts'o } else { 899a16031c639c1965c7a35eb9ac9b2d45798efe7e9Theodore Ts'o fprintf(out, "%sctime: 0x%08x -- %s", prefix, inode->i_ctime, 900188960ea4b830ec69607aab3068537ce55f44be4Theodore Ts'o time_to_string((__s32) inode->i_ctime)); 901a16031c639c1965c7a35eb9ac9b2d45798efe7e9Theodore Ts'o fprintf(out, "%satime: 0x%08x -- %s", prefix, inode->i_atime, 902188960ea4b830ec69607aab3068537ce55f44be4Theodore Ts'o time_to_string((__s32) inode->i_atime)); 903a16031c639c1965c7a35eb9ac9b2d45798efe7e9Theodore Ts'o fprintf(out, "%smtime: 0x%08x -- %s", prefix, inode->i_mtime, 904188960ea4b830ec69607aab3068537ce55f44be4Theodore Ts'o time_to_string((__s32) inode->i_mtime)); 905188960ea4b830ec69607aab3068537ce55f44be4Theodore Ts'o if (inode->i_dtime) 906188960ea4b830ec69607aab3068537ce55f44be4Theodore Ts'o fprintf(out, "%sdtime: 0x%08x -- %s", prefix, 907188960ea4b830ec69607aab3068537ce55f44be4Theodore Ts'o inode->i_dtime, 908188960ea4b830ec69607aab3068537ce55f44be4Theodore Ts'o time_to_string((__s32) inode->i_dtime)); 909a16031c639c1965c7a35eb9ac9b2d45798efe7e9Theodore Ts'o } 910ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o if (EXT2_INODE_SIZE(current_fs->super) > EXT2_GOOD_OLD_INODE_SIZE) 911ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o internal_dump_inode_extra(out, prefix, inode_num, 912ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o (struct ext2_inode_large *) inode); 9135beff1c0cfaf59a80bbd86a4b1436b39133b2abfDarrick J. Wong dump_inode_attributes(out, inode_num); 914c0495d96fd1f7015e7beb3d9363cbe949d133173Theodore Ts'o if (ext2fs_has_feature_metadata_csum(current_fs->super)) { 9156d0af0c85d2298cbb3acc8cfd860beb932623d23Darrick J. Wong __u32 crc = inode->i_checksum_lo; 9166d0af0c85d2298cbb3acc8cfd860beb932623d23Darrick J. Wong if (is_large_inode && 9176d0af0c85d2298cbb3acc8cfd860beb932623d23Darrick J. Wong large_inode->i_extra_isize >= 9186d0af0c85d2298cbb3acc8cfd860beb932623d23Darrick J. Wong (offsetof(struct ext2_inode_large, 9196d0af0c85d2298cbb3acc8cfd860beb932623d23Darrick J. Wong i_checksum_hi) - 9206d0af0c85d2298cbb3acc8cfd860beb932623d23Darrick J. Wong EXT2_GOOD_OLD_INODE_SIZE)) 9216d0af0c85d2298cbb3acc8cfd860beb932623d23Darrick J. Wong crc |= ((__u32)large_inode->i_checksum_hi) << 16; 9226d0af0c85d2298cbb3acc8cfd860beb932623d23Darrick J. Wong fprintf(out, "Inode checksum: 0x%08x\n", crc); 9236d0af0c85d2298cbb3acc8cfd860beb932623d23Darrick J. Wong } 9246d0af0c85d2298cbb3acc8cfd860beb932623d23Darrick J. Wong 925328731738d88eb6c32c784e7aa7871e576e9e8a5Zheng Liu if (LINUX_S_ISLNK(inode->i_mode) && 9267ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong ext2fs_inode_data_blocks(current_fs, inode) == 0) 9277ba5cc744b842da7a7109fbf8f0c53dbc63bcae1Darrick J. Wong dump_fast_link(out, inode_num, inode, prefix); 9282d10769ec6745b1e4bab371764d65bb3587ab285Theodore Ts'o else if (LINUX_S_ISBLK(inode->i_mode) || LINUX_S_ISCHR(inode->i_mode)) { 9292d10769ec6745b1e4bab371764d65bb3587ab285Theodore Ts'o int major, minor; 9302d10769ec6745b1e4bab371764d65bb3587ab285Theodore Ts'o const char *devnote; 9312d10769ec6745b1e4bab371764d65bb3587ab285Theodore Ts'o 9322d10769ec6745b1e4bab371764d65bb3587ab285Theodore Ts'o if (inode->i_block[0]) { 9332d10769ec6745b1e4bab371764d65bb3587ab285Theodore Ts'o major = (inode->i_block[0] >> 8) & 255; 9342d10769ec6745b1e4bab371764d65bb3587ab285Theodore Ts'o minor = inode->i_block[0] & 255; 9352d10769ec6745b1e4bab371764d65bb3587ab285Theodore Ts'o devnote = ""; 9362d10769ec6745b1e4bab371764d65bb3587ab285Theodore Ts'o } else { 9372d10769ec6745b1e4bab371764d65bb3587ab285Theodore Ts'o major = (inode->i_block[1] & 0xfff00) >> 8; 938efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o minor = ((inode->i_block[1] & 0xff) | 9392d10769ec6745b1e4bab371764d65bb3587ab285Theodore Ts'o ((inode->i_block[1] >> 12) & 0xfff00)); 9402d10769ec6745b1e4bab371764d65bb3587ab285Theodore Ts'o devnote = "(New-style) "; 9412d10769ec6745b1e4bab371764d65bb3587ab285Theodore Ts'o } 942efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o fprintf(out, "%sDevice major/minor number: %02d:%02d (hex %02x:%02x)\n", 9432d10769ec6745b1e4bab371764d65bb3587ab285Theodore Ts'o devnote, major, minor, major, minor); 944187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o } else if (do_dump_blocks) { 945187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o if (inode->i_flags & EXT4_EXTENTS_FL) 946187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o dump_extents(out, prefix, inode_num, 947c4b87b8c4ff6f3efff86f96dbef3ed050a712354Theodore Ts'o DUMP_LEAF_EXTENTS|DUMP_NODE_EXTENTS, 0, 0); 948133e94627b01823d2555450ddd1d95401ff2227aZheng Liu else if (inode->i_flags & EXT4_INLINE_DATA_FL) 949133e94627b01823d2555450ddd1d95401ff2227aZheng Liu dump_inline_data(out, prefix, inode_num); 950187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o else 951187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o dump_blocks(out, prefix, inode_num); 9522d10769ec6745b1e4bab371764d65bb3587ab285Theodore Ts'o } 953da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o} 954da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 955ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'ostatic void dump_inode(ext2_ino_t inode_num, struct ext2_inode *inode) 956da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o{ 957da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o FILE *out; 958efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 959da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o out = open_pager(); 960ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o internal_dump_inode(out, "", inode_num, inode, 1); 9613839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o close_pager(out); 9623839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 9633839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 9643839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid do_stat(int argc, char *argv[]) 9653839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 966b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o ext2_ino_t inode; 967ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o struct ext2_inode * inode_buf; 9683839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 96964777391eb2bdc0d57319bb9895b840a4c60e475Theodore Ts'o if (check_fs_open(argv[0])) 9708363e357b2cf943396ec7165e389a20385e40ab6Theodore Ts'o return; 97164777391eb2bdc0d57319bb9895b840a4c60e475Theodore Ts'o 972ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o inode_buf = (struct ext2_inode *) 973ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o malloc(EXT2_INODE_SIZE(current_fs->super)); 974ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o if (!inode_buf) { 975ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o fprintf(stderr, "do_stat: can't allocate buffer\n"); 9763839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 977ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o } 9783839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 979ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o if (common_inode_args_process(argc, argv, &inode, 0)) { 980ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o free(inode_buf); 981ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o return; 982ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o } 983ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o 984ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o if (debugfs_read_inode_full(inode, inode_buf, argv[0], 985ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o EXT2_INODE_SIZE(current_fs->super))) { 986ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o free(inode_buf); 987e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return; 988ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o } 9893839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 990ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o dump_inode(inode, inode_buf); 991ea822eeba373bd0bed6e58a35ce123a9f2768113Theodore Ts'o free(inode_buf); 9923839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 9933839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 9943839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 995cf5301d7f2c3bbed3d26600335102414cbf0c4baAndreas Dilgervoid do_dump_extents(int argc, char **argv) 996187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o{ 997187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o struct ext2_inode inode; 998187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o ext2_ino_t ino; 999187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o FILE *out; 1000187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o int c, flags = 0; 1001187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o int logical_width; 1002187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o int physical_width; 1003187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o 1004187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o reset_getopt(); 1005187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o while ((c = getopt(argc, argv, "nl")) != EOF) { 1006187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o switch (c) { 1007187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o case 'n': 1008187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o flags |= DUMP_NODE_EXTENTS; 1009187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o break; 1010187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o case 'l': 1011187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o flags |= DUMP_LEAF_EXTENTS; 1012187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o break; 1013187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o } 1014187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o } 1015187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o 1016cf5301d7f2c3bbed3d26600335102414cbf0c4baAndreas Dilger if (argc != optind + 1) { 1017187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o com_err(0, 0, "Usage: dump_extents [-n] [-l] file"); 1018187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o return; 1019187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o } 1020187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o 1021187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o if (flags == 0) 1022187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o flags = DUMP_NODE_EXTENTS | DUMP_LEAF_EXTENTS; 1023187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o flags |= DUMP_EXTENT_TABLE; 1024187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o 1025187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o if (check_fs_open(argv[0])) 1026187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o return; 1027187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o 1028187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o ino = string_to_inode(argv[optind]); 1029187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o if (ino == 0) 1030187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o return; 1031187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o 1032187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o if (debugfs_read_inode(ino, &inode, argv[0])) 1033187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o return; 1034187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o 1035187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o if ((inode.i_flags & EXT4_EXTENTS_FL) == 0) { 1036187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o fprintf(stderr, "%s: does not uses extent block maps\n", 1037187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o argv[optind]); 1038187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o return; 1039187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o } 1040187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o 10410bd0e5932046401049502ee99529b984d7cd316eAndreas Dilger logical_width = int_log10((EXT2_I_SIZE(&inode)+current_fs->blocksize-1)/ 1042187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o current_fs->blocksize) + 1; 1043187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o if (logical_width < 5) 1044187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o logical_width = 5; 10454efbac6fed75c29d3d5f1b676b932754653a2ac5Valerie Aurora Henson physical_width = int_log10(ext2fs_blocks_count(current_fs->super)) + 1; 1046187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o if (physical_width < 5) 1047187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o physical_width = 5; 1048187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o 1049187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o out = open_pager(); 1050187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o dump_extents(out, "", ino, flags, logical_width, physical_width); 1051187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o close_pager(out); 1052187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o return; 1053187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o} 1054187cb623dc8085439d366dceb07bc2191da3c21eTheodore Ts'o 1055af0df2aa4a073f7e1a2d58b40010ecd891e80a60Theodore Ts'ostatic int print_blocks_proc(ext2_filsys fs EXT2FS_ATTR((unused)), 1056af0df2aa4a073f7e1a2d58b40010ecd891e80a60Theodore Ts'o blk64_t *blocknr, 10573cebf9c1029ca983ebbbae79f7905a02d087ff98Theodore Ts'o e2_blkcnt_t blockcnt EXT2FS_ATTR((unused)), 1058af0df2aa4a073f7e1a2d58b40010ecd891e80a60Theodore Ts'o blk64_t ref_block EXT2FS_ATTR((unused)), 1059af0df2aa4a073f7e1a2d58b40010ecd891e80a60Theodore Ts'o int ref_offset EXT2FS_ATTR((unused)), 1060af0df2aa4a073f7e1a2d58b40010ecd891e80a60Theodore Ts'o void *private EXT2FS_ATTR((unused))) 1061af0df2aa4a073f7e1a2d58b40010ecd891e80a60Theodore Ts'o{ 1062af0df2aa4a073f7e1a2d58b40010ecd891e80a60Theodore Ts'o printf("%llu ", *blocknr); 1063af0df2aa4a073f7e1a2d58b40010ecd891e80a60Theodore Ts'o return 0; 1064af0df2aa4a073f7e1a2d58b40010ecd891e80a60Theodore Ts'o} 1065af0df2aa4a073f7e1a2d58b40010ecd891e80a60Theodore Ts'o 1066af0df2aa4a073f7e1a2d58b40010ecd891e80a60Theodore Ts'ovoid do_blocks(int argc, char *argv[]) 1067af0df2aa4a073f7e1a2d58b40010ecd891e80a60Theodore Ts'o{ 1068af0df2aa4a073f7e1a2d58b40010ecd891e80a60Theodore Ts'o ext2_ino_t inode; 1069af0df2aa4a073f7e1a2d58b40010ecd891e80a60Theodore Ts'o 1070af0df2aa4a073f7e1a2d58b40010ecd891e80a60Theodore Ts'o if (check_fs_open(argv[0])) 1071af0df2aa4a073f7e1a2d58b40010ecd891e80a60Theodore Ts'o return; 1072af0df2aa4a073f7e1a2d58b40010ecd891e80a60Theodore Ts'o 1073af0df2aa4a073f7e1a2d58b40010ecd891e80a60Theodore Ts'o if (common_inode_args_process(argc, argv, &inode, 0)) { 1074af0df2aa4a073f7e1a2d58b40010ecd891e80a60Theodore Ts'o return; 1075af0df2aa4a073f7e1a2d58b40010ecd891e80a60Theodore Ts'o } 1076af0df2aa4a073f7e1a2d58b40010ecd891e80a60Theodore Ts'o 1077af0df2aa4a073f7e1a2d58b40010ecd891e80a60Theodore Ts'o ext2fs_block_iterate3(current_fs, inode, BLOCK_FLAG_READ_ONLY, NULL, 1078af0df2aa4a073f7e1a2d58b40010ecd891e80a60Theodore Ts'o print_blocks_proc, NULL); 1079af0df2aa4a073f7e1a2d58b40010ecd891e80a60Theodore Ts'o fputc('\n', stdout); 1080af0df2aa4a073f7e1a2d58b40010ecd891e80a60Theodore Ts'o return; 1081af0df2aa4a073f7e1a2d58b40010ecd891e80a60Theodore Ts'o} 1082af0df2aa4a073f7e1a2d58b40010ecd891e80a60Theodore Ts'o 10833839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid do_chroot(int argc, char *argv[]) 10843839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 1085b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o ext2_ino_t inode; 10863839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o int retval; 10873839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1088e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (common_inode_args_process(argc, argv, &inode, 0)) 10893839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 10903839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1091fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o retval = ext2fs_check_directory(current_fs, inode); 10923839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) { 10939b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o com_err(argv[1], retval, 0); 10943839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 10953839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 10963839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o root = inode; 10973839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 10983839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1099e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#ifndef READ_ONLY 11003839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid do_clri(int argc, char *argv[]) 11013839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 1102b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o ext2_ino_t inode; 11033839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o struct ext2_inode inode_buf; 11043839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1105e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (common_inode_args_process(argc, argv, &inode, CHECK_FS_RW)) 11063839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 11073839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1108e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (debugfs_read_inode(inode, &inode_buf, argv[0])) 11093839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 11103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o memset(&inode_buf, 0, sizeof(inode_buf)); 1111e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (debugfs_write_inode(inode, &inode_buf, argv[0])) 11123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 11133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 11143839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 11153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid do_freei(int argc, char *argv[]) 11163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 11172ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o unsigned int len = 1; 11182ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o int err = 0; 11192ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o ext2_ino_t inode; 11202ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o 11212ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o if (common_args_process(argc, argv, 2, 3, argv[0], "<file> [num]", 11222ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o CHECK_FS_RW | CHECK_FS_BITMAPS)) 1123e64e6761aa22f31123a91206a5686526f7b9c6c0Theodore Ts'o return; 11242ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o if (check_fs_read_write(argv[0])) 11252ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o return; 11263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 11272ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o inode = string_to_inode(argv[1]); 11282ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o if (!inode) 11293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 11303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 11312ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o if (argc == 3) { 11322ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o len = parse_ulong(argv[2], argv[0], "length", &err); 11332ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o if (err) 11342ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o return; 11352ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o } 11362ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o 11372ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o if (len == 1 && 11382ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o !ext2fs_test_inode_bitmap2(current_fs->inode_map,inode)) 11393839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o com_err(argv[0], 0, "Warning: inode already clear"); 11402ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o while (len-- > 0) 1141a9b23fc99da8c8918cb5fb8dcd1732edb70ad382Lev Solomonov ext2fs_unmark_inode_bitmap2(current_fs->inode_map, inode++); 1142fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o ext2fs_mark_ib_dirty(current_fs); 11433839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 11443839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 11453839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid do_seti(int argc, char *argv[]) 11463839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 11472ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o unsigned int len = 1; 11482ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o int err = 0; 11492ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o ext2_ino_t inode; 11503839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 11512ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o if (common_args_process(argc, argv, 2, 3, argv[0], "<file> [num]", 11522ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o CHECK_FS_RW | CHECK_FS_BITMAPS)) 11532ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o return; 11542ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o if (check_fs_read_write(argv[0])) 11553839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 11563839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 11572ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o inode = string_to_inode(argv[1]); 11582ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o if (!inode) 11592ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o return; 11602ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o 11612ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o if (argc == 3) { 11622ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o len = parse_ulong(argv[2], argv[0], "length", &err); 11632ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o if (err) 11642ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o return; 11652ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o } 11662ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o 11672ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o if ((len == 1) && 11682ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o ext2fs_test_inode_bitmap2(current_fs->inode_map,inode)) 11693839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o com_err(argv[0], 0, "Warning: inode already set"); 11702ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o while (len-- > 0) 11712ae5d1fdb82b31bf270c4699c59a087c846db2f0Theodore Ts'o ext2fs_mark_inode_bitmap2(current_fs->inode_map, inode++); 1172fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o ext2fs_mark_ib_dirty(current_fs); 11733839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 1174e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#endif /* READ_ONLY */ 11753839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 11763839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid do_testi(int argc, char *argv[]) 11773839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 1178b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o ext2_ino_t inode; 11793839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1180e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (common_inode_args_process(argc, argv, &inode, CHECK_FS_BITMAPS)) 11813839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 11823839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 11836d879a999bad95724304a2a5158d7da4fcd599e7Valerie Aurora Henson if (ext2fs_test_inode_bitmap2(current_fs->inode_map,inode)) 1184b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o printf("Inode %u is marked in use\n", inode); 11853839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o else 1186b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o printf("Inode %u is not in use\n", inode); 11873839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 11883839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1189e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#ifndef READ_ONLY 11903839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid do_freeb(int argc, char *argv[]) 11913839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 1192048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson blk64_t block; 1193048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson blk64_t count = 1; 11943839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1195e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (common_block_args_process(argc, argv, &block, &count)) 11963839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 1197fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o if (check_fs_read_write(argv[0])) 11983839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 1199e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o while (count-- > 0) { 12006d879a999bad95724304a2a5158d7da4fcd599e7Valerie Aurora Henson if (!ext2fs_test_block_bitmap2(current_fs->block_map,block)) 1201048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson com_err(argv[0], 0, "Warning: block %llu already clear", 1202e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o block); 12036d879a999bad95724304a2a5158d7da4fcd599e7Valerie Aurora Henson ext2fs_unmark_block_bitmap2(current_fs->block_map,block); 1204e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o block++; 1205e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o } 1206fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o ext2fs_mark_bb_dirty(current_fs); 12073839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 12083839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 12093839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid do_setb(int argc, char *argv[]) 12103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 1211048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson blk64_t block; 1212048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson blk64_t count = 1; 12133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1214e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (common_block_args_process(argc, argv, &block, &count)) 12153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 1216fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o if (check_fs_read_write(argv[0])) 12173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 1218e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o while (count-- > 0) { 12196d879a999bad95724304a2a5158d7da4fcd599e7Valerie Aurora Henson if (ext2fs_test_block_bitmap2(current_fs->block_map,block)) 1220048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson com_err(argv[0], 0, "Warning: block %llu already set", 1221e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o block); 12226d879a999bad95724304a2a5158d7da4fcd599e7Valerie Aurora Henson ext2fs_mark_block_bitmap2(current_fs->block_map,block); 1223e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o block++; 1224e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o } 1225fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o ext2fs_mark_bb_dirty(current_fs); 12263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 1227e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#endif /* READ_ONLY */ 12283839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 12293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid do_testb(int argc, char *argv[]) 12303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 1231048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson blk64_t block; 1232048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson blk64_t count = 1; 12333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1234e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (common_block_args_process(argc, argv, &block, &count)) 12353839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 1236e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o while (count-- > 0) { 12376d879a999bad95724304a2a5158d7da4fcd599e7Valerie Aurora Henson if (ext2fs_test_block_bitmap2(current_fs->block_map,block)) 1238048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson printf("Block %llu marked in use\n", block); 1239e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o else 1240048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson printf("Block %llu not in use\n", block); 1241e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o block++; 12423839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 12433839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 12443839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1245e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#ifndef READ_ONLY 124650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'ostatic void modify_u8(char *com, const char *prompt, 124750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o const char *format, __u8 *val) 12483839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 12493839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o char buf[200]; 125021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o unsigned long v; 12513839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o char *tmp; 12523839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 12533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o sprintf(buf, format, *val); 12543839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o printf("%30s [%s] ", prompt, buf); 1255d9039ae0ff3f7929ede576058b3ad3e9c62a47c4Dmitry V. Levin if (!fgets(buf, sizeof(buf), stdin)) 1256d9039ae0ff3f7929ede576058b3ad3e9c62a47c4Dmitry V. Levin return; 12573839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (buf[strlen (buf) - 1] == '\n') 12583839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o buf[strlen (buf) - 1] = '\0'; 12593839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (!buf[0]) 12603839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 126121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o v = strtoul(buf, &tmp, 0); 12623839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (*tmp) 12633839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o com_err(com, 0, "Bad value - %s", buf); 12643839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o else 12653839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o *val = v; 12663839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 12673839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 126850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'ostatic void modify_u16(char *com, const char *prompt, 126950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o const char *format, __u16 *val) 12703839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 12713839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o char buf[200]; 127221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o unsigned long v; 12733839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o char *tmp; 12743839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 12753839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o sprintf(buf, format, *val); 12763839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o printf("%30s [%s] ", prompt, buf); 1277d9039ae0ff3f7929ede576058b3ad3e9c62a47c4Dmitry V. Levin if (!fgets(buf, sizeof(buf), stdin)) 1278d9039ae0ff3f7929ede576058b3ad3e9c62a47c4Dmitry V. Levin return; 12793839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (buf[strlen (buf) - 1] == '\n') 12803839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o buf[strlen (buf) - 1] = '\0'; 12813839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (!buf[0]) 12823839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 128321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o v = strtoul(buf, &tmp, 0); 12843839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (*tmp) 12853839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o com_err(com, 0, "Bad value - %s", buf); 12863839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o else 12873839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o *val = v; 12883839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 12893839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 129050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'ostatic void modify_u32(char *com, const char *prompt, 129150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o const char *format, __u32 *val) 12923839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 12933839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o char buf[200]; 129421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o unsigned long v; 12953839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o char *tmp; 12963839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 12973839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o sprintf(buf, format, *val); 12983839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o printf("%30s [%s] ", prompt, buf); 1299d9039ae0ff3f7929ede576058b3ad3e9c62a47c4Dmitry V. Levin if (!fgets(buf, sizeof(buf), stdin)) 1300d9039ae0ff3f7929ede576058b3ad3e9c62a47c4Dmitry V. Levin return; 13013839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (buf[strlen (buf) - 1] == '\n') 13023839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o buf[strlen (buf) - 1] = '\0'; 13033839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (!buf[0]) 13043839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 130521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o v = strtoul(buf, &tmp, 0); 13063839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (*tmp) 13073839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o com_err(com, 0, "Bad value - %s", buf); 13083839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o else 13093839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o *val = v; 13103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 13113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 13123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 13133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid do_modify_inode(int argc, char *argv[]) 13143839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 13153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o struct ext2_inode inode; 1316b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o ext2_ino_t inode_num; 1317b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o int i; 1318b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o unsigned char *frag, *fsize; 1319b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o char buf[80]; 13207380ac903316c0fe91ed6706eb4d84249a9b348dTheodore Ts'o int os; 1321b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o const char *hex_format = "0x%x"; 1322b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o const char *octal_format = "0%o"; 1323b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o const char *decimal_format = "%d"; 13248deb80a5d1078cbe43eaffcdeebf0a1a549d6a54Takashi Sato const char *unsignedlong_format = "%lu"; 1325efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 1326e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (common_inode_args_process(argc, argv, &inode_num, CHECK_FS_RW)) 13273839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 13283839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 13297380ac903316c0fe91ed6706eb4d84249a9b348dTheodore Ts'o os = current_fs->super->s_creator_os; 13307380ac903316c0fe91ed6706eb4d84249a9b348dTheodore Ts'o 1331e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (debugfs_read_inode(inode_num, &inode, argv[1])) 13323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 1333efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 133450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o modify_u16(argv[0], "Mode", octal_format, &inode.i_mode); 133550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o modify_u16(argv[0], "User ID", decimal_format, &inode.i_uid); 133650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o modify_u16(argv[0], "Group ID", decimal_format, &inode.i_gid); 13378deb80a5d1078cbe43eaffcdeebf0a1a549d6a54Takashi Sato modify_u32(argv[0], "Size", unsignedlong_format, &inode.i_size); 133850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o modify_u32(argv[0], "Creation time", decimal_format, &inode.i_ctime); 133950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o modify_u32(argv[0], "Modification time", decimal_format, &inode.i_mtime); 134050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o modify_u32(argv[0], "Access time", decimal_format, &inode.i_atime); 134150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o modify_u32(argv[0], "Deletion time", decimal_format, &inode.i_dtime); 134250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o modify_u16(argv[0], "Link count", decimal_format, &inode.i_links_count); 13435d17119d14fe1276936c85d7986695a4543b1aa1Theodore Ts'o if (os == EXT2_OS_LINUX) 1344efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o modify_u16(argv[0], "Block count high", unsignedlong_format, 13455d17119d14fe1276936c85d7986695a4543b1aa1Theodore Ts'o &inode.osd2.linux2.l_i_blocks_hi); 13468deb80a5d1078cbe43eaffcdeebf0a1a549d6a54Takashi Sato modify_u32(argv[0], "Block count", unsignedlong_format, &inode.i_blocks); 134750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o modify_u32(argv[0], "File flags", hex_format, &inode.i_flags); 13483db9305a6bdb67f708c31400603a34e799af475fTheodore Ts'o modify_u32(argv[0], "Generation", hex_format, &inode.i_generation); 134950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#if 0 135050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o modify_u32(argv[0], "Reserved1", decimal_format, &inode.i_reserved1); 135150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif 135250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o modify_u32(argv[0], "File acl", decimal_format, &inode.i_file_acl); 135336a43d675ef61d0f5d5b2ad62d2e670c408d14acTheodore Ts'o if (LINUX_S_ISDIR(inode.i_mode)) 135436a43d675ef61d0f5d5b2ad62d2e670c408d14acTheodore Ts'o modify_u32(argv[0], "Directory acl", decimal_format, &inode.i_dir_acl); 135536a43d675ef61d0f5d5b2ad62d2e670c408d14acTheodore Ts'o else 135636a43d675ef61d0f5d5b2ad62d2e670c408d14acTheodore Ts'o modify_u32(argv[0], "High 32bits of size", decimal_format, &inode.i_size_high); 135762c06f790c4920ec2721515e36d599751f6d4d2dTheodore Ts'o 13585d17119d14fe1276936c85d7986695a4543b1aa1Theodore Ts'o if (os == EXT2_OS_HURD) 135962c06f790c4920ec2721515e36d599751f6d4d2dTheodore Ts'o modify_u32(argv[0], "Translator Block", 136062c06f790c4920ec2721515e36d599751f6d4d2dTheodore Ts'o decimal_format, &inode.osd1.hurd1.h_i_translator); 1361efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 136250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o modify_u32(argv[0], "Fragment address", decimal_format, &inode.i_faddr); 1363fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o switch (os) { 1364fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o case EXT2_OS_HURD: 1365fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o frag = &inode.osd2.hurd2.h_i_frag; 1366fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o fsize = &inode.osd2.hurd2.h_i_fsize; 1367fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o break; 1368fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o default: 1369fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o frag = fsize = 0; 1370fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o } 1371fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o if (frag) 1372fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o modify_u8(argv[0], "Fragment number", decimal_format, frag); 1373fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o if (fsize) 1374fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o modify_u8(argv[0], "Fragment size", decimal_format, fsize); 1375fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o 13763839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o for (i=0; i < EXT2_NDIR_BLOCKS; i++) { 13773839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o sprintf(buf, "Direct Block #%d", i); 137850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o modify_u32(argv[0], buf, decimal_format, &inode.i_block[i]); 13793839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 138050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o modify_u32(argv[0], "Indirect Block", decimal_format, 1381efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o &inode.i_block[EXT2_IND_BLOCK]); 138250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o modify_u32(argv[0], "Double Indirect Block", decimal_format, 13833839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o &inode.i_block[EXT2_DIND_BLOCK]); 138450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o modify_u32(argv[0], "Triple Indirect Block", decimal_format, 13853839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o &inode.i_block[EXT2_TIND_BLOCK]); 1386e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (debugfs_write_inode(inode_num, &inode, argv[1])) 13873839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 13883839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 1389e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#endif /* READ_ONLY */ 13903839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 13913839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid do_change_working_dir(int argc, char *argv[]) 13923839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 1393b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o ext2_ino_t inode; 1394b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o int retval; 1395efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 1396e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (common_inode_args_process(argc, argv, &inode, 0)) 13973839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 13983839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1399fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o retval = ext2fs_check_directory(current_fs, inode); 14003839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) { 14019b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o com_err(argv[1], retval, 0); 14023839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 14033839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 14043839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o cwd = inode; 14053839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 14063839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 14073839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 14083839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid do_print_working_directory(int argc, char *argv[]) 14093839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 14103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o int retval; 14113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o char *pathname = NULL; 1412efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 1413e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (common_args_process(argc, argv, 1, 1, 1414e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o "print_working_directory", "", 0)) 14153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 14163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1417fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o retval = ext2fs_get_pathname(current_fs, cwd, 0, &pathname); 14183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) { 14193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o com_err(argv[0], retval, 14203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o "while trying to get pathname of cwd"); 14213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 1422971fe056305c7f57629d609490701e13298e658bBrian Behlendorf printf("[pwd] INODE: %6u PATH: %s\n", 1423971fe056305c7f57629d609490701e13298e658bBrian Behlendorf cwd, pathname ? pathname : "NULL"); 1424971fe056305c7f57629d609490701e13298e658bBrian Behlendorf if (pathname) { 1425971fe056305c7f57629d609490701e13298e658bBrian Behlendorf free(pathname); 1426971fe056305c7f57629d609490701e13298e658bBrian Behlendorf pathname = NULL; 1427971fe056305c7f57629d609490701e13298e658bBrian Behlendorf } 1428fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o retval = ext2fs_get_pathname(current_fs, root, 0, &pathname); 14293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) { 14303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o com_err(argv[0], retval, 14313839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o "while trying to get pathname of root"); 14323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 1433971fe056305c7f57629d609490701e13298e658bBrian Behlendorf printf("[root] INODE: %6u PATH: %s\n", 1434971fe056305c7f57629d609490701e13298e658bBrian Behlendorf root, pathname ? pathname : "NULL"); 1435971fe056305c7f57629d609490701e13298e658bBrian Behlendorf if (pathname) { 1436971fe056305c7f57629d609490701e13298e658bBrian Behlendorf free(pathname); 1437971fe056305c7f57629d609490701e13298e658bBrian Behlendorf pathname = NULL; 1438971fe056305c7f57629d609490701e13298e658bBrian Behlendorf } 14393839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 14403839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 14413839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 14423cebf9c1029ca983ebbbae79f7905a02d087ff98Theodore Ts'o#ifndef READ_ONLY 144350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'ostatic void make_link(char *sourcename, char *destname) 14443839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 1445abdf84f38ae766f401961d82d4eefdad78ac24edTheodore Ts'o ext2_ino_t ino; 1446abdf84f38ae766f401961d82d4eefdad78ac24edTheodore Ts'o struct ext2_inode inode; 1447b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o int retval; 1448b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o ext2_ino_t dir; 1449d4e0b1c6f5aa8c6a248d9149ed5634a310952411Theodore Ts'o char *dest, *cp, *base_name; 14503839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 14513839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o /* 14523839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Get the source inode 14533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 1454abdf84f38ae766f401961d82d4eefdad78ac24edTheodore Ts'o ino = string_to_inode(sourcename); 1455abdf84f38ae766f401961d82d4eefdad78ac24edTheodore Ts'o if (!ino) 14563839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 1457d4e0b1c6f5aa8c6a248d9149ed5634a310952411Theodore Ts'o base_name = strrchr(sourcename, '/'); 1458d4e0b1c6f5aa8c6a248d9149ed5634a310952411Theodore Ts'o if (base_name) 1459d4e0b1c6f5aa8c6a248d9149ed5634a310952411Theodore Ts'o base_name++; 14603839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o else 1461d4e0b1c6f5aa8c6a248d9149ed5634a310952411Theodore Ts'o base_name = sourcename; 14623839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o /* 14633839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Figure out the destination. First see if it exists and is 1464efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * a directory. 14653839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 1466fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o if (! (retval=ext2fs_namei(current_fs, root, cwd, destname, &dir))) 1467d4e0b1c6f5aa8c6a248d9149ed5634a310952411Theodore Ts'o dest = base_name; 14683839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o else { 14693839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o /* 14703839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * OK, it doesn't exist. See if it is 14713839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * '<dir>/basename' or 'basename' 14723839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 14733839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o cp = strrchr(destname, '/'); 14743839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (cp) { 14753839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o *cp = 0; 14763839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o dir = string_to_inode(destname); 14773839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (!dir) 14783839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 14793839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o dest = cp+1; 14803839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } else { 14813839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o dir = cwd; 14823839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o dest = destname; 14833839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 14843839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 1485abdf84f38ae766f401961d82d4eefdad78ac24edTheodore Ts'o 1486abdf84f38ae766f401961d82d4eefdad78ac24edTheodore Ts'o if (debugfs_read_inode(ino, &inode, sourcename)) 1487abdf84f38ae766f401961d82d4eefdad78ac24edTheodore Ts'o return; 1488efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 1489efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o retval = ext2fs_link(current_fs, dir, dest, ino, 1490abdf84f38ae766f401961d82d4eefdad78ac24edTheodore Ts'o ext2_file_type(inode.i_mode)); 14913839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) 14929b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o com_err("make_link", retval, 0); 14933839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 14943839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 14953839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 14963839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 14973839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid do_link(int argc, char *argv[]) 14983839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 1499e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (common_args_process(argc, argv, 3, 3, "link", 1500e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o "<source file> <dest_name>", CHECK_FS_RW)) 1501e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return; 1502e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o 1503e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o make_link(argv[1], argv[2]); 1504e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o} 1505e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o 1506048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Hensonstatic int mark_blocks_proc(ext2_filsys fs, blk64_t *blocknr, 1507048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson e2_blkcnt_t blockcnt EXT2FS_ATTR((unused)), 1508048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson blk64_t ref_block EXT2FS_ATTR((unused)), 1509048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson int ref_offset EXT2FS_ATTR((unused)), 1510544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o void *private EXT2FS_ATTR((unused))) 1511e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o{ 1512048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson blk64_t block; 1513e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o 1514e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o block = *blocknr; 1515048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson ext2fs_block_alloc_stats2(fs, block, +1); 1516e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return 0; 1517e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o} 1518e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o 1519e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'ovoid do_undel(int argc, char *argv[]) 1520e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o{ 1521e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o ext2_ino_t ino; 1522e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o struct ext2_inode inode; 1523e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o 1524b026d539e67ca4bd1a7ef3743888c594fad7bfffTheodore Ts'o if (common_args_process(argc, argv, 2, 3, "undelete", 1525b026d539e67ca4bd1a7ef3743888c594fad7bfffTheodore Ts'o "<inode_num> [dest_name]", 1526e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o CHECK_FS_RW | CHECK_FS_BITMAPS)) 1527e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return; 1528e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o 1529e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o ino = string_to_inode(argv[1]); 1530e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (!ino) 1531e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return; 1532e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o 1533e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (debugfs_read_inode(ino, &inode, argv[1])) 1534e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return; 1535e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o 15366d879a999bad95724304a2a5158d7da4fcd599e7Valerie Aurora Henson if (ext2fs_test_inode_bitmap2(current_fs->inode_map, ino)) { 1537e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o com_err(argv[1], 0, "Inode is not marked as deleted"); 15383839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 15393839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 1540e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o 1541e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o /* 1542e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o * XXX this function doesn't handle changing the links count on the 1543efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * parent directory when undeleting a directory. 1544e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o */ 1545e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o inode.i_links_count = LINUX_S_ISDIR(inode.i_mode) ? 2 : 1; 1546e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o inode.i_dtime = 0; 1547e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o 1548e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (debugfs_write_inode(ino, &inode, argv[0])) 15493839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 15503839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1551048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson ext2fs_block_iterate3(current_fs, ino, BLOCK_FLAG_READ_ONLY, NULL, 1552048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson mark_blocks_proc, NULL); 1553e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o 1554d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o ext2fs_inode_alloc_stats2(current_fs, ino, +1, 0); 1555e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o 1556b026d539e67ca4bd1a7ef3743888c594fad7bfffTheodore Ts'o if (argc > 2) 1557b026d539e67ca4bd1a7ef3743888c594fad7bfffTheodore Ts'o make_link(argv[1], argv[2]); 15583839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 15593839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 156050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'ostatic void unlink_file_by_name(char *filename) 15613839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 1562b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o int retval; 1563b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o ext2_ino_t dir; 1564d4e0b1c6f5aa8c6a248d9149ed5634a310952411Theodore Ts'o char *base_name; 1565efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 1566d4e0b1c6f5aa8c6a248d9149ed5634a310952411Theodore Ts'o base_name = strrchr(filename, '/'); 1567d4e0b1c6f5aa8c6a248d9149ed5634a310952411Theodore Ts'o if (base_name) { 1568d4e0b1c6f5aa8c6a248d9149ed5634a310952411Theodore Ts'o *base_name++ = '\0'; 15693839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o dir = string_to_inode(filename); 15703839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (!dir) 15713839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 15723839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } else { 15733839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o dir = cwd; 1574d4e0b1c6f5aa8c6a248d9149ed5634a310952411Theodore Ts'o base_name = filename; 15753839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 1576d4e0b1c6f5aa8c6a248d9149ed5634a310952411Theodore Ts'o retval = ext2fs_unlink(current_fs, dir, base_name, 0, 0); 15773839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) 15789b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o com_err("unlink_file_by_name", retval, 0); 15793839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 15803839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 15813839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 15823839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid do_unlink(int argc, char *argv[]) 15833839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 1584e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (common_args_process(argc, argv, 2, 2, "link", 1585e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o "<pathname>", CHECK_FS_RW)) 15863839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 15873839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 15883839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o unlink_file_by_name(argv[1]); 15893839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 1590b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o 1591b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'ovoid do_copy_inode(int argc, char *argv[]) 1592b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o{ 1593b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o ext2_ino_t src_ino, dest_ino; 1594b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o struct ext2_inode inode; 1595b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o unsigned char buf[4096]; 1596b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o int retval; 1597b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o 1598b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o if (common_args_process(argc, argv, 3, 3, "copy_inode", 1599b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o "<source file> <dest_name>", CHECK_FS_RW)) 1600b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o return; 1601b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o 1602b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o src_ino = string_to_inode(argv[1]); 1603b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o if (!src_ino) 1604b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o return; 1605b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o 1606b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o dest_ino = string_to_inode(argv[2]); 1607b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o if (!dest_ino) 1608b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o return; 1609b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o 1610b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o if (debugfs_read_inode_full(src_ino, (struct ext2_inode *) buf, 1611b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o argv[0], sizeof(buf))) 1612b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o return; 1613b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o 1614b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o if (debugfs_write_inode_full(dest_ino, (struct ext2_inode *) buf, 1615b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o argv[0], sizeof(buf))) 1616b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o return; 1617b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o} 1618b199291909e5951b74c9ad43163b5022a329dc26Theodore Ts'o 1619e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#endif /* READ_ONLY */ 16203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 16213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid do_find_free_block(int argc, char *argv[]) 16223839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 1623048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson blk64_t free_blk, goal, first_free = 0; 1624e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o int count; 16253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o errcode_t retval; 16263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o char *tmp; 1627efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 1628e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if ((argc > 3) || (argc==2 && *argv[1] == '?')) { 1629e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o com_err(argv[0], 0, "Usage: find_free_block [count [goal]]"); 16303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 16313839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 16323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (check_fs_open(argv[0])) 16333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 16343839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 16353839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (argc > 1) { 1636e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o count = strtol(argv[1],&tmp,0); 1637e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (*tmp) { 1638e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o com_err(argv[0], 0, "Bad count - %s", argv[1]); 1639e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return; 1640e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o } 1641e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o } else 1642e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o count = 1; 1643e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o 1644e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (argc > 2) { 1645e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o goal = strtol(argv[2], &tmp, 0); 16463839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (*tmp) { 16473839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o com_err(argv[0], 0, "Bad goal - %s", argv[1]); 16483839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 16493839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 16503839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 16513839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o else 1652fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o goal = current_fs->super->s_first_data_block; 16533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1654e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o printf("Free blocks found: "); 1655efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o free_blk = goal - 1; 1656e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o while (count-- > 0) { 1657048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson retval = ext2fs_new_block2(current_fs, free_blk + 1, 0, 1658048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson &free_blk); 16595aae7c292fe0e10ec4e36d664da86939d15aca31Theodore Ts'o if (first_free) { 16605aae7c292fe0e10ec4e36d664da86939d15aca31Theodore Ts'o if (first_free == free_blk) 16615aae7c292fe0e10ec4e36d664da86939d15aca31Theodore Ts'o break; 16625aae7c292fe0e10ec4e36d664da86939d15aca31Theodore Ts'o } else 16635aae7c292fe0e10ec4e36d664da86939d15aca31Theodore Ts'o first_free = free_blk; 1664e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (retval) { 16659b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o com_err("ext2fs_new_block", retval, 0); 1666e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return; 1667e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o } else 1668048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson printf("%llu ", free_blk); 1669e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o } 1670e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o printf("\n"); 16713839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 16723839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 16733839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid do_find_free_inode(int argc, char *argv[]) 16743839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 1675b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o ext2_ino_t free_inode, dir; 1676b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o int mode; 1677b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o int retval; 1678b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o char *tmp; 1679efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 168050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o if (argc > 3 || (argc>1 && *argv[1] == '?')) { 168150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o com_err(argv[0], 0, "Usage: find_free_inode [dir] [mode]"); 16823839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 16833839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 16843839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (check_fs_open(argv[0])) 16853839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 16863839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 16873839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (argc > 1) { 16883839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o dir = strtol(argv[1], &tmp, 0); 16893839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (*tmp) { 16903839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o com_err(argv[0], 0, "Bad dir - %s", argv[1]); 16913839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 16923839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 16933839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 16943839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o else 16953839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o dir = root; 16963839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (argc > 2) { 16973839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o mode = strtol(argv[2], &tmp, 0); 16983839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (*tmp) { 16993839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o com_err(argv[0], 0, "Bad mode - %s", argv[2]); 17003839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 17013839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 170250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o } else 17033839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o mode = 010755; 17043839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1705fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o retval = ext2fs_new_inode(current_fs, dir, mode, 0, &free_inode); 17063839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) 17079b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o com_err("ext2fs_new_inode", retval, 0); 17083839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o else 1709b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o printf("Free inode found: %u\n", free_inode); 17103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 17113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1712e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#ifndef READ_ONLY 171350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'ovoid do_write(int argc, char *argv[]) 171450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{ 1715b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o errcode_t retval; 171650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o 1717e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (common_args_process(argc, argv, 3, 3, "write", 1718e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o "<native file> <new file>", CHECK_FS_RW)) 171950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o return; 1720e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o 1721a3111e80b82d28e2ad5c8ad74bc4acecf559d1d4Darrick J. Wong retval = do_write_internal(current_fs, cwd, argv[1], argv[2], root); 1722a3111e80b82d28e2ad5c8ad74bc4acecf559d1d4Darrick J. Wong if (retval) 17239b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o com_err(argv[0], retval, 0); 172450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o} 172550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o 172650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'ovoid do_mknod(int argc, char *argv[]) 172750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o{ 1728c4c9bc590c4a1f21ec3053aacc232430493f10b0Darrick J. Wong unsigned long major, minor; 1729b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o errcode_t retval; 1730c4c9bc590c4a1f21ec3053aacc232430493f10b0Darrick J. Wong int nr; 17319aa3aa8dae4781b7d03c4d086fc3d27fb3fd2351Robert Yang struct stat st; 173250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o 173350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o if (check_fs_open(argv[0])) 173450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o return; 173550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o if (argc < 3 || argv[2][1]) { 1736e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o usage: 173750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o com_err(argv[0], 0, "Usage: mknod <name> [p| [c|b] <major> <minor>]"); 173850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o return; 173950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o } 17409aa3aa8dae4781b7d03c4d086fc3d27fb3fd2351Robert Yang 1741c4c9bc590c4a1f21ec3053aacc232430493f10b0Darrick J. Wong minor = major = 0; 174250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o switch (argv[2][0]) { 174350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o case 'p': 17449aa3aa8dae4781b7d03c4d086fc3d27fb3fd2351Robert Yang st.st_mode = S_IFIFO; 174550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o nr = 3; 174650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o break; 174750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o case 'c': 17489aa3aa8dae4781b7d03c4d086fc3d27fb3fd2351Robert Yang st.st_mode = S_IFCHR; 174950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o nr = 5; 175050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o break; 175150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o case 'b': 17529aa3aa8dae4781b7d03c4d086fc3d27fb3fd2351Robert Yang st.st_mode = S_IFBLK; 175350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o nr = 5; 175450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o break; 175550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o default: 175650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o nr = 0; 175750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o } 17589aa3aa8dae4781b7d03c4d086fc3d27fb3fd2351Robert Yang 175950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o if (nr == 5) { 176050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o major = strtoul(argv[3], argv+3, 0); 176150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o minor = strtoul(argv[4], argv+4, 0); 17622d10769ec6745b1e4bab371764d65bb3587ab285Theodore Ts'o if (major > 65535 || minor > 65535 || argv[3][0] || argv[4][0]) 176350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o nr = 0; 176450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o } 17659aa3aa8dae4781b7d03c4d086fc3d27fb3fd2351Robert Yang 1766e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (argc != nr) 1767e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o goto usage; 17689aa3aa8dae4781b7d03c4d086fc3d27fb3fd2351Robert Yang 17699aa3aa8dae4781b7d03c4d086fc3d27fb3fd2351Robert Yang st.st_rdev = makedev(major, minor); 1770a3111e80b82d28e2ad5c8ad74bc4acecf559d1d4Darrick J. Wong retval = do_mknod_internal(current_fs, cwd, argv[1], &st); 1771a3111e80b82d28e2ad5c8ad74bc4acecf559d1d4Darrick J. Wong if (retval) 17729b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o com_err(argv[0], retval, 0); 177350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o} 177450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o 17753839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid do_mkdir(int argc, char *argv[]) 17763839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 17773839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o errcode_t retval; 17783839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1779e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (common_args_process(argc, argv, 2, 2, "mkdir", 1780e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o "<filename>", CHECK_FS_RW)) 1781d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o return; 1782d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o 178325f291c9b32d8017e6969c72a75e37d354c0570bTheodore Ts'o retval = do_mkdir_internal(current_fs, cwd, argv[1], root); 1784a3111e80b82d28e2ad5c8ad74bc4acecf559d1d4Darrick J. Wong if (retval) 17859aa3aa8dae4781b7d03c4d086fc3d27fb3fd2351Robert Yang com_err(argv[0], retval, 0); 17863839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 17873839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 17883839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1789048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Hensonstatic int release_blocks_proc(ext2_filsys fs, blk64_t *blocknr, 1790048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson e2_blkcnt_t blockcnt EXT2FS_ATTR((unused)), 1791048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson blk64_t ref_block EXT2FS_ATTR((unused)), 1792048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson int ref_offset EXT2FS_ATTR((unused)), 1793544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o void *private EXT2FS_ATTR((unused))) 17943839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 1795048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson blk64_t block; 1796344368911e118ffacde509d63bb8e617f91ea7cfTheodore Ts'o 1797344368911e118ffacde509d63bb8e617f91ea7cfTheodore Ts'o block = *blocknr; 1798048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson ext2fs_block_alloc_stats2(fs, block, -1); 17993839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return 0; 18003839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 18013839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1802b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'ostatic void kill_file_by_inode(ext2_ino_t inode) 18033839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 18043839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o struct ext2_inode inode_buf; 18053839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1806e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (debugfs_read_inode(inode, &inode_buf, 0)) 1807e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return; 18084efae606bf3159f2134fa29a5ad78fb9f6331f92Theodore Ts'o inode_buf.i_dtime = current_fs->now ? current_fs->now : time(0); 1809e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (debugfs_write_inode(inode, &inode_buf, 0)) 1810e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return; 1811716a3c3536f87372ce16b5b678b9957dabf6d638Zheng Liu if (ext2fs_inode_has_valid_blocks2(current_fs, &inode_buf)) { 1812716a3c3536f87372ce16b5b678b9957dabf6d638Zheng Liu ext2fs_block_iterate3(current_fs, inode, BLOCK_FLAG_READ_ONLY, 1813716a3c3536f87372ce16b5b678b9957dabf6d638Zheng Liu NULL, release_blocks_proc, NULL); 1814716a3c3536f87372ce16b5b678b9957dabf6d638Zheng Liu } 1815521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o printf("\n"); 1816d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o ext2fs_inode_alloc_stats2(current_fs, inode, -1, 1817d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o LINUX_S_ISDIR(inode_buf.i_mode)); 18183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 18193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 18203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 18213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid do_kill_file(int argc, char *argv[]) 18223839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 1823b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o ext2_ino_t inode_num; 18243839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1825e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (common_inode_args_process(argc, argv, &inode_num, CHECK_FS_RW)) 18263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 18273839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 18283839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o kill_file_by_inode(inode_num); 18293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 18303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 18313839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid do_rm(int argc, char *argv[]) 18323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 18333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o int retval; 1834b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o ext2_ino_t inode_num; 18353839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o struct ext2_inode inode; 18363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1837e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (common_args_process(argc, argv, 2, 2, "rm", 1838e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o "<filename>", CHECK_FS_RW)) 1839d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o return; 1840d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o 1841fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o retval = ext2fs_namei(current_fs, root, cwd, argv[1], &inode_num); 18423839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) { 184391d6d486d259b6eb08e4999025b9ef2b097d3495Theodore Ts'o com_err(argv[0], retval, "while trying to resolve filename"); 18443839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 18453839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 18463839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1847e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (debugfs_read_inode(inode_num, &inode, argv[0])) 18483839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 18493839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 185050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o if (LINUX_S_ISDIR(inode.i_mode)) { 18513839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o com_err(argv[0], 0, "file is a directory"); 18523839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 18533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 18543839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 18553839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o --inode.i_links_count; 1856e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (debugfs_write_inode(inode_num, &inode, argv[0])) 18573839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 18583839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 18593839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o unlink_file_by_name(argv[1]); 18603839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (inode.i_links_count == 0) 18613839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o kill_file_by_inode(inode_num); 18623839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 18633839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1864d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'ostruct rd_struct { 1865d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o ext2_ino_t parent; 1866d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o int empty; 1867d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o}; 1868d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o 1869544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'ostatic int rmdir_proc(ext2_ino_t dir EXT2FS_ATTR((unused)), 1870544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o int entry EXT2FS_ATTR((unused)), 1871d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o struct ext2_dir_entry *dirent, 1872544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o int offset EXT2FS_ATTR((unused)), 1873544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o int blocksize EXT2FS_ATTR((unused)), 1874544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o char *buf EXT2FS_ATTR((unused)), 1875d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o void *private) 1876d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o{ 1877d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o struct rd_struct *rds = (struct rd_struct *) private; 1878d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o 1879d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o if (dirent->inode == 0) 1880d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o return 0; 188170f4632b626e3db94dd02c9dc9b4e643ffb0d048Jan Kara if ((ext2fs_dirent_name_len(dirent) == 1) && (dirent->name[0] == '.')) 1882d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o return 0; 188370f4632b626e3db94dd02c9dc9b4e643ffb0d048Jan Kara if ((ext2fs_dirent_name_len(dirent) == 2) && (dirent->name[0] == '.') && 1884d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o (dirent->name[1] == '.')) { 1885d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o rds->parent = dirent->inode; 1886d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o return 0; 1887d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o } 1888d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o rds->empty = 0; 1889d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o return 0; 1890d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o} 1891efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 1892d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'ovoid do_rmdir(int argc, char *argv[]) 1893d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o{ 1894d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o int retval; 1895d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o ext2_ino_t inode_num; 1896d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o struct ext2_inode inode; 1897d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o struct rd_struct rds; 1898d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o 1899d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o if (common_args_process(argc, argv, 2, 2, "rmdir", 1900d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o "<filename>", CHECK_FS_RW)) 1901d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o return; 1902d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o 1903d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o retval = ext2fs_namei(current_fs, root, cwd, argv[1], &inode_num); 1904d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o if (retval) { 1905d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o com_err(argv[0], retval, "while trying to resolve filename"); 1906d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o return; 1907d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o } 1908d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o 1909d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o if (debugfs_read_inode(inode_num, &inode, argv[0])) 1910d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o return; 1911d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o 1912d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o if (!LINUX_S_ISDIR(inode.i_mode)) { 1913d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o com_err(argv[0], 0, "file is not a directory"); 1914d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o return; 1915d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o } 1916d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o 1917d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o rds.parent = 0; 1918d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o rds.empty = 1; 1919d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o 1920d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o retval = ext2fs_dir_iterate2(current_fs, inode_num, 0, 1921d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o 0, rmdir_proc, &rds); 1922d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o if (retval) { 1923d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o com_err(argv[0], retval, "while iterating over directory"); 1924d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o return; 1925d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o } 1926d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o if (rds.empty == 0) { 1927d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o com_err(argv[0], 0, "directory not empty"); 1928d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o return; 1929d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o } 1930d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o 1931d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o inode.i_links_count = 0; 1932d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o if (debugfs_write_inode(inode_num, &inode, argv[0])) 1933d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o return; 1934d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o 1935d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o unlink_file_by_name(argv[1]); 1936d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o kill_file_by_inode(inode_num); 1937d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o 1938d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o if (rds.parent) { 1939d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o if (debugfs_read_inode(rds.parent, &inode, argv[0])) 1940d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o return; 1941d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o if (inode.i_links_count > 1) 1942d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o inode.i_links_count--; 1943d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o if (debugfs_write_inode(rds.parent, &inode, argv[0])) 1944d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o return; 1945d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o } 1946d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o} 1947e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#endif /* READ_ONLY */ 1948d7f64ae8386bf94ec7490459c9fa0fb2b0b95e0fTheodore Ts'o 1949efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'ovoid do_show_debugfs_params(int argc EXT2FS_ATTR((unused)), 1950544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o char *argv[] EXT2FS_ATTR((unused))) 19513839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 1952fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o if (current_fs) 19531d520184ee1a809f0a41566eed80ccf64b39ed1aZheng Liu printf("Open mode: read-%s\n", 19541d520184ee1a809f0a41566eed80ccf64b39ed1aZheng Liu current_fs->flags & EXT2_FLAG_RW ? "write" : "only"); 19551d520184ee1a809f0a41566eed80ccf64b39ed1aZheng Liu printf("Filesystem in use: %s\n", 19561d520184ee1a809f0a41566eed80ccf64b39ed1aZheng Liu current_fs ? current_fs->device_name : "--none--"); 19573839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 19583839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1959e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#ifndef READ_ONLY 19603839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid do_expand_dir(int argc, char *argv[]) 19613839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 1962b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o ext2_ino_t inode; 19633839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o int retval; 19643839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1965e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (common_inode_args_process(argc, argv, &inode, CHECK_FS_RW)) 19663839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 19673839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1968fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o retval = ext2fs_expand_dir(current_fs, inode); 19693839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) 19709b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o com_err("ext2fs_expand_dir", retval, 0); 19713839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 19723839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 19733839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1974d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'ovoid do_features(int argc, char *argv[]) 1975d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o{ 1976d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o int i; 1977efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 1978d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o if (check_fs_open(argv[0])) 1979d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o return; 1980d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o 1981d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o if ((argc != 1) && check_fs_read_write(argv[0])) 1982d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o return; 1983d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o for (i=1; i < argc; i++) { 1984d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o if (e2p_edit_feature(argv[i], 198506968e7e27aaac0f28fc6448fef58fcda314b5a2Theodore Ts'o ¤t_fs->super->s_feature_compat, 0)) 1986d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o com_err(argv[0], 0, "Unknown feature: %s\n", 1987d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o argv[i]); 1988d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o else 1989d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o ext2fs_mark_super_dirty(current_fs); 1990d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o } 19915dd8f963d04fa4099a003cb3b13ffae05ab29210Theodore Ts'o print_features(current_fs->super, stdout); 1992d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o} 1993e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#endif /* READ_ONLY */ 1994d3aea7dc1bf155861573ae16160a703b03527ac9Theodore Ts'o 1995b38cd283637dafff6b39d4b76bf76fa2789eb21fTheodore Ts'ovoid do_bmap(int argc, char *argv[]) 1996b38cd283637dafff6b39d4b76bf76fa2789eb21fTheodore Ts'o{ 1997b38cd283637dafff6b39d4b76bf76fa2789eb21fTheodore Ts'o ext2_ino_t ino; 19989ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o blk64_t blk, pblk = 0; 19999ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o int c, err, flags = 0, ret_flags = 0; 2000b38cd283637dafff6b39d4b76bf76fa2789eb21fTheodore Ts'o errcode_t errcode; 2001efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 20029ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o if (check_fs_open(argv[0])) 2003b38cd283637dafff6b39d4b76bf76fa2789eb21fTheodore Ts'o return; 2004b38cd283637dafff6b39d4b76bf76fa2789eb21fTheodore Ts'o 20059ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o reset_getopt(); 20069ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o while ((c = getopt (argc, argv, "a")) != EOF) { 20079ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o switch (c) { 20089ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o case 'a': 20099ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o flags |= BMAP_ALLOC; 20109ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o break; 20119ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o default: 20129ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o goto print_usage; 20139ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o } 20149ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o } 20159ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o 20169ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o if (argc <= optind+1) { 20179ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o print_usage: 20189ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o com_err(0, 0, 20199ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o "Usage: bmap [-a] <file> logical_blk [physical_blk]"); 20209ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o return; 20219ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o } 20229ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o 20239ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o ino = string_to_inode(argv[optind++]); 2024becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'o if (!ino) 2025becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'o return; 20269ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o err = strtoblk(argv[0], argv[optind++], "logical block", &blk); 2027fe56188b07668758c28912b6eaf31abb498a9e82Darrick J. Wong if (err) 2028fe56188b07668758c28912b6eaf31abb498a9e82Darrick J. Wong return; 2029b38cd283637dafff6b39d4b76bf76fa2789eb21fTheodore Ts'o 20309ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o if (argc > optind+1) 20319ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o goto print_usage; 20329ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o 20339ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o if (argc == optind+1) { 20349ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o err = strtoblk(argv[0], argv[optind++], 20359ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o "physical block", &pblk); 20369ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o if (err) 20379ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o return; 20389ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o if (flags & BMAP_ALLOC) { 20399ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o com_err(0, 0, "Can't set and allocate a block"); 20409ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o return; 20419ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o } 20429ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o flags |= BMAP_SET; 20439ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o } 20449ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o 20459ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o errcode = ext2fs_bmap2(current_fs, ino, 0, 0, flags, blk, 20469ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o &ret_flags, &pblk); 2047b38cd283637dafff6b39d4b76bf76fa2789eb21fTheodore Ts'o if (errcode) { 204850295a3f9e40894316301bebcc7247e9ec85f506Darrick J. Wong com_err(argv[0], errcode, 2049048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson "while mapping logical block %llu\n", blk); 2050b38cd283637dafff6b39d4b76bf76fa2789eb21fTheodore Ts'o return; 2051b38cd283637dafff6b39d4b76bf76fa2789eb21fTheodore Ts'o } 20529ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o printf("%llu", pblk); 20539ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o if (ret_flags & BMAP_RET_UNINIT) 20549ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o fputs(" (uninit)", stdout); 20559ed2c124f3245f48f45e52285c1e6dd55390d2a2Theodore Ts'o fputc('\n', stdout); 2056b38cd283637dafff6b39d4b76bf76fa2789eb21fTheodore Ts'o} 2057b38cd283637dafff6b39d4b76bf76fa2789eb21fTheodore Ts'o 2058becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'ovoid do_imap(int argc, char *argv[]) 2059becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'o{ 2060becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'o ext2_ino_t ino; 2061becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'o unsigned long group, block, block_nr, offset; 2062becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'o 2063becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'o if (common_args_process(argc, argv, 2, 2, argv[0], 2064becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'o "<file>", 0)) 2065becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'o return; 2066becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'o ino = string_to_inode(argv[1]); 2067becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'o if (!ino) 206888494bb6d440f703db98b6cc4452f63d7aa392b9Theodore Ts'o return; 2069becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'o 2070becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'o group = (ino - 1) / EXT2_INODES_PER_GROUP(current_fs->super); 2071becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'o offset = ((ino - 1) % EXT2_INODES_PER_GROUP(current_fs->super)) * 2072becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'o EXT2_INODE_SIZE(current_fs->super); 2073becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'o block = offset >> EXT2_BLOCK_SIZE_BITS(current_fs->super); 2074048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson if (!ext2fs_inode_table_loc(current_fs, (unsigned)group)) { 2075544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o com_err(argv[0], 0, "Inode table for group %lu is missing\n", 2076becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'o group); 2077becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'o return; 2078becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'o } 2079048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson block_nr = ext2fs_inode_table_loc(current_fs, (unsigned)group) + 2080becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'o block; 2081becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'o offset &= (EXT2_BLOCK_SIZE(current_fs->super) - 1); 2082becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'o 208348e6e81362f264aee4f3945c14928efaf71a06c9Theodore Ts'o printf("Inode %d is part of block group %lu\n" 208448e6e81362f264aee4f3945c14928efaf71a06c9Theodore Ts'o "\tlocated at block %lu, offset 0x%04lx\n", ino, group, 2085becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'o block_nr, offset); 2086becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'o 2087becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'o} 2088becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'o 2089e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wongvoid do_idump(int argc, char *argv[]) 2090e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong{ 2091e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong ext2_ino_t ino; 20920befec4e24377e391dca2a3f9e6e163f18b132ceAndreas Dilger unsigned char *buf; 2093e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong errcode_t err; 2094e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong int isize; 2095e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong 2096e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong if (common_args_process(argc, argv, 2, 2, argv[0], 2097e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong "<file>", 0)) 2098e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong return; 2099e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong ino = string_to_inode(argv[1]); 2100e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong if (!ino) 2101e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong return; 2102e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong 2103e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong isize = EXT2_INODE_SIZE(current_fs->super); 2104e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong err = ext2fs_get_mem(isize, &buf); 2105e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong if (err) { 2106e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong com_err(argv[0], err, "while allocating memory"); 2107e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong return; 2108e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong } 2109e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong 2110e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong err = ext2fs_read_inode_full(current_fs, ino, 2111e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong (struct ext2_inode *)buf, isize); 2112e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong if (err) { 2113e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong com_err(argv[0], err, "while reading inode %d", ino); 2114e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong goto err; 2115e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong } 2116e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong 2117e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong do_byte_hexdump(stdout, buf, isize); 2118e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wongerr: 2119e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong ext2fs_free_mem(&buf); 2120e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong} 2121e13ebfdd5f13876de1b978c8a5ed5a322ed7ba62Darrick J. Wong 2122e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#ifndef READ_ONLY 21234efae606bf3159f2134fa29a5ad78fb9f6331f92Theodore Ts'ovoid do_set_current_time(int argc, char *argv[]) 21244efae606bf3159f2134fa29a5ad78fb9f6331f92Theodore Ts'o{ 2125188960ea4b830ec69607aab3068537ce55f44be4Theodore Ts'o __s64 now; 21264efae606bf3159f2134fa29a5ad78fb9f6331f92Theodore Ts'o 21274efae606bf3159f2134fa29a5ad78fb9f6331f92Theodore Ts'o if (common_args_process(argc, argv, 2, 2, argv[0], 21284efae606bf3159f2134fa29a5ad78fb9f6331f92Theodore Ts'o "<time>", 0)) 21294efae606bf3159f2134fa29a5ad78fb9f6331f92Theodore Ts'o return; 2130becf36f6ace508fd091052b9e9bcdea192bfbc48Theodore Ts'o 21314efae606bf3159f2134fa29a5ad78fb9f6331f92Theodore Ts'o now = string_to_time(argv[1]); 2132188960ea4b830ec69607aab3068537ce55f44be4Theodore Ts'o if (now == -1) { 21334efae606bf3159f2134fa29a5ad78fb9f6331f92Theodore Ts'o com_err(argv[0], 0, "Couldn't parse argument as a time: %s\n", 21344efae606bf3159f2134fa29a5ad78fb9f6331f92Theodore Ts'o argv[1]); 21354efae606bf3159f2134fa29a5ad78fb9f6331f92Theodore Ts'o return; 21364efae606bf3159f2134fa29a5ad78fb9f6331f92Theodore Ts'o 21374efae606bf3159f2134fa29a5ad78fb9f6331f92Theodore Ts'o } else { 21384efae606bf3159f2134fa29a5ad78fb9f6331f92Theodore Ts'o printf("Setting current time to %s\n", time_to_string(now)); 21394efae606bf3159f2134fa29a5ad78fb9f6331f92Theodore Ts'o current_fs->now = now; 21404efae606bf3159f2134fa29a5ad78fb9f6331f92Theodore Ts'o } 21414efae606bf3159f2134fa29a5ad78fb9f6331f92Theodore Ts'o} 2142e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#endif /* READ_ONLY */ 2143b38cd283637dafff6b39d4b76bf76fa2789eb21fTheodore Ts'o 214403efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilgerstatic int find_supp_feature(__u32 *supp, int feature_type, char *name) 214503efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger{ 214603efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger int compat, bit, ret; 214703efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger unsigned int feature_mask; 214803efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger 214903efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger if (name) { 215003efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger if (feature_type == E2P_FS_FEATURE) 215103efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger ret = e2p_string2feature(name, &compat, &feature_mask); 215203efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger else 215303efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger ret = e2p_jrnl_string2feature(name, &compat, 215403efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger &feature_mask); 215503efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger if (ret) 215603efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger return ret; 215703efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger 215803efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger if (!(supp[compat] & feature_mask)) 215903efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger return 1; 216003efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger } else { 216103efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger for (compat = 0; compat < 3; compat++) { 216203efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger for (bit = 0, feature_mask = 1; bit < 32; 216303efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger bit++, feature_mask <<= 1) { 216403efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger if (supp[compat] & feature_mask) { 216503efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger if (feature_type == E2P_FS_FEATURE) 216603efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger fprintf(stdout, " %s", 216703efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger e2p_feature2string(compat, 216803efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger feature_mask)); 216903efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger else 217003efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger fprintf(stdout, " %s", 217103efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger e2p_jrnl_feature2string(compat, 217203efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger feature_mask)); 217303efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger } 217403efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger } 217503efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger } 217603efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger fprintf(stdout, "\n"); 217703efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger } 217803efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger 217903efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger return 0; 218003efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger} 218103efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger 218203efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilgervoid do_supported_features(int argc, char *argv[]) 218303efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger{ 218442080a8656895eddb0e054c3af86667a5a6aff9fTheodore Ts'o int ret; 218503efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger __u32 supp[3] = { EXT2_LIB_FEATURE_COMPAT_SUPP, 218603efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger EXT2_LIB_FEATURE_INCOMPAT_SUPP, 218703efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger EXT2_LIB_FEATURE_RO_COMPAT_SUPP }; 218803efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger __u32 jrnl_supp[3] = { JFS_KNOWN_COMPAT_FEATURES, 218903efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger JFS_KNOWN_INCOMPAT_FEATURES, 219003efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger JFS_KNOWN_ROCOMPAT_FEATURES }; 219103efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger 219203efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger if (argc > 1) { 219303efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger ret = find_supp_feature(supp, E2P_FS_FEATURE, argv[1]); 219403efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger if (ret) { 219503efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger ret = find_supp_feature(jrnl_supp, E2P_JOURNAL_FEATURE, 219603efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger argv[1]); 219703efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger } 219803efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger if (ret) 219903efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger com_err(argv[0], 0, "Unknown feature: %s\n", argv[1]); 220003efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger else 220103efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger fprintf(stdout, "Supported feature: %s\n", argv[1]); 220203efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger } else { 220303efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger fprintf(stdout, "Supported features:"); 220403efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger ret = find_supp_feature(supp, E2P_FS_FEATURE, NULL); 220503efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger ret = find_supp_feature(jrnl_supp, E2P_JOURNAL_FEATURE, NULL); 220603efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger } 220703efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger} 220803efde8abe79c80ff369206d06d4f1e476b08f53Andreas Dilger 2209e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#ifndef READ_ONLY 221086685923625eed3632eaf17cdda8e86f13b13384Theodore Ts'ovoid do_punch(int argc, char *argv[]) 221186685923625eed3632eaf17cdda8e86f13b13384Theodore Ts'o{ 221286685923625eed3632eaf17cdda8e86f13b13384Theodore Ts'o ext2_ino_t ino; 221386685923625eed3632eaf17cdda8e86f13b13384Theodore Ts'o blk64_t start, end; 221486685923625eed3632eaf17cdda8e86f13b13384Theodore Ts'o int err; 221586685923625eed3632eaf17cdda8e86f13b13384Theodore Ts'o errcode_t errcode; 221686685923625eed3632eaf17cdda8e86f13b13384Theodore Ts'o 221786685923625eed3632eaf17cdda8e86f13b13384Theodore Ts'o if (common_args_process(argc, argv, 3, 4, argv[0], 221886685923625eed3632eaf17cdda8e86f13b13384Theodore Ts'o "<file> start_blk [end_blk]", 221986685923625eed3632eaf17cdda8e86f13b13384Theodore Ts'o CHECK_FS_RW | CHECK_FS_BITMAPS)) 222086685923625eed3632eaf17cdda8e86f13b13384Theodore Ts'o return; 222186685923625eed3632eaf17cdda8e86f13b13384Theodore Ts'o 222286685923625eed3632eaf17cdda8e86f13b13384Theodore Ts'o ino = string_to_inode(argv[1]); 222386685923625eed3632eaf17cdda8e86f13b13384Theodore Ts'o if (!ino) 222486685923625eed3632eaf17cdda8e86f13b13384Theodore Ts'o return; 2225a25fffae5cbdb9349fa3c358c9714584e9de7b33Eric Whitney err = strtoblk(argv[0], argv[2], "logical block", &start); 2226fe56188b07668758c28912b6eaf31abb498a9e82Darrick J. Wong if (err) 2227fe56188b07668758c28912b6eaf31abb498a9e82Darrick J. Wong return; 2228fe56188b07668758c28912b6eaf31abb498a9e82Darrick J. Wong if (argc == 4) { 2229a25fffae5cbdb9349fa3c358c9714584e9de7b33Eric Whitney err = strtoblk(argv[0], argv[3], "logical block", &end); 2230fe56188b07668758c28912b6eaf31abb498a9e82Darrick J. Wong if (err) 2231fe56188b07668758c28912b6eaf31abb498a9e82Darrick J. Wong return; 2232fe56188b07668758c28912b6eaf31abb498a9e82Darrick J. Wong } else 223386685923625eed3632eaf17cdda8e86f13b13384Theodore Ts'o end = ~0; 223486685923625eed3632eaf17cdda8e86f13b13384Theodore Ts'o 223586685923625eed3632eaf17cdda8e86f13b13384Theodore Ts'o errcode = ext2fs_punch(current_fs, ino, 0, 0, start, end); 223686685923625eed3632eaf17cdda8e86f13b13384Theodore Ts'o 223786685923625eed3632eaf17cdda8e86f13b13384Theodore Ts'o if (errcode) { 223886685923625eed3632eaf17cdda8e86f13b13384Theodore Ts'o com_err(argv[0], errcode, 223986685923625eed3632eaf17cdda8e86f13b13384Theodore Ts'o "while truncating inode %u from %llu to %llu\n", ino, 224086685923625eed3632eaf17cdda8e86f13b13384Theodore Ts'o (unsigned long long) start, (unsigned long long) end); 224186685923625eed3632eaf17cdda8e86f13b13384Theodore Ts'o return; 224286685923625eed3632eaf17cdda8e86f13b13384Theodore Ts'o } 224386685923625eed3632eaf17cdda8e86f13b13384Theodore Ts'o} 22442f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong 22452f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wongvoid do_fallocate(int argc, char *argv[]) 22462f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong{ 22472f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong ext2_ino_t ino; 22482f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong blk64_t start, end; 22492f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong int err; 22502f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong errcode_t errcode; 22512f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong 22522f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong if (common_args_process(argc, argv, 3, 4, argv[0], 22532f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong "<file> start_blk [end_blk]", 22542f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong CHECK_FS_RW | CHECK_FS_BITMAPS)) 22552f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong return; 22562f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong 22572f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong ino = string_to_inode(argv[1]); 22582f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong if (!ino) 22592f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong return; 22602f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong err = strtoblk(argv[0], argv[2], "logical block", &start); 22612f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong if (err) 22622f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong return; 22632f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong if (argc == 4) { 22642f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong err = strtoblk(argv[0], argv[3], "logical block", &end); 22652f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong if (err) 22662f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong return; 22672f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong } else 22682f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong end = ~0; 22692f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong 22702f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong errcode = ext2fs_fallocate(current_fs, EXT2_FALLOCATE_INIT_BEYOND_EOF, 22712f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong ino, NULL, ~0ULL, start, end - start + 1); 22722f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong 22732f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong if (errcode) { 22742f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong com_err(argv[0], errcode, 22752f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong "while fallocating inode %u from %llu to %llu\n", ino, 22762f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong (unsigned long long) start, (unsigned long long) end); 22772f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong return; 22782f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong } 22792f8c0d028cd8e3b24aaa357a796478c3435e21e4Darrick J. Wong} 2280e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#endif /* READ_ONLY */ 228186685923625eed3632eaf17cdda8e86f13b13384Theodore Ts'o 22824df6a37bd39c84ea67394ab5049bc82f14b929b5Darren Hartvoid do_symlink(int argc, char *argv[]) 22834df6a37bd39c84ea67394ab5049bc82f14b929b5Darren Hart{ 22844df6a37bd39c84ea67394ab5049bc82f14b929b5Darren Hart errcode_t retval; 22854df6a37bd39c84ea67394ab5049bc82f14b929b5Darren Hart 22864df6a37bd39c84ea67394ab5049bc82f14b929b5Darren Hart if (common_args_process(argc, argv, 3, 3, "symlink", 22874df6a37bd39c84ea67394ab5049bc82f14b929b5Darren Hart "<filename> <target>", CHECK_FS_RW)) 22884df6a37bd39c84ea67394ab5049bc82f14b929b5Darren Hart return; 22894df6a37bd39c84ea67394ab5049bc82f14b929b5Darren Hart 2290a3111e80b82d28e2ad5c8ad74bc4acecf559d1d4Darrick J. Wong retval = do_symlink_internal(current_fs, cwd, argv[1], argv[2], root); 2291a3111e80b82d28e2ad5c8ad74bc4acecf559d1d4Darrick J. Wong if (retval) 22929aa3aa8dae4781b7d03c4d086fc3d27fb3fd2351Robert Yang com_err(argv[0], retval, 0); 22934df6a37bd39c84ea67394ab5049bc82f14b929b5Darren Hart 22944df6a37bd39c84ea67394ab5049bc82f14b929b5Darren Hart} 22954df6a37bd39c84ea67394ab5049bc82f14b929b5Darren Hart 229625f291c9b32d8017e6969c72a75e37d354c0570bTheodore Ts'o#if CONFIG_MMP 22973cebf9c1029ca983ebbbae79f7905a02d087ff98Theodore Ts'ovoid do_dump_mmp(int argc EXT2FS_ATTR((unused)), char *argv[]) 22980f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger{ 22990f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger struct mmp_struct *mmp_s; 23002fe6136c48610791de8bb4c8fcad536292ffe36eAndreas Dilger unsigned long long mmp_block; 23010f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger time_t t; 23020f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger errcode_t retval = 0; 23030f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger 23047105c183a0f4622268a50db37017cfacc9877e5fEric Sandeen if (check_fs_open(argv[0])) 23057105c183a0f4622268a50db37017cfacc9877e5fEric Sandeen return; 23067105c183a0f4622268a50db37017cfacc9877e5fEric Sandeen 23072fe6136c48610791de8bb4c8fcad536292ffe36eAndreas Dilger if (argc > 1) { 23082fe6136c48610791de8bb4c8fcad536292ffe36eAndreas Dilger char *end = NULL; 23092fe6136c48610791de8bb4c8fcad536292ffe36eAndreas Dilger mmp_block = strtoull(argv[1], &end, 0); 23102fe6136c48610791de8bb4c8fcad536292ffe36eAndreas Dilger if (end == argv[0] || mmp_block == 0) { 23112fe6136c48610791de8bb4c8fcad536292ffe36eAndreas Dilger fprintf(stderr, "%s: invalid MMP block '%s' given\n", 23122fe6136c48610791de8bb4c8fcad536292ffe36eAndreas Dilger argv[0], argv[1]); 23132fe6136c48610791de8bb4c8fcad536292ffe36eAndreas Dilger return; 23142fe6136c48610791de8bb4c8fcad536292ffe36eAndreas Dilger } 23152fe6136c48610791de8bb4c8fcad536292ffe36eAndreas Dilger } else { 23162fe6136c48610791de8bb4c8fcad536292ffe36eAndreas Dilger mmp_block = current_fs->super->s_mmp_block; 23172fe6136c48610791de8bb4c8fcad536292ffe36eAndreas Dilger } 23182fe6136c48610791de8bb4c8fcad536292ffe36eAndreas Dilger 23192fe6136c48610791de8bb4c8fcad536292ffe36eAndreas Dilger if (mmp_block == 0) { 23202fe6136c48610791de8bb4c8fcad536292ffe36eAndreas Dilger fprintf(stderr, "%s: MMP: not active on this filesystem.\n", 23212fe6136c48610791de8bb4c8fcad536292ffe36eAndreas Dilger argv[0]); 23222fe6136c48610791de8bb4c8fcad536292ffe36eAndreas Dilger return; 23232fe6136c48610791de8bb4c8fcad536292ffe36eAndreas Dilger } 23242fe6136c48610791de8bb4c8fcad536292ffe36eAndreas Dilger 23250f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger if (current_fs->mmp_buf == NULL) { 23260f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger retval = ext2fs_get_mem(current_fs->blocksize, 23270f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger ¤t_fs->mmp_buf); 23280f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger if (retval) { 23290f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger com_err(argv[0], retval, "allocating MMP buffer.\n"); 23300f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger return; 23310f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger } 23320f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger } 23330f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger 23340f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger mmp_s = current_fs->mmp_buf; 23350f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger 23362fe6136c48610791de8bb4c8fcad536292ffe36eAndreas Dilger retval = ext2fs_mmp_read(current_fs, mmp_block, current_fs->mmp_buf); 23370f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger if (retval) { 23382fe6136c48610791de8bb4c8fcad536292ffe36eAndreas Dilger com_err(argv[0], retval, "reading MMP block %llu.\n", 23392fe6136c48610791de8bb4c8fcad536292ffe36eAndreas Dilger mmp_block); 23400f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger return; 23410f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger } 23420f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger 23430f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger t = mmp_s->mmp_time; 23440f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger fprintf(stdout, "block_number: %llu\n", current_fs->super->s_mmp_block); 23450f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger fprintf(stdout, "update_interval: %d\n", 23460f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger current_fs->super->s_mmp_update_interval); 23470f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger fprintf(stdout, "check_interval: %d\n", mmp_s->mmp_check_interval); 23480f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger fprintf(stdout, "sequence: %08x\n", mmp_s->mmp_seq); 23490f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger fprintf(stdout, "time: %lld -- %s", mmp_s->mmp_time, ctime(&t)); 23500f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger fprintf(stdout, "node_name: %s\n", mmp_s->mmp_nodename); 23510f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger fprintf(stdout, "device_name: %s\n", mmp_s->mmp_bdevname); 23527105c183a0f4622268a50db37017cfacc9877e5fEric Sandeen fprintf(stdout, "magic: 0x%x\n", mmp_s->mmp_magic); 2353a9620d8b308271ace63dd0787555fa715d09e0f8Darrick J. Wong fprintf(stdout, "checksum: 0x%08x\n", mmp_s->mmp_checksum); 235425f291c9b32d8017e6969c72a75e37d354c0570bTheodore Ts'o fprintf(stdout, "MMP is unsupported, please recompile with " 235525f291c9b32d8017e6969c72a75e37d354c0570bTheodore Ts'o "--enable-mmp\n"); 235625f291c9b32d8017e6969c72a75e37d354c0570bTheodore Ts'o} 2357d6a4bcb517ac7aa6d2347d6979f1f04cd94d60d8Tony Breeds#else 235825f291c9b32d8017e6969c72a75e37d354c0570bTheodore Ts'ovoid do_dump_mmp(int argc EXT2FS_ATTR((unused)), 235925f291c9b32d8017e6969c72a75e37d354c0570bTheodore Ts'o char *argv[] EXT2FS_ATTR((unused))) 236025f291c9b32d8017e6969c72a75e37d354c0570bTheodore Ts'o{ 2361d6a4bcb517ac7aa6d2347d6979f1f04cd94d60d8Tony Breeds fprintf(stdout, "MMP is unsupported, please recompile with " 2362d6a4bcb517ac7aa6d2347d6979f1f04cd94d60d8Tony Breeds "--enable-mmp\n"); 23630f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger} 236425f291c9b32d8017e6969c72a75e37d354c0570bTheodore Ts'o#endif 23650f5eba7501f467f757792ee449d16c9259b994fdAndreas Dilger 23669e85208e84bbdea9cfe6e8887502a1c4d92efbe5Theodore Ts'ostatic int source_file(const char *cmd_file, int ss_idx) 2367fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o{ 2368fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o FILE *f; 2369355ffb2ff566229b8bc3f5f7557e91edff5a767aRobert Yang char buf[BUFSIZ]; 2370fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o char *cp; 2371fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o int exit_status = 0; 2372fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o int retval; 2373fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o 2374fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o if (strcmp(cmd_file, "-") == 0) 2375fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o f = stdin; 2376fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o else { 2377fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o f = fopen(cmd_file, "r"); 2378fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o if (!f) { 2379fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o perror(cmd_file); 2380fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o exit(1); 2381fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o } 2382fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o } 23832a7bfe835317bb9f3ebcd20079b2bb800f4b9eaaTheodore Ts'o fflush(stdout); 23842a7bfe835317bb9f3ebcd20079b2bb800f4b9eaaTheodore Ts'o fflush(stderr); 2385fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o setbuf(stdout, NULL); 2386fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o setbuf(stderr, NULL); 2387fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o while (!feof(f)) { 2388fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o if (fgets(buf, sizeof(buf), f) == NULL) 2389fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o break; 2390fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o cp = strchr(buf, '\n'); 2391fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o if (cp) 2392fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o *cp = 0; 2393fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o cp = strchr(buf, '\r'); 2394fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o if (cp) 2395fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o *cp = 0; 2396fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o printf("debugfs: %s\n", buf); 23979e85208e84bbdea9cfe6e8887502a1c4d92efbe5Theodore Ts'o retval = ss_execute_line(ss_idx, buf); 2398fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o if (retval) { 23999e85208e84bbdea9cfe6e8887502a1c4d92efbe5Theodore Ts'o ss_perror(ss_idx, retval, buf); 2400fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o exit_status++; 2401fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o } 2402fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o } 24032d7ef236b752c1da7868f009018075fddc01d810Peng Tao if (f != stdin) 24042d7ef236b752c1da7868f009018075fddc01d810Peng Tao fclose(f); 2405fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o return exit_status; 2406fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o} 2407fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o 2408a8859cad8790514cf2c41507aaea1ff3b751b954Theodore Ts'oint main(int argc, char **argv) 24093839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 241050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o int retval; 2411e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o const char *usage = 2412e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o "Usage: %s [-b blocksize] [-s superblock] [-f cmd_file] " 2413e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o "[-R request] [-V] [" 2414e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#ifndef READ_ONLY 2415491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong "[-w] [-z undo_file] " 2416e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#endif 2417e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o "[-c] device]"; 2418f13048113f09def05a024470bfeaf44635bf7e98Theodore Ts'o int c; 241903b9dca63a75731711071e0a7ddef0475d6daf3aEric Sandeen int open_flags = EXT2_FLAG_SOFTSUPP_FEATURES | EXT2_FLAG_64BITS; 2420fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o char *request = 0; 2421fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o int exit_status = 0; 2422fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o char *cmd_file = 0; 2423048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson blk64_t superblock = 0; 2424048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson blk64_t blocksize = 0; 24252e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o int catastrophic = 0; 24261ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o char *data_filename = 0; 2427e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#ifdef READ_ONLY 24289bca9a39b7b159d78f21ddab63ba1ad68c5e5443Darrick J. Wong const char *opt_string = "nicR:f:b:s:Vd:D"; 2429e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#else 2430491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong const char *opt_string = "niwcR:f:b:s:Vd:Dz:"; 2431491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong char *undo_file = NULL; 2432e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#endif 24331fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o#ifdef CONFIG_JBD_DEBUG 24341fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o char *jbd_debug; 24351fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o#endif 2436efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 243749ce6cb5cee956a478a3704c92619de1c7f204d5Theodore Ts'o if (debug_prog_name == 0) 2438e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#ifdef READ_ONLY 2439e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o debug_prog_name = "rdebugfs"; 2440e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#else 244149ce6cb5cee956a478a3704c92619de1c7f204d5Theodore Ts'o debug_prog_name = "debugfs"; 2442e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#endif 2443a6d8302b4873527798a77c1ba3106a04b71dfeacTheodore Ts'o add_error_table(&et_ext2_error_table); 244449ce6cb5cee956a478a3704c92619de1c7f204d5Theodore Ts'o fprintf (stderr, "%s %s (%s)\n", debug_prog_name, 244549ce6cb5cee956a478a3704c92619de1c7f204d5Theodore Ts'o E2FSPROGS_VERSION, E2FSPROGS_DATE); 24463839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 24471fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o#ifdef CONFIG_JBD_DEBUG 24481fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o jbd_debug = ss_safe_getenv("DEBUGFS_JBD_DEBUG"); 24491fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o if (jbd_debug) { 24501fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o int res = sscanf(jbd_debug, "%d", &journal_enable_debug); 24511fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o 24521fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o if (res != 1) { 24531fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o fprintf(stderr, 24541fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o "DEBUGFS_JBD_DEBUG \"%s\" not an integer\n\n", 24551fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o jbd_debug); 24561fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o exit(1); 24571fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o } 24581fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o } 24591fc23b5e773a7a30130842a8091af546d5dd9875Theodore Ts'o#endif 2460e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o while ((c = getopt (argc, argv, opt_string)) != EOF) { 24613839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o switch (c) { 2462fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o case 'R': 2463fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o request = optarg; 2464fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o break; 2465fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o case 'f': 2466fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o cmd_file = optarg; 2467fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o break; 24681ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o case 'd': 24691ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o data_filename = optarg; 24701ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o break; 247159cf7e0da802aa8f560434bd521c30f5bb5d3e21Theodore Ts'o case 'i': 247259cf7e0da802aa8f560434bd521c30f5bb5d3e21Theodore Ts'o open_flags |= EXT2_FLAG_IMAGE_FILE; 247359cf7e0da802aa8f560434bd521c30f5bb5d3e21Theodore Ts'o break; 24749bca9a39b7b159d78f21ddab63ba1ad68c5e5443Darrick J. Wong case 'n': 24759bca9a39b7b159d78f21ddab63ba1ad68c5e5443Darrick J. Wong open_flags |= EXT2_FLAG_IGNORE_CSUM_ERRORS; 24769bca9a39b7b159d78f21ddab63ba1ad68c5e5443Darrick J. Wong break; 2477e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#ifndef READ_ONLY 24783839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o case 'w': 247959cf7e0da802aa8f560434bd521c30f5bb5d3e21Theodore Ts'o open_flags |= EXT2_FLAG_RW; 24803839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o break; 2481e88c5a33a841026728fa7c9fcc4bcdca6580b495Theodore Ts'o#endif 24820fd68e0241e944545d43045593e82b0fb7317797Theodore Ts'o case 'D': 24830fd68e0241e944545d43045593e82b0fb7317797Theodore Ts'o open_flags |= EXT2_FLAG_DIRECT_IO; 24840fd68e0241e944545d43045593e82b0fb7317797Theodore Ts'o break; 24852e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o case 'b': 2486efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o blocksize = parse_ulong(optarg, argv[0], 2487e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o "block size", 0); 24882e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o break; 24892e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o case 's': 2490a25fffae5cbdb9349fa3c358c9714584e9de7b33Eric Whitney retval = strtoblk(argv[0], optarg, 2491a25fffae5cbdb9349fa3c358c9714584e9de7b33Eric Whitney "superblock block number", 2492a25fffae5cbdb9349fa3c358c9714584e9de7b33Eric Whitney &superblock); 249332541fe4f90e59597f7721967153e9641c5f8dceEric Whitney if (retval) 2494fe56188b07668758c28912b6eaf31abb498a9e82Darrick J. Wong return 1; 24952e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o break; 24962e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o case 'c': 24972e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o catastrophic = 1; 24982e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o break; 2499818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o case 'V': 2500818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o /* Print version number and exit */ 2501818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o fprintf(stderr, "\tUsing %s\n", 2502818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o error_message(EXT2_ET_BASE)); 2503818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o exit(0); 2504491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong case 'z': 2505491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong undo_file = optarg; 2506491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong break; 25073839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o default: 250849ce6cb5cee956a478a3704c92619de1c7f204d5Theodore Ts'o com_err(argv[0], 0, usage, debug_prog_name); 2509b4ac9cc351ba9613347a1f60a6e7d9c91060df82Theodore Ts'o return 1; 25103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 25113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 25123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (optind < argc) 25132e8d40d562ec93d68505800a46c5b9dcc229264eTheodore Ts'o open_filesystem(argv[optind], open_flags, 25141ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o superblock, blocksize, catastrophic, 2515491cc33ac6895d228b731e037b311e4314d72b88Darrick J. Wong data_filename, undo_file); 2516efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 251749ce6cb5cee956a478a3704c92619de1c7f204d5Theodore Ts'o sci_idx = ss_create_invocation(debug_prog_name, "0.0", (char *) NULL, 25183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o &debug_cmds, &retval); 25193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) { 25203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o ss_perror(sci_idx, retval, "creating invocation"); 25213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o exit(1); 25223839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 25233ae497eab281eab5f98770e6a3d5992b9d37325eTheodore Ts'o ss_get_readline(sci_idx); 25243839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 25253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o (void) ss_add_request_table (sci_idx, &ss_std_requests, 1, &retval); 25263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) { 25273839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o ss_perror(sci_idx, retval, "adding standard requests"); 25283839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o exit (1); 25293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 253049ce6cb5cee956a478a3704c92619de1c7f204d5Theodore Ts'o if (extra_cmds) 253149ce6cb5cee956a478a3704c92619de1c7f204d5Theodore Ts'o ss_add_request_table (sci_idx, extra_cmds, 1, &retval); 253249ce6cb5cee956a478a3704c92619de1c7f204d5Theodore Ts'o if (retval) { 253349ce6cb5cee956a478a3704c92619de1c7f204d5Theodore Ts'o ss_perror(sci_idx, retval, "adding extra requests"); 253449ce6cb5cee956a478a3704c92619de1c7f204d5Theodore Ts'o exit (1); 253549ce6cb5cee956a478a3704c92619de1c7f204d5Theodore Ts'o } 2536fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o if (request) { 2537fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o retval = 0; 2538fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o retval = ss_execute_line(sci_idx, request); 2539fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o if (retval) { 2540fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o ss_perror(sci_idx, retval, request); 2541fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o exit_status++; 2542fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o } 2543fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o } else if (cmd_file) { 2544fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o exit_status = source_file(cmd_file, sci_idx); 2545fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o } else { 2546fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o ss_listen(sci_idx); 2547fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o } 25483839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 25496e9761c2c02a055199059156a979e5d9928c428bTheodore Ts'o ss_delete_invocation(sci_idx); 25506e9761c2c02a055199059156a979e5d9928c428bTheodore Ts'o 2551fc6d9d519aef67735918bf02c0fa8c9222008f76Theodore Ts'o if (current_fs) 25523839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o close_filesystem(); 2553efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 2554a6d8302b4873527798a77c1ba3106a04b71dfeacTheodore Ts'o remove_error_table(&et_ext2_error_table); 2555e597304ab282d3030cbe364a6c55b9fe803a86c0Theodore Ts'o return exit_status; 25563839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 2557