McKay,All Any new update on this issue? Thanks. I just came across similar issue in which readdir(..) can't return NULL...causing endless loop... Regards, Yang 2008/8/21 Andrew McKay > I have now tested the latest version of YAFFS2 from the CVS repository and > am > still getting the same bug with the file system in linux 2.6.20.4. I have > tested other filesystems, ext2, and some network shares, and I do not have > any > issues with the number of files in a directory. This is exclusive to my > YAFFS2 > mount point. I have managed to "fix" the problem, but I'm pretty sure it's > not > the appropriate solution. Here's some more details of my test and results. > > > I'm having some issues with YAFFS and directories with quite a few files > in them > > (110+ files). When I do an ls in the directory the system locks up and > > eventually ls dies with an out of memory error. > > I'm testing the file system with the following script: > > #!/bin/sh > > getfiles(){ > FILES=`ls | wc -l` > echo "FILES=[$FILES]" > } > > generate_file(){ > dd if=/dev/zero of=file$1.txt bs=128 count=1 > /dev/null 2>&1 > } > > NUM=100000 > echo working in $1 > cd $1 > while true > do > FILENUM=`echo $NUM | cut -c 2-` > echo "--- Generating file $FILENUM ---" > generate_file "$FILENUM" > echo "--- Running ls ---" > getfiles > NUM=`expr $NUM + 1` > echo " " > echo " " > done > > I checked out the latest version of yaffs2 and patched it into my kernel > and ran > the code with the same results. Here's a trimmed up version of the log > from > this script. > > > # sh filelimit_test.sh /mnt/nand/test/tempdir > working in /mnt/nand/test/tempdir > --- Generating file 00000 --- > --- Running ls --- > FILES=[ 1] > > > --- Generating file 00001 --- > --- Running ls --- > FILES=[ 2] > > > --- Generating file 00002 --- > --- Running ls --- > FILES=[ 3] > > > --- Generating file 00003 --- > --- Running ls --- > FILES=[ 4] > > > --- Generating file 00004 --- > --- Running ls --- > FILES=[ 5] > > > --- Generating file 00005 --- > --- Running ls --- > FILES=[ 6] > > > --- Generating file 00006 --- > --- Running ls --- > FILES=[ 7] > > > --- Generating file 00007 --- > --- Running ls --- > FILES=[ 8] > > > --- Generating file 00008 --- > --- Running ls --- > FILES=[ 9] > > > --- Generating file 00009 --- > --- Running ls --- > FILES=[ 10] > > . > . > . > > --- Generating file 00123 --- > --- Running ls --- > FILES=[ 124] > > > --- Generating file 00124 --- > --- Running ls --- > FILES=[ 125] > > > --- Generating file 00125 --- > --- Running ls --- > FILES=[ 126] > > > --- Generating file 00126 --- > --- Running ls --- > FILES=[ 253] > > > --- Generating file 00127 --- > --- Running ls --- > FILES=[ 254] > > > --- Generating file 00128 --- > --- Running ls --- > syslogd invoked oom-killer: gfp_mask=0x201d2, order=0, oomkilladj=0 > Mem-info: > DMA per-cpu: > CPU 0: Hot: hi: 0, btch: 1 usd: 0 Cold: hi: 0, btch: 1 > usd: 0 > Active:4922 inactive:962 dirty:0 writeback:0 unstable:0 free:179 slab:791 > mapped:96 pagetables:37 > DMA free:716kB min:716kB low:892kB high:1072kB active:19688kB > inactive:3848kB > present:32064kB pages_scanned:36201 all_unreclaimable? yes > lowmem_reserve[]: 0 0 > DMA: 1*4kB 1*8kB 0*16kB 0*32kB 1*64kB 1*128kB 0*256kB 1*512kB 0*1024kB > 0*2048kB > 0*4096kB = 716kB > Free swap: 0kB > 8192 pages of RAM > 251 free pages > 1052 reserved pages > 791 slab pages > 310 pages shared > 0 pages swap cached > Out of memory: kill process 7455 (ls) score 222 or a child > Killed process 7455 (ls) > klogd invoked oom-killer: gfp_mask=0x201d2, order=0, oomkilladj=0 > Mem-info: > DMA per-cpu: > CPU 0: Hot: hi: 0, btch: 1 usd: 0 Cold: hi: 0, btch: 1 > usd: 0 > Active:4922 inactive:962 dirty:0 writeback:0 unstable:0 free:179 slab:791 > mapped:96 pagetables:37 > DMA free:716kB min:716kB low:892kB high:1072kB active:19688kB > inactive:3848kB > present:32064kB pages_scanned:36201 all_unreclaimable? yes > lowmem_reserve[]: 0 0 > DMA: 1*4kB 1*8kB 0*16kB 0*32kB 1*64kB 1*128kB 0*256kB 1*512kB 0*1024kB > 0*2048kB > 0*4096kB = 716kB > Free swap: 0kB > 8192 pages of RAM > 251 free pages > 1052 reserved pages > 791 slab pages > 311 pages shared > 0 pages swap cached > syslogd invoked oom-killer: gfp_mask=0x201d2, order=0, oomkilladj=0 > Mem-info: > DMA per-cpu: > CPU 0: Hot: hi: 0, btch: 1 usd: 0 Cold: hi: 0, btch: 1 > usd: 0 > Active:4922 inactive:962 dirty:0 writeback:0 unstable:0 free:179 slab:791 > mapped:96 pagetables:37 > DMA free:716kB min:716kB low:892kB high:1072kB active:19688kB > inactive:3848kB > present:32064kB pages_scanned:36201 all_unreclaimable? yes > lowmem_reserve[]: 0 0 > DMA: 1*4kB 1*8kB 0*16kB 0*32kB 1*64kB 1*128kB 0*256kB 1*512kB 0*1024kB > 0*2048kB > 0*4096kB = 716kB > Free swap: 0kB > 8192 pages of RAM > 251 free pages > 1052 reserved pages > 791 slab pages > 311 pages shared > 0 pages swap cached > ls invoked oom-killer: gfp_mask=0x201d2, order=0, oomkilladj=0 > Mem-info: > DMA per-cpu: > CPU 0: Hot: hi: 0, btch: 1 usd: 0 Cold: hi: 0, btch: 1 > usd: 0 > Active:4922 inactive:962 dirty:0 writeback:0 unstable:0 free:179 slab:791 > mapped:96 pagetables:37 > DMA free:716kB min:716kB low:892kB high:1072kB active:19688kB > inactive:3848kB > present:32064kB pages_scanned:36201 all_unreclaimable? yes > lowmem_reserve[]: 0 0 > DMA: 1*4kB 1*8kB 0*16kB 0*32kB 1*64kB 1*128kB 0*256kB 1*512kB 0*1024kB > 0*2048kB > 0*4096kB = 716kB > Free swap: 0kB > 8192 pages of RAM > 251 free pages > 1052 reserved pages > 791 slab pages > 311 pages shared > 0 pages swap cached > syslogd invoked oom-killer: gfp_mask=0x201d2, order=0, oomkilladj=0 > Mem-info: > DMA per-cpu: > CPU 0: Hot: hi: 0, btch: 1 usd: 0 Cold: hi: 0, btch: 1 > usd: 0 > Active:4923 inactive:961 dirty:0 writeback:0 unstable:0 free:178 slab:791 > mapped:97 pagetables:37 > DMA free:712kB min:716kB low:892kB high:1072kB active:19692kB > inactive:3844kB > present:32064kB pages_scanned:36201 all_unreclaimable? yes > lowmem_reserve[]: 0 0 > DMA: 0*4kB 1*8kB 0*16kB 0*32kB 1*64kB 1*128kB 0*256kB 1*512kB 0*1024kB > 0*2048kB > 0*4096kB = 712kB > Free swap: 0kB > 8192 pages of RAM > 250 free pages > 1052 reserved pages > 791 slab pages > 313 pages shared > 0 pages swap cached > klogd invoked oom-killer: gfp_mask=0x201d2, order=0, oomkilladj=0 > Mem-info: > DMA per-cpu: > CPU 0: Hot: hi: 0, btch: 1 usd: 0 Cold: hi: 0, btch: 1 > usd: 0 > Active:4923 inactive:961 dirty:0 writeback:0 unstable:0 free:178 slab:791 > mapped:97 pagetables:37 > DMA free:712kB min:716kB low:892kB high:1072kB active:19692kB > inactive:3844kB > present:32064kB pages_scanned:36201 all_unreclaimable? yes > lowmem_reserve[]: 0 0 > DMA: 0*4kB 1*8kB 0*16kB 0*32kB 1*64kB 1*128kB 0*256kB 1*512kB 0*1024kB > 0*2048kB > 0*4096kB = 712kB > Free swap: 0kB > 8192 pages of RAM > 250 free pages > 1052 reserved pages > 791 slab pages > 313 pages shared > 0 pages swap cached > syslogd invoked oom-killer: gfp_mask=0x201d2, order=0, oomkilladj=0 > Mem-info: > DMA per-cpu: > CPU 0: Hot: hi: 0, btch: 1 usd: 0 Cold: hi: 0, btch: 1 > usd: 0 > Active:4923 inactive:961 dirty:0 writeback:0 unstable:0 free:178 slab:791 > mapped:97 pagetables:37 > DMA free:712kB min:716kB low:892kB high:1072kB active:19692kB > inactive:3844kB > present:32064kB pages_scanned:36201 all_unreclaimable? yes > lowmem_reserve[]: 0 0 > DMA: 0*4kB 1*8kB 0*16kB 0*32kB 1*64kB 1*128kB 0*256kB 1*512kB 0*1024kB > 0*2048kB > 0*4096kB = 712kB > Free swap: 0kB > 8192 pages of RAM > 250 free pages > 1052 reserved pages > 791 slab pages > 313 pages shared > 0 pages swap cached > Killed > FILES=[ 0] > > You'll notice that the file count goes funny for two exections of ls where > it > doubly lists all the files, then it gets stuck in an infinite loop that > eventually crashes ls. > > > It seems the action of rewinding the directory if the file pointer and > inode > > pointer versions differ is not the correct solution. I have added trace > code > > and confirmed that when the following if statement is entered the > directory > > listing starts from the beginning. > > > > if (f->f_version != inode->i_version) { > > offset = 2; > > f->f_pos = offset; > > f->f_version = inode->i_version; > > } > > > > > If I change the previous code to not rewind the directory when f->f_version > is > not equal to inode->i_version: > > if (f->f_version != inode->i_version) { > //offset = 2; > f->f_pos = offset; > f->f_version = inode->i_version; > } > > Then I don't have the problem with ls > > sh filelimit_test.sh /mnt/nand/test/tempdir > working in /mnt/nand/test/tempdir > --- Generating file 00000 --- > --- Running ls --- > FILES=[ 1] > > > --- Generating file 00001 --- > --- Running ls --- > FILES=[ 2] > > > --- Generating file 00002 --- > --- Running ls --- > FILES=[ 3] > > > --- Generating file 00003 --- > --- Running ls --- > FILES=[ 4] > > > --- Generating file 00004 --- > --- Running ls --- > FILES=[ 5] > > > --- Generating file 00005 --- > --- Running ls --- > FILES=[ 6] > > > --- Generating file 00006 --- > --- Running ls --- > FILES=[ 7] > > > --- Generating file 00007 --- > --- Running ls --- > FILES=[ 8] > > > --- Generating file 00008 --- > --- Running ls --- > FILES=[ 9] > > > --- Generating file 00009 --- > --- Running ls --- > FILES=[ 10] > > . > . > . > > --- Generating file 00494 --- > --- Running ls --- > FILES=[ 495] > > > --- Generating file 00495 --- > --- Running ls --- > FILES=[ 496] > > > --- Generating file 00496 --- > --- Running ls --- > FILES=[ 497] > > > --- Generating file 00497 --- > --- Running ls --- > FILES=[ 498] > > > --- Generating file 00498 --- > --- Running ls --- > FILES=[ 499] > > > --- Generating file 00499 --- > --- Running ls --- > FILES=[ 500] > > I'm hoping the added information will help understanding of this problem. > Has > anyone seen anything like this with YAFFS2 and the Linux kernel? I'm going > to > test my change with my other software developers and see if they're going > to > have any issues with the fix I did. We're using YAFFS2 in an application > where > we get 100+ files in a directory, and it has been having problems. > > Andrew McKay > Iders Inc. > > > > > _______________________________________________ > yaffs mailing list > yaffs@lists.aleph1.co.uk > http://lists.aleph1.co.uk/cgi-bin/mailman/listinfo/yaffs > -- BRs, Yang