Mancho, Can you package this up raise a ticket on Trac for OpenWrt and attach the fix so that Florian can apply it. David On Wednesday 06 June 2007, Giampaolo Mancini wrote: > Hi Ian, > it works! Now i can edit/modify the files without any problem. > > Do you still need some debugging on this? > > Many thaks! > > Bests, > mancho. > > Ian McDonnell wrote: > > Giampaolo, > > > > On Wednesday 06 June 2007 07:14, Giampaolo Mancini wrote: > >>> There are some patches > >>> committed by David on the openwrt svn but apparently there > >>> are still a few problems. I now have backward > >>> compatibility, since I can read the old nand/yaffs data but > >>> I am unable to update any data after a first write to the > >>> device. > >> > >> I'm also having the very same behavior on a RB153 with OpenWRT > >> trunk's YAFFS: i can't modify any file on the YAFFS filesystem > >> but moving the file to /tmp, editing there and then moving > >> back to YAFFS filesystem does the job. > > > > Try applying this patch to yaffs_mtdif1.c. There is a problem > > when compiled with the CONFIG_YAFFS_9BYTE_TAGS option -- > > the line that sets 'shouldbeFF' to all ones, clobbers the > > deleted status byte in pt1. This is surely going to mess-up file > > updates. > > > > This patch includes some other tweaks for (missing) stats and > > message formating that are in my working version which I diff'ed > > with http://users.actrix.co.nz/manningc/yaffs2-ian-20070523.tgz > > to generate the patch. It's the change for 'chunkDeleted' that > > you need. > > > > -Ian > > > > --- yaffs_mtdif1.c-20070523 2007-05-17 11:52:39.000000000 -0400 > > +++ yaffs_mtdif1.c 2007-06-06 12:45:03.000000000 -0400 > > @@ -102,6 +102,8 @@ > > compile_time_assertion(sizeof(yaffs_PackedTags1) == 12); > > compile_time_assertion(sizeof(yaffs_Tags) == 8); > > > > + dev->nPageWrites++; > > + > > yaffs_PackTags1(&pt1, etags); > > yaffs_CalcTagsECC((yaffs_Tags *)&pt1); > > > > @@ -178,6 +180,8 @@ > > int retval; > > int deleted; > > > > + dev->nPageReads++; > > + > > memset(&ops, 0, sizeof(ops)); > > ops.mode = MTD_OOB_AUTO; > > ops.len = (data) ? chunkBytes : 0; > > @@ -237,7 +241,7 @@ > > deleted = !pt1.deleted; > > pt1.deleted = 1; > > #else > > - (void) deleted; /* not used */ > > + deleted = (yaffs_CountBits(((__u8 *)&pt1)[8]) < 7); > > #endif > > > > /* Check the packed tags mini-ECC and correct if necessary/possible. > > @@ -250,7 +254,8 @@ > > case 1: > > /* recovered tags-ECC error */ > > dev->tagsEccFixed++; > > - eccres = YAFFS_ECC_RESULT_FIXED; > > + if (eccres == YAFFS_ECC_RESULT_NO_ERROR) > > + eccres = YAFFS_ECC_RESULT_FIXED; > > break; > > default: > > /* unrecovered tags-ECC error */ > > @@ -265,13 +270,8 @@ > > yaffs_UnpackTags1(etags, &pt1); > > etags->eccResult = eccres; > > > > - /* Set deleted state. > > - */ > > -#ifndef CONFIG_YAFFS_9BYTE_TAGS > > + /* Set deleted state */ > > etags->chunkDeleted = deleted; > > -#else > > - etags->chunkDeleted = (yaffs_CountBits(((__u8 *)&pt1)[8]) < 7); > > -#endif > > return YAFFS_OK; > > } > > > > @@ -306,7 +306,7 @@ > > > > if (oobavail < YTAG1_SIZE) { > > yaffs_trace(YAFFS_TRACE_ERROR, > > - "mtd device has only %d bytes for tags, need %d", > > + "mtd device has only %d bytes for tags, need %d\n", > > oobavail, YTAG1_SIZE); > > return YAFFS_FAIL; > > }