changeset 310:a097a8d2aa15

Merge upstream up to Thu Oct 08 02:57:59 2009 +0100
author Ross Younger <wry@ecoscentric.com>
date Tue, 03 Nov 2009 15:33:54 +0000
parents ed45fbf83981 (current diff) b21bd2a64496 (diff)
children 16de60f90faa
files packages/fs/yaffs/current/src/yaffs_checkptrw.c packages/fs/yaffs/current/src/yaffs_guts.c packages/fs/yaffs/current/src/yaffs_guts.h packages/fs/yaffs/current/src/yaffs_nand.c packages/fs/yaffs/current/src/yaffs_tagscompat.c packages/fs/yaffs/current/src/yportenv.h
diffstat 6 files changed, 40 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/packages/fs/yaffs/current/src/yaffs_checkptrw.c
+++ b/packages/fs/yaffs/current/src/yaffs_checkptrw.c
@@ -43,6 +43,9 @@ static int yaffs_CheckpointErase(yaffs_D
 		yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, i);
 		if (bi->blockState == YAFFS_BLOCK_STATE_CHECKPOINT) {
 			T(YAFFS_TRACE_CHECKPOINT, (TSTR("erasing checkpt block %d"TENDSTR), i));
+
+			dev->nBlockErasures++;
+
 			if (dev->eraseBlockInNAND(dev, i - dev->blockOffset /* realign */)) {
 				bi->blockState = YAFFS_BLOCK_STATE_EMPTY;
 				dev->nErasedBlocks++;
@@ -222,6 +225,8 @@ static int yaffs_CheckpointFlushBuffer(y
 
 	realignedChunk = chunk - dev->chunkOffset;
 
+	dev->nPageWrites++;
+
 	dev->writeChunkWithTagsToNAND(dev, realignedChunk,
 			dev->checkpointBuffer, &tags);
 	dev->checkpointByteOffset = 0;
@@ -309,6 +314,8 @@ int yaffs_CheckpointRead(yaffs_Device *d
 					dev->checkpointCurrentChunk;
 
 				realignedChunk = chunk - dev->chunkOffset;
+				
+				dev->nPageReads++;
 
 				/* read in the next chunk */
 				/* printf("read checkpoint page %d\n",dev->checkpointPage); */
--- a/packages/fs/yaffs/current/src/yaffs_guts.c
+++ b/packages/fs/yaffs/current/src/yaffs_guts.c
@@ -1549,11 +1549,16 @@ static int yaffs_FindChunkInGroup(yaffs_
 	for (j = 0; theChunk && j < dev->chunkGroupSize; j++) {
 		if (yaffs_CheckChunkBit(dev, theChunk / dev->nChunksPerBlock,
 				theChunk % dev->nChunksPerBlock)) {
-			yaffs_ReadChunkWithTagsFromNAND(dev, theChunk, NULL,
-							tags);
-			if (yaffs_TagsMatch(tags, objectId, chunkInInode)) {
-				/* found it; */
+			
+			if(dev->chunkGroupSize == 1)
 				return theChunk;
+			else {
+				yaffs_ReadChunkWithTagsFromNAND(dev, theChunk, NULL,
+								tags);
+				if (yaffs_TagsMatch(tags, objectId, chunkInInode)) {
+					/* found it; */
+					return theChunk;
+				}
 			}
 		}
 		theChunk++;
@@ -5067,23 +5072,27 @@ loff_t yaffs_GetFileSize(yaffs_Object *o
 
 
 
-int yaffs_FlushFile(yaffs_Object *in, int updateTime)
+int yaffs_FlushFile(yaffs_Object *in, int updateTime, int dataSync)
 {
 	int retVal;
 	if (in->dirty) {
 		yaffs_FlushFilesChunkCache(in);
-		if (updateTime) {
+		if(dataSync) /* Only sync data */
+			retVal=YAFFS_OK;
+		else {
+			if (updateTime) {
 #ifdef CONFIG_YAFFS_WINCE
-			yfsd_WinFileTimeNow(in->win_mtime);
+				yfsd_WinFileTimeNow(in->win_mtime);
 #else
 
-			in->yst_mtime = Y_CURRENT_TIME;
+				in->yst_mtime = Y_CURRENT_TIME;
 
 #endif
+			}
+
+			retVal = (yaffs_UpdateObjectHeader(in, NULL, 0, 0, 0) >=
+				0) ? YAFFS_OK : YAFFS_FAIL;
 		}
-
-		retVal = (yaffs_UpdateObjectHeader(in, NULL, 0, 0, 0) >=
-			0) ? YAFFS_OK : YAFFS_FAIL;
 	} else {
 		retVal = YAFFS_OK;
 	}
--- a/packages/fs/yaffs/current/src/yaffs_guts.h
+++ b/packages/fs/yaffs/current/src/yaffs_guts.h
@@ -840,7 +840,8 @@ int yaffs_ResizeFile(yaffs_Object *obj, 
 
 yaffs_Object *yaffs_MknodFile(yaffs_Object *parent, const YCHAR *name,
 				__u32 mode, __u32 uid, __u32 gid);
-int yaffs_FlushFile(yaffs_Object *obj, int updateTime);
+
+int yaffs_FlushFile(yaffs_Object *obj, int updateTime, int dataSync);
 
 /* Flushing and checkpointing */
 void yaffs_FlushEntireDeviceCache(yaffs_Device *dev);
--- a/packages/fs/yaffs/current/src/yaffs_nand.c
+++ b/packages/fs/yaffs/current/src/yaffs_nand.c
@@ -62,6 +62,8 @@ int yaffs_ReadChunkWithTagsFromNAND(yaff
 
 	int realignedChunkInNAND = chunkInNAND - dev->chunkOffset;
 
+	dev->nPageReads++;
+
 	/* If there are no tags provided, use local tags to get prioritised gc working */
 	if (!tags)
 		tags = &localTags;
@@ -89,6 +91,9 @@ int yaffs_WriteChunkWithTagsToNAND(yaffs
 						   const __u8 *buffer,
 						   yaffs_ExtendedTags *tags)
 {
+
+	dev->nPageWrites++;
+
 	chunkInNAND -= dev->chunkOffset;
 
 
@@ -122,6 +127,7 @@ int yaffs_MarkBlockBad(yaffs_Device *dev
 {
 	blockNo -= dev->blockOffset;
 
+
 	if (dev->markNANDBlockBad)
 		return dev->markNANDBlockBad(dev, blockNo);
 	else
@@ -151,8 +157,8 @@ int yaffs_EraseBlockInNAND(struct yaffs_
 
 	blockInNAND -= dev->blockOffset;
 
+	dev->nBlockErasures++;
 
-	dev->nBlockErasures++;
 	result = dev->eraseBlockInNAND(dev, blockInNAND);
 
 	return result;
--- a/packages/fs/yaffs/current/src/yaffs_tagscompat.c
+++ b/packages/fs/yaffs/current/src/yaffs_tagscompat.c
@@ -179,7 +179,6 @@ static int yaffs_WriteChunkToNAND(struct
 		return YAFFS_FAIL;
 	}
 
-	dev->nPageWrites++;
 	return dev->writeChunkToNAND(dev, chunkInNAND, data, spare);
 }
 
@@ -193,8 +192,6 @@ static int yaffs_ReadChunkFromNAND(struc
 	int retVal;
 	yaffs_Spare localSpare;
 
-	dev->nPageReads++;
-
 	if (!spare && data) {
 		/* If we don't have a real spare, then we use a local one. */
 		/* Need this for the calculation of the ecc */
--- a/packages/fs/yaffs/current/src/yportenv.h
+++ b/packages/fs/yaffs/current/src/yportenv.h
@@ -76,8 +76,8 @@
 /* KR - added for use in scan so processes aren't blocked indefinitely. */
 #define YYIELD() schedule()
 
-#define YAFFS_ROOT_MODE			0666
-#define YAFFS_LOSTNFOUND_MODE		0666
+#define YAFFS_ROOT_MODE			0755
+#define YAFFS_LOSTNFOUND_MODE		0700
 
 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
 #define Y_CURRENT_TIME CURRENT_TIME.tv_sec
@@ -148,8 +148,8 @@
 #define YAFFS_LOSTNFOUND_PREFIX		"obj"
 /* #define YPRINTF(x) printf x */
 
-#define YAFFS_ROOT_MODE				0666
-#define YAFFS_LOSTNFOUND_MODE		0666
+#define YAFFS_ROOT_MODE			0755
+#define YAFFS_LOSTNFOUND_MODE		0700
 
 #define yaffs_SumCompare(x, y) ((x) == (y))
 #define yaffs_strcmp(a, b) strcmp(a, b)