*/
//yaffs_guts.c
-const char *yaffs_guts_c_version="$Id: yaffs_guts.c,v 1.24 2003-04-03 17:58:56 charles Exp $";
+const char *yaffs_guts_c_version="$Id: yaffs_guts.c,v 1.28 2003-08-20 03:53:39 charles Exp $";
#include "yportenv.h"
#include "yaffsinterface.h"
#include "yaffs_guts.h"
-
-
-
#define YAFFS_PASSIVE_GC_CHUNKS 2
+#if 0
+// Use Steven Hill's ECC struff instead
// External functions for ECC on data
void nand_calculate_ecc (const u_char *dat, u_char *ecc_code);
int nand_correct_data (u_char *dat, u_char *read_ecc, u_char *calc_ecc);
-
+#define yaffs_ECCCalculate(data,ecc) nand_calculate_ecc(data,ecc)
+#define yaffs_ECCCorrect(data,read_ecc,calc_ecc) nand_correct_ecc(data,read_ecc,calc_ecc)
+#else
+#include "yaffs_ecc.h"
+#endif
// countBits is a quick way of counting the number of bits in a byte.
// ie. countBits[n] holds the number of 1 bits in a byte with the value n.
int eccResult1,eccResult2;
__u8 calcEcc[3];
- nand_calculate_ecc(data,calcEcc);
- eccResult1 = nand_correct_data (data,spare->ecc1, calcEcc);
- nand_calculate_ecc(&data[256],calcEcc);
- eccResult2 = nand_correct_data (&data[256],spare->ecc2, calcEcc);
+ yaffs_ECCCalculate(data,calcEcc);
+ eccResult1 = yaffs_ECCCorrect (data,spare->ecc1, calcEcc);
+ yaffs_ECCCalculate(&data[256],calcEcc);
+ eccResult2 = yaffs_ECCCorrect(&data[256],spare->ecc2, calcEcc);
if(eccResult1>0)
{
void yaffs_CalcECC(const __u8 *data, yaffs_Spare *spare)
{
- nand_calculate_ecc (data , spare->ecc1);
- nand_calculate_ecc (&data[256] , spare->ecc2);
+ yaffs_ECCCalculate(data , spare->ecc1);
+ yaffs_ECCCalculate(&data[256] , spare->ecc2);
}
void yaffs_CalcTagsECC(yaffs_Tags *tags)
static void yaffs_DeinitialiseTnodes(yaffs_Device*dev)
{
// Free the list of allocated tnodes
-
+ yaffs_TnodeList *tmp;
+
while(dev->allocatedTnodeList)
{
+ tmp = dev->allocatedTnodeList->next;
+
YFREE(dev->allocatedTnodeList->tnodes);
- dev->allocatedTnodeList = dev->allocatedTnodeList->next;
+ YFREE(dev->allocatedTnodeList);
+ dev->allocatedTnodeList = tmp;
+
}
dev->freeTnodes = NULL;
{
// Free the list of allocated Objects
+ yaffs_ObjectList *tmp;
+
while( dev->allocatedObjectList)
{
+ tmp = dev->allocatedObjectList->next;
YFREE(dev->allocatedObjectList->objects);
- dev->allocatedObjectList = dev->allocatedObjectList->next;
+ YFREE(dev->allocatedObjectList);
+
+ dev->allocatedObjectList = tmp;
}
dev->freeObjects = NULL;
theObject->win_ctime[1] = theObject->win_mtime[1] = theObject->win_atime[1];
#else
- theObject->st_atime = theObject->st_mtime = theObject->st_ctime = CURRENT_TIME;
+
+#if defined(CONFIG_KERNEL_2_5)
+ theObject->st_atime = theObject->st_mtime = theObject->st_ctime = CURRENT_TIME.tv_sec;
+#else
+ theObject->st_atime = theObject->st_mtime = theObject->st_ctime = CURRENT_TIME;
+#endif
#endif
switch(type)
{
in->win_ctime[0] = in->win_mtime[0] = in->win_atime[0];
in->win_ctime[1] = in->win_mtime[1] = in->win_atime[0];
+#else
+#if defined(CONFIG_KERNEL_2_5)
+ in->st_atime = in->st_mtime = in->st_ctime = CURRENT_TIME.tv_sec;
#else
in->st_atime = in->st_mtime = in->st_ctime = CURRENT_TIME;
+#endif
in->st_rdev = rdev;
in->st_uid = uid;
in->st_gid = gid;
// using yaffs_DeleteChunk
chunkId = yaffs_FindAndDeleteChunkInFile(in,i,NULL);
- if(chunkId <= 0 || chunkId >= (dev->endBlock * 32))
+ if(chunkId < (dev->startBlock * 32) || chunkId >= ((dev->endBlock+1) * 32))
{
//T(("Found daft chunkId %d for %d\n",chunkId,i));
}
{
#ifdef CONFIG_YAFFS_WINCE
yfsd_WinFileTimeNow(in->win_mtime);
+#else
+#if defined(CONFIG_KERNEL_2_5)
+ in->st_mtime = CURRENT_TIME.tv_sec;
#else
in->st_mtime = CURRENT_TIME;
+#endif
#endif
}
if(valid & ATTR_UID) obj->st_uid = attr->ia_uid;
if(valid & ATTR_GID) obj->st_gid = attr->ia_gid;
+#if defined(CONFIG_KERNEL_2_5)
+ if(valid & ATTR_ATIME) obj->st_atime = attr->ia_atime.tv_sec;
+ if(valid & ATTR_CTIME) obj->st_ctime = attr->ia_ctime.tv_sec;
+ if(valid & ATTR_MTIME) obj->st_mtime = attr->ia_mtime.tv_sec;
+#else
if(valid & ATTR_ATIME) obj->st_atime = attr->ia_atime;
if(valid & ATTR_CTIME) obj->st_ctime = attr->ia_ctime;
if(valid & ATTR_MTIME) obj->st_mtime = attr->ia_mtime;
+#endif
if(valid & ATTR_SIZE) yaffs_ResizeFile(obj,attr->ia_size);
attr->ia_uid = obj->st_uid; valid |= ATTR_UID;
attr->ia_gid = obj->st_gid; valid |= ATTR_GID;
+#if defined(CONFIG_KERNEL_2_5)
+ attr->ia_atime.tv_sec = obj->st_atime; valid |= ATTR_ATIME;
+ attr->ia_ctime.tv_sec = obj->st_ctime; valid |= ATTR_CTIME;
+ attr->ia_mtime.tv_sec = obj->st_mtime; valid |= ATTR_MTIME;
+#else
attr->ia_atime = obj->st_atime; valid |= ATTR_ATIME;
attr->ia_ctime = obj->st_ctime; valid |= ATTR_CTIME;
attr->ia_mtime = obj->st_mtime; valid |= ATTR_MTIME;
-
+#endif
attr->ia_size = yaffs_GetFileSize(obj); valid |= ATTR_SIZE;
attr->ia_valid = valid;
int nFree;
int pending;
int b;
+ int nDirtyCacheChunks=0;
yaffs_BlockInfo *blk;
nFree += pending;
+ // Now count the number of dirty chunks in the cache and subtract those
+
+ {
+ int i;
+ for(i = 0; i < dev->nShortOpCaches; i++)
+ {
+ if(dev->srCache[i].dirty) nDirtyCacheChunks++;
+ }
+ }
+
+ nFree -= nDirtyCacheChunks;
+
+ nFree -= ((dev->nReservedBlocks + 1) * dev->nChunksPerBlock);
+
if(nFree < 0) nFree = 0;
return nFree;