projects
/
yaffs2.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (from parent 1:
021066a
)
Change some object verification
author
charles
<charles>
Fri, 16 Jan 2009 02:14:52 +0000
(
02:14
+0000)
committer
charles
<charles>
Fri, 16 Jan 2009 02:14:52 +0000
(
02:14
+0000)
yaffs_guts.c
patch
|
blob
|
history
yaffs_guts.h
patch
|
blob
|
history
diff --git
a/yaffs_guts.c
b/yaffs_guts.c
index 76074cd51d8b689363a17fcb9a944f6d9af5bf0f..f7d44490dcd21523e914fa134a6358215f18014f 100644
(file)
--- a/
yaffs_guts.c
+++ b/
yaffs_guts.c
@@
-13,7
+13,7
@@
const char *yaffs_guts_c_version =
const char *yaffs_guts_c_version =
- "$Id: yaffs_guts.c,v 1.7
2 2009-01-16 00:44:45
charles Exp $";
+ "$Id: yaffs_guts.c,v 1.7
3 2009-01-16 02:14:52
charles Exp $";
#include "yportenv.h"
#include "yportenv.h"
@@
-752,10
+752,15
@@
static void yaffs_VerifyObject(yaffs_Object *obj)
__u32 chunkMax;
__u32 chunkIdOk;
__u32 chunkMax;
__u32 chunkIdOk;
- __u32 chunkIsLive;
+ __u32 chunkInRange;
+ __u32 chunkShouldNotBeDeleted;
+ __u32 chunkValid;
if(!obj)
return;
if(!obj)
return;
+
+ if(obj->beingCreated)
+ return;
dev = obj->myDev;
dev = obj->myDev;
@@
-767,21
+772,24
@@
static void yaffs_VerifyObject(yaffs_Object *obj)
chunkMin = dev->internalStartBlock * dev->nChunksPerBlock;
chunkMax = (dev->internalEndBlock+1) * dev->nChunksPerBlock - 1;
chunkMin = dev->internalStartBlock * dev->nChunksPerBlock;
chunkMax = (dev->internalEndBlock+1) * dev->nChunksPerBlock - 1;
- chunkIdOk = (((unsigned)(obj->hdrChunk)) >= chunkMin && ((unsigned)(obj->hdrChunk)) <= chunkMax);
- chunkIsLive = chunkIdOk &&
+ chunkInRange = (((unsigned)(obj->hdrChunk)) >= chunkMin && ((unsigned)(obj->hdrChunk)) <= chunkMax);
+ chunkIdOk = chunkInRange || obj->hdrChunk == 0;
+ chunkValid = chunkInRange &&
yaffs_CheckChunkBit(dev,
obj->hdrChunk / dev->nChunksPerBlock,
obj->hdrChunk % dev->nChunksPerBlock);
yaffs_CheckChunkBit(dev,
obj->hdrChunk / dev->nChunksPerBlock,
obj->hdrChunk % dev->nChunksPerBlock);
+ chunkShouldNotBeDeleted = chunkInRange && !chunkValid;
+
if(!obj->fake &&
if(!obj->fake &&
- (!chunkIdOk ||
!chunkIsLive
)) {
+ (!chunkIdOk ||
chunkShouldNotBeDeleted
)) {
T(YAFFS_TRACE_VERIFY,
(TSTR("Obj %d has chunkId %d %s %s"TENDSTR),
obj->objectId,obj->hdrChunk,
chunkIdOk ? "" : ",out of range",
T(YAFFS_TRACE_VERIFY,
(TSTR("Obj %d has chunkId %d %s %s"TENDSTR),
obj->objectId,obj->hdrChunk,
chunkIdOk ? "" : ",out of range",
- chunk
IsLive || !chunkIdOk ? "" : ",marked as deleted
"));
+ chunk
ShouldNotBeDeleted ? ",marked as deleted" : "
"));
}
}
- if(chunk
IdOk && chunkIsLive
&&!yaffs_SkipNANDVerification(dev)) {
+ if(chunk
Valid
&&!yaffs_SkipNANDVerification(dev)) {
yaffs_ExtendedTags tags;
yaffs_ObjectHeader *oh;
__u8 *buffer = yaffs_GetTempBuffer(dev,__LINE__);
yaffs_ExtendedTags tags;
yaffs_ObjectHeader *oh;
__u8 *buffer = yaffs_GetTempBuffer(dev,__LINE__);
@@
-1926,6
+1934,8
@@
static yaffs_Object *yaffs_AllocateEmptyObject(yaffs_Device * dev)
/* Now sweeten it up... */
memset(tn, 0, sizeof(yaffs_Object));
/* Now sweeten it up... */
memset(tn, 0, sizeof(yaffs_Object));
+ tn->beingCreated = 1;
+
tn->myDev = dev;
tn->hdrChunk = 0;
tn->variantType = YAFFS_OBJECT_TYPE_UNKNOWN;
tn->myDev = dev;
tn->hdrChunk = 0;
tn->variantType = YAFFS_OBJECT_TYPE_UNKNOWN;
@@
-1947,6
+1957,8
@@
static yaffs_Object *yaffs_AllocateEmptyObject(yaffs_Device * dev)
if (dev->lostNFoundDir) {
yaffs_AddObjectToDirectory(dev->lostNFoundDir, tn);
}
if (dev->lostNFoundDir) {
yaffs_AddObjectToDirectory(dev->lostNFoundDir, tn);
}
+
+ tn->beingCreated = 0;
}
dev->nCheckpointBlocksRequired = 0; /* force recalculation*/
}
dev->nCheckpointBlocksRequired = 0; /* force recalculation*/
diff --git
a/yaffs_guts.h
b/yaffs_guts.h
index 849d9511cb9eaafcc26d035889a56bd5d539daf0..ae92a31017869499fa4f6bb58905a1d1f296c13b 100644
(file)
--- a/
yaffs_guts.h
+++ b/
yaffs_guts.h
@@
-421,6
+421,7
@@
struct yaffs_ObjectStruct {
* still in the inode cache. Free of object is defered.
* until the inode is released.
*/
* still in the inode cache. Free of object is defered.
* until the inode is released.
*/
+ __u8 beingCreated:1; /* This object is still being created so skip some checks. */
__u8 serial; /* serial number of chunk in NAND. Cached here */
/* __u16 sum_prev; */
__u8 serial; /* serial number of chunk in NAND. Cached here */
/* __u16 sum_prev; */