[Yaffs] data loss under heavy pressure on Yaffs2 GC --> fix
Luc Van Oostenryck
lkml at looxix.net
Wed Aug 3 00:12:19 BST 2005
Luc Van Oostenryck wrote:
> Charles Manning wrote:
>
>> On Wednesday 03 August 2005 08:46, you wrote:
>>
>>
>>> It's not solved for my test.
>
>
>>> It seems that there is a problem with resizing.
>>>
>>> Luc
>>
>>
>>
>>
>> So this happens in a single run without any unmount/mount between the
>> writing and the reading? If so, then it is not the problem fixed in
>> 1.15 which required a rescan to make the problem happen.
>
>
> Yes, it happen whithout remounting (the content of the test file don't
> change
> after a reboot, it's still corrupted).
>
>> To summarize what you report here, the problem is that you'd expect to
>> see holes in the file due to the resize.
>
>
> The hole are an optimization (no block physically written), but yes it
> is expected
> to read back zeroes.
>
>> Can you run this with more tracing on and see what happens inside YAFFS?
>
>
> Yes, I'll do. It should be better to have a smaller specific testcase.
> I
>
>> don't want to point any fingers yet (not until I see a trace log), but
>> it could be the Linux page cache holding onto data and this being
>> given back. Perhaps there is some page invalidation that needs to
>> happen that is not happening? Perhaps some page is not being released
>> at the correct time?
>>
>> -- Charles
>>
>
> Yes, this is certainly a possibility, I will compare with the other file
> systems
> to see what they do with the pages after a truncate/resize.
>
>
> Luc
>
Yes, there seems to be something missing.
The others fs use something like a mix of calling vmtruncate() and/or something like the code below,
either in setattr() or XXX_truncate() (to add in inode_operations and called by vmtruncate if present)
page = grab_cache_page(inode->i_mapping, inode->i_size >> PAGE_CACHE_SHIFT) // or attrs->ia_size >> PAGE_CACHE_SHIFT
// if needed, fill with zeroes the partial page
// there is already a/some function to do this
flush_dcache_page(page);
unlock_page(page);
page_cache_release(page);
I will need to investigate much further.
More information about the yaffs
mailing list