X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;f=yaffs_guts.c;h=5218aeab3391faef20b9d85dbbf0800f29e0332f;hb=1ac8445c7e2f516db4a03a9d0715199279f9f134;hp=133dd15cc1fb51f3a3e6cd6fa4ff87f48a22ae26;hpb=a03d8e2c95ff61dd751f629bd7b2f2533fa955e8;p=yaffs%2F.git diff --git a/yaffs_guts.c b/yaffs_guts.c index 133dd15..5218aea 100644 --- a/yaffs_guts.c +++ b/yaffs_guts.c @@ -14,7 +14,7 @@ */ //yaffs_guts.c -const char *yaffs_guts_c_version="$Id: yaffs_guts.c,v 1.26 2003-05-20 23:20:53 charles Exp $"; +const char *yaffs_guts_c_version="$Id: yaffs_guts.c,v 1.30 2003-09-16 06:48:38 charles Exp $"; #include "yportenv.h" @@ -782,11 +782,16 @@ static void yaffs_FreeTnode(yaffs_Device*dev, yaffs_Tnode *tn) static void yaffs_DeinitialiseTnodes(yaffs_Device*dev) { // Free the list of allocated tnodes - + yaffs_TnodeList *tmp; + while(dev->allocatedTnodeList) { + tmp = dev->allocatedTnodeList->next; + YFREE(dev->allocatedTnodeList->tnodes); - dev->allocatedTnodeList = dev->allocatedTnodeList->next; + YFREE(dev->allocatedTnodeList); + dev->allocatedTnodeList = tmp; + } dev->freeTnodes = NULL; @@ -1151,6 +1156,8 @@ static int yaffs_SoftDeleteWorker(yaffs_Object *in, yaffs_Tnode *tn, __u32 level { if(tn->level0[i]) { + // Note this does not find the real chunk, only the chunk group. + // We make an assumption that a chunk group is niot larger than a block. theChunk = (tn->level0[i] << in->myDev->chunkGroupBits); T(YAFFS_TRACE_SCAN,(TSTR("soft delete tch %d cgb %d chunk %d" TENDSTR), tn->level0[i],in->myDev->chunkGroupBits,theChunk)); @@ -1452,10 +1459,15 @@ static void yaffs_DeinitialiseObjects(yaffs_Device *dev) { // Free the list of allocated Objects + yaffs_ObjectList *tmp; + while( dev->allocatedObjectList) { + tmp = dev->allocatedObjectList->next; YFREE(dev->allocatedObjectList->objects); - dev->allocatedObjectList = dev->allocatedObjectList->next; + YFREE(dev->allocatedObjectList); + + dev->allocatedObjectList = tmp; } dev->freeObjects = NULL; @@ -1625,7 +1637,12 @@ yaffs_Object *yaffs_CreateNewObject(yaffs_Device *dev,int number,yaffs_ObjectTyp theObject->win_ctime[1] = theObject->win_mtime[1] = theObject->win_atime[1]; #else - theObject->st_atime = theObject->st_mtime = theObject->st_ctime = CURRENT_TIME; + +#if defined(CONFIG_KERNEL_2_5) + theObject->st_atime = theObject->st_mtime = theObject->st_ctime = CURRENT_TIME.tv_sec; +#else + theObject->st_atime = theObject->st_mtime = theObject->st_ctime = CURRENT_TIME; +#endif #endif switch(type) { @@ -1728,8 +1745,12 @@ yaffs_Object *yaffs_MknodObject( yaffs_ObjectType type, in->win_ctime[0] = in->win_mtime[0] = in->win_atime[0]; in->win_ctime[1] = in->win_mtime[1] = in->win_atime[0]; +#else +#if defined(CONFIG_KERNEL_2_5) + in->st_atime = in->st_mtime = in->st_ctime = CURRENT_TIME.tv_sec; #else in->st_atime = in->st_mtime = in->st_ctime = CURRENT_TIME; +#endif in->st_rdev = rdev; in->st_uid = uid; in->st_gid = gid; @@ -2844,7 +2865,14 @@ static void yaffs_DeleteChunk(yaffs_Device *dev,int chunkId,int markNAND) if(markNAND) { yaffs_SpareInitialise(&spare); - + +#ifdef CONFIG_MTD_NAND_VERIFY_WRITE + + //read data before write, to ensure correct ecc + //if we're using MTD verification under Linux + yaffs_ReadChunkFromNAND(dev,chunkId,NULL,&spare,0); +#endif + spare.pageStatus = 0; // To mark it as deleted. @@ -3692,8 +3720,12 @@ int yaffs_FlushFile(yaffs_Object *in, int updateTime) { #ifdef CONFIG_YAFFS_WINCE yfsd_WinFileTimeNow(in->win_mtime); +#else +#if defined(CONFIG_KERNEL_2_5) + in->st_mtime = CURRENT_TIME.tv_sec; #else in->st_mtime = CURRENT_TIME; +#endif #endif } @@ -4546,9 +4578,15 @@ int yaffs_SetAttributes(yaffs_Object *obj, struct iattr *attr) if(valid & ATTR_UID) obj->st_uid = attr->ia_uid; if(valid & ATTR_GID) obj->st_gid = attr->ia_gid; +#if defined(CONFIG_KERNEL_2_5) + if(valid & ATTR_ATIME) obj->st_atime = attr->ia_atime.tv_sec; + if(valid & ATTR_CTIME) obj->st_ctime = attr->ia_ctime.tv_sec; + if(valid & ATTR_MTIME) obj->st_mtime = attr->ia_mtime.tv_sec; +#else if(valid & ATTR_ATIME) obj->st_atime = attr->ia_atime; if(valid & ATTR_CTIME) obj->st_ctime = attr->ia_ctime; if(valid & ATTR_MTIME) obj->st_mtime = attr->ia_mtime; +#endif if(valid & ATTR_SIZE) yaffs_ResizeFile(obj,attr->ia_size); @@ -4565,10 +4603,15 @@ int yaffs_GetAttributes(yaffs_Object *obj, struct iattr *attr) attr->ia_uid = obj->st_uid; valid |= ATTR_UID; attr->ia_gid = obj->st_gid; valid |= ATTR_GID; +#if defined(CONFIG_KERNEL_2_5) + attr->ia_atime.tv_sec = obj->st_atime; valid |= ATTR_ATIME; + attr->ia_ctime.tv_sec = obj->st_ctime; valid |= ATTR_CTIME; + attr->ia_mtime.tv_sec = obj->st_mtime; valid |= ATTR_MTIME; +#else attr->ia_atime = obj->st_atime; valid |= ATTR_ATIME; attr->ia_ctime = obj->st_ctime; valid |= ATTR_CTIME; attr->ia_mtime = obj->st_mtime; valid |= ATTR_MTIME; - +#endif attr->ia_size = yaffs_GetFileSize(obj); valid |= ATTR_SIZE; attr->ia_valid = valid; @@ -4632,8 +4675,7 @@ int yaffs_GutsInitialise(yaffs_Device *dev) int extraBits; int nBlocks; - if( dev->nBytesPerChunk != YAFFS_BYTES_PER_CHUNK || - + if( dev->nBytesPerChunk != YAFFS_BYTES_PER_CHUNK || dev->nChunksPerBlock < 2 || dev->nReservedBlocks < 2 || dev->startBlock <= 0 || @@ -4700,7 +4742,18 @@ int yaffs_GutsInitialise(yaffs_Device *dev) { dev->chunkGroupBits = bits - 16; } + dev->chunkGroupSize = 1 << dev->chunkGroupBits; + + if(dev->nChunksPerBlock < dev->chunkGroupSize) + { + // We have a problem because the soft delete won't work if + // the chunk group size > chunks per block. + // This can be remedied by using larger "virtual blocks". + + return YAFFS_FAIL; + } +