From 8d541f641ef3861276f7138b2f3e601036f03110 Mon Sep 17 00:00:00 2001 From: Andreas Dilger Date: Sat, 23 Jun 2018 14:30:52 -0400 Subject: [PATCH] e2fsck: handle preallocation for large PAGE_SIZE Fix handling of block preallocation support in cases where the kernel PAGE_SIZE is larger than the filesystem blocksize. Signed-off-by: Kalpak Shah Signed-off-by: Andreas Dilger Signed-off-by: Theodore Ts'o --- e2fsck/pass1.c | 11 ++++++++--- tests/f_eofblocks/expect.1 | 6 ++---- tests/f_eofblocks/expect.2 | 2 +- tests/f_eofblocks/image.gz | Bin 1364 -> 1372 bytes 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/e2fsck/pass1.c b/e2fsck/pass1.c index c5149e5d7..98e80174f 100644 --- a/e2fsck/pass1.c +++ b/e2fsck/pass1.c @@ -3448,10 +3448,15 @@ static void check_blocks(e2fsck_t ctx, struct problem_context *pctx, size = EXT2_I_SIZE(inode); if ((pb.last_init_lblock >= 0) && - /* allow allocated blocks to end of PAGE_SIZE */ + /* if size is smaller than expected by the block count, + * allow allocated blocks to end of PAGE_SIZE. + * last_init_lblock is the last in-use block, so it is + * the minimum expected file size, but +1 because it is + * the base-zero block number and not the block count. */ (size < (__u64)pb.last_init_lblock * fs->blocksize) && - (pb.last_init_lblock / blkpg * blkpg != pb.last_init_lblock || - size < (__u64)(pb.last_init_lblock & ~(blkpg-1)) * + ((pb.last_init_lblock + 1) / blkpg * blkpg != + (pb.last_init_lblock + 1) || + size < (__u64)(pb.last_init_lblock & ~(blkpg - 1)) * fs->blocksize)) bad_size = 3; else if (!(extent_fs && (inode->i_flags & EXT4_EXTENTS_FL)) && diff --git a/tests/f_eofblocks/expect.1 b/tests/f_eofblocks/expect.1 index 2e9133e1e..34222480b 100644 --- a/tests/f_eofblocks/expect.1 +++ b/tests/f_eofblocks/expect.1 @@ -1,7 +1,5 @@ Pass 1: Checking inodes, blocks, and sizes -Inode 30, i_size is 2048, should be 4096. Fix? yes - -Inode 31, i_size is 2048, should be 4096. Fix? yes +Inode 31, i_size is 2048, should be 6144. Fix? yes Pass 2: Checking directory structure Pass 3: Checking directory connectivity @@ -9,5 +7,5 @@ Pass 4: Checking reference counts Pass 5: Checking group summary information test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** -test_filesys: 31/56 files (29.0% non-contiguous), 83/400 blocks +test_filesys: 31/56 files (29.0% non-contiguous), 85/400 blocks Exit status is 1 diff --git a/tests/f_eofblocks/expect.2 b/tests/f_eofblocks/expect.2 index 2a2bca5c9..0cce31480 100644 --- a/tests/f_eofblocks/expect.2 +++ b/tests/f_eofblocks/expect.2 @@ -3,5 +3,5 @@ Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information -test_filesys: 31/56 files (29.0% non-contiguous), 83/400 blocks +test_filesys: 31/56 files (29.0% non-contiguous), 85/400 blocks Exit status is 0 diff --git a/tests/f_eofblocks/image.gz b/tests/f_eofblocks/image.gz index 2586a6a7670ad609ba7e66911a8f7a8f4df96321..e1177b3a7d6f33ce135fe91c7b6d11bbb1ee09a3 100644 GIT binary patch literal 1372 zc-rlaZ7`b$0LQbrmA%~T*100cv8^^_hKjcl)1f;vRTmkx%V`=!gy1?Ykw;CpDPp<_ zC1kY9(4}FbqGVGgJ(|!GcWFttL>^Z!sSxob&&%xN?)G)x_WSVv@c-TY|AZO`hvTnJ zCcS9KWM^hGaGT4C-%%LO_RourpLy!^U{6qZ?#I7M;L3+tS2(qARc6hT>~`L^o&4JG zghOMT*L%71(i6RnnKgT<@4QT`e5ErM9}-(Lcj}01VVQCaoO1`2S4-w5gj&b;Fh}E< z4p<2S%fa>+jAvawOkvlSjtUs%g>HOZv>R(P>Gl`}+F2P5B+0rgyE&1pV;&JyR+O%asZgEdUZg)aGKAJ}~urQ^;N>Ds|&>*I8GQW?hqKsj=f9<0 zlu`N9tO)g{GT+x`P9t@%i87iP#WPV;pcA5W7SZ+s#(!EXxwk(tK-0<`@7tCG#(OsC z+`@Td_4d0Af)0tr7G!E8v8BA$pJ*Km81Fx@x7I}b?bQS8dl|jzOmjh?(%p3=@2Mfg z)@ueNeM9I)m)(Tu->mliz`w;)pkwBJT!l;5e2$wE7W0}LHY#xcfTLpy33%eVd=_CB ztGSp&^g&%6${nHHjF+_l^`SFajN{u9Foyl)@sEq0`P*!rt9zI$LH$)p(jAnw1WV7q zDqO*@fDk$;eS}g~)*8fn{T8+xw_NIOB7daOU|X_KQn*_qVVVXEwv>ITx@4_F3X%)^ z-R}>S`39ECH6?kyaD!smH8{`{czhi~*pP*ySAD9`dW?*AN|Wd)USkSL)vFQ}TKtGA zZnJF)w%3@9VudJ#!pk`Gt(S$f(7~Jqn5WT`u_#;x(;IB*3zCB-?KH|+jB5TK@F|kl zh6mR{j?z_sv4VEc94(Ub!-MJ|@|-~4=_U8~#7^l2ix*IxMFbDc-gPqT3}8IsJ3D1`_Jwbsxh zf038@nC#y))yHqyCr^9p3tEq1d?|d-2}(F@O8O)}tqmlja7nyDFu5c5^Tf^`ECyoS z2mXF)fVx|tKB^)JeaPG+f1hIJbPe3(tp^ArjC1YSBph4~0A*1;@>Wq$B5N#~K zpfpXwDN;z7McWL_kL*JYvLGWIX(WQ87VV-)s+C|wdn<~B7C{BkqK%uPMP#W9jkrDc zo^$AqbLY%^(ZZbH51u&>?>*yx-s5@SnKR%u%Yf->L)068wJht8sj`E9N+z9=>FMf9{lFx55Ir< zhZp-kyZq}|z5l?WE1ylR^3`7+`TF7K)(?O2((gat{=l1SUTvN|t9Y$(_MdrNO`X1? z-l$z}J+1+N&3m!A_HS*i|G})@8p#c2+uw490O0!52!A%tH5xB;@d?0nq2781uGLq? zG4Jd3Rjcx6`2MV~{?x%|4z1jK@Yw^q^JnFFy|#1hp6sTwUzcUGi~iBISvIHaV|;GW z?~3txWgp}7i+*>EFDUzU`Ey9K-xK2t%Ra^z75(0S7++lWF+NcAkFCvrZ_(;wd`Z#o zi}9spALBzs|9FfqEBhEJw- zAF%!b>mRWG0qY;I{sHSBu>OJng&vmx0H&2jqj4njuliwHvI7DD000000000000000 zz_q7;advE^tp76i*DYD={l|X1FgEhj#k}%YdRqS|K7y>MG5QgugEPcb^a?7 z^A{)NHzK#J)cLPW%paI4e{Pn&9zXxS9o0OR`7Y5q~$i|b#S z?0sxEez0@%RQb*4&Xbq&N}7Mv*2MX5s>lbk@dIB0k^}_|;NS5#ODu1?06+!+NxVE= -- 2.47.2