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