2010-03-24 19:27:26

by Evgeniy Ivanov

[permalink] [raw]
Subject: ext2/ext3 different block_sizes/i_size/e2fsck question

Hello,

Sorry for bothering list with my ext2 questions.
I got into trouble with my ext2 implementation and filesystem with
1024 block size. Sometimes when I write files they're written
correctly (md5sum is the same as original, i_size is correct either),
but e2fsck changes i_size to another values (which breaks files). E.g.
67445000->67446784 or 67445248->67446784. I see that new sizes are
numbers of multiples of 1024.
Strange thing is that I can't reproduce this problem with 2048 and
4096 block sizes. I thought the problem was in trash in unused part of
last block (actually it is zeroed), but then it would be reproduceable
in fs with another block size.
How does ext2 decide to fix that files sizes? Any suggestions?

Thanks in advance for any help.


--
Evgeniy Ivanov


2010-03-24 23:18:14

by Evgeniy Ivanov

[permalink] [raw]
Subject: Re: ext2/ext3 different block_sizes/i_size/e2fsck question

I've also noted a very interesting and strange thing. I checked a file
for which e2fsck did 67445000->67446784 i_size change.
debugfs stat comparison between fixed file and file with old size
differs in i_size *only* (all blocks are the same), but cmp shows
difference in 67382273 (it's constant for any bogus file), that is
block 65803 which is the last before triple indirection. How did file
change if e2fsck just had changed i_size and both values are greater
than 67382273?


On Wed, Mar 24, 2010 at 10:27 PM, Evgeniy Ivanov <[email protected]> wrote:
> Hello,
>
> Sorry for bothering list with my ext2 questions.
> I got into trouble with my ext2 implementation and filesystem with
> 1024 block size. Sometimes when I write files they're written
> correctly (md5sum is the same as original, i_size is correct either),
> but e2fsck changes i_size to another values (which breaks files). E.g.
> 67445000->67446784 or 67445248->67446784. I see that new sizes are
> numbers of multiples of 1024.
> Strange thing is that I can't reproduce this problem with 2048 and
> 4096 block sizes. I thought the problem was in trash in unused part of
> last block (actually it is zeroed), but then it would be reproduceable
> in fs with another block size.
> How does ext2 decide to fix that files sizes? Any suggestions?
>
> Thanks in advance for any help.
>
>
> --
> Evgeniy Ivanov
>



--
Evgeniy Ivanov

2010-03-25 01:55:46

by Theodore Ts'o

[permalink] [raw]
Subject: Re: ext2/ext3 different block_sizes/i_size/e2fsck question

On Wed, Mar 24, 2010 at 10:27:24PM +0300, Evgeniy Ivanov wrote:
>
> Sorry for bothering list with my ext2 questions.
> I got into trouble with my ext2 implementation and filesystem with
> 1024 block size. Sometimes when I write files they're written
> correctly (md5sum is the same as original, i_size is correct either),
> but e2fsck changes i_size to another values (which breaks files). E.g.
> 67445000->67446784 or 67445248->67446784. I see that new sizes are
> numbers of multiples of 1024.
> Strange thing is that I can't reproduce this problem with 2048 and
> 4096 block sizes. I thought the problem was in trash in unused part of
> last block (actually it is zeroed), but then it would be reproduceable
> in fs with another block size.

E2fsck will adjust i_size if it is smaller than the number of blocks
than you have allocated. So in the case of 67445000->67446784, your
file probably had 65866 1k blocks, and since 67445000 is less than
(655865*1024)+1, e2fsck assumed that your i_size was wrong, and so it
asked for permission to fix it.

Put another way, if you have 2 blocks in 1k file, and i_size is 1024,
it clearly must be wrong. If it's 1025, maybe we're only using 1 byte
in the last block; but if i_size is less than or equal to 1024, then
why was the 2nd block allocated in the file in the first place?

- Ted

2010-03-25 22:43:37

by Evgeniy Ivanov

[permalink] [raw]
Subject: Re: ext2/ext3 different block_sizes/i_size/e2fsck question

On Thu, Mar 25, 2010 at 4:55 AM, <[email protected]> wrote:
> On Wed, Mar 24, 2010 at 10:27:24PM +0300, Evgeniy Ivanov wrote:
>>
>> Sorry for bothering list with my ext2 questions.
>> I got into trouble with my ext2 implementation and filesystem with
>> 1024 block size. Sometimes when I write files they're written
>> correctly (md5sum is the same as original, i_size is correct either),
>> but e2fsck changes i_size to another values (which breaks files). E.g.
>> 67445000->67446784 or 67445248->67446784. I see that new sizes are
>> numbers of multiples of 1024.
>> Strange thing is that I can't reproduce this problem with 2048 and
>> 4096 block sizes. I thought the problem was in trash in unused part of
>> last block (actually it is zeroed), but then it would be reproduceable
>> in fs with another block size.
>
> E2fsck will adjust i_size if it is smaller than the number of blocks
> than you have allocated. ?So in the case of 67445000->67446784, your
> file probably had 65866 1k blocks, and since 67445000 is less than
> (655865*1024)+1, e2fsck assumed that your i_size was wrong, and so it
> asked for permission to fix it.
>
> Put another way, if you have 2 blocks in 1k file, and i_size is 1024,
> it clearly must be wrong. ?If it's 1025, maybe we're only using 1 byte
> in the last block; but if i_size is less than or equal to 1024, then
> why was the 2nd block allocated in the file in the first place?

Thank you for your explanation.
My problem was in miscalculation of first triple indirect block. I
used following thing "triple_ind_s = doub_ind_s + pow(addr_in_block,
2)" and it was a bad idea to use pow() instead of multiplication or
shifting. It was ok with gcc (and libc), but caused a problem with ACK
(I get value of 1 less, thus each last double indirect block became a
hole instead of data). Since that was both in reading and writing md5
sums were correct (and in Linux I checked them only after e2fsck).
Funny bug :)


--
Evgeniy Ivanov