util.c revision e5b3b27966ac71ca8b445a18a6ee1238684fb3f4
13839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* 23839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * util.c --- utilities for the debugfs program 33839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 43839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Copyright (C) 1993, 1994 Theodore Ts'o. This file may be 53839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * redistributed under the terms of the GNU Public License. 63839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 73839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 83839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 93839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <stdio.h> 103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <unistd.h> 113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <stdlib.h> 123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <ctype.h> 133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <string.h> 141e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#include <time.h> 152c4a540636142a936889bbe4b85a2b9c56bfa458Theodore Ts'o#include <signal.h> 163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "debugfs.h" 183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oFILE *open_pager(void) 203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o FILE *outfile; 22b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o const char *pager = getenv("PAGER"); 233839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 242c4a540636142a936889bbe4b85a2b9c56bfa458Theodore Ts'o signal(SIGPIPE, SIG_IGN); 25df614db6ef79c767745b8154c26d69398b571605Theodore Ts'o if (pager) { 26df614db6ef79c767745b8154c26d69398b571605Theodore Ts'o if (strcmp(pager, "__none__") == 0) { 27df614db6ef79c767745b8154c26d69398b571605Theodore Ts'o return stdout; 28df614db6ef79c767745b8154c26d69398b571605Theodore Ts'o } 29df614db6ef79c767745b8154c26d69398b571605Theodore Ts'o } else 30c6bd0c97e4dc42511015b9a20b3e35dcdc8fd411Theodore Ts'o pager = "more"; 31c6bd0c97e4dc42511015b9a20b3e35dcdc8fd411Theodore Ts'o 32c6bd0c97e4dc42511015b9a20b3e35dcdc8fd411Theodore Ts'o outfile = popen(pager, "w"); 33c6bd0c97e4dc42511015b9a20b3e35dcdc8fd411Theodore Ts'o 34df614db6ef79c767745b8154c26d69398b571605Theodore Ts'o return (outfile ? outfile : stdout); 353839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 373839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ovoid close_pager(FILE *stream) 383839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 39571fc5a89c17985626df29823617b63094d10b31Theodore Ts'o if (stream && stream != stdout) pclose(stream); 403839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 413839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 423839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* 433839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * This routine is used whenever a command needs to turn a string into 443839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * an inode. 453839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 46b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'oext2_ino_t string_to_inode(char *str) 473839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 48b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o ext2_ino_t ino; 49b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o int len = strlen(str); 50b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o char *end; 51b044c2e02af46c54206f0f6e29896ab32681a7dbTheodore Ts'o int retval; 523839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o /* 543839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * If the string is of the form <ino>, then treat it as an 553839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * inode number. 563839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 573839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if ((len > 2) && (str[0] == '<') && (str[len-1] == '>')) { 589131a759318963d9c86a7de7138ac8cee9641f8cTheodore Ts'o ino = strtoul(str+1, &end, 0); 599131a759318963d9c86a7de7138ac8cee9641f8cTheodore Ts'o if (*end=='>') 609131a759318963d9c86a7de7138ac8cee9641f8cTheodore Ts'o return ino; 613839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 623839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 631e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o retval = ext2fs_namei(current_fs, root, cwd, str, &ino); 643839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) { 653839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o com_err(str, retval, ""); 663839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return 0; 673839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 683839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return ino; 693839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 703839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 713839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* 723839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * This routine returns 1 if the filesystem is not open, and prints an 733839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * error message to that effect. 743839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 753839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oint check_fs_open(char *name) 763839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 771e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o if (!current_fs) { 783839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o com_err(name, 0, "Filesystem not open"); 793839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return 1; 803839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 813839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return 0; 823839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 833839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 843839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* 853839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * This routine returns 1 if a filesystem is open, and prints an 863839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * error message to that effect. 873839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 883839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oint check_fs_not_open(char *name) 893839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 901e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o if (current_fs) { 913839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o com_err(name, 0, 923839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o "Filesystem %s is still open. Close it first.\n", 931e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o current_fs->device_name); 943839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return 1; 953839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 963839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return 0; 973839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 983839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 991e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o/* 1001e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o * This routine returns 1 if a filesystem is not opened read/write, 1011e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o * and prints an error message to that effect. 1021e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o */ 1031e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'oint check_fs_read_write(char *name) 1041e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o{ 1051e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o if (!(current_fs->flags & EXT2_FLAG_RW)) { 1061e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o com_err(name, 0, "Filesystem opened read/only"); 1071e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o return 1; 1081e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o } 1091e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o return 0; 1101e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o} 1111e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o 1121e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o/* 113d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o * This routine returns 1 if a filesystem is doesn't have its inode 114d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o * and block bitmaps loaded, and prints an error message to that 115d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o * effect. 116d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o */ 117d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'oint check_fs_bitmaps(char *name) 118d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o{ 119d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o if (!current_fs->block_map || !current_fs->inode_map) { 120d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o com_err(name, 0, "Filesystem bitmaps not loaded"); 121d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o return 1; 122d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o } 123d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o return 0; 124d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o} 125d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o 126d61f6176024865007d5a0da49c61c21e9d498007Theodore Ts'o/* 1271e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o * This function takes a __u32 time value and converts it to a string, 1281e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o * using ctime 1291e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o */ 1301e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'ochar *time_to_string(__u32 cl) 1311e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o{ 1321e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o time_t t = (time_t) cl; 1331e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o 1341e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o return ctime(&t); 1351e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o} 1361e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o 137e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o/* 138e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o * This function will convert a string to an unsigned long, printing 139e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o * an error message if it fails, and returning success or failure in err. 140e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o */ 141e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'ounsigned long parse_ulong(const char *str, const char *cmd, 142e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o const char *descr, int *err) 143e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o{ 144e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o char *tmp; 145e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o unsigned long ret; 146e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o 147e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o ret = strtoul(str, &tmp, 0); 148e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (*tmp == 0) { 149e5b3b27966ac71ca8b445a18a6ee1238684fb3f4Theodore Ts'o if (err) 150e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o *err = 0; 151e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return ret; 152e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o } 153e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o com_err(cmd, 0, "Bad %s - %s", descr, str); 154e5b3b27966ac71ca8b445a18a6ee1238684fb3f4Theodore Ts'o if (err) 155e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o *err = 1; 156e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o else 157e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o exit(1); 158e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return 0; 159e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o} 160e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o 161e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o/* 162e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o * This function will convert a string to a block number. It returns 163e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o * 0 on success, 1 on failure. 164e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o */ 165e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'oint strtoblk(const char *cmd, const char *str, blk_t *ret) 166e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o{ 167e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o blk_t blk; 168e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o int err; 169e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o 170e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o blk = parse_ulong(str, cmd, "block number", &err); 171e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o *ret = blk; 172e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (err == 0 && blk == 0) { 173e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o com_err(cmd, 0, "Invalid block number 0"); 174e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o err = 1; 175e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o } 176e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return err; 177e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o} 178e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o 179e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o/* 180e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o * This is a common helper function used by the command processing 181e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o * routines 182e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o */ 183e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'oint common_args_process(int argc, char *argv[], int min_argc, int max_argc, 184e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o const char *cmd, const char *usage, int flags) 185e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o{ 186e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (argc < min_argc || argc > max_argc) { 187e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o com_err(argv[0], 0, "Usage: %s %s", cmd, usage); 188e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return 1; 189e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o } 190e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (flags & CHECK_FS_NOTOPEN) { 191e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (check_fs_not_open(argv[0])) 192e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return 1; 193e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o } else { 194e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (check_fs_open(argv[0])) 195e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return 1; 196e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o } 197e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if ((flags & CHECK_FS_RW) && check_fs_read_write(argv[0])) 198e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return 1; 199e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if ((flags & CHECK_FS_BITMAPS) && check_fs_bitmaps(argv[0])) 200e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return 1; 201e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return 0; 202e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o} 2031e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o 204e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o/* 205e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o * This is a helper function used by do_stat, do_freei, do_seti, and 206e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o * do_testi, etc. Basically, any command which takes a single 207e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o * argument which is a file/inode number specifier. 208e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o */ 209e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'oint common_inode_args_process(int argc, char *argv[], 210e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o ext2_ino_t *inode, int flags) 211e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o{ 212e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (common_args_process(argc, argv, 2, 2, argv[0], "<file>", flags)) 213e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return 1; 2141e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o 215e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o *inode = string_to_inode(argv[1]); 216e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (!*inode) 217e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return 1; 218e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return 0; 219e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o} 220e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o 221e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o/* 222e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o * This is a helper function used by do_freeb, do_setb, and do_testb 223e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o */ 224e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'oint common_block_args_process(int argc, char *argv[], 225e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o blk_t *block, int *count) 226e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o{ 227e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o int err; 228e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o 229e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (common_args_process(argc, argv, 2, 3, argv[0], 230e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o "<block> [count]", CHECK_FS_BITMAPS)) 231e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return 1; 232e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o 233e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (strtoblk(argv[0], argv[1], block)) 234e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return 1; 235e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (argc > 2) { 236e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o *count = parse_ulong(argv[0], argv[2], "count", &err); 237e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (err) 238e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return 1; 239e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o } 240e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return 0; 241e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o} 242e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o 243e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'oint debugfs_read_inode(ext2_ino_t ino, struct ext2_inode * inode, 244e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o const char *cmd) 245e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o{ 246e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o int retval; 247e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o 248e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o retval = ext2fs_read_inode(current_fs, ino, inode); 249e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (retval) { 250e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o com_err(cmd, retval, "while reading inode %u", ino); 251e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return 1; 252e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o } 253e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return 0; 254e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o} 255e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o 256e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'oint debugfs_write_inode(ext2_ino_t ino, struct ext2_inode * inode, 257e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o const char *cmd) 258e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o{ 259e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o int retval; 260e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o 261e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o retval = ext2fs_write_inode(current_fs, ino, inode); 262e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o if (retval) { 263e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o com_err(cmd, retval, "while writing inode %u", ino); 264e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return 1; 265e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o } 266e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o return 0; 267e1018eeaa3285cd0ca26986d929194c1b577d211Theodore Ts'o} 2681e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o 269