From b71e01835ff844d5be09ecbf7e51acad4d75447b Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Mon, 16 Nov 2009 21:56:24 -0500 Subject: [PATCH] e2fsck: Fix duplicate directory entries for non-indexed directories Duplicate directory entries were not necessarily getting found and fixed for non-indexed directories, since we were sorting these directories by inode number, and the duplicate entry code assumed the entries were getting sorted by name or directory name hash. Addresses-Sourceforge-Bug: #2862551 Signed-off-by: "Theodore Ts'o" --- e2fsck/rehash.c | 12 ++++++------ tests/f_dup_de2/expect.1 | 16 ++++++++++++++++ tests/f_dup_de2/expect.2 | 7 +++++++ tests/f_dup_de2/image.gz | Bin 0 -> 4860 bytes tests/f_dup_de2/name | 1 + 5 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 tests/f_dup_de2/expect.1 create mode 100644 tests/f_dup_de2/expect.2 create mode 100644 tests/f_dup_de2/image.gz create mode 100644 tests/f_dup_de2/name diff --git a/e2fsck/rehash.c b/e2fsck/rehash.c index 50388f36..46d04e49 100644 --- a/e2fsck/rehash.c +++ b/e2fsck/rehash.c @@ -751,12 +751,7 @@ errcode_t e2fsck_rehash_dir(e2fsck_t ctx, ext2_ino_t ino) /* Sort the list */ resort: - if (fd.compress) - qsort(fd.harray+2, fd.num_array-2, - sizeof(struct hash_entry), ino_cmp); - else - qsort(fd.harray, fd.num_array, - sizeof(struct hash_entry), hash_cmp); + qsort(fd.harray, fd.num_array, sizeof(struct hash_entry), hash_cmp); /* * Look for duplicates @@ -769,6 +764,11 @@ resort: goto errout; } + /* Sort non-hashed directories by inode number */ + if (fd.compress) + qsort(fd.harray+2, fd.num_array-2, + sizeof(struct hash_entry), ino_cmp); + /* * Copy the directory entries. In a htree directory these * will become the leaf nodes. diff --git a/tests/f_dup_de2/expect.1 b/tests/f_dup_de2/expect.1 new file mode 100644 index 00000000..8dd3d912 --- /dev/null +++ b/tests/f_dup_de2/expect.1 @@ -0,0 +1,16 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Duplicate entry 'test-008' found. + Marking / (2) to be rebuilt. + +Pass 3: Checking directory connectivity +Pass 3A: Optimizing directories +Entry 'test-008' in / (2) has a non-unique filename. +Rename to test-0~0? yes + +Pass 4: Checking reference counts +Pass 5: Checking group summary information + +test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** +test_filesys: 21/256 files (0.0% non-contiguous), 1087/2048 blocks +Exit status is 1 diff --git a/tests/f_dup_de2/expect.2 b/tests/f_dup_de2/expect.2 new file mode 100644 index 00000000..8781274c --- /dev/null +++ b/tests/f_dup_de2/expect.2 @@ -0,0 +1,7 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +test_filesys: 21/256 files (0.0% non-contiguous), 1087/2048 blocks +Exit status is 0 diff --git a/tests/f_dup_de2/image.gz b/tests/f_dup_de2/image.gz new file mode 100644 index 0000000000000000000000000000000000000000..a8e4db3e8ac4c1695b89c714f24635467a61f279 GIT binary patch literal 4860 zcmeH~`&Uy}7RR+zvDM1d2lxQeRcB-@MOtZO3S!*87A27?FwLa&p zwSU`tf6w>q!#KTcnRMk#K`+@INjMn)@uG2~{TBjWRqjYxVD4|gq&I*6mdh$|g16?# zt8Y4fe)-d5Aq~f03)e1beIu&j&dY0Sytlmh=}T{2TC-$v!=?AWoGuPrv!cJQyI|AU zEN)3L^$aq7rh6WxOtD+M*00D_;PMSV>mC_;XR7Vn5?XKIf-QVSa1if=*ngL903aD(Ht#zx^+|Vyi%=$|Q=WbqU;%C!^ z(w+ftMtjFTs;6-%xuD-~q-uxjh7E;akDW`lvkGXnTxp+{ArX*(LbZqx5^Y5Dk z>*Y*p^<$x#!%V!JRsOVp()M_aTIaK5(LYwjhpyKCt5eI^b9s!D3d3&B$x*u}zrDD# zzd&STwd9yyF%OM6;YI6LY)u-x6+HLNPk!yG>5VmSW9i!*a|@nzncqEBJ2%guUxvr# zP4$-IqT%;B@6BKDYD>3@auQgaAKOOCz2{FA<@o1iFjCrUB&Gb+`$qfK;ugL>LcUf~ z!*7Y0aqIMZ`1z@3uB&a{rcXCHYyQgKv}3+y)6V&f1!fjlvcSm&_AGF7f!{4qlM|oy zOBT;Pa&6)M%+Xl%&bFM4%)^IEx5xc7zQcYrf9js3-C8mTz;;uE8RkPBHtx*5(AkN` z;rXCqhTp;3t|U+I$(g#lm+$?42=>^GxE*yl>Ap zyA@7jCvy5$Qx{*f<<2-fZ`;W$tT?vpVr?z-Q2a@75^*C3nT!z8 z{yBohg{5<2^1y<;EzbWff%6l~cLFBc6Xy!^X!~l8^+x!QU)TjCY+vZl^=Y+F@~z~t zHKWDzlZ%fu)?}SZU*(+jeoi67EAIA$Ei^CMcC%kc`mwS%vA;Esx~6OvLJ=@i+{;(t zYCxR+Dilc(OOb;K;Tvss?vsHgTUFpQl38j^$EWE0=!myldp(S^X5-I<*+`wKmOp1Ps=SLXTJTblzXeD3x715ik_HF zXBH@aVs@G zsuIFo++|P*quF1sdlc4+C(=p~(AB2GY!X4@$9b8AFOoDKIZG@CVs&bvC`q12o}p{O z6kW{_YtC7f&q+yAH4{E$Ijv@0Td7JTGD#hf?h+b+hXTi3xLx=xX{C=_VqGFT?C&@b z0c17ZU`dx=_Kof$UZEANWb;=smFj*po=Tx-EW67Oi0VDD63V@Uh$B%Jv>)~&RX|)h zPo#ngZ}O2PPO9o#ubiw|l^B1;Ni{*QXi?UyoEgBW)%NpX8 zrIHIWBu@3cq)65@rfiW^$ePDgGm_&V-y@0xpA?UPd)ZBnig>Jv+JPMQh&WBGLO$}~ z1rghjPtL%vAO}1|?&xPo7<52|DiJ;;l%W4ll%`+8g zJY&U8M<#78NHiO+5S0ahEuTo$z9NzQJaw9`u^g4w>{oE9Yb;%#9L7t52q~l&4$GUUG8$sl^+A*5oc7Yz z`qSin?Uk)iH#q=g2tp%q9$l{0>SG9WnlxzDdXb-;qVly3*-?H<1`!OT7{mM&l{f^% z7=>wQKWPHujl6bwD^;Ow&W@hOV3MHAED1(YyK0!Qqhs0O4#Xz9z;ei{aD{f6kWglL zwd8|f?sxbxrluB7X8QL=d0{=wpk96x_J|qK8=Zm;GC935lh_>cM>gbGUq|dl{=}}X zh(3)rk>Ar_@vk|mZc0w^8!ssT{{Cq?iGTA!F~g_d9DYsQVUTZE2j@H6UKAZa zH_zNH?6kx0+^esM?1y`)CCHwH=okz~f^}Dg;RARoeczxLhWVgD)W`JC;GXd)AIx21 zGSs9(Mv_O9VDPvw6O~B%4XP=%R6J~er(iqs1}MeDAKk2hA`?!Nq>68^1k$%Zv+G8pl+0zRprZb z!vpDumJg&F-^fbX6TL;>w1i1p^kH?V0^pYm+nZJS!|PAM(>1%hEnLS_O9g2-W*fzp7#G0Lx=ffZA=+LlB`CCZ_2 zEtClRkn!}Sw&}4_gc<>k@qZX~0d>~mZ*7k zx6v<3@Z#OLg+GA_o0Lp~yAncU@CXD*;Cj|OVH!lByRLyt(3SLEFk06p4E4eH)3*&R zsS1Il8RY4-LT)SJN*fGKQ%aqr($GAmvQoLMtHMYa_C|Nnogi1&G8C2s1E{~`q*3%fPsZR-G1ho-Jl{V>lCbR_*mW!Ow zlR&88KnYs2FnP3Yh26>9TBV*FNu*ISi%<|lVAGU6AT@?~;|^2+J*rhCs$)nu`a3O> zs2ZS(EYa4s$MvnG6Od-)PUD`G-omqLv$^fiER{yjf|p$D3&;`hpHl~Oo!7cTWz`13 zA+b!RsZ}*FrDs&@#ho%moH|;J%b+-ThqzCs8dGP8hh*>=yo5Z0#Ikjc%9GT3x`%(I zg4eG$p_h>;4`C2`4hi=Vbfb+-{buwik_Cmh