X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs%2F.git;a=blobdiff_plain;f=yaffs_guts.c;h=7c97b314bfd1d2be9d5ce70e42e0324099edc728;hp=91fb73c598fda9e44ed5052abc06a0ff8de1b38d;hb=b91298ceff82f7f47539ec0308c6b310e1d9e755;hpb=829a3f784f8f2fb79898ecb0ccc55c61b3eaef53 diff --git a/yaffs_guts.c b/yaffs_guts.c index 91fb73c..7c97b31 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.36 2004-10-10 17:54:59 charles Exp $"; +const char *yaffs_guts_c_version="$Id: yaffs_guts.c,v 1.37 2004-10-20 20:12:43 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) @@ -3743,12 +3765,14 @@ static int yaffs_DoGenericObjectDeletion(yaffs_Object *in) yaffs_RemoveObjectFromDirectory(in); yaffs_DeleteChunk(in->myDev,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; @@ -3786,6 +3810,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; }