projects
/
yaffs
/
.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Changes for more recent kernels
[yaffs/.git]
/
yaffs_guts.c
diff --git
a/yaffs_guts.c
b/yaffs_guts.c
index 91fb73c598fda9e44ed5052abc06a0ff8de1b38d..87fa7a99d2e3ff82aadce48b6b059d14971db519 100644
(file)
--- a/
yaffs_guts.c
+++ b/
yaffs_guts.c
@@
-14,7
+14,7
@@
*/
//yaffs_guts.c
*/
//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.
40 2005-04-05 03:45:40
charles Exp $";
#include "yportenv.h"
#include "yportenv.h"
@@
-1444,6
+1444,16
@@
static void yaffs_FreeObject(yaffs_Object *tn)
yaffs_Device *dev = tn->myDev;
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.
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)
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)
{
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;
}
}
return in;
}
}
@@
-3114,7
+3141,7
@@
static void yaffs_FlushFilesChunkCache(yaffs_Object *obj)
int lowest;
int i;
yaffs_ChunkCache *cache;
int lowest;
int i;
yaffs_ChunkCache *cache;
- int chunkWritten;
+ int chunkWritten
= 0
;
int nBytes;
int nCaches = obj->myDev->nShortOpCaches;
int nBytes;
int nCaches = obj->myDev->nShortOpCaches;
@@
-3743,12
+3770,15
@@
static int yaffs_DoGenericObjectDeletion(yaffs_Object *in)
yaffs_RemoveObjectFromDirectory(in);
yaffs_DeleteChunk(in->myDev,in->chunkId,1);
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;
#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;
#endif
yaffs_FreeObject(in);
return YAFFS_OK;
@@
-3786,6
+3816,8
@@
static int yaffs_UnlinkFile(yaffs_Object *in)
#ifdef __KERNEL__
if(!in->myInode)
{
#ifdef __KERNEL__
if(!in->myInode)
{
+ // Might be open at present,
+ // Caught by delete_inode in yaffs_fs.c
immediateDeletion = 1;
}
immediateDeletion = 1;
}
@@
-4757,6
+4789,7
@@
int yaffs_GutsInitialise(yaffs_Device *dev)
dev->eccUnfixed=0;
dev->tagsEccFixed=0;
dev->tagsEccUnfixed=0;
dev->eccUnfixed=0;
dev->tagsEccFixed=0;
dev->tagsEccUnfixed=0;
+ dev->nErasedBlocks=0;
dev->localBuffer = YMALLOC(dev->nBytesPerChunk);
dev->localBuffer = YMALLOC(dev->nBytesPerChunk);
@@
-4829,6
+4862,7
@@
void yaffs_Deinitialise(yaffs_Device *dev)
if(dev->nShortOpCaches > 0)
YFREE(dev->srCache);
YFREE(dev->localBuffer);
if(dev->nShortOpCaches > 0)
YFREE(dev->srCache);
YFREE(dev->localBuffer);
+ dev->isMounted = 0;
}
}
}
}