projects
/
yaffs2.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
e2f8ff4
)
Improve out of memory handling
author
charles
<charles>
Tue, 10 Nov 2009 23:55:05 +0000
(23:55 +0000)
committer
charles
<charles>
Tue, 10 Nov 2009 23:55:05 +0000
(23:55 +0000)
yaffs_guts.c
patch
|
blob
|
history
diff --git
a/yaffs_guts.c
b/yaffs_guts.c
index fda5f8b311e47b50efafecf619e5d35ac0ff916b..0dc9622a6ec34ce013742cda6555a242160a7b6a 100644
(file)
--- a/
yaffs_guts.c
+++ b/
yaffs_guts.c
@@
-12,7
+12,7
@@
*/
const char *yaffs_guts_c_version =
*/
const char *yaffs_guts_c_version =
- "$Id: yaffs_guts.c,v 1.9
3 2009-11-07 02:06:58
charles Exp $";
+ "$Id: yaffs_guts.c,v 1.9
4 2009-11-10 23:55:05
charles Exp $";
#include "yportenv.h"
#include "yportenv.h"
@@
-1323,7
+1323,7
@@
static void yaffs_InitialiseTnodes(yaffs_Device *dev)
}
}
-void yaffs_
Put
Level0Tnode(yaffs_Device *dev, yaffs_Tnode *tn, unsigned pos,
+void yaffs_
Load
Level0Tnode(yaffs_Device *dev, yaffs_Tnode *tn, unsigned pos,
unsigned val)
{
__u32 *map = (__u32 *)tn;
unsigned val)
{
__u32 *map = (__u32 *)tn;
@@
-1481,13
+1481,13
@@
static yaffs_Tnode *yaffs_AddOrFindLevel0Tnode(yaffs_Device *dev,
if (tn) {
tn->internal[0] = fStruct->top;
fStruct->top = tn;
if (tn) {
tn->internal[0] = fStruct->top;
fStruct->top = tn;
+ fStruct->topLevel++;
} else {
T(YAFFS_TRACE_ERROR,
} else {
T(YAFFS_TRACE_ERROR,
- (TSTR("yaffs: no more tnodes" TENDSTR)));
+ (TSTR("yaffs: no more tnodes" TENDSTR)));
+ return NULL;
}
}
}
}
-
- fStruct->topLevel = requiredTallness;
}
/* Traverse down to level 0, adding anything we need */
}
/* Traverse down to level 0, adding anything we need */
@@
-1506,6
+1506,8
@@
static yaffs_Tnode *yaffs_AddOrFindLevel0Tnode(yaffs_Device *dev,
if ((l > 1) && !tn->internal[x]) {
/* Add missing non-level-zero tnode */
tn->internal[x] = yaffs_GetTnode(dev);
if ((l > 1) && !tn->internal[x]) {
/* Add missing non-level-zero tnode */
tn->internal[x] = yaffs_GetTnode(dev);
+ if(!tn->internal[x])
+ return NULL;
} else if (l == 1) {
/* Looking from level 1 at level 0 */
} else if (l == 1) {
/* Looking from level 1 at level 0 */
@@
-1518,6
+1520,8
@@
static yaffs_Tnode *yaffs_AddOrFindLevel0Tnode(yaffs_Device *dev,
} else if (!tn->internal[x]) {
/* Don't have one, none passed in */
tn->internal[x] = yaffs_GetTnode(dev);
} else if (!tn->internal[x]) {
/* Don't have one, none passed in */
tn->internal[x] = yaffs_GetTnode(dev);
+ if(!tn->internal[x])
+ return NULL;
}
}
}
}
@@
-1641,7
+1645,7
@@
static int yaffs_DeleteWorker(yaffs_Object *in, yaffs_Tnode *tn, __u32 level,
}
}
- yaffs_
Put
Level0Tnode(dev, tn, i, 0);
+ yaffs_
Load
Level0Tnode(dev, tn, i, 0);
}
}
}
}
@@
-1718,7
+1722,7
@@
static int yaffs_SoftDeleteWorker(yaffs_Object *in, yaffs_Tnode *tn,
* a block.
*/
yaffs_SoftDeleteChunk(dev, theChunk);
* a block.
*/
yaffs_SoftDeleteChunk(dev, theChunk);
- yaffs_
Put
Level0Tnode(dev, tn, i, 0);
+ yaffs_
Load
Level0Tnode(dev, tn, i, 0);
}
}
}
}
@@
-2169,18
+2173,20
@@
yaffs_Object *yaffs_CreateNewObject(yaffs_Device *dev, int number,
if (number < 0)
number = yaffs_CreateNewObjectNumber(dev);
if (number < 0)
number = yaffs_CreateNewObjectNumber(dev);
- theObject = yaffs_AllocateEmptyObject(dev);
- if (!theObject)
- return NULL;
-
if (type == YAFFS_OBJECT_TYPE_FILE) {
tn = yaffs_GetTnode(dev);
if (type == YAFFS_OBJECT_TYPE_FILE) {
tn = yaffs_GetTnode(dev);
- if (!tn) {
- yaffs_FreeObject(theObject);
+ if (!tn)
return NULL;
return NULL;
- }
}
}
+ theObject = yaffs_AllocateEmptyObject(dev);
+ if (!theObject){
+ if(tn)
+ yaffs_FreeTnode(dev,tn);
+ return NULL;
+ }
+
+
if (theObject) {
theObject->fake = 0;
theObject->renameAllowed = 1;
if (theObject) {
theObject->fake = 0;
theObject->renameAllowed = 1;
@@
-2282,11
+2288,6
@@
static yaffs_Object *yaffs_MknodObject(yaffs_ObjectType type,
if (yaffs_FindObjectByName(parent, name))
return NULL;
if (yaffs_FindObjectByName(parent, name))
return NULL;
- in = yaffs_CreateNewObject(dev, -1, type);
-
- if (!in)
- return YAFFS_FAIL;
-
if (type == YAFFS_OBJECT_TYPE_SYMLINK) {
str = yaffs_CloneString(aliasString);
if (!str) {
if (type == YAFFS_OBJECT_TYPE_SYMLINK) {
str = yaffs_CloneString(aliasString);
if (!str) {
@@
-2295,6
+2296,15
@@
static yaffs_Object *yaffs_MknodObject(yaffs_ObjectType type,
}
}
}
}
+ in = yaffs_CreateNewObject(dev, -1, type);
+
+ if (!in){
+ if(str)
+ YFREE(str);
+ return NULL;
+ }
+
+
if (in) {
if (in) {
@@
-3353,7
+3363,7
@@
static int yaffs_FindAndDeleteChunkInFile(yaffs_Object *in, int chunkInInode,
/* Delete the entry in the filestructure (if found) */
if (retVal != -1)
/* Delete the entry in the filestructure (if found) */
if (retVal != -1)
- yaffs_
Put
Level0Tnode(dev, tn, chunkInInode, 0);
+ yaffs_
Load
Level0Tnode(dev, tn, chunkInInode, 0);
}
return retVal;
}
return retVal;
@@
-3423,6
+3433,8
@@
static int yaffs_PutChunkIntoFile(yaffs_Object *in, int chunkInInode,
/* NB inScan is zero unless scanning.
* For forward scanning, inScan is > 0;
* for backward scanning inScan is < 0
/* NB inScan is zero unless scanning.
* For forward scanning, inScan is > 0;
* for backward scanning inScan is < 0
+ *
+ * chunkInNAND = 0 is a dummy insert to make sure the tnodes are there.
*/
yaffs_Tnode *tn;
*/
yaffs_Tnode *tn;
@@
-3454,6
+3466,11
@@
static int yaffs_PutChunkIntoFile(yaffs_Object *in, int chunkInInode,
NULL);
if (!tn)
return YAFFS_FAIL;
NULL);
if (!tn)
return YAFFS_FAIL;
+
+ if(!chunkInNAND)
+ /* Dummy insert, bail now */
+ return YAFFS_OK;
+
existingChunk = yaffs_GetChunkGroupBase(dev, tn, chunkInInode);
existingChunk = yaffs_GetChunkGroupBase(dev, tn, chunkInInode);
@@
-3535,7
+3552,7
@@
static int yaffs_PutChunkIntoFile(yaffs_Object *in, int chunkInInode,
if (existingChunk == 0)
in->nDataChunks++;
if (existingChunk == 0)
in->nDataChunks++;
- yaffs_
Put
Level0Tnode(dev, tn, chunkInInode, chunkInNAND);
+ yaffs_
Load
Level0Tnode(dev, tn, chunkInInode, chunkInNAND);
return YAFFS_OK;
}
return YAFFS_OK;
}
@@
-3657,12
+3674,20
@@
static int yaffs_WriteChunkDataToObject(yaffs_Object *in, int chunkInInode,
(TSTR("Writing %d bytes to chunk!!!!!!!!!" TENDSTR), nBytes));
YBUG();
}
(TSTR("Writing %d bytes to chunk!!!!!!!!!" TENDSTR), nBytes));
YBUG();
}
-
+
+ /*
+ * If there isn't already a chunk there then do a dummy
+ * insert to make sue we have the desired tnode structure.
+ */
+ if(prevChunkId < 1 &&
+ yaffs_PutChunkIntoFile(in, chunkInInode, 0, 0) != YAFFS_OK)
+ return -1;
+
newChunkId =
yaffs_WriteNewChunkWithTagsToNAND(dev, buffer, &newTags,
useReserve);
newChunkId =
yaffs_WriteNewChunkWithTagsToNAND(dev, buffer, &newTags,
useReserve);
- if (newChunkId >
=
0) {
+ if (newChunkId > 0) {
yaffs_PutChunkIntoFile(in, chunkInInode, newChunkId, 0);
if (prevChunkId > 0)
yaffs_PutChunkIntoFile(in, chunkInInode, newChunkId, 0);
if (prevChunkId > 0)