X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=yaffs_guts.c;h=340c7366cee299d2a97d062a404d782a2266c263;hp=a3fce2cddf2dad153058a3ef9c1c4eb24dc0058d;hb=f216bcabdaf791aa93ad2e58c1d747d2d8bd6617;hpb=363520161b021b7ac870c269064606e3f16feeeb diff --git a/yaffs_guts.c b/yaffs_guts.c index a3fce2c..340c736 100644 --- a/yaffs_guts.c +++ b/yaffs_guts.c @@ -13,7 +13,7 @@ */ //yaffs_guts.c -const char *yaffs_guts_c_version="$Id: yaffs_guts.c,v 1.1 2004-11-03 08:14:07 charles Exp $"; +const char *yaffs_guts_c_version="$Id: yaffs_guts.c,v 1.3 2004-11-22 03:22:25 charles Exp $"; #include "yportenv.h" @@ -201,7 +201,7 @@ int yaffs_EraseBlockInNAND(struct yaffs_DeviceStruct *dev,int blockInNAND) return result; } -int yaffs_InitialiseNAND(struct yaffs_DeviceStruct *dev) +static int yaffs_InitialiseNAND(struct yaffs_DeviceStruct *dev) { return dev->initialiseNAND(dev); } @@ -1194,7 +1194,7 @@ static void yaffs_SoftDeleteChunk(yaffs_Device *dev, int chunk) yaffs_BlockInfo *theBlock; - T(YAFFS_TRACE_DELETE,(TSTR("soft delete chunk %d" TENDSTR),chunk)); + T(YAFFS_TRACE_DELETION,(TSTR("soft delete chunk %d" TENDSTR),chunk)); theBlock = yaffs_GetBlockInfo(dev, chunk/dev->nChunksPerBlock); if(theBlock) @@ -1529,6 +1529,16 @@ static void yaffs_FreeObject(yaffs_Object *tn) yaffs_Device *dev = tn->myDev; +#ifdef __KERNEL__ + if(tn->myInode) + { + // We're still hooked up to a cached inode. + // Don't delete now, but mark for later deletion + tn->deferedFree = 1; + return; + } +#endif + yaffs_UnhashObject(tn); // Link into the free list. @@ -1539,6 +1549,19 @@ static void yaffs_FreeObject(yaffs_Object *tn) +#ifdef __KERNEL__ + +void yaffs_HandleDeferedFree(yaffs_Object *obj) +{ + if(obj->deferedFree) + { + yaffs_FreeObject(obj); + } +} + +#endif + + static void yaffs_DeinitialiseObjects(yaffs_Device *dev) { @@ -1723,11 +1746,7 @@ yaffs_Object *yaffs_CreateNewObject(yaffs_Device *dev,int number,yaffs_ObjectTyp #else -#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 + theObject->st_atime = theObject->st_mtime = theObject->st_ctime = Y_CURRENT_TIME; #endif switch(type) { @@ -1831,11 +1850,8 @@ yaffs_Object *yaffs_MknodObject( yaffs_ObjectType type, in->win_ctime[1] = in->win_mtime[1] = in->win_atime[1]; #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_atime = in->st_mtime = in->st_ctime = Y_CURRENT_TIME; + in->st_rdev = rdev; in->st_uid = uid; in->st_gid = gid; @@ -1974,7 +1990,7 @@ int yaffs_RenameObject(yaffs_Object *oldDir, const YCHAR *oldName, yaffs_Object int force = 0; #ifdef CONFIG_YAFFS_CASE_INSENSITIVE - // Special case for WinCE. + // Special case for case insemsitive systems (eg. WinCE). // While look-up is case insensitive, the name isn't. // THerefore we might want to change x.txt to X.txt if(oldDir == newDir && yaffs_strcmp(oldName,newName) == 0) @@ -2719,7 +2735,7 @@ int yaffs_CheckGarbageCollection(yaffs_Device *dev) { int block; int aggressive; - int gcOk; + int gcOk = YAFFS_OK; int maxTries = 0; //yaffs_DoUnlinkedFileDeletion(dev); @@ -4168,11 +4184,9 @@ 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 + + in->st_mtime = Y_CURRENT_TIME; + #endif } @@ -4510,6 +4524,8 @@ static int yaffs_Scan(yaffs_Device *dev) __u8 *chunkData; yaffs_BlockIndex *blockIndex = NULL; + + T(YAFFS_TRACE_SCAN,(TSTR("yaffs_Scan starts..." TENDSTR))); chunkData = yaffs_GetTempBuffer(dev,__LINE__); @@ -4933,6 +4949,9 @@ static int yaffs_Scan(yaffs_Device *dev) } yaffs_ReleaseTempBuffer(dev,chunkData,__LINE__); + + T(YAFFS_TRACE_SCAN,(TSTR("yaffs_Scan ends" TENDSTR))); + return YAFFS_OK; } @@ -5183,15 +5202,9 @@ 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_ATIME) obj->st_atime = Y_TIME_CONVERT(attr->ia_atime); + if(valid & ATTR_CTIME) obj->st_ctime = Y_TIME_CONVERT(attr->ia_ctime); + if(valid & ATTR_MTIME) obj->st_mtime = Y_TIME_CONVERT(attr->ia_mtime); if(valid & ATTR_SIZE) yaffs_ResizeFile(obj,attr->ia_size); @@ -5208,15 +5221,10 @@ 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 + Y_TIME_CONVERT(attr->ia_atime)= obj->st_atime; valid |= ATTR_ATIME; + Y_TIME_CONVERT(attr->ia_ctime) = obj->st_ctime; valid |= ATTR_CTIME; + Y_TIME_CONVERT(attr->ia_mtime) = obj->st_mtime; valid |= ATTR_MTIME; + attr->ia_size = yaffs_GetFileSize(obj); valid |= ATTR_SIZE; attr->ia_valid = valid; @@ -5279,6 +5287,8 @@ int yaffs_CheckDevFunctions(const yaffs_Device *dev) if(!dev->eraseBlockInNAND || !dev->initialiseNAND) return 0; +#ifdef CONFIG_YAFFS_YAFFS2 + // Can use the "with tags" style interface for yaffs1 or yaffs2 if(dev->writeChunkWithTagsToNAND && dev->readChunkWithTagsFromNAND && @@ -5286,6 +5296,7 @@ int yaffs_CheckDevFunctions(const yaffs_Device *dev) !dev->readChunkFromNAND && dev->markNANDBlockBad && dev->queryNANDBlock) return 1; +#endif // Can use the "spare" style interface for yaffs1 if(!dev->isYaffs2 && @@ -5307,11 +5318,12 @@ int yaffs_GutsInitialise(yaffs_Device *dev) int extraBits; int nBlocks; + T(YAFFS_TRACE_ALWAYS,(TSTR("yaffs: yaffs_GutsInitialise()" TENDSTR))); // Check stuff that must be set if(!dev) { - T(YAFFS_TRACE_ALWAYS,(TSTR("yaffs: Need a device\n" TENDSTR))); + T(YAFFS_TRACE_ALWAYS,(TSTR("yaffs: Need a device" TENDSTR))); return YAFFS_FAIL; } @@ -5326,10 +5338,16 @@ int yaffs_GutsInitialise(yaffs_Device *dev) dev->endBlock <= (dev->startBlock + dev->nReservedBlocks + 2) // otherwise it is too small ) { - T(YAFFS_TRACE_ALWAYS,(TSTR("yaffs: nand geometry problems\n" TENDSTR))); + T(YAFFS_TRACE_ALWAYS,(TSTR("yaffs: NAND geometry problems: chunk size %d, type is yaffs%s " TENDSTR), + dev->nBytesPerChunk, dev->isYaffs2 ? "2" : "")); return YAFFS_FAIL; } + if(yaffs_InitialiseNAND(dev) != YAFFS_OK) + { + T(YAFFS_TRACE_ALWAYS,(TSTR("yaffs: InitialiseNAND failed" TENDSTR))); + return YAFFS_FAIL; + } // Got the right mix of functions? // @@ -5436,7 +5454,6 @@ int yaffs_GutsInitialise(yaffs_Device *dev) - yaffs_InitialiseBlocks(dev,nBlocks); yaffs_InitialiseTnodes(dev); @@ -5496,7 +5513,7 @@ int yaffs_GutsInitialise(yaffs_Device *dev) dev->nRetiredBlocks = 0; - + T(YAFFS_TRACE_ALWAYS,(TSTR("yaffs: yaffs_GutsInitialise() done.\n" TENDSTR))); return YAFFS_OK; }