From 1f572d1f88628c1e0dc88cb8cfaf2bb480b81e4f Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Tue, 17 Jan 2012 15:38:31 -0500 Subject: [PATCH] libext2fs: display partial path if fs corrupted in ext2fs_get_pathname() The function ext2fs_get_pathname() used to return EXT2_ET_NO_DIRECTORY if one of the directories in an inode's pathname is not a directory. This is not very useful in an emergency, when the file system is corrupted. This commit will cause ext2fs_get_pathname() to return a partial pathname, which should help system administrators trying to use debugfs to investigate a corrupted file system. Signed-off-by: "Theodore Ts'o" --- lib/ext2fs/get_pathname.c | 21 ++++++++++++++++----- tests/f_badroot/expect.1 | 2 +- tests/f_dupdot/expect.1 | 4 ++-- tests/f_expand/expect.1.gz | Bin 13440 -> 13462 bytes tests/f_orphan_dotdot_ft/expect.1 | 12 ++++++------ 5 files changed, 25 insertions(+), 14 deletions(-) diff --git a/lib/ext2fs/get_pathname.c b/lib/ext2fs/get_pathname.c index e259eee7..33209949 100644 --- a/lib/ext2fs/get_pathname.c +++ b/lib/ext2fs/get_pathname.c @@ -74,7 +74,7 @@ static errcode_t ext2fs_get_pathname_int(ext2_filsys fs, ext2_ino_t dir, char *buf, char **name) { struct get_pathname_struct gp; - char *parent_name, *ret; + char *parent_name = 0, *ret; errcode_t retval; if (dir == ino) { @@ -99,7 +99,19 @@ static errcode_t ext2fs_get_pathname_int(ext2_filsys fs, ext2_ino_t dir, gp.errcode = 0; retval = ext2fs_dir_iterate(fs, dir, 0, buf, get_pathname_proc, &gp); - if (retval) + if (retval == EXT2_ET_NO_DIRECTORY) { + char buf[32]; + + if (ino) + snprintf(buf, sizeof(buf), "<%u>/<%u>", dir, ino); + else + snprintf(buf, sizeof(buf), "<%u>", dir); + retval = ext2fs_get_mem(strlen(buf)+1, name); + if (retval) + goto cleanup; + strcpy(*name, buf); + return 0; + } else if (retval) goto cleanup; if (gp.errcode) { retval = gp.errcode; @@ -132,12 +144,11 @@ static errcode_t ext2fs_get_pathname_int(ext2_filsys fs, ext2_ino_t dir, else strcat(ret, "???"); *name = ret; - ext2fs_free_mem(&parent_name); retval = 0; cleanup: - if (gp.name) - ext2fs_free_mem(&gp.name); + ext2fs_free_mem(&parent_name); + ext2fs_free_mem(&gp.name); return retval; } diff --git a/tests/f_badroot/expect.1 b/tests/f_badroot/expect.1 index 66ff32ee..f9d01e57 100644 --- a/tests/f_badroot/expect.1 +++ b/tests/f_badroot/expect.1 @@ -4,7 +4,7 @@ Pass 1: Checking inodes, blocks, and sizes Root inode is not a directory. Clear? yes Pass 2: Checking directory structure -Entry '..' in ??? (11) has deleted/unused inode 2. Clear? yes +Entry '..' in <2>/<11> (11) has deleted/unused inode 2. Clear? yes Pass 3: Checking directory connectivity Root inode not allocated. Allocate? yes diff --git a/tests/f_dupdot/expect.1 b/tests/f_dupdot/expect.1 index 611f8701..afce8d6e 100644 --- a/tests/f_dupdot/expect.1 +++ b/tests/f_dupdot/expect.1 @@ -1,9 +1,9 @@ Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure -Entry '.' in ??? (12) is duplicate '.' entry. +Entry '.' in <14>/<12> (12) is duplicate '.' entry. Fix? yes -Entry '..' in ??? (12) is duplicate '..' entry. +Entry '..' in <14>/<12> (12) is duplicate '..' entry. Fix? yes Pass 3: Checking directory connectivity diff --git a/tests/f_expand/expect.1.gz b/tests/f_expand/expect.1.gz index 91799bb05ce03abba20f467b3cf3f8500a762fa0..1015e155ca93f1aea0edfad09be6e795c0ab1898 100644 GIT binary patch literal 13462 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 literal 13440 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 SH@A-J(6wJWM@o|P_5K$GlWsEr diff --git a/tests/f_orphan_dotdot_ft/expect.1 b/tests/f_orphan_dotdot_ft/expect.1 index ac309e8a..6a1373f2 100644 --- a/tests/f_orphan_dotdot_ft/expect.1 +++ b/tests/f_orphan_dotdot_ft/expect.1 @@ -7,23 +7,23 @@ Pass 2: Checking directory structure Entry 'dir' in / (2) has an incorrect filetype (was 2, should be 6). Fix? yes -Entry '..' in ??? (13) has an incorrect filetype (was 2, should be 6). +Entry '..' in <12>/<13> (13) has an incorrect filetype (was 2, should be 6). Fix? yes -Entry '..' in ??? (14) has an incorrect filetype (was 2, should be 6). +Entry '..' in <12>/<14> (14) has an incorrect filetype (was 2, should be 6). Fix? yes -Entry '..' in ??? (15) has an incorrect filetype (was 2, should be 6). +Entry '..' in <12>/<15> (15) has an incorrect filetype (was 2, should be 6). Fix? yes Pass 3: Checking directory connectivity -Unconnected directory inode 13 (???) +Unconnected directory inode 13 (<12>/<13>) Connect to /lost+found? yes -Unconnected directory inode 14 (???) +Unconnected directory inode 14 (<12>/<14>) Connect to /lost+found? yes -Unconnected directory inode 15 (???) +Unconnected directory inode 15 (<12>/<15>) Connect to /lost+found? yes Pass 4: Checking reference counts