X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs%2F.git;a=blobdiff_plain;f=yaffs_guts.c;h=0ace425f92f3d055bf5ad7ced90354057f344676;hp=bcd3da1082675e008e918e5491a3af772d77af64;hb=8f88750ecfa15e4ddb80fcc6080a0c104fd27bd9;hpb=8cc260c1954603f2efcd13bca480eed8bd47a7e2 diff --git a/yaffs_guts.c b/yaffs_guts.c index bcd3da1..0ace425 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.34 2004-06-08 08:47:55 charles Exp $"; +const char *yaffs_guts_c_version="$Id: yaffs_guts.c,v 1.39 2005-01-24 22:26:45 charles Exp $"; #include "yportenv.h" @@ -1444,6 +1444,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. @@ -1453,6 +1463,18 @@ 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) @@ -1601,6 +1623,11 @@ yaffs_Object *yaffs_FindObjectByNumber(yaffs_Device *dev,__u32 number) in = list_entry(i, yaffs_Object,hashLink); if(in->objectId == number) { +#ifdef __KERNEL__ + // Don't tell the VFS about this if it has been marked for freeing + if(in->deferedFree) + return NULL; +#endif return in; } } @@ -1638,11 +1665,8 @@ 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) { @@ -1746,11 +1770,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; @@ -3120,7 +3141,7 @@ static void yaffs_FlushFilesChunkCache(yaffs_Object *obj) int lowest; int i; yaffs_ChunkCache *cache; - int chunkWritten; + int chunkWritten = 0; int nBytes; int nCaches = obj->myDev->nShortOpCaches; @@ -3725,11 +3746,7 @@ 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 } @@ -3753,12 +3770,15 @@ static int yaffs_DoGenericObjectDeletion(yaffs_Object *in) yaffs_RemoveObjectFromDirectory(in); yaffs_DeleteChunk(in->myDev,in->chunkId,1); + in->chunkId = -1; +#if 0 #ifdef __KERNEL__ if(in->myInode) { in->myInode->u.generic_ip = NULL; - in->myInode = 0; + in->myInode = NULL; } +#endif #endif yaffs_FreeObject(in); return YAFFS_OK; @@ -3796,6 +3816,8 @@ static int yaffs_UnlinkFile(yaffs_Object *in) #ifdef __KERNEL__ if(!in->myInode) { + // Might be open at present, + // Caught by delete_inode in yaffs_fs.c immediateDeletion = 1; } @@ -4583,15 +4605,10 @@ 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); @@ -4600,6 +4617,7 @@ int yaffs_SetAttributes(yaffs_Object *obj, struct iattr *attr) return YAFFS_OK; } + int yaffs_GetAttributes(yaffs_Object *obj, struct iattr *attr) { unsigned int valid = 0; @@ -4608,15 +4626,11 @@ 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; @@ -4847,6 +4861,7 @@ void yaffs_Deinitialise(yaffs_Device *dev) if(dev->nShortOpCaches > 0) YFREE(dev->srCache); YFREE(dev->localBuffer); + dev->isMounted = 0; } } @@ -4999,3 +5014,6 @@ void yaffs_GutsTest(yaffs_Device *dev) + + +