*/
const char *yaffs_guts_c_version =
- "$Id: yaffs_guts.c,v 1.18 2005-08-16 02:28:04 charles Exp $";
+ "$Id: yaffs_guts.c,v 1.22 2005-10-13 02:17:00 charles Exp $";
#include "yportenv.h"
const yaffs_ExtendedTags * tags);
/* Other local prototypes */
+static int yaffs_UnlinkObject( yaffs_Object *obj);
+
static int yaffs_WriteNewChunkWithTagsToNAND(yaffs_Device * dev,
const __u8 * buffer,
yaffs_ExtendedTags * tags,
*/
yaffs_ChangeObjectName(obj, newDir, newName, force,
existingTarget->objectId);
- yaffs_Unlink(newDir, newName);
+ yaffs_UnlinkObject(existingTarget);
}
- return yaffs_ChangeObjectName(obj, newDir, newName, force, 0);
+ return yaffs_ChangeObjectName(obj, newDir, newName, 1, 0);
}
return YAFFS_FAIL;
}
/* Todo we're assuming the malloc will pass. */
dev->blockInfo = YMALLOC(nBlocks * sizeof(yaffs_BlockInfo));
+ if(!dev->blockInfo){
+ dev->blockInfo = YMALLOC_ALT(nBlocks * sizeof(yaffs_BlockInfo));
+ dev->blockInfoAlt = 1;
+ }
+ else
+ dev->blockInfoAlt = 0;
/* Set up dynamic blockinfo stuff. */
dev->chunkBitmapStride = (dev->nChunksPerBlock + 7) / 8;
dev->chunkBits = YMALLOC(dev->chunkBitmapStride * nBlocks);
+ if(!dev->chunkBits){
+ dev->chunkBits = YMALLOC_ALT(dev->chunkBitmapStride * nBlocks);
+ dev->chunkBitsAlt = 1;
+ }
+ else
+ dev->chunkBitsAlt = 0;
+
if (dev->blockInfo && dev->chunkBits) {
memset(dev->blockInfo, 0, nBlocks * sizeof(yaffs_BlockInfo));
memset(dev->chunkBits, 0, dev->chunkBitmapStride * nBlocks);
static void yaffs_DeinitialiseBlocks(yaffs_Device * dev)
{
- YFREE(dev->blockInfo);
+ if(dev->blockInfoAlt)
+ YFREE_ALT(dev->blockInfo);
+ else
+ YFREE(dev->blockInfo);
+ dev->blockInfoAlt = 0;
+
dev->blockInfo = NULL;
- YFREE(dev->chunkBits);
+
+ if(dev->chunkBitsAlt)
+ YFREE_ALT(dev->chunkBits);
+ else
+ YFREE(dev->chunkBits);
+ dev->chunkBitsAlt = 0;
dev->chunkBits = NULL;
}
if (markNAND &&
bi->blockState != YAFFS_BLOCK_STATE_COLLECTING && !dev->isYaffs2) {
-#ifdef CONFIG_MTD_NAND_VERIFY_WRITE
-
- /* Read data before write, to ensure correct ecc
- * if we're using MTD verification under Linux
- */
- yaffs_ReadChunkFromNAND(dev, chunkId, NULL, &spare, 0);
-#endif
-
yaffs_InitialiseTags(&tags);
tags.chunkDeleted = 1;
}
}
-int yaffs_Unlink(yaffs_Object * dir, const YCHAR * name)
-{
- yaffs_Object *obj;
- obj = yaffs_FindObjectByName(dir, name);
+static int yaffs_UnlinkObject( yaffs_Object *obj)
+{
if (obj && obj->unlinkAllowed) {
return yaffs_UnlinkWorker(obj);
return YAFFS_FAIL;
}
+int yaffs_Unlink(yaffs_Object * dir, const YCHAR * name)
+{
+ yaffs_Object *obj;
+
+ obj = yaffs_FindObjectByName(dir, name);
+ return yaffs_UnlinkObject(obj);
+}
/*----------------------- Initialisation Scanning ---------------------- */
/*------------------------------ Directory Functions ----------------------------- */
+static void yaffs_RemoveObjectFromDirectory(yaffs_Object * obj)
+{
+ yaffs_Device *dev = obj->myDev;
+
+ if(dev && dev->removeObjectCallback)
+ dev->removeObjectCallback(obj);
+
+ list_del_init(&obj->siblings);
+ obj->parent = NULL;
+}
+
+
static void yaffs_AddObjectToDirectory(yaffs_Object * directory,
yaffs_Object * obj)
{
} else if (!list_empty(&obj->siblings)) {
/* If it is holed up somewhere else, un hook it */
- list_del_init(&obj->siblings);
+ yaffs_RemoveObjectFromDirectory(obj);
}
/* Now add it */
list_add(&obj->siblings, &directory->variant.directoryVariant.children);
}
}
-static void yaffs_RemoveObjectFromDirectory(yaffs_Object * obj)
-{
- list_del_init(&obj->siblings);
- obj->parent = NULL;
-}
-
yaffs_Object *yaffs_FindObjectByName(yaffs_Object * directory,
const YCHAR * name)
{