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 e259eee75..332099493 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 66ff32ee7..f9d01e570 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 611f87016..afce8d6ef 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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 EPkU=MtpET3 literal 13440 zc-rlodtB0Y+s7p)ze>QhiqHja>)FcIZ&LS-nNYU4m&+pYTw16dW+5uOZ$i`(51Gwe z>avvvnVEUY(-QFv=*&)AGayaGL#0kj#bXKr&u{hGv)%W$mU~){y`KGZy*}6b;^O*U z-|v^->&L|li(|8m?sVI%odp-Fb|!RfI!PbW>K9mU|5DQ3^{AONeti8`iQgPM{Gd2V zeRcSxg1v|~E0^Xbq-tfAae=0&(riWfgYpzJ4L^R%cXJmW2sbR{P4+59jzbw)X;TCB zeq!EapUBb5yIMb0uN+*f)0h_8X?0qIt~c*iT3gMOw^dvC@C{R|o$cJ-9;^1MiASo3 ztG(A%A9~z<>{i>Mq3(JQtLuiIW9!0neG08%q|3ma9Jt}ApHws%29Mnm4}BqCtWO@| zYQ9b2P2C?1A3jk?9~m7OlbIUSn*K_j_Dqv^m1e5J(YwaL(RZFYT0PZdlR&Mx;vN1# zb0uM_yFQ3s6*AO!dC?&6ffc!xXrrPfT-aL;A8 zi*NGhJ&Gszt>9c)&D*iT806WQBtPl*+p%F7WLiw4pLAk7mWM%}i79f_rz9WkcBag z{?Z9gtQdnVikZih&i2CAVUWc!PE0A*3)_G}eif6%lrHls32mFdPQBmOj}ONCnIKwf zkCyse0OR+Y9BHY|F7>$t#`~Kfl(kn&eM-Ri0Fxui+V4w!s=)Xl6GZDS`3aS}F;KRK z66l-kMd-#{DL0M|^u6Fk=)+v8Fs=*qE%71@V6Ide!-IUk_96^pu2dOQf_&v(gmH|0 zfQ@7xAX}3Wa!0YBNlM&VpZdpCKbrn8vrKu=B*6U^+c)t_#J9w_}=4)9g zTY8@B#ZR$ZZ@$>a#e~U<`X-=AI?r0RhVSb_VzQ1>!D6YUwXh!1&@4B9lfT;~jLAx* zf?r8DS^wfqob$oj@{eR|{@7J77v{~4b)!z_s(*(4^Njb}q%&>(@PTHgqSLWnSL(p- z&M${p$3n{Xl3REE4$d#V-MOuzm;YQZ{ssPAlRsPC^v>yTQ>I(@3BKbbHoT^vwcwAg zTt(k%oYeckh47|%Q+w^ZMYxrwr>@k!JHpye-m&UAWP5F$?w)t}o4xH-OT?4M#~R1h z+IVH1Eew$WOnl#*Gr+;GyVK7Whe%=}*AjAXLhfZK8i4QH1i5m^6+%(S-4D5~-JiD7 z-^E>WJ$6!^bS5^myBlUv5t5x1h*uXw?f~Rgg=8-c!mAr0cN}tSpeW=HL9QNhB~X-w zSI^_eh9Y`k7PTQeMDCk=7%Do5yX1CE$VzPqaFKn=5N)OQt%>`QXBGAp+rHUyH>%Lw1C@WbNofVRQpS+IHI7KL%PGh+5&EuS^A6iQX4L*Qi+1g zoUl9W?^-}l*(QI{eyV-GDwik_aw_kzn_ECH*?xaf0JR}sRY4SpINCexjuvo->@$DS zr&Rj_)peqvoI`42f8PS`l;!w~4p18kR4qh7B`2(jt!@G7vTOdL5UPEls*fnB=2SMZ zCt5&nS+Bq75VfIDr6CH$9BmWZND2DL<}gK(RQn>;Tx)@pLuzKvR)W4VOQtA>+EAo2 zw-(fK!kXEyE5Ti|O-#{eRQqDpa%(|7r?Q!iRf4-^`aY%RB%aq_=Sq@WllG^Z<%F|kKgA;a_O;CcL$gVL(DOCH*Du%V- z8&2h2wv7_>ll3x10&2r$Rj9S#7Ds!RyZk{jn0iYLj(z#l*hRXA1^Ngf(3nS^RU z8C4XJ3-HxwVJD9DHAx-^^)W~zwZUScKnTDeMhm-eteYfxD%8gyEvyX&R8zoEfIo^B z_TpG_k~|mcV~|z}Wk7*2fIp5F_TyNsBzXnY#~@7$Wzg8+X5EgZtJ9zgp6^#Rpr zhs8pHLjYfc7LMUqkD&d4`haS*!vHY_3#9(Pz@+ULIEQHzLBXAhG)G-me1u%%+xee2P_r}L<0O-rb1&p3rUunb0urkw6G2s zAfsYcW}F%aw$vX<8_wmI59I__Ixg z^YE{U-GwP5T!|U@}cs( zv4Ad(HT#fPc@1i3yZfJr^_YS|Lsi#c5a9f&$p|Od|dbvq+){3V;&r|s}2tx(TrKNi}k&QhDW_4r-ItV_s7my zweu#^bd!#0dhhn+mOlThMqVo=N03De;mp6}3zd2-{9tzj(E(-c8l5lqp%9y2nCw_j zv~fV8U86Hzij;WYCB?zedm=Kh9qSP`Gf5tdhpijDpX$V5oiksYi2!n?udF-{9N!fI zH|to2ut|iyILUnrPL6}&uNo!niU3wgpf!s`s-NQaD470+*Z2tU)^7axsYDC<<0%V+ zu5vYbZ=Q?!+1q`|ky-J!T@sh$wq3O@1#4n-?>>la%5k}8s9Q?5sJW!Mh?#0UW&3WY zWzN<}kB{>5&Ud;s_T}#5x|LKcH>WSmFNizx6UK7g;wzRnw{H*U3T%x_?Q(UI{Rs@7 zk2a&lqFJ9k4*U|CG7Zx-R!l?gG)()HU@v_<_)80V*48;(hin%Nd2f!(8)v`hOODD) zw%uFjQfiyoX_>#(jC(!X1x@bCcKLw(kg0#7b=#&L0_2jKiFcvvoNhl=i0xNY3HV$ zqjXe+*N(dgy^D0t{fn4T1!JX^B3wGY`Pt~rQnA~A8XAh8iLi2w_Q;W%C_3C2>J3Eh zN%N{-U~8uLN{NYChZ|D80l{4euS$f`>y51TM0m^$JlKHk_?umU({DELdpHB}P%7{E z;o#3Y`$k`~vE%l>JVC+Bb7&vnRiL7ZLHmkf7Y)0b@G=roM)3ApMd4pr0FP5ihSRm{jjotcK1d^vOm&(;oT7?LfaW-A#*9 z1}Vbp#=V5?MLPHX)lBivkX@0^so#{zbJfC?77D#&-2T}JD4niZRLXOkhAG7QtVdwu zV2C{t>3@d20z-)xbIr`09X}-MU2!r)%;`@8=Qr*^H99r%xcBInpDHqLb##Y=qaVDsAx1aWLyW5&2jj3Sve{UOa5w$bIu4PeZyn z^S9(oAH6|O)Gv76_M+s-(}TP*M;ggsC7UnKM%cfq(gy!L1KnR8QN9e^13le^STsRr z!qhbyx@fqf!-=6@Pvj<>lW8dYD~Va;m$-m`1W*3>>j*v@k>DH+eHt_59gz(6G9ve! zIr)EsV;Jh?L~goyl>>^NjVN@EUX&}%dl|TsJ7b5SPqFstEv4Y)Ey`cN&OKekJK}o7a~+o9lMCV)-ok!t{c;2#=4l^WOOx##Al; z@;~g|>WN2>t-N*Py`msGZzwBEFBmO7o~*X|ZU!K3)fXo-CAAP zZZV|a9DeAgIFx)StDP6jo6NFWX9y0i(Zbcn`o^$u%^0sdZ1SE3Ueok=P#mINI!LcN z^thcjGHhzq7Cxz8s$FfN@9FIkPbAodX%sxIf;V~BZmq6~XUNOqX>Qr+>TmIeE~kZ$ zB^U-k3w^(#vu)61>V|l9RM23GH)whl4?WrqkH+$Xt$5n{htQio4s+~DvYRTZ)+iDl iU%REB8dk}a!D%(xd;PJ7ukW2OpsK%cj*ut9js6=1lWsEr diff --git a/tests/f_orphan_dotdot_ft/expect.1 b/tests/f_orphan_dotdot_ft/expect.1 index ac309e8a4..6a1373f2a 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 -- 2.47.3