I've run into a problem using the latest YAFFS code on linux-2.6.28-rc8 using today's YAFFS CVS code.
First off I had to modify the code in yaffs_write_begin to only call grab_cache_pages_write_begin if the kernel version is newer than 2.6.28 since 2.6.28-rc8 does *not* have __grab_cache_page whereas 2.6.28 proper does:
#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 28)
pg = grab_cache_page_write_begin(mapping, index, flags);
#else
pg = __grab_cache_page(mapping, index);
#endif
Second I added "dev->nPageWrites++;" to nandmtd2_ReadChunkWithTagsFromNAND and "dev->nPageReads++;" to nandmtd2_WriteChunkWithTagsToNAND to track the number of page read/writes.
With this code, I'm seeing 30MB files that are created have mismatching checksums while running the attached test script. The output from the test looks like:
OMAP-35x# . /media/mmcblk0p1/x
Create 30M file and get md5sum
30720+0 records in
30720+0 records out
5b04790304a4221f1016a8c310da4746 somefile.1
**>> Block 710 needs retiring
**>> yaffs write required 2 attempts
**>> Block 710 retired
Block 710 is in state 9 after gc, should be erased
Calculate md5sums for copied files
5b04790304a4221f1016a8c310da4746 somefile.1
5b04790304a4221f1016a8c310da4746 somefile.2
5b04790304a4221f1016a8c310da4746 somefile.3
8c8d5a7974d0b9da747bc59edd1991f6 somefile.4
execute sync and recalculate md5sums
save exit: isCheckpointed 1
5b04790304a4221f1016a8c310da4746 somefile.1
5b04790304a4221f1016a8c310da4746 somefile.2
5b04790304a4221f1016a8c310da4746 somefile.3
5b04790304a4221f1016a8c310da4746 somefile.4
Delete one of the files
5b04790304a4221f1016a8c310da4746 somefile.1
5b04790304a4221f1016a8c310da4746 somefile.3
3cb7668eb7760202d96970a6a9a3361f somefile.4
recopy the deleted file
f6dba6d5af7a7a89481da1849035a417 somefile.1
5b04790304a4221f1016a8c310da4746 somefile.3
5b04790304a4221f1016a8c310da4746 somefile.4
f6dba6d5af7a7a89481da1849035a417 somefile.7
Creating test folder and some junk files in that folder
1+0 records in
1+0 records out
ae1028b8d6aef86d020c9edfae29ca3d junk.1
md5sums of all files in test folder
ae1028b8d6aef86d020c9edfae29ca3d junk.1
ae1028b8d6aef86d020c9edfae29ca3d junk.2
ae1028b8d6aef86d020c9edfae29ca3d junk.3
ae1028b8d6aef86d020c9edfae29ca3d junk.4
ae1028b8d6aef86d020c9edfae29ca3d junk.5
ae1028b8d6aef86d020c9edfae29ca3d junk.6
ae1028b8d6aef86d020c9edfae29ca3d junk.7
ae1028b8d6aef86d020c9edfae29ca3d junk.8
ae1028b8d6aef86d020c9edfae29ca3d junk.9
execute sync and recalculate md5sums
save exit: isCheckpointed 1
ae1028b8d6aef86d020c9edfae29ca3d junk.1
ae1028b8d6aef86d020c9edfae29ca3d junk.2
ae1028b8d6aef86d020c9edfae29ca3d junk.3
ae1028b8d6aef86d020c9edfae29ca3d junk.4
ae1028b8d6aef86d020c9edfae29ca3d junk.5
ae1028b8d6aef86d020c9edfae29ca3d junk.6
ae1028b8d6aef86d020c9edfae29ca3d junk.7
ae1028b8d6aef86d020c9edfae29ca3d junk.8
ae1028b8d6aef86d020c9edfae29ca3d junk.9
Remove some files and recreate them
Calculate md5sums for 30M files again
f6dba6d5af7a7a89481da1849035a417 somefile.1
5b04790304a4221f1016a8c310da4746 somefile.3
5b04790304a4221f1016a8c310da4746 somefile.4
1fee3f481bfa5cf3403efe9e481a0374 somefile.7
execute sync and recalculate md5sums
save exit: isCheckpointed 1
a7b6ccfa31115aa75a0fdca07073293d somefile.1
5b04790304a4221f1016a8c310da4746 somefile.3
1abb3d578e2d129341df26916090b869 somefile.4
f6dba6d5af7a7a89481da1849035a417 somefile.7
OMAP-35x#
In the output, note that the md5sum of "somefile.*" should all match.
Anyone seen anything like this before? Test attached.