debugfs: optimize ncheck and improve its error checking

Don't call ext2fs_get_pathname() for every single directory; instead,
only call it if we find a matching directory entry.  In addition, if
ext2fs_get_pathname() fails, print the number of the parent directory
in angle parents so the user gets some additional information.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
bitmap-optimize
Theodore Ts'o 2012-01-16 17:49:46 -05:00
parent 24d364fc43
commit 2b1cae7a26
1 changed files with 25 additions and 10 deletions

View File

@ -20,11 +20,13 @@
#include "debugfs.h"
struct inode_walk_struct {
ext2_ino_t dir;
ext2_ino_t *iarray;
int inodes_left;
int num_inodes;
int position;
char *parent;
unsigned int get_pathname_failed;
};
static int ncheck_proc(struct ext2_dir_entry *dirent,
@ -34,15 +36,32 @@ static int ncheck_proc(struct ext2_dir_entry *dirent,
void *private)
{
struct inode_walk_struct *iw = (struct inode_walk_struct *) private;
int i;
errcode_t retval;
int i;
iw->position++;
if (iw->position <= 2)
return 0;
for (i=0; i < iw->num_inodes; i++) {
if (iw->iarray[i] == dirent->inode) {
printf("%u\t%s/%.*s\n", iw->iarray[i], iw->parent,
(dirent->name_len & 0xFF), dirent->name);
if (!iw->parent && !iw->get_pathname_failed) {
retval = ext2fs_get_pathname(current_fs,
iw->dir,
0, &iw->parent);
if (retval) {
com_err("ncheck", retval,
"while calling ext2fs_get_pathname for inode #%u", iw->dir);
iw->get_pathname_failed = 1;
}
}
if (iw->parent)
printf("%u\t%s/%.*s\n", iw->iarray[i],
iw->parent,
(dirent->name_len & 0xFF), dirent->name);
else
printf("%u\t<%u>/%.*s\n", iw->iarray[i],
iw->dir,
(dirent->name_len & 0xFF), dirent->name);
}
}
if (!iw->inodes_left)
@ -115,13 +134,9 @@ void do_ncheck(int argc, char **argv)
goto next;
iw.position = 0;
retval = ext2fs_get_pathname(current_fs, ino, 0, &iw.parent);
if (retval) {
com_err("ncheck", retval,
"while calling ext2fs_get_pathname");
goto next;
}
iw.parent = 0;
iw.dir = ino;
iw.get_pathname_failed = 0;
retval = ext2fs_dir_iterate(current_fs, ino, 0, 0,
ncheck_proc, &iw);