From 9eed4e6315942b2b027a3f2a3eb959cd186fd3ae Mon Sep 17 00:00:00 2001 From: "Alexandros C. Couloumbis" Date: Wed, 20 Oct 2010 11:27:31 +0000 Subject: [PATCH] linux/generic: sync to todays yaffs tree SVN-Revision: 23544 --- ...1.patch => 511-yaffs-git-2010-10-20.patch} | 14930 ++++++++++------ 1 file changed, 9089 insertions(+), 5841 deletions(-) rename target/linux/generic/patches-2.6.36/{511-yaffs-git-2010-10-01.patch => 511-yaffs-git-2010-10-20.patch} (64%) diff --git a/target/linux/generic/patches-2.6.36/511-yaffs-git-2010-10-01.patch b/target/linux/generic/patches-2.6.36/511-yaffs-git-2010-10-20.patch similarity index 64% rename from target/linux/generic/patches-2.6.36/511-yaffs-git-2010-10-01.patch rename to target/linux/generic/patches-2.6.36/511-yaffs-git-2010-10-20.patch index 1ba5b1f468..f58c48168e 100644 --- a/target/linux/generic/patches-2.6.36/511-yaffs-git-2010-10-01.patch +++ b/target/linux/generic/patches-2.6.36/511-yaffs-git-2010-10-20.patch @@ -1,5 +1,39 @@ ---- a/fs/yaffs2/devextras.h -+++ b/fs/yaffs2/devextras.h +diff -Nrup linux-2.6.36-rc8/fs/Kconfig linux-2.6.36-rc8.new/fs/Kconfig +--- linux-2.6.36-rc8/fs/Kconfig 2010-10-20 13:11:25.295000294 +0300 ++++ linux-2.6.36-rc8.new/fs/Kconfig 2010-10-20 13:28:15.952000294 +0300 +@@ -44,7 +44,6 @@ source "fs/gfs2/Kconfig" + source "fs/ocfs2/Kconfig" + source "fs/btrfs/Kconfig" + source "fs/nilfs2/Kconfig" +-source "fs/yaffs2/Kconfig" + + endif # BLOCK + +@@ -175,6 +174,10 @@ source "fs/hfsplus/Kconfig" + source "fs/befs/Kconfig" + source "fs/bfs/Kconfig" + source "fs/efs/Kconfig" ++ ++# Patched by YAFFS ++source "fs/yaffs2/Kconfig" ++ + source "fs/jffs2/Kconfig" + # UBIFS File system configuration + source "fs/ubifs/Kconfig" +diff -Nrup linux-2.6.36-rc8/fs/Makefile linux-2.6.36-rc8.new/fs/Makefile +--- linux-2.6.36-rc8/fs/Makefile 2010-10-20 13:11:25.295000294 +0300 ++++ linux-2.6.36-rc8.new/fs/Makefile 2010-10-20 13:28:15.953000294 +0300 +@@ -127,5 +127,6 @@ obj-$(CONFIG_BTRFS_FS) += btrfs/ + obj-$(CONFIG_GFS2_FS) += gfs2/ + obj-$(CONFIG_EXOFS_FS) += exofs/ + obj-$(CONFIG_CEPH_FS) += ceph/ +-obj-$(CONFIG_YAFFS_FS) += yaffs2/ + ++# Patched by YAFFS ++obj-$(CONFIG_YAFFS_FS) += yaffs2/ +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/devextras.h linux-2.6.36-rc8.new/fs/yaffs2/devextras.h +--- linux-2.6.36-rc8/fs/yaffs2/devextras.h 2010-10-20 13:17:58.937000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/devextras.h 2010-10-20 13:28:16.050000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet another Flash File System . A NAND-flash specific file system. @@ -122,8 +156,9 @@ #if !(defined __KERNEL__) ---- a/fs/yaffs2/Kconfig -+++ b/fs/yaffs2/Kconfig +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/Kconfig linux-2.6.36-rc8.new/fs/yaffs2/Kconfig +--- linux-2.6.36-rc8/fs/yaffs2/Kconfig 2010-10-20 13:17:58.937000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/Kconfig 2010-10-20 13:28:15.993000294 +0300 @@ -90,23 +90,15 @@ config YAFFS_AUTO_YAFFS2 If unsure, say Y. @@ -201,8 +236,9 @@ + If unsure, say Y. + + ---- a/fs/yaffs2/Makefile -+++ b/fs/yaffs2/Makefile +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/Makefile linux-2.6.36-rc8.new/fs/yaffs2/Makefile +--- linux-2.6.36-rc8/fs/yaffs2/Makefile 2010-10-20 13:17:58.937000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/Makefile 2010-10-20 13:28:15.989000294 +0300 @@ -4,7 +4,14 @@ obj-$(CONFIG_YAFFS_FS) += yaffs.o @@ -220,8 +256,9 @@ +yaffs-y += yaffs_bitmap.o +yaffs-y += yaffs_verify.o + ---- a/fs/yaffs2/moduleconfig.h -+++ b/fs/yaffs2/moduleconfig.h +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/moduleconfig.h linux-2.6.36-rc8.new/fs/yaffs2/moduleconfig.h +--- linux-2.6.36-rc8/fs/yaffs2/moduleconfig.h 2010-10-20 13:17:58.938000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/moduleconfig.h 2010-10-20 13:28:16.055000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet another Flash File System . A NAND-flash specific file system. @@ -231,7 +268,7 @@ * for Toby Churchill Ltd and Brightstar Engineering * * Created by Martin Fouts -@@ -29,22 +29,43 @@ +@@ -29,25 +29,46 @@ /* Meaning: Yaffs does its own ECC, rather than using MTD ECC */ /* #define CONFIG_YAFFS_DOES_ECC */ @@ -280,9 +317,23 @@ +#define CONFIG_YAFFS_XATTR /* - Older-style on-NAND data format has a "pageStatus" byte to record ---- /dev/null -+++ b/fs/yaffs2/yaffs_allocator.c +-Older-style on-NAND data format has a "pageStatus" byte to record ++Older-style on-NAND data format has a "page_status" byte to record + chunk/page state. This byte is zeroed when the page is discarded. + Choose this option if you have existing on-NAND data in this format + that you need to continue to support. New data written also uses the +@@ -57,7 +78,7 @@ adjusted to use the older-style format. + MTD versions in yaffs_mtdif1.c. + */ + /* Default: Not selected */ +-/* Meaning: Use older-style on-NAND data format with pageStatus byte */ ++/* Meaning: Use older-style on-NAND data format with page_status byte */ + /* #define CONFIG_YAFFS_9BYTE_TAGS */ + + #endif /* YAFFS_OUT_OF_TREE */ +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_allocator.c linux-2.6.36-rc8.new/fs/yaffs2/yaffs_allocator.c +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_allocator.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_allocator.c 2010-10-20 13:28:15.998000294 +0300 @@ -0,0 +1,409 @@ +/* + * YAFFS: Yet another Flash File System . A NAND-flash specific file system. @@ -307,45 +358,45 @@ + +#ifdef CONFIG_YAFFS_YMALLOC_ALLOCATOR + -+void yaffs_DeinitialiseRawTnodesAndObjects(yaffs_Device *dev) ++void yaffs_deinit_raw_tnodes_and_objs(yaffs_dev_t *dev) +{ + dev = dev; +} + -+void yaffs_InitialiseRawTnodesAndObjects(yaffs_Device *dev) ++void yaffs_init_raw_tnodes_and_objs(yaffs_dev_t *dev) +{ + dev = dev; +} + -+yaffs_Tnode *yaffs_AllocateRawTnode(yaffs_Device *dev) ++yaffs_tnode_t *yaffs_alloc_raw_tnode(yaffs_dev_t *dev) +{ -+ return (yaffs_Tnode *)YMALLOC(dev->tnodeSize); ++ return (yaffs_tnode_t *)YMALLOC(dev->tnode_size); +} + -+void yaffs_FreeRawTnode(yaffs_Device *dev, yaffs_Tnode *tn) ++void yaffs_free_raw_tnode(yaffs_dev_t *dev, yaffs_tnode_t *tn) +{ + dev = dev; + YFREE(tn); +} + -+void yaffs_InitialiseRawObjects(yaffs_Device *dev) ++void yaffs_init_raw_objs(yaffs_dev_t *dev) +{ + dev = dev; +} + -+void yaffs_DeinitialiseRawObjects(yaffs_Device *dev) ++void yaffs_deinit_raw_objs(yaffs_dev_t *dev) +{ + dev = dev; +} + -+yaffs_Object *yaffs_AllocateRawObject(yaffs_Device *dev) ++yaffs_obj_t *yaffs_alloc_raw_obj(yaffs_dev_t *dev) +{ + dev = dev; -+ return (yaffs_Object *) YMALLOC(sizeof(yaffs_Object)); ++ return (yaffs_obj_t *) YMALLOC(sizeof(yaffs_obj_t)); +} + + -+void yaffs_FreeRawObject(yaffs_Device *dev, yaffs_Object *obj) ++void yaffs_free_raw_obj(yaffs_dev_t *dev, yaffs_obj_t *obj) +{ + + dev = dev; @@ -354,43 +405,43 @@ + +#else + -+struct yaffs_TnodeList_struct { -+ struct yaffs_TnodeList_struct *next; -+ yaffs_Tnode *tnodes; ++struct yaffs_tnode_list { ++ struct yaffs_tnode_list *next; ++ yaffs_tnode_t *tnodes; +}; + -+typedef struct yaffs_TnodeList_struct yaffs_TnodeList; ++typedef struct yaffs_tnode_list yaffs_tnodelist_t; + -+struct yaffs_ObjectList_struct { -+ yaffs_Object *objects; -+ struct yaffs_ObjectList_struct *next; ++struct yaffs_obj_tList_struct { ++ yaffs_obj_t *objects; ++ struct yaffs_obj_tList_struct *next; +}; + -+typedef struct yaffs_ObjectList_struct yaffs_ObjectList; ++typedef struct yaffs_obj_tList_struct yaffs_obj_tList; + + +struct yaffs_AllocatorStruct { -+ int nTnodesCreated; -+ yaffs_Tnode *freeTnodes; ++ int n_tnodesCreated; ++ yaffs_tnode_t *freeTnodes; + int nFreeTnodes; -+ yaffs_TnodeList *allocatedTnodeList; ++ yaffs_tnodelist_t *allocatedTnodeList; + -+ int nObjectsCreated; -+ yaffs_Object *freeObjects; ++ int n_objCreated; ++ yaffs_obj_t *freeObjects; + int nFreeObjects; + -+ yaffs_ObjectList *allocatedObjectList; ++ yaffs_obj_tList *allocatedObjectList; +}; + +typedef struct yaffs_AllocatorStruct yaffs_Allocator; + + -+static void yaffs_DeinitialiseRawTnodes(yaffs_Device *dev) ++static void yaffs_deinit_raw_tnodes(yaffs_dev_t *dev) +{ + + yaffs_Allocator *allocator = (yaffs_Allocator *)dev->allocator; + -+ yaffs_TnodeList *tmp; ++ yaffs_tnodelist_t *tmp; + + if(!allocator){ + YBUG(); @@ -408,10 +459,10 @@ + + allocator->freeTnodes = NULL; + allocator->nFreeTnodes = 0; -+ allocator->nTnodesCreated = 0; ++ allocator->n_tnodesCreated = 0; +} + -+static void yaffs_InitialiseRawTnodes(yaffs_Device *dev) ++static void yaffs_init_raw_tnodes(yaffs_dev_t *dev) +{ + yaffs_Allocator *allocator = dev->allocator; + @@ -419,33 +470,33 @@ + allocator->allocatedTnodeList = NULL; + allocator->freeTnodes = NULL; + allocator->nFreeTnodes = 0; -+ allocator->nTnodesCreated = 0; ++ allocator->n_tnodesCreated = 0; + } else + YBUG(); +} + -+static int yaffs_CreateTnodes(yaffs_Device *dev, int nTnodes) ++static int yaffs_create_tnodes(yaffs_dev_t *dev, int n_tnodes) +{ + yaffs_Allocator *allocator = (yaffs_Allocator *)dev->allocator; + int i; -+ yaffs_Tnode *newTnodes; ++ yaffs_tnode_t *newTnodes; + __u8 *mem; -+ yaffs_Tnode *curr; -+ yaffs_Tnode *next; -+ yaffs_TnodeList *tnl; ++ yaffs_tnode_t *curr; ++ yaffs_tnode_t *next; ++ yaffs_tnodelist_t *tnl; + + if(!allocator){ + YBUG(); + return YAFFS_FAIL; + } + -+ if (nTnodes < 1) ++ if (n_tnodes < 1) + return YAFFS_OK; + + + /* make these things */ + -+ newTnodes = YMALLOC(nTnodes * dev->tnodeSize); ++ newTnodes = YMALLOC(n_tnodes * dev->tnode_size); + mem = (__u8 *)newTnodes; + + if (!newTnodes) { @@ -455,25 +506,25 @@ + } + + /* New hookup for wide tnodes */ -+ for (i = 0; i < nTnodes - 1; i++) { -+ curr = (yaffs_Tnode *) &mem[i * dev->tnodeSize]; -+ next = (yaffs_Tnode *) &mem[(i+1) * dev->tnodeSize]; ++ for (i = 0; i < n_tnodes - 1; i++) { ++ curr = (yaffs_tnode_t *) &mem[i * dev->tnode_size]; ++ next = (yaffs_tnode_t *) &mem[(i+1) * dev->tnode_size]; + curr->internal[0] = next; + } + -+ curr = (yaffs_Tnode *) &mem[(nTnodes - 1) * dev->tnodeSize]; ++ curr = (yaffs_tnode_t *) &mem[(n_tnodes - 1) * dev->tnode_size]; + curr->internal[0] = allocator->freeTnodes; -+ allocator->freeTnodes = (yaffs_Tnode *)mem; ++ allocator->freeTnodes = (yaffs_tnode_t *)mem; + -+ allocator->nFreeTnodes += nTnodes; -+ allocator->nTnodesCreated += nTnodes; ++ allocator->nFreeTnodes += n_tnodes; ++ allocator->n_tnodesCreated += n_tnodes; + + /* Now add this bunch of tnodes to a list for freeing up. + * NB If we can't add this to the management list it isn't fatal + * but it just means we can't free this bunch of tnodes later. + */ + -+ tnl = YMALLOC(sizeof(yaffs_TnodeList)); ++ tnl = YMALLOC(sizeof(yaffs_tnodelist_t)); + if (!tnl) { + T(YAFFS_TRACE_ERROR, + (TSTR @@ -491,10 +542,10 @@ +} + + -+yaffs_Tnode *yaffs_AllocateRawTnode(yaffs_Device *dev) ++yaffs_tnode_t *yaffs_alloc_raw_tnode(yaffs_dev_t *dev) +{ + yaffs_Allocator *allocator = (yaffs_Allocator *)dev->allocator; -+ yaffs_Tnode *tn = NULL; ++ yaffs_tnode_t *tn = NULL; + + if(!allocator){ + YBUG(); @@ -503,7 +554,7 @@ + + /* If there are none left make more */ + if (!allocator->freeTnodes) -+ yaffs_CreateTnodes(dev, YAFFS_ALLOCATION_NTNODES); ++ yaffs_create_tnodes(dev, YAFFS_ALLOCATION_NTNODES); + + if (allocator->freeTnodes) { + tn = allocator->freeTnodes; @@ -515,7 +566,7 @@ +} + +/* FreeTnode frees up a tnode and puts it back on the free list */ -+void yaffs_FreeRawTnode(yaffs_Device *dev, yaffs_Tnode *tn) ++void yaffs_free_raw_tnode(yaffs_dev_t *dev, yaffs_tnode_t *tn) +{ + yaffs_Allocator *allocator = dev->allocator; + @@ -529,12 +580,12 @@ + allocator->freeTnodes = tn; + allocator->nFreeTnodes++; + } -+ dev->nCheckpointBlocksRequired = 0; /* force recalculation*/ ++ dev->checkpoint_blocks_required = 0; /* force recalculation*/ +} + + + -+static void yaffs_InitialiseRawObjects(yaffs_Device *dev) ++static void yaffs_init_raw_objs(yaffs_dev_t *dev) +{ + yaffs_Allocator *allocator = dev->allocator; + @@ -546,10 +597,10 @@ + YBUG(); +} + -+static void yaffs_DeinitialiseRawObjects(yaffs_Device *dev) ++static void yaffs_deinit_raw_objs(yaffs_dev_t *dev) +{ + yaffs_Allocator *allocator = dev->allocator; -+ yaffs_ObjectList *tmp; ++ yaffs_obj_tList *tmp; + + if(!allocator){ + YBUG(); @@ -566,29 +617,29 @@ + + allocator->freeObjects = NULL; + allocator->nFreeObjects = 0; -+ allocator->nObjectsCreated = 0; ++ allocator->n_objCreated = 0; +} + + -+static int yaffs_CreateFreeObjects(yaffs_Device *dev, int nObjects) ++static int yaffs_create_free_objs(yaffs_dev_t *dev, int n_obj) +{ + yaffs_Allocator *allocator = dev->allocator; + + int i; -+ yaffs_Object *newObjects; -+ yaffs_ObjectList *list; ++ yaffs_obj_t *newObjects; ++ yaffs_obj_tList *list; + + if(!allocator){ + YBUG(); + return YAFFS_FAIL; + } + -+ if (nObjects < 1) ++ if (n_obj < 1) + return YAFFS_OK; + + /* make these things */ -+ newObjects = YMALLOC(nObjects * sizeof(yaffs_Object)); -+ list = YMALLOC(sizeof(yaffs_ObjectList)); ++ newObjects = YMALLOC(n_obj * sizeof(yaffs_obj_t)); ++ list = YMALLOC(sizeof(yaffs_obj_tList)); + + if (!newObjects || !list) { + if (newObjects){ @@ -605,15 +656,15 @@ + } + + /* Hook them into the free list */ -+ for (i = 0; i < nObjects - 1; i++) { ++ for (i = 0; i < n_obj - 1; i++) { + newObjects[i].siblings.next = + (struct ylist_head *)(&newObjects[i + 1]); + } + -+ newObjects[nObjects - 1].siblings.next = (void *)allocator->freeObjects; ++ newObjects[n_obj - 1].siblings.next = (void *)allocator->freeObjects; + allocator->freeObjects = newObjects; -+ allocator->nFreeObjects += nObjects; -+ allocator->nObjectsCreated += nObjects; ++ allocator->nFreeObjects += n_obj; ++ allocator->n_objCreated += n_obj; + + /* Now add this bunch of Objects to a list for freeing up. */ + @@ -624,9 +675,9 @@ + return YAFFS_OK; +} + -+yaffs_Object *yaffs_AllocateRawObject(yaffs_Device *dev) ++yaffs_obj_t *yaffs_alloc_raw_obj(yaffs_dev_t *dev) +{ -+ yaffs_Object *obj = NULL; ++ yaffs_obj_t *obj = NULL; + yaffs_Allocator *allocator = dev->allocator; + + if(!allocator) { @@ -636,12 +687,12 @@ + + /* If there are none left make more */ + if (!allocator->freeObjects) -+ yaffs_CreateFreeObjects(dev, YAFFS_ALLOCATION_NOBJECTS); ++ yaffs_create_free_objs(dev, YAFFS_ALLOCATION_NOBJECTS); + + if (allocator->freeObjects) { + obj = allocator->freeObjects; + allocator->freeObjects = -+ (yaffs_Object *) (allocator->freeObjects->siblings.next); ++ (yaffs_obj_t *) (allocator->freeObjects->siblings.next); + allocator->nFreeObjects--; + } + @@ -649,7 +700,7 @@ +} + + -+void yaffs_FreeRawObject(yaffs_Device *dev, yaffs_Object *obj) ++void yaffs_free_raw_obj(yaffs_dev_t *dev, yaffs_obj_t *obj) +{ + + yaffs_Allocator *allocator = dev->allocator; @@ -664,11 +715,11 @@ + } +} + -+void yaffs_DeinitialiseRawTnodesAndObjects(yaffs_Device *dev) ++void yaffs_deinit_raw_tnodes_and_objs(yaffs_dev_t *dev) +{ + if(dev->allocator){ -+ yaffs_DeinitialiseRawTnodes(dev); -+ yaffs_DeinitialiseRawObjects(dev); ++ yaffs_deinit_raw_tnodes(dev); ++ yaffs_deinit_raw_objs(dev); + + YFREE(dev->allocator); + dev->allocator=NULL; @@ -676,7 +727,7 @@ + YBUG(); +} + -+void yaffs_InitialiseRawTnodesAndObjects(yaffs_Device *dev) ++void yaffs_init_raw_tnodes_and_objs(yaffs_dev_t *dev) +{ + yaffs_Allocator *allocator; + @@ -684,8 +735,8 @@ + allocator = YMALLOC(sizeof(yaffs_Allocator)); + if(allocator){ + dev->allocator = allocator; -+ yaffs_InitialiseRawTnodes(dev); -+ yaffs_InitialiseRawObjects(dev); ++ yaffs_init_raw_tnodes(dev); ++ yaffs_init_raw_objs(dev); + } + } else + YBUG(); @@ -693,8 +744,9 @@ + + +#endif ---- /dev/null -+++ b/fs/yaffs2/yaffs_allocator.h +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_allocator.h linux-2.6.36-rc8.new/fs/yaffs2/yaffs_allocator.h +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_allocator.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_allocator.h 2010-10-20 13:28:16.058000294 +0300 @@ -0,0 +1,30 @@ +/* + * YAFFS: Yet another Flash File System . A NAND-flash specific file system. @@ -716,18 +768,19 @@ + +#include "yaffs_guts.h" + -+void yaffs_InitialiseRawTnodesAndObjects(yaffs_Device *dev); -+void yaffs_DeinitialiseRawTnodesAndObjects(yaffs_Device *dev); ++void yaffs_init_raw_tnodes_and_objs(yaffs_dev_t *dev); ++void yaffs_deinit_raw_tnodes_and_objs(yaffs_dev_t *dev); + -+yaffs_Tnode *yaffs_AllocateRawTnode(yaffs_Device *dev); -+void yaffs_FreeRawTnode(yaffs_Device *dev, yaffs_Tnode *tn); ++yaffs_tnode_t *yaffs_alloc_raw_tnode(yaffs_dev_t *dev); ++void yaffs_free_raw_tnode(yaffs_dev_t *dev, yaffs_tnode_t *tn); + -+yaffs_Object *yaffs_AllocateRawObject(yaffs_Device *dev); -+void yaffs_FreeRawObject(yaffs_Device *dev, yaffs_Object *obj); ++yaffs_obj_t *yaffs_alloc_raw_obj(yaffs_dev_t *dev); ++void yaffs_free_raw_obj(yaffs_dev_t *dev, yaffs_obj_t *obj); + +#endif ---- /dev/null -+++ b/fs/yaffs2/yaffs_bitmap.c +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_bitmap.c linux-2.6.36-rc8.new/fs/yaffs2/yaffs_bitmap.c +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_bitmap.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_bitmap.c 2010-10-20 13:28:15.998000294 +0300 @@ -0,0 +1,105 @@ +/* + * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. @@ -748,22 +801,22 @@ + * Chunk bitmap manipulations + */ + -+static Y_INLINE __u8 *yaffs_BlockBits(yaffs_Device *dev, int blk) ++static Y_INLINE __u8 *yaffs_BlockBits(yaffs_dev_t *dev, int blk) +{ -+ if (blk < dev->internalStartBlock || blk > dev->internalEndBlock) { ++ if (blk < dev->internal_start_block || blk > dev->internal_end_block) { + T(YAFFS_TRACE_ERROR, + (TSTR("**>> yaffs: BlockBits block %d is not valid" TENDSTR), + blk)); + YBUG(); + } -+ return dev->chunkBits + -+ (dev->chunkBitmapStride * (blk - dev->internalStartBlock)); ++ return dev->chunk_bits + ++ (dev->chunk_bit_stride * (blk - dev->internal_start_block)); +} + -+void yaffs_VerifyChunkBitId(yaffs_Device *dev, int blk, int chunk) ++void yaffs_verify_chunk_bit_id(yaffs_dev_t *dev, int blk, int chunk) +{ -+ if (blk < dev->internalStartBlock || blk > dev->internalEndBlock || -+ chunk < 0 || chunk >= dev->param.nChunksPerBlock) { ++ if (blk < dev->internal_start_block || blk > dev->internal_end_block || ++ chunk < 0 || chunk >= dev->param.chunks_per_block) { + T(YAFFS_TRACE_ERROR, + (TSTR("**>> yaffs: Chunk Id (%d:%d) invalid"TENDSTR), + blk, chunk)); @@ -771,44 +824,44 @@ + } +} + -+void yaffs_ClearChunkBits(yaffs_Device *dev, int blk) ++void yaffs_clear_chunk_bits(yaffs_dev_t *dev, int blk) +{ + __u8 *blkBits = yaffs_BlockBits(dev, blk); + -+ memset(blkBits, 0, dev->chunkBitmapStride); ++ memset(blkBits, 0, dev->chunk_bit_stride); +} + -+void yaffs_ClearChunkBit(yaffs_Device *dev, int blk, int chunk) ++void yaffs_clear_chunk_bit(yaffs_dev_t *dev, int blk, int chunk) +{ + __u8 *blkBits = yaffs_BlockBits(dev, blk); + -+ yaffs_VerifyChunkBitId(dev, blk, chunk); ++ yaffs_verify_chunk_bit_id(dev, blk, chunk); + + blkBits[chunk / 8] &= ~(1 << (chunk & 7)); +} + -+void yaffs_SetChunkBit(yaffs_Device *dev, int blk, int chunk) ++void yaffs_set_chunk_bit(yaffs_dev_t *dev, int blk, int chunk) +{ + __u8 *blkBits = yaffs_BlockBits(dev, blk); + -+ yaffs_VerifyChunkBitId(dev, blk, chunk); ++ yaffs_verify_chunk_bit_id(dev, blk, chunk); + + blkBits[chunk / 8] |= (1 << (chunk & 7)); +} + -+int yaffs_CheckChunkBit(yaffs_Device *dev, int blk, int chunk) ++int yaffs_check_chunk_bit(yaffs_dev_t *dev, int blk, int chunk) +{ + __u8 *blkBits = yaffs_BlockBits(dev, blk); -+ yaffs_VerifyChunkBitId(dev, blk, chunk); ++ yaffs_verify_chunk_bit_id(dev, blk, chunk); + + return (blkBits[chunk / 8] & (1 << (chunk & 7))) ? 1 : 0; +} + -+int yaffs_StillSomeChunkBits(yaffs_Device *dev, int blk) ++int yaffs_still_some_chunks(yaffs_dev_t *dev, int blk) +{ + __u8 *blkBits = yaffs_BlockBits(dev, blk); + int i; -+ for (i = 0; i < dev->chunkBitmapStride; i++) { ++ for (i = 0; i < dev->chunk_bit_stride; i++) { + if (*blkBits) + return 1; + blkBits++; @@ -816,12 +869,12 @@ + return 0; +} + -+int yaffs_CountChunkBits(yaffs_Device *dev, int blk) ++int yaffs_count_chunk_bits(yaffs_dev_t *dev, int blk) +{ + __u8 *blkBits = yaffs_BlockBits(dev, blk); + int i; + int n = 0; -+ for (i = 0; i < dev->chunkBitmapStride; i++) { ++ for (i = 0; i < dev->chunk_bit_stride; i++) { + __u8 x = *blkBits; + while (x) { + if (x & 1) @@ -834,8 +887,9 @@ + return n; +} + ---- /dev/null -+++ b/fs/yaffs2/yaffs_bitmap.h +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_bitmap.h linux-2.6.36-rc8.new/fs/yaffs2/yaffs_bitmap.h +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_bitmap.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_bitmap.h 2010-10-20 13:28:16.058000294 +0300 @@ -0,0 +1,31 @@ +/* + * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. @@ -859,17 +913,18 @@ + +#include "yaffs_guts.h" + -+void yaffs_VerifyChunkBitId(yaffs_Device *dev, int blk, int chunk); -+void yaffs_ClearChunkBits(yaffs_Device *dev, int blk); -+void yaffs_ClearChunkBit(yaffs_Device *dev, int blk, int chunk); -+void yaffs_SetChunkBit(yaffs_Device *dev, int blk, int chunk); -+int yaffs_CheckChunkBit(yaffs_Device *dev, int blk, int chunk); -+int yaffs_StillSomeChunkBits(yaffs_Device *dev, int blk); -+int yaffs_CountChunkBits(yaffs_Device *dev, int blk); ++void yaffs_verify_chunk_bit_id(yaffs_dev_t *dev, int blk, int chunk); ++void yaffs_clear_chunk_bits(yaffs_dev_t *dev, int blk); ++void yaffs_clear_chunk_bit(yaffs_dev_t *dev, int blk, int chunk); ++void yaffs_set_chunk_bit(yaffs_dev_t *dev, int blk, int chunk); ++int yaffs_check_chunk_bit(yaffs_dev_t *dev, int blk, int chunk); ++int yaffs_still_some_chunks(yaffs_dev_t *dev, int blk); ++int yaffs_count_chunk_bits(yaffs_dev_t *dev, int blk); + +#endif ---- a/fs/yaffs2/yaffs_checkptrw.c -+++ b/fs/yaffs2/yaffs_checkptrw.c +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_checkptrw.c linux-2.6.36-rc8.new/fs/yaffs2/yaffs_checkptrw.c +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_checkptrw.c 2010-10-20 13:17:58.941000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_checkptrw.c 2010-10-20 13:28:15.999000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. @@ -891,300 +946,536 @@ #include "yaffs_getblockinfo.h" -static int yaffs_CheckpointSpaceOk(yaffs_Device *dev) -+static int yaffs2_CheckpointSpaceOk(yaffs_Device *dev) ++static int yaffs2_checkpt_space_ok(yaffs_dev_t *dev) { - int blocksAvailable = dev->nErasedBlocks - dev->nReservedBlocks; -+ int blocksAvailable = dev->nErasedBlocks - dev->param.nReservedBlocks; ++ int blocksAvailable = dev->n_erased_blocks - dev->param.n_reserved_blocks; T(YAFFS_TRACE_CHECKPOINT, (TSTR("checkpt blocks available = %d" TENDSTR), -@@ -30,11 +26,11 @@ static int yaffs_CheckpointSpaceOk(yaffs +@@ -30,53 +26,56 @@ static int yaffs_CheckpointSpaceOk(yaffs } -static int yaffs_CheckpointErase(yaffs_Device *dev) -+static int yaffs2_CheckpointErase(yaffs_Device *dev) ++static int yaffs_checkpt_erase(yaffs_dev_t *dev) { int i; - if (!dev->eraseBlockInNAND) -+ if (!dev->param.eraseBlockInNAND) ++ if (!dev->param.erase_fn) return 0; T(YAFFS_TRACE_CHECKPOINT, (TSTR("checking blocks %d to %d"TENDSTR), - dev->internalStartBlock, dev->internalEndBlock)); -@@ -43,12 +39,15 @@ static int yaffs_CheckpointErase(yaffs_D - yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, i); - if (bi->blockState == YAFFS_BLOCK_STATE_CHECKPOINT) { +- dev->internalStartBlock, dev->internalEndBlock)); ++ dev->internal_start_block, dev->internal_end_block)); + +- for (i = dev->internalStartBlock; i <= dev->internalEndBlock; i++) { +- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, i); +- if (bi->blockState == YAFFS_BLOCK_STATE_CHECKPOINT) { ++ for (i = dev->internal_start_block; i <= dev->internal_end_block; i++) { ++ yaffs_block_info_t *bi = yaffs_get_block_info(dev, i); ++ if (bi->block_state == YAFFS_BLOCK_STATE_CHECKPOINT) { T(YAFFS_TRACE_CHECKPOINT, (TSTR("erasing checkpt block %d"TENDSTR), i)); - if (dev->eraseBlockInNAND(dev, i - dev->blockOffset /* realign */)) { -+ -+ dev->nBlockErasures++; -+ -+ if (dev->param.eraseBlockInNAND(dev, i - dev->blockOffset /* realign */)) { - bi->blockState = YAFFS_BLOCK_STATE_EMPTY; - dev->nErasedBlocks++; +- bi->blockState = YAFFS_BLOCK_STATE_EMPTY; +- dev->nErasedBlocks++; - dev->nFreeChunks += dev->nChunksPerBlock; -+ dev->nFreeChunks += dev->param.nChunksPerBlock; ++ ++ dev->n_erasures++; ++ ++ if (dev->param.erase_fn(dev, i - dev->block_offset /* realign */)) { ++ bi->block_state = YAFFS_BLOCK_STATE_EMPTY; ++ dev->n_erased_blocks++; ++ dev->n_free_chunks += dev->param.chunks_per_block; } else { - dev->markNANDBlockBad(dev, i); -+ dev->param.markNANDBlockBad(dev, i); - bi->blockState = YAFFS_BLOCK_STATE_DEAD; +- bi->blockState = YAFFS_BLOCK_STATE_DEAD; ++ dev->param.bad_block_fn(dev, i); ++ bi->block_state = YAFFS_BLOCK_STATE_DEAD; } } -@@ -60,13 +59,13 @@ static int yaffs_CheckpointErase(yaffs_D + } + +- dev->blocksInCheckpoint = 0; ++ dev->blocks_in_checkpt = 0; + + return 1; } -static void yaffs_CheckpointFindNextErasedBlock(yaffs_Device *dev) -+static void yaffs2_CheckpointFindNextErasedBlock(yaffs_Device *dev) ++static void yaffs2_checkpt_find_erased_block(yaffs_dev_t *dev) { int i; - int blocksAvailable = dev->nErasedBlocks - dev->nReservedBlocks; -+ int blocksAvailable = dev->nErasedBlocks - dev->param.nReservedBlocks; ++ int blocksAvailable = dev->n_erased_blocks - dev->param.n_reserved_blocks; T(YAFFS_TRACE_CHECKPOINT, (TSTR("allocating checkpt block: erased %d reserved %d avail %d next %d "TENDSTR), - dev->nErasedBlocks, dev->nReservedBlocks, blocksAvailable, dev->checkpointNextBlock)); -+ dev->nErasedBlocks, dev->param.nReservedBlocks, blocksAvailable, dev->checkpointNextBlock)); ++ dev->n_erased_blocks, dev->param.n_reserved_blocks, blocksAvailable, dev->checkpt_next_block)); - if (dev->checkpointNextBlock >= 0 && - dev->checkpointNextBlock <= dev->internalEndBlock && -@@ -88,7 +87,7 @@ static void yaffs_CheckpointFindNextEras - dev->checkpointCurrentBlock = -1; +- if (dev->checkpointNextBlock >= 0 && +- dev->checkpointNextBlock <= dev->internalEndBlock && ++ if (dev->checkpt_next_block >= 0 && ++ dev->checkpt_next_block <= dev->internal_end_block && + blocksAvailable > 0) { + +- for (i = dev->checkpointNextBlock; i <= dev->internalEndBlock; i++) { +- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, i); +- if (bi->blockState == YAFFS_BLOCK_STATE_EMPTY) { +- dev->checkpointNextBlock = i + 1; +- dev->checkpointCurrentBlock = i; ++ for (i = dev->checkpt_next_block; i <= dev->internal_end_block; i++) { ++ yaffs_block_info_t *bi = yaffs_get_block_info(dev, i); ++ if (bi->block_state == YAFFS_BLOCK_STATE_EMPTY) { ++ dev->checkpt_next_block = i + 1; ++ dev->checkpt_cur_block = i; + T(YAFFS_TRACE_CHECKPOINT, (TSTR("allocating checkpt block %d"TENDSTR), i)); + return; + } +@@ -84,34 +83,34 @@ static void yaffs_CheckpointFindNextEras + } + T(YAFFS_TRACE_CHECKPOINT, (TSTR("out of checkpt blocks"TENDSTR))); + +- dev->checkpointNextBlock = -1; +- dev->checkpointCurrentBlock = -1; ++ dev->checkpt_next_block = -1; ++ dev->checkpt_cur_block = -1; } -static void yaffs_CheckpointFindNextCheckpointBlock(yaffs_Device *dev) -+static void yaffs2_CheckpointFindNextCheckpointBlock(yaffs_Device *dev) ++static void yaffs2_checkpt_find_block(yaffs_dev_t *dev) { int i; - yaffs_ExtendedTags tags; -@@ -98,10 +97,10 @@ static void yaffs_CheckpointFindNextChec +- yaffs_ExtendedTags tags; ++ yaffs_ext_tags tags; - if (dev->blocksInCheckpoint < dev->checkpointMaxBlocks) - for (i = dev->checkpointNextBlock; i <= dev->internalEndBlock; i++) { + T(YAFFS_TRACE_CHECKPOINT, (TSTR("find next checkpt block: start: blocks %d next %d" TENDSTR), +- dev->blocksInCheckpoint, dev->checkpointNextBlock)); ++ dev->blocks_in_checkpt, dev->checkpt_next_block)); + +- if (dev->blocksInCheckpoint < dev->checkpointMaxBlocks) +- for (i = dev->checkpointNextBlock; i <= dev->internalEndBlock; i++) { - int chunk = i * dev->nChunksPerBlock; -+ int chunk = i * dev->param.nChunksPerBlock; - int realignedChunk = chunk - dev->chunkOffset; +- int realignedChunk = chunk - dev->chunkOffset; ++ if (dev->blocks_in_checkpt < dev->checkpt_max_blocks) ++ for (i = dev->checkpt_next_block; i <= dev->internal_end_block; i++) { ++ int chunk = i * dev->param.chunks_per_block; ++ int realignedChunk = chunk - dev->chunk_offset; - dev->readChunkWithTagsFromNAND(dev, realignedChunk, -+ dev->param.readChunkWithTagsFromNAND(dev, realignedChunk, ++ dev->param.read_chunk_tags_fn(dev, realignedChunk, NULL, &tags); T(YAFFS_TRACE_CHECKPOINT, (TSTR("find next checkpt block: search: block %d oid %d seq %d eccr %d" TENDSTR), - i, tags.objectId, tags.sequenceNumber, tags.eccResult)); -@@ -124,29 +123,29 @@ static void yaffs_CheckpointFindNextChec +- i, tags.objectId, tags.sequenceNumber, tags.eccResult)); ++ i, tags.obj_id, tags.seq_number, tags.ecc_result)); + +- if (tags.sequenceNumber == YAFFS_SEQUENCE_CHECKPOINT_DATA) { ++ if (tags.seq_number == YAFFS_SEQUENCE_CHECKPOINT_DATA) { + /* Right kind of block */ +- dev->checkpointNextBlock = tags.objectId; +- dev->checkpointCurrentBlock = i; +- dev->checkpointBlockList[dev->blocksInCheckpoint] = i; +- dev->blocksInCheckpoint++; ++ dev->checkpt_next_block = tags.obj_id; ++ dev->checkpt_cur_block = i; ++ dev->checkpt_block_list[dev->blocks_in_checkpt] = i; ++ dev->blocks_in_checkpt++; + T(YAFFS_TRACE_CHECKPOINT, (TSTR("found checkpt block %d"TENDSTR), i)); + return; + } +@@ -119,122 +118,127 @@ static void yaffs_CheckpointFindNextChec + + T(YAFFS_TRACE_CHECKPOINT, (TSTR("found no more checkpt blocks"TENDSTR))); + +- dev->checkpointNextBlock = -1; +- dev->checkpointCurrentBlock = -1; ++ dev->checkpt_next_block = -1; ++ dev->checkpt_cur_block = -1; } -int yaffs_CheckpointOpen(yaffs_Device *dev, int forWriting) -+int yaffs2_CheckpointOpen(yaffs_Device *dev, int forWriting) ++int yaffs2_checkpt_open(yaffs_dev_t *dev, int forWriting) { + -+ dev->checkpointOpenForWrite = forWriting; ++ dev->checkpt_open_write = forWriting; + /* Got the functions we need? */ - if (!dev->writeChunkWithTagsToNAND || - !dev->readChunkWithTagsFromNAND || - !dev->eraseBlockInNAND || - !dev->markNANDBlockBad) -+ if (!dev->param.writeChunkWithTagsToNAND || -+ !dev->param.readChunkWithTagsFromNAND || -+ !dev->param.eraseBlockInNAND || -+ !dev->param.markNANDBlockBad) ++ if (!dev->param.write_chunk_tags_fn || ++ !dev->param.read_chunk_tags_fn || ++ !dev->param.erase_fn || ++ !dev->param.bad_block_fn) return 0; - if (forWriting && !yaffs_CheckpointSpaceOk(dev)) -+ if (forWriting && !yaffs2_CheckpointSpaceOk(dev)) ++ if (forWriting && !yaffs2_checkpt_space_ok(dev)) return 0; - if (!dev->checkpointBuffer) +- if (!dev->checkpointBuffer) - dev->checkpointBuffer = YMALLOC_DMA(dev->totalBytesPerChunk); -+ dev->checkpointBuffer = YMALLOC_DMA(dev->param.totalBytesPerChunk); - if (!dev->checkpointBuffer) +- if (!dev->checkpointBuffer) ++ if (!dev->checkpt_buffer) ++ dev->checkpt_buffer = YMALLOC_DMA(dev->param.total_bytes_per_chunk); ++ if (!dev->checkpt_buffer) return 0; - dev->checkpointPageSequence = 0; +- dev->checkpointPageSequence = 0; - - dev->checkpointOpenForWrite = forWriting; - - dev->checkpointByteCount = 0; - dev->checkpointSum = 0; - dev->checkpointXor = 0; -@@ -158,7 +157,7 @@ int yaffs_CheckpointOpen(yaffs_Device *d +- dev->checkpointByteCount = 0; +- dev->checkpointSum = 0; +- dev->checkpointXor = 0; +- dev->checkpointCurrentBlock = -1; +- dev->checkpointCurrentChunk = -1; +- dev->checkpointNextBlock = dev->internalStartBlock; ++ dev->checkpt_page_seq = 0; ++ dev->checkpt_byte_count = 0; ++ dev->checkpt_sum = 0; ++ dev->checkpt_xor = 0; ++ dev->checkpt_cur_block = -1; ++ dev->checkpt_cur_chunk = -1; ++ dev->checkpt_next_block = dev->internal_start_block; + + /* Erase all the blocks in the checkpoint area */ if (forWriting) { - memset(dev->checkpointBuffer, 0, dev->nDataBytesPerChunk); - dev->checkpointByteOffset = 0; +- memset(dev->checkpointBuffer, 0, dev->nDataBytesPerChunk); +- dev->checkpointByteOffset = 0; - return yaffs_CheckpointErase(dev); -+ return yaffs2_CheckpointErase(dev); ++ memset(dev->checkpt_buffer, 0, dev->data_bytes_per_chunk); ++ dev->checkpt_byte_offs = 0; ++ return yaffs_checkpt_erase(dev); } else { int i; /* Set to a value that will kick off a read */ -@@ -168,6 +167,9 @@ int yaffs_CheckpointOpen(yaffs_Device *d - dev->blocksInCheckpoint = 0; - dev->checkpointMaxBlocks = (dev->internalEndBlock - dev->internalStartBlock)/16 + 2; - dev->checkpointBlockList = YMALLOC(sizeof(int) * dev->checkpointMaxBlocks); -+ if(!dev->checkpointBlockList) +- dev->checkpointByteOffset = dev->nDataBytesPerChunk; ++ dev->checkpt_byte_offs = dev->data_bytes_per_chunk; + /* A checkpoint block list of 1 checkpoint block per 16 block is (hopefully) + * going to be way more than we need */ +- dev->blocksInCheckpoint = 0; +- dev->checkpointMaxBlocks = (dev->internalEndBlock - dev->internalStartBlock)/16 + 2; +- dev->checkpointBlockList = YMALLOC(sizeof(int) * dev->checkpointMaxBlocks); +- for (i = 0; i < dev->checkpointMaxBlocks; i++) +- dev->checkpointBlockList[i] = -1; ++ dev->blocks_in_checkpt = 0; ++ dev->checkpt_max_blocks = (dev->internal_end_block - dev->internal_start_block)/16 + 2; ++ dev->checkpt_block_list = YMALLOC(sizeof(int) * dev->checkpt_max_blocks); ++ if(!dev->checkpt_block_list) + return 0; + - for (i = 0; i < dev->checkpointMaxBlocks; i++) - dev->checkpointBlockList[i] = -1; ++ for (i = 0; i < dev->checkpt_max_blocks; i++) ++ dev->checkpt_block_list[i] = -1; } -@@ -175,7 +177,7 @@ int yaffs_CheckpointOpen(yaffs_Device *d + return 1; } -int yaffs_GetCheckpointSum(yaffs_Device *dev, __u32 *sum) -+int yaffs2_GetCheckpointSum(yaffs_Device *dev, __u32 *sum) ++int yaffs2_get_checkpt_sum(yaffs_dev_t *dev, __u32 *sum) { __u32 compositeSum; - compositeSum = (dev->checkpointSum << 8) | (dev->checkpointXor & 0xFF); -@@ -183,7 +185,7 @@ int yaffs_GetCheckpointSum(yaffs_Device +- compositeSum = (dev->checkpointSum << 8) | (dev->checkpointXor & 0xFF); ++ compositeSum = (dev->checkpt_sum << 8) | (dev->checkpt_xor & 0xFF); + *sum = compositeSum; return 1; } -static int yaffs_CheckpointFlushBuffer(yaffs_Device *dev) -+static int yaffs2_CheckpointFlushBuffer(yaffs_Device *dev) ++static int yaffs2_checkpt_flush_buffer(yaffs_dev_t *dev) { int chunk; int realignedChunk; -@@ -191,7 +193,7 @@ static int yaffs_CheckpointFlushBuffer(y - yaffs_ExtendedTags tags; - if (dev->checkpointCurrentBlock < 0) { +- yaffs_ExtendedTags tags; ++ yaffs_ext_tags tags; + +- if (dev->checkpointCurrentBlock < 0) { - yaffs_CheckpointFindNextErasedBlock(dev); -+ yaffs2_CheckpointFindNextErasedBlock(dev); - dev->checkpointCurrentChunk = 0; +- dev->checkpointCurrentChunk = 0; ++ if (dev->checkpt_cur_block < 0) { ++ yaffs2_checkpt_find_erased_block(dev); ++ dev->checkpt_cur_chunk = 0; } -@@ -211,7 +213,7 @@ static int yaffs_CheckpointFlushBuffer(y - dev->blocksInCheckpoint++; +- if (dev->checkpointCurrentBlock < 0) ++ if (dev->checkpt_cur_block < 0) + return 0; + +- tags.chunkDeleted = 0; +- tags.objectId = dev->checkpointNextBlock; /* Hint to next place to look */ +- tags.chunkId = dev->checkpointPageSequence + 1; +- tags.sequenceNumber = YAFFS_SEQUENCE_CHECKPOINT_DATA; +- tags.byteCount = dev->nDataBytesPerChunk; +- if (dev->checkpointCurrentChunk == 0) { ++ tags.is_deleted = 0; ++ tags.obj_id = dev->checkpt_next_block; /* Hint to next place to look */ ++ tags.chunk_id = dev->checkpt_page_seq + 1; ++ tags.seq_number = YAFFS_SEQUENCE_CHECKPOINT_DATA; ++ tags.n_bytes = dev->data_bytes_per_chunk; ++ if (dev->checkpt_cur_chunk == 0) { + /* First chunk we write for the block? Set block state to + checkpoint */ +- yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, dev->checkpointCurrentBlock); +- bi->blockState = YAFFS_BLOCK_STATE_CHECKPOINT; +- dev->blocksInCheckpoint++; ++ yaffs_block_info_t *bi = yaffs_get_block_info(dev, dev->checkpt_cur_block); ++ bi->block_state = YAFFS_BLOCK_STATE_CHECKPOINT; ++ dev->blocks_in_checkpt++; } - chunk = dev->checkpointCurrentBlock * dev->nChunksPerBlock + dev->checkpointCurrentChunk; -+ chunk = dev->checkpointCurrentBlock * dev->param.nChunksPerBlock + dev->checkpointCurrentChunk; ++ chunk = dev->checkpt_cur_block * dev->param.chunks_per_block + dev->checkpt_cur_chunk; T(YAFFS_TRACE_CHECKPOINT, (TSTR("checkpoint wite buffer nand %d(%d:%d) objid %d chId %d" TENDSTR), -@@ -219,12 +221,14 @@ static int yaffs_CheckpointFlushBuffer(y +- chunk, dev->checkpointCurrentBlock, dev->checkpointCurrentChunk, tags.objectId, tags.chunkId)); ++ chunk, dev->checkpt_cur_block, dev->checkpt_cur_chunk, tags.obj_id, tags.chunk_id)); - realignedChunk = chunk - dev->chunkOffset; +- realignedChunk = chunk - dev->chunkOffset; ++ realignedChunk = chunk - dev->chunk_offset; - dev->writeChunkWithTagsToNAND(dev, realignedChunk, -+ dev->nPageWrites++; -+ -+ dev->param.writeChunkWithTagsToNAND(dev, realignedChunk, - dev->checkpointBuffer, &tags); - dev->checkpointByteOffset = 0; - dev->checkpointPageSequence++; - dev->checkpointCurrentChunk++; +- dev->checkpointBuffer, &tags); +- dev->checkpointByteOffset = 0; +- dev->checkpointPageSequence++; +- dev->checkpointCurrentChunk++; - if (dev->checkpointCurrentChunk >= dev->nChunksPerBlock) { -+ if (dev->checkpointCurrentChunk >= dev->param.nChunksPerBlock) { - dev->checkpointCurrentChunk = 0; - dev->checkpointCurrentBlock = -1; +- dev->checkpointCurrentChunk = 0; +- dev->checkpointCurrentBlock = -1; ++ dev->n_page_writes++; ++ ++ dev->param.write_chunk_tags_fn(dev, realignedChunk, ++ dev->checkpt_buffer, &tags); ++ dev->checkpt_byte_offs = 0; ++ dev->checkpt_page_seq++; ++ dev->checkpt_cur_chunk++; ++ if (dev->checkpt_cur_chunk >= dev->param.chunks_per_block) { ++ dev->checkpt_cur_chunk = 0; ++ dev->checkpt_cur_block = -1; } -@@ -234,7 +238,7 @@ static int yaffs_CheckpointFlushBuffer(y +- memset(dev->checkpointBuffer, 0, dev->nDataBytesPerChunk); ++ memset(dev->checkpt_buffer, 0, dev->data_bytes_per_chunk); + + return 1; } -int yaffs_CheckpointWrite(yaffs_Device *dev, const void *data, int nBytes) -+int yaffs2_CheckpointWrite(yaffs_Device *dev, const void *data, int nBytes) ++int yaffs2_checkpt_wr(yaffs_dev_t *dev, const void *data, int n_bytes) { int i = 0; int ok = 1; -@@ -263,13 +267,13 @@ int yaffs_CheckpointWrite(yaffs_Device * +@@ -244,36 +248,36 @@ int yaffs_CheckpointWrite(yaffs_Device * - if (dev->checkpointByteOffset < 0 || - dev->checkpointByteOffset >= dev->nDataBytesPerChunk) + + +- if (!dev->checkpointBuffer) ++ if (!dev->checkpt_buffer) + return 0; + +- if (!dev->checkpointOpenForWrite) ++ if (!dev->checkpt_open_write) + return -1; + +- while (i < nBytes && ok) { +- dev->checkpointBuffer[dev->checkpointByteOffset] = *dataBytes; +- dev->checkpointSum += *dataBytes; +- dev->checkpointXor ^= *dataBytes; ++ while (i < n_bytes && ok) { ++ dev->checkpt_buffer[dev->checkpt_byte_offs] = *dataBytes; ++ dev->checkpt_sum += *dataBytes; ++ dev->checkpt_xor ^= *dataBytes; + +- dev->checkpointByteOffset++; ++ dev->checkpt_byte_offs++; + i++; + dataBytes++; +- dev->checkpointByteCount++; ++ dev->checkpt_byte_count++; + + +- if (dev->checkpointByteOffset < 0 || +- dev->checkpointByteOffset >= dev->nDataBytesPerChunk) - ok = yaffs_CheckpointFlushBuffer(dev); -+ ok = yaffs2_CheckpointFlushBuffer(dev); ++ if (dev->checkpt_byte_offs < 0 || ++ dev->checkpt_byte_offs >= dev->data_bytes_per_chunk) ++ ok = yaffs2_checkpt_flush_buffer(dev); } return i; } -int yaffs_CheckpointRead(yaffs_Device *dev, void *data, int nBytes) -+int yaffs2_CheckpointRead(yaffs_Device *dev, void *data, int nBytes) ++int yaffs2_checkpt_rd(yaffs_dev_t *dev, void *data, int n_bytes) { int i = 0; int ok = 1; -@@ -294,7 +298,7 @@ int yaffs_CheckpointRead(yaffs_Device *d - dev->checkpointByteOffset >= dev->nDataBytesPerChunk) { +- yaffs_ExtendedTags tags; ++ yaffs_ext_tags tags; - if (dev->checkpointCurrentBlock < 0) { + + int chunk; +@@ -281,113 +285,116 @@ int yaffs_CheckpointRead(yaffs_Device *d + + __u8 *dataBytes = (__u8 *)data; + +- if (!dev->checkpointBuffer) ++ if (!dev->checkpt_buffer) + return 0; + +- if (dev->checkpointOpenForWrite) ++ if (dev->checkpt_open_write) + return -1; + +- while (i < nBytes && ok) { ++ while (i < n_bytes && ok) { + + +- if (dev->checkpointByteOffset < 0 || +- dev->checkpointByteOffset >= dev->nDataBytesPerChunk) { ++ if (dev->checkpt_byte_offs < 0 || ++ dev->checkpt_byte_offs >= dev->data_bytes_per_chunk) { + +- if (dev->checkpointCurrentBlock < 0) { - yaffs_CheckpointFindNextCheckpointBlock(dev); -+ yaffs2_CheckpointFindNextCheckpointBlock(dev); - dev->checkpointCurrentChunk = 0; +- dev->checkpointCurrentChunk = 0; ++ if (dev->checkpt_cur_block < 0) { ++ yaffs2_checkpt_find_block(dev); ++ dev->checkpt_cur_chunk = 0; } -@@ -302,14 +306,16 @@ int yaffs_CheckpointRead(yaffs_Device *d +- if (dev->checkpointCurrentBlock < 0) ++ if (dev->checkpt_cur_block < 0) ok = 0; else { - chunk = dev->checkpointCurrentBlock * +- chunk = dev->checkpointCurrentBlock * - dev->nChunksPerBlock + -+ dev->param.nChunksPerBlock + - dev->checkpointCurrentChunk; - - realignedChunk = chunk - dev->chunkOffset; +- dev->checkpointCurrentChunk; +- +- realignedChunk = chunk - dev->chunkOffset; ++ chunk = dev->checkpt_cur_block * ++ dev->param.chunks_per_block + ++ dev->checkpt_cur_chunk; ++ ++ realignedChunk = chunk - dev->chunk_offset; + -+ dev->nPageReads++; ++ dev->n_page_reads++; /* read in the next chunk */ /* printf("read checkpoint page %d\n",dev->checkpointPage); */ - dev->readChunkWithTagsFromNAND(dev, -+ dev->param.readChunkWithTagsFromNAND(dev, ++ dev->param.read_chunk_tags_fn(dev, realignedChunk, - dev->checkpointBuffer, +- dev->checkpointBuffer, ++ dev->checkpt_buffer, &tags); -@@ -323,7 +329,7 @@ int yaffs_CheckpointRead(yaffs_Device *d - dev->checkpointPageSequence++; - dev->checkpointCurrentChunk++; + +- if (tags.chunkId != (dev->checkpointPageSequence + 1) || +- tags.eccResult > YAFFS_ECC_RESULT_FIXED || +- tags.sequenceNumber != YAFFS_SEQUENCE_CHECKPOINT_DATA) ++ if (tags.chunk_id != (dev->checkpt_page_seq + 1) || ++ tags.ecc_result > YAFFS_ECC_RESULT_FIXED || ++ tags.seq_number != YAFFS_SEQUENCE_CHECKPOINT_DATA) + ok = 0; + +- dev->checkpointByteOffset = 0; +- dev->checkpointPageSequence++; +- dev->checkpointCurrentChunk++; ++ dev->checkpt_byte_offs = 0; ++ dev->checkpt_page_seq++; ++ dev->checkpt_cur_chunk++; - if (dev->checkpointCurrentChunk >= dev->nChunksPerBlock) -+ if (dev->checkpointCurrentChunk >= dev->param.nChunksPerBlock) - dev->checkpointCurrentBlock = -1; +- dev->checkpointCurrentBlock = -1; ++ if (dev->checkpt_cur_chunk >= dev->param.chunks_per_block) ++ dev->checkpt_cur_block = -1; } } -@@ -342,17 +348,20 @@ int yaffs_CheckpointRead(yaffs_Device *d + + if (ok) { +- *dataBytes = dev->checkpointBuffer[dev->checkpointByteOffset]; +- dev->checkpointSum += *dataBytes; +- dev->checkpointXor ^= *dataBytes; +- dev->checkpointByteOffset++; ++ *dataBytes = dev->checkpt_buffer[dev->checkpt_byte_offs]; ++ dev->checkpt_sum += *dataBytes; ++ dev->checkpt_xor ^= *dataBytes; ++ dev->checkpt_byte_offs++; + i++; + dataBytes++; +- dev->checkpointByteCount++; ++ dev->checkpt_byte_count++; + } + } + return i; } -int yaffs_CheckpointClose(yaffs_Device *dev) -+int yaffs2_CheckpointClose(yaffs_Device *dev) ++int yaffs_checkpt_close(yaffs_dev_t *dev) { - if (dev->checkpointOpenForWrite) { - if (dev->checkpointByteOffset != 0) +- if (dev->checkpointOpenForWrite) { +- if (dev->checkpointByteOffset != 0) - yaffs_CheckpointFlushBuffer(dev); - } else { -+ yaffs2_CheckpointFlushBuffer(dev); -+ } else if(dev->checkpointBlockList){ ++ if (dev->checkpt_open_write) { ++ if (dev->checkpt_byte_offs != 0) ++ yaffs2_checkpt_flush_buffer(dev); ++ } else if(dev->checkpt_block_list){ int i; - for (i = 0; i < dev->blocksInCheckpoint && dev->checkpointBlockList[i] >= 0; i++) { +- for (i = 0; i < dev->blocksInCheckpoint && dev->checkpointBlockList[i] >= 0; i++) { - yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, dev->checkpointBlockList[i]); - if (bi->blockState == YAFFS_BLOCK_STATE_EMPTY) -+ int blk = dev->checkpointBlockList[i]; -+ yaffs_BlockInfo *bi = NULL; -+ if( dev->internalStartBlock <= blk && blk <= dev->internalEndBlock) -+ bi = yaffs_GetBlockInfo(dev, blk); -+ if (bi && bi->blockState == YAFFS_BLOCK_STATE_EMPTY) - bi->blockState = YAFFS_BLOCK_STATE_CHECKPOINT; +- bi->blockState = YAFFS_BLOCK_STATE_CHECKPOINT; ++ for (i = 0; i < dev->blocks_in_checkpt && dev->checkpt_block_list[i] >= 0; i++) { ++ int blk = dev->checkpt_block_list[i]; ++ yaffs_block_info_t *bi = NULL; ++ if( dev->internal_start_block <= blk && blk <= dev->internal_end_block) ++ bi = yaffs_get_block_info(dev, blk); ++ if (bi && bi->block_state == YAFFS_BLOCK_STATE_EMPTY) ++ bi->block_state = YAFFS_BLOCK_STATE_CHECKPOINT; else { /* Todo this looks odd... */ -@@ -362,7 +371,7 @@ int yaffs_CheckpointClose(yaffs_Device * - dev->checkpointBlockList = NULL; + } + } +- YFREE(dev->checkpointBlockList); +- dev->checkpointBlockList = NULL; ++ YFREE(dev->checkpt_block_list); ++ dev->checkpt_block_list = NULL; } - dev->nFreeChunks -= dev->blocksInCheckpoint * dev->nChunksPerBlock; -+ dev->nFreeChunks -= dev->blocksInCheckpoint * dev->param.nChunksPerBlock; - dev->nErasedBlocks -= dev->blocksInCheckpoint; +- dev->nErasedBlocks -= dev->blocksInCheckpoint; ++ dev->n_free_chunks -= dev->blocks_in_checkpt * dev->param.chunks_per_block; ++ dev->n_erased_blocks -= dev->blocks_in_checkpt; -@@ -378,16 +387,14 @@ int yaffs_CheckpointClose(yaffs_Device * + T(YAFFS_TRACE_CHECKPOINT, (TSTR("checkpoint byte count %d" TENDSTR), +- dev->checkpointByteCount)); ++ dev->checkpt_byte_count)); + +- if (dev->checkpointBuffer) { ++ if (dev->checkpt_buffer) { + /* free the buffer */ +- YFREE(dev->checkpointBuffer); +- dev->checkpointBuffer = NULL; ++ YFREE(dev->checkpt_buffer); ++ dev->checkpt_buffer = NULL; + return 1; + } else return 0; } -int yaffs_CheckpointInvalidateStream(yaffs_Device *dev) -+int yaffs2_CheckpointInvalidateStream(yaffs_Device *dev) ++int yaffs2_checkpt_invalidate_stream(yaffs_dev_t *dev) { - /* Erase the first checksum block */ - @@ -1194,15 +1485,16 @@ - if (!yaffs_CheckpointSpaceOk(dev)) - return 0; + T(YAFFS_TRACE_CHECKPOINT, (TSTR("checkpoint invalidate of %d blocks"TENDSTR), -+ dev->blocksInCheckpoint)); ++ dev->blocks_in_checkpt)); - return yaffs_CheckpointErase(dev); -+ return yaffs2_CheckpointErase(dev); ++ return yaffs_checkpt_erase(dev); } ---- a/fs/yaffs2/yaffs_checkptrw.h -+++ b/fs/yaffs2/yaffs_checkptrw.h +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_checkptrw.h linux-2.6.36-rc8.new/fs/yaffs2/yaffs_checkptrw.h +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_checkptrw.h 2010-10-20 13:17:58.941000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_checkptrw.h 2010-10-20 13:28:16.058000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet another Flash File System . A NAND-flash specific file system. @@ -1217,28 +1509,29 @@ #include "yaffs_guts.h" -int yaffs_CheckpointOpen(yaffs_Device *dev, int forWriting); -+int yaffs2_CheckpointOpen(yaffs_Device *dev, int forWriting); ++int yaffs2_checkpt_open(yaffs_dev_t *dev, int forWriting); -int yaffs_CheckpointWrite(yaffs_Device *dev, const void *data, int nBytes); -+int yaffs2_CheckpointWrite(yaffs_Device *dev, const void *data, int nBytes); ++int yaffs2_checkpt_wr(yaffs_dev_t *dev, const void *data, int n_bytes); -int yaffs_CheckpointRead(yaffs_Device *dev, void *data, int nBytes); -+int yaffs2_CheckpointRead(yaffs_Device *dev, void *data, int nBytes); ++int yaffs2_checkpt_rd(yaffs_dev_t *dev, void *data, int n_bytes); -int yaffs_GetCheckpointSum(yaffs_Device *dev, __u32 *sum); -+int yaffs2_GetCheckpointSum(yaffs_Device *dev, __u32 *sum); ++int yaffs2_get_checkpt_sum(yaffs_dev_t *dev, __u32 *sum); -int yaffs_CheckpointClose(yaffs_Device *dev); -+int yaffs2_CheckpointClose(yaffs_Device *dev); ++int yaffs_checkpt_close(yaffs_dev_t *dev); -int yaffs_CheckpointInvalidateStream(yaffs_Device *dev); -+int yaffs2_CheckpointInvalidateStream(yaffs_Device *dev); ++int yaffs2_checkpt_invalidate_stream(yaffs_dev_t *dev); #endif - ---- a/fs/yaffs2/yaffs_ecc.c -+++ b/fs/yaffs2/yaffs_ecc.c +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_ecc.c linux-2.6.36-rc8.new/fs/yaffs2/yaffs_ecc.c +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_ecc.c 2010-10-20 13:17:58.942000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_ecc.c 2010-10-20 13:28:16.025000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. @@ -1258,8 +1551,105 @@ #include "yportenv.h" #include "yaffs_ecc.h" ---- a/fs/yaffs2/yaffs_ecc.h -+++ b/fs/yaffs2/yaffs_ecc.h +@@ -72,7 +69,7 @@ static const unsigned char column_parity + + /* Count the bits in an unsigned char or a U32 */ + +-static int yaffs_CountBits(unsigned char x) ++static int yaffs_count_bits(unsigned char x) + { + int r = 0; + while (x) { +@@ -83,7 +80,7 @@ static int yaffs_CountBits(unsigned char + return r; + } + +-static int yaffs_CountBits32(unsigned x) ++static int yaffs_count_bits32(unsigned x) + { + int r = 0; + while (x) { +@@ -95,7 +92,7 @@ static int yaffs_CountBits32(unsigned x) + } + + /* Calculate the ECC for a 256-byte block of data */ +-void yaffs_ECCCalculate(const unsigned char *data, unsigned char *ecc) ++void yaffs_ecc_cacl(const unsigned char *data, unsigned char *ecc) + { + unsigned int i; + +@@ -166,7 +163,7 @@ void yaffs_ECCCalculate(const unsigned c + + /* Correct the ECC on a 256 byte block of data */ + +-int yaffs_ECCCorrect(unsigned char *data, unsigned char *read_ecc, ++int yaffs_ecc_correct(unsigned char *data, unsigned char *read_ecc, + const unsigned char *test_ecc) + { + unsigned char d0, d1, d2; /* deltas */ +@@ -226,9 +223,9 @@ int yaffs_ECCCorrect(unsigned char *data + return 1; /* Corrected the error */ + } + +- if ((yaffs_CountBits(d0) + +- yaffs_CountBits(d1) + +- yaffs_CountBits(d2)) == 1) { ++ if ((yaffs_count_bits(d0) + ++ yaffs_count_bits(d1) + ++ yaffs_count_bits(d2)) == 1) { + /* Reccoverable error in ecc */ + + read_ecc[0] = test_ecc[0]; +@@ -248,7 +245,7 @@ int yaffs_ECCCorrect(unsigned char *data + /* + * ECCxxxOther does ECC calcs on arbitrary n bytes of data + */ +-void yaffs_ECCCalculateOther(const unsigned char *data, unsigned nBytes, ++void yaffs_ecc_calc_other(const unsigned char *data, unsigned n_bytes, + yaffs_ECCOther *eccOther) + { + unsigned int i; +@@ -258,7 +255,7 @@ void yaffs_ECCCalculateOther(const unsig + unsigned line_parity_prime = 0; + unsigned char b; + +- for (i = 0; i < nBytes; i++) { ++ for (i = 0; i < n_bytes; i++) { + b = column_parity_table[*data++]; + col_parity ^= b; + +@@ -275,7 +272,7 @@ void yaffs_ECCCalculateOther(const unsig + eccOther->lineParityPrime = line_parity_prime; + } + +-int yaffs_ECCCorrectOther(unsigned char *data, unsigned nBytes, ++int yaffs_ecc_correct_other(unsigned char *data, unsigned n_bytes, + yaffs_ECCOther *read_ecc, + const yaffs_ECCOther *test_ecc) + { +@@ -304,7 +301,7 @@ int yaffs_ECCCorrectOther(unsigned char + if (cDelta & 0x02) + bit |= 0x01; + +- if (lDelta >= nBytes) ++ if (lDelta >= n_bytes) + return -1; + + data[lDelta] ^= (1 << bit); +@@ -312,8 +309,8 @@ int yaffs_ECCCorrectOther(unsigned char + return 1; /* corrected */ + } + +- if ((yaffs_CountBits32(lDelta) + yaffs_CountBits32(lDeltaPrime) + +- yaffs_CountBits(cDelta)) == 1) { ++ if ((yaffs_count_bits32(lDelta) + yaffs_count_bits32(lDeltaPrime) + ++ yaffs_count_bits(cDelta)) == 1) { + /* Reccoverable error in ecc */ + + *read_ecc = *test_ecc; +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_ecc.h linux-2.6.36-rc8.new/fs/yaffs2/yaffs_ecc.h +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_ecc.h 2010-10-20 13:17:58.942000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_ecc.h 2010-10-20 13:28:16.058000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet another Flash File System . A NAND-flash specific file system. @@ -1269,8 +1659,27 @@ * for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning ---- a/fs/yaffs2/yaffs_fs.c -+++ /dev/null +@@ -32,13 +32,13 @@ typedef struct { + unsigned lineParityPrime; + } yaffs_ECCOther; + +-void yaffs_ECCCalculate(const unsigned char *data, unsigned char *ecc); +-int yaffs_ECCCorrect(unsigned char *data, unsigned char *read_ecc, ++void yaffs_ecc_cacl(const unsigned char *data, unsigned char *ecc); ++int yaffs_ecc_correct(unsigned char *data, unsigned char *read_ecc, + const unsigned char *test_ecc); + +-void yaffs_ECCCalculateOther(const unsigned char *data, unsigned nBytes, ++void yaffs_ecc_calc_other(const unsigned char *data, unsigned n_bytes, + yaffs_ECCOther *ecc); +-int yaffs_ECCCorrectOther(unsigned char *data, unsigned nBytes, ++int yaffs_ecc_correct_other(unsigned char *data, unsigned n_bytes, + yaffs_ECCOther *read_ecc, + const yaffs_ECCOther *test_ecc); + #endif +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_fs.c linux-2.6.36-rc8.new/fs/yaffs2/yaffs_fs.c +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_fs.c 2010-10-20 13:17:58.944000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_fs.c 1970-01-01 02:00:00.000000000 +0200 @@ -1,2529 +0,0 @@ -/* - * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. @@ -3801,8 +4210,9 @@ -MODULE_DESCRIPTION("YAFFS2 - a NAND specific flash file system"); -MODULE_AUTHOR("Charles Manning, Aleph One Ltd., 2002-2006"); -MODULE_LICENSE("GPL"); ---- a/fs/yaffs2/yaffs_getblockinfo.h -+++ b/fs/yaffs2/yaffs_getblockinfo.h +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_getblockinfo.h linux-2.6.36-rc8.new/fs/yaffs2/yaffs_getblockinfo.h +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_getblockinfo.h 2010-10-20 13:17:58.945000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_getblockinfo.h 2010-10-20 13:28:16.058000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet another Flash File System . A NAND-flash specific file system. @@ -3812,16 +4222,32 @@ * for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning -@@ -17,6 +17,7 @@ +@@ -17,18 +17,19 @@ #define __YAFFS_GETBLOCKINFO_H__ #include "yaffs_guts.h" +#include "yaffs_trace.h" /* Function to manipulate block info */ - static Y_INLINE yaffs_BlockInfo *yaffs_GetBlockInfo(yaffs_Device * dev, int blk) ---- a/fs/yaffs2/yaffs_guts.c -+++ b/fs/yaffs2/yaffs_guts.c +-static Y_INLINE yaffs_BlockInfo *yaffs_GetBlockInfo(yaffs_Device * dev, int blk) ++static Y_INLINE yaffs_block_info_t *yaffs_get_block_info(yaffs_dev_t * dev, int blk) + { +- if (blk < dev->internalStartBlock || blk > dev->internalEndBlock) { ++ if (blk < dev->internal_start_block || blk > dev->internal_end_block) { + T(YAFFS_TRACE_ERROR, + (TSTR + ("**>> yaffs: getBlockInfo block %d is not valid" TENDSTR), + blk)); + YBUG(); + } +- return &dev->blockInfo[blk - dev->internalStartBlock]; ++ return &dev->block_info[blk - dev->internal_start_block]; + } + + #endif +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_guts.c linux-2.6.36-rc8.new/fs/yaffs2/yaffs_guts.c +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_guts.c 2010-10-20 13:17:58.951000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_guts.c 2010-10-20 13:28:16.027000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. @@ -3844,7 +4270,7 @@ #include "yaffsinterface.h" #include "yaffs_guts.h" -@@ -22,22 +19,28 @@ const char *yaffs_guts_c_version = +@@ -22,118 +19,109 @@ const char *yaffs_guts_c_version = #include "yaffs_getblockinfo.h" #include "yaffs_tagscompat.h" @@ -3876,55 +4302,82 @@ + /* Robustification (if it ever comes about...) */ - static void yaffs_RetireBlock(yaffs_Device *dev, int blockInNAND); - static void yaffs_HandleWriteChunkError(yaffs_Device *dev, int chunkInNAND, -@@ -49,33 +52,26 @@ static void yaffs_HandleUpdateChunk(yaff - const yaffs_ExtendedTags *tags); +-static void yaffs_RetireBlock(yaffs_Device *dev, int blockInNAND); +-static void yaffs_HandleWriteChunkError(yaffs_Device *dev, int chunkInNAND, ++static void yaffs_retire_block(yaffs_dev_t *dev, int flash_block); ++static void yaffs_handle_chunk_wr_error(yaffs_dev_t *dev, int nand_chunk, + int erasedOk); +-static void yaffs_HandleWriteChunkOk(yaffs_Device *dev, int chunkInNAND, ++static void yaffs_handle_chunk_wr_ok(yaffs_dev_t *dev, int nand_chunk, + const __u8 *data, +- const yaffs_ExtendedTags *tags); +-static void yaffs_HandleUpdateChunk(yaffs_Device *dev, int chunkInNAND, +- const yaffs_ExtendedTags *tags); ++ const yaffs_ext_tags *tags); ++static void yaffs_handle_chunk_update(yaffs_dev_t *dev, int nand_chunk, ++ const yaffs_ext_tags *tags); /* Other local prototypes */ -+static void yaffs_UpdateParent(yaffs_Object *obj); - static int yaffs_UnlinkObject(yaffs_Object *obj); - static int yaffs_ObjectHasCachedWriteData(yaffs_Object *obj); - --static void yaffs_HardlinkFixup(yaffs_Device *dev, yaffs_Object *hardList); +-static int yaffs_UnlinkObject(yaffs_Object *obj); +-static int yaffs_ObjectHasCachedWriteData(yaffs_Object *obj); - - static int yaffs_WriteNewChunkWithTagsToNAND(yaffs_Device *dev, +-static void yaffs_HardlinkFixup(yaffs_Device *dev, yaffs_Object *hardList); ++static void yaffs_update_parent(yaffs_obj_t *obj); ++static int yaffs_unlink_obj(yaffs_obj_t *obj); ++static int yaffs_obj_cache_dirty(yaffs_obj_t *obj); + +-static int yaffs_WriteNewChunkWithTagsToNAND(yaffs_Device *dev, ++static int yaffs_write_new_chunk(yaffs_dev_t *dev, const __u8 *buffer, - yaffs_ExtendedTags *tags, +- yaffs_ExtendedTags *tags, ++ yaffs_ext_tags *tags, int useReserve); -static int yaffs_PutChunkIntoFile(yaffs_Object *in, int chunkInInode, - int chunkInNAND, int inScan); -+ - static yaffs_Object *yaffs_CreateNewObject(yaffs_Device *dev, int number, - yaffs_ObjectType type); +-static yaffs_Object *yaffs_CreateNewObject(yaffs_Device *dev, int number, +- yaffs_ObjectType type); -static void yaffs_AddObjectToDirectory(yaffs_Object *directory, - yaffs_Object *obj); -static int yaffs_UpdateObjectHeader(yaffs_Object *in, const YCHAR *name, - int force, int isShrink, int shadows); -+ -+ -+static int yaffs_ApplyXMod(yaffs_Object *obj, char *buffer, yaffs_XAttrMod *xmod); -+ - static void yaffs_RemoveObjectFromDirectory(yaffs_Object *obj); - static int yaffs_CheckStructures(void); +-static void yaffs_RemoveObjectFromDirectory(yaffs_Object *obj); +-static int yaffs_CheckStructures(void); -static int yaffs_DeleteWorker(yaffs_Object *in, yaffs_Tnode *tn, __u32 level, - int chunkOffset, int *limit); - static int yaffs_DoGenericObjectDeletion(yaffs_Object *in); - +-static int yaffs_DoGenericObjectDeletion(yaffs_Object *in); +- -static yaffs_BlockInfo *yaffs_GetBlockInfo(yaffs_Device *dev, int blockNo); -- -- - static int yaffs_CheckChunkErased(struct yaffs_DeviceStruct *dev, - int chunkInNAND); -@@ -87,30 +83,22 @@ static int yaffs_TagsMatch(const yaffs_E - static int yaffs_AllocateChunk(yaffs_Device *dev, int useReserve, - yaffs_BlockInfo **blockUsedPtr); ++static yaffs_obj_t *yaffs_new_obj(yaffs_dev_t *dev, int number, ++ yaffs_obj_type type); + +-static int yaffs_CheckChunkErased(struct yaffs_DeviceStruct *dev, +- int chunkInNAND); + +-static int yaffs_UnlinkWorker(yaffs_Object *obj); ++static int yaffs_apply_xattrib_mod(yaffs_obj_t *obj, char *buffer, yaffs_xattr_mod *xmod); + +-static int yaffs_TagsMatch(const yaffs_ExtendedTags *tags, int objectId, +- int chunkInObject); ++static void yaffs_remove_obj_from_dir(yaffs_obj_t *obj); ++static int yaffs_check_structures(void); ++static int yaffs_generic_obj_del(yaffs_obj_t *in); ++ ++static int yaffs_check_chunk_erased(struct yaffs_dev_s *dev, ++ int nand_chunk); + +-static int yaffs_AllocateChunk(yaffs_Device *dev, int useReserve, +- yaffs_BlockInfo **blockUsedPtr); ++static int yaffs_unlink_worker(yaffs_obj_t *obj); -static void yaffs_VerifyFreeChunks(yaffs_Device *dev); -- - static void yaffs_CheckObjectDetailsLoaded(yaffs_Object *in); ++static int yaffs_tags_match(const yaffs_ext_tags *tags, int obj_id, ++ int chunkInObject); + +-static void yaffs_CheckObjectDetailsLoaded(yaffs_Object *in); ++static int yaffs_alloc_chunk(yaffs_dev_t *dev, int useReserve, ++ yaffs_block_info_t **blockUsedPtr); -static void yaffs_VerifyDirectory(yaffs_Object *directory); -#ifdef YAFFS_PARANOID @@ -3932,31 +4385,64 @@ -#else -#define yaffs_CheckFileSanity(in) -#endif -- - static void yaffs_InvalidateWholeChunkCache(yaffs_Object *in); - static void yaffs_InvalidateChunkCache(yaffs_Object *object, int chunkId); ++static void yaffs_check_obj_details_loaded(yaffs_obj_t *in); ++ ++static void yaffs_invalidate_whole_cache(yaffs_obj_t *in); ++static void yaffs_invalidate_chunk_cache(yaffs_obj_t *object, int chunk_id); + +-static void yaffs_InvalidateWholeChunkCache(yaffs_Object *in); +-static void yaffs_InvalidateChunkCache(yaffs_Object *object, int chunkId); ++static int yaffs_find_chunk_in_file(yaffs_obj_t *in, int inode_chunk, ++ yaffs_ext_tags *tags); -static void yaffs_InvalidateCheckpoint(yaffs_Device *dev); -- - static int yaffs_FindChunkInFile(yaffs_Object *in, int chunkInInode, - yaffs_ExtendedTags *tags); ++static int yaffs_verify_chunk_written(yaffs_dev_t *dev, ++ int nand_chunk, ++ const __u8 *data, ++ yaffs_ext_tags *tags); + +-static int yaffs_FindChunkInFile(yaffs_Object *in, int chunkInInode, +- yaffs_ExtendedTags *tags); -static __u32 yaffs_GetChunkGroupBase(yaffs_Device *dev, yaffs_Tnode *tn, - unsigned pos); -static yaffs_Tnode *yaffs_FindLevel0Tnode(yaffs_Device *dev, - yaffs_FileStructure *fStruct, - __u32 chunkId); -+static int yaffs_VerifyChunkWritten(yaffs_Device *dev, -+ int chunkInNAND, -+ const __u8 *data, -+ yaffs_ExtendedTags *tags); -+ -+ -+static void yaffs_LoadNameFromObjectHeader(yaffs_Device *dev,YCHAR *name, const YCHAR *ohName, int bufferSize); -+static void yaffs_LoadObjectHeaderFromName(yaffs_Device *dev,YCHAR *ohName, const YCHAR *name); ++static void yaffs_load_name_from_oh(yaffs_dev_t *dev,YCHAR *name, const YCHAR *ohName, int bufferSize); ++static void yaffs_load_oh_from_name(yaffs_dev_t *dev,YCHAR *ohName, const YCHAR *name); /* Function to calculate chunk and offset */ + +-static void yaffs_AddrToChunk(yaffs_Device *dev, loff_t addr, int *chunkOut, ++static void yaffs_addr_to_chunk(yaffs_dev_t *dev, loff_t addr, int *chunkOut, + __u32 *offsetOut) + { + int chunk; + __u32 offset; + +- chunk = (__u32)(addr >> dev->chunkShift); ++ chunk = (__u32)(addr >> dev->chunk_shift); + +- if (dev->chunkDiv == 1) { ++ if (dev->chunk_div == 1) { + /* easy power of 2 case */ +- offset = (__u32)(addr & dev->chunkMask); ++ offset = (__u32)(addr & dev->chunk_mask); + } else { + /* Non power-of-2 case */ + + loff_t chunkBase; + +- chunk /= dev->chunkDiv; ++ chunk /= dev->chunk_div; + +- chunkBase = ((loff_t)chunk) * dev->nDataBytesPerChunk; ++ chunkBase = ((loff_t)chunk) * dev->data_bytes_per_chunk; + offset = (__u32)(addr - chunkBase); + } + @@ -172,7 +160,7 @@ static __u32 ShiftsGE(__u32 x) static __u32 Shifts(__u32 x) @@ -3966,25 +4452,143 @@ nShifts = 0; -@@ -203,7 +191,7 @@ static int yaffs_InitialiseTempBuffers(y +@@ -193,49 +181,49 @@ static __u32 Shifts(__u32 x) + * Temporary buffer manipulations. + */ + +-static int yaffs_InitialiseTempBuffers(yaffs_Device *dev) ++static int yaffs_init_tmp_buffers(yaffs_dev_t *dev) + { + int i; + __u8 *buf = (__u8 *)1; + +- memset(dev->tempBuffer, 0, sizeof(dev->tempBuffer)); ++ memset(dev->temp_buffer, 0, sizeof(dev->temp_buffer)); + for (i = 0; buf && i < YAFFS_N_TEMP_BUFFERS; i++) { - dev->tempBuffer[i].line = 0; /* not in use */ - dev->tempBuffer[i].buffer = buf = +- dev->tempBuffer[i].line = 0; /* not in use */ +- dev->tempBuffer[i].buffer = buf = - YMALLOC_DMA(dev->totalBytesPerChunk); -+ YMALLOC_DMA(dev->param.totalBytesPerChunk); ++ dev->temp_buffer[i].line = 0; /* not in use */ ++ dev->temp_buffer[i].buffer = buf = ++ YMALLOC_DMA(dev->param.total_bytes_per_chunk); } return buf ? YAFFS_OK : YAFFS_FAIL; -@@ -286,7 +274,7 @@ int yaffs_IsManagedTempBuffer(yaffs_Devi + } + +-__u8 *yaffs_GetTempBuffer(yaffs_Device *dev, int lineNo) ++__u8 *yaffs_get_temp_buffer(yaffs_dev_t *dev, int line_no) + { + int i, j; + +- dev->tempInUse++; +- if (dev->tempInUse > dev->maxTemp) +- dev->maxTemp = dev->tempInUse; ++ dev->temp_in_use++; ++ if (dev->temp_in_use > dev->max_temp) ++ dev->max_temp = dev->temp_in_use; + + for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) { +- if (dev->tempBuffer[i].line == 0) { +- dev->tempBuffer[i].line = lineNo; +- if ((i + 1) > dev->maxTemp) { +- dev->maxTemp = i + 1; ++ if (dev->temp_buffer[i].line == 0) { ++ dev->temp_buffer[i].line = line_no; ++ if ((i + 1) > dev->max_temp) { ++ dev->max_temp = i + 1; + for (j = 0; j <= i; j++) +- dev->tempBuffer[j].maxLine = +- dev->tempBuffer[j].line; ++ dev->temp_buffer[j].max_line = ++ dev->temp_buffer[j].line; + } + +- return dev->tempBuffer[i].buffer; ++ return dev->temp_buffer[i].buffer; + } + } + + T(YAFFS_TRACE_BUFFERS, + (TSTR("Out of temp buffers at line %d, other held by lines:"), +- lineNo)); ++ line_no)); + for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) +- T(YAFFS_TRACE_BUFFERS, (TSTR(" %d "), dev->tempBuffer[i].line)); ++ T(YAFFS_TRACE_BUFFERS, (TSTR(" %d "), dev->temp_buffer[i].line)); + + T(YAFFS_TRACE_BUFFERS, (TSTR(" " TENDSTR))); + +@@ -244,21 +232,21 @@ __u8 *yaffs_GetTempBuffer(yaffs_Device * + * This is not good. + */ + +- dev->unmanagedTempAllocations++; +- return YMALLOC(dev->nDataBytesPerChunk); ++ dev->unmanaged_buffer_allocs++; ++ return YMALLOC(dev->data_bytes_per_chunk); + + } + +-void yaffs_ReleaseTempBuffer(yaffs_Device *dev, __u8 *buffer, +- int lineNo) ++void yaffs_release_temp_buffer(yaffs_dev_t *dev, __u8 *buffer, ++ int line_no) + { + int i; + +- dev->tempInUse--; ++ dev->temp_in_use--; + + for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) { +- if (dev->tempBuffer[i].buffer == buffer) { +- dev->tempBuffer[i].line = 0; ++ if (dev->temp_buffer[i].buffer == buffer) { ++ dev->temp_buffer[i].line = 0; + return; + } + } +@@ -267,9 +255,9 @@ void yaffs_ReleaseTempBuffer(yaffs_Devic + /* assume it is an unmanaged one. */ + T(YAFFS_TRACE_BUFFERS, + (TSTR("Releasing unmanaged temp buffer in line %d" TENDSTR), +- lineNo)); ++ line_no)); + YFREE(buffer); +- dev->unmanagedTempDeallocations++; ++ dev->unmanaged_buffer_deallocs++; + } + + } +@@ -277,21 +265,21 @@ void yaffs_ReleaseTempBuffer(yaffs_Devic + /* + * Determine if we have a managed buffer. + */ +-int yaffs_IsManagedTempBuffer(yaffs_Device *dev, const __u8 *buffer) ++int yaffs_is_managed_tmp_buffer(yaffs_dev_t *dev, const __u8 *buffer) + { + int i; + + for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) { +- if (dev->tempBuffer[i].buffer == buffer) ++ if (dev->temp_buffer[i].buffer == buffer) return 1; } - for (i = 0; i < dev->nShortOpCaches; i++) { -+ for (i = 0; i < dev->param.nShortOpCaches; i++) { - if (dev->srCache[i].data == buffer) +- if (dev->srCache[i].data == buffer) ++ for (i = 0; i < dev->param.n_caches; i++) { ++ if (dev->cache[i].data == buffer) return 1; } -@@ -299,6374 +287,4183 @@ int yaffs_IsManagedTempBuffer(yaffs_Devi + +- if (buffer == dev->checkpointBuffer) ++ if (buffer == dev->checkpt_buffer) + return 1; + + T(YAFFS_TRACE_ALWAYS, +@@ -299,6397 +287,4205 @@ int yaffs_IsManagedTempBuffer(yaffs_Devi return 0; } @@ -4029,7 +4633,7 @@ + */ -static Y_INLINE void yaffs_ClearChunkBit(yaffs_Device *dev, int blk, int chunk) -+static Y_INLINE int yaffs_HashFunction(int n) ++static Y_INLINE int yaffs_hash_fn(int n) { - __u8 *blkBits = yaffs_BlockBits(dev, blk); - @@ -4054,17 +4658,17 @@ + */ -static Y_INLINE int yaffs_CheckChunkBit(yaffs_Device *dev, int blk, int chunk) -+yaffs_Object *yaffs_Root(yaffs_Device *dev) ++yaffs_obj_t *yaffs_root(yaffs_dev_t *dev) { - __u8 *blkBits = yaffs_BlockBits(dev, blk); - yaffs_VerifyChunkBitId(dev, blk, chunk); - - return (blkBits[chunk / 8] & (1 << (chunk & 7))) ? 1 : 0; -+ return dev->rootDir; ++ return dev->root_dir; } -static Y_INLINE int yaffs_StillSomeChunkBits(yaffs_Device *dev, int blk) -+yaffs_Object *yaffs_LostNFound(yaffs_Device *dev) ++yaffs_obj_t *yaffs_lost_n_found(yaffs_dev_t *dev) { - __u8 *blkBits = yaffs_BlockBits(dev, blk); - int i; @@ -4074,7 +4678,7 @@ - blkBits++; - } - return 0; -+ return dev->lostNFoundDir; ++ return dev->lost_n_found; } -static int yaffs_CountChunkBits(yaffs_Device *dev, int blk) @@ -4111,11 +4715,11 @@ -} - -static int yaffs_SkipNANDVerification(yaffs_Device *dev) -+int yaffs_CheckFF(__u8 *buffer, int nBytes) ++int yaffs_check_ff(__u8 *buffer, int n_bytes) { - return !(yaffs_traceMask & (YAFFS_TRACE_VERIFY_NAND)); + /* Horrible, slow implementation */ -+ while (nBytes--) { ++ while (n_bytes--) { + if (*buffer != 0xFF) + return 0; + buffer++; @@ -4137,24 +4741,24 @@ -}; - -static void yaffs_VerifyBlock(yaffs_Device *dev, yaffs_BlockInfo *bi, int n) -+static int yaffs_CheckChunkErased(struct yaffs_DeviceStruct *dev, -+ int chunkInNAND) ++static int yaffs_check_chunk_erased(struct yaffs_dev_s *dev, ++ int nand_chunk) { - int actuallyUsed; - int inUse; + int retval = YAFFS_OK; -+ __u8 *data = yaffs_GetTempBuffer(dev, __LINE__); -+ yaffs_ExtendedTags tags; ++ __u8 *data = yaffs_get_temp_buffer(dev, __LINE__); ++ yaffs_ext_tags tags; + int result; - if (yaffs_SkipVerification(dev)) - return; -+ result = yaffs_ReadChunkWithTagsFromNAND(dev, chunkInNAND, data, &tags); ++ result = yaffs_rd_chunk_tags_nand(dev, nand_chunk, data, &tags); - /* Report illegal runtime states */ - if (bi->blockState >= YAFFS_NUMBER_OF_BLOCK_STATES) - T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has undefined state %d"TENDSTR), n, bi->blockState)); -+ if (tags.eccResult > YAFFS_ECC_RESULT_NO_ERROR) ++ if (tags.ecc_result > YAFFS_ECC_RESULT_NO_ERROR) + retval = YAFFS_FAIL; - switch (bi->blockState) { @@ -4163,9 +4767,9 @@ - case YAFFS_BLOCK_STATE_NEEDS_SCANNING: - T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has bad run-state %s"TENDSTR), - n, blockStateName[bi->blockState])); -+ if (!yaffs_CheckFF(data, dev->nDataBytesPerChunk) || tags.chunkUsed) { ++ if (!yaffs_check_ff(data, dev->data_bytes_per_chunk) || tags.chunk_used) { + T(YAFFS_TRACE_NANDACCESS, -+ (TSTR("Chunk %d not erased" TENDSTR), chunkInNAND)); ++ (TSTR("Chunk %d not erased" TENDSTR), nand_chunk)); + retval = YAFFS_FAIL; } @@ -4179,7 +4783,7 @@ - T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has illegal values pagesInUsed %d softDeletions %d"TENDSTR), - n, bi->pagesInUse, bi->softDeletions)); - -+ yaffs_ReleaseTempBuffer(dev, data, __LINE__); ++ yaffs_release_temp_buffer(dev, data, __LINE__); - /* Check chunk bitmap legal */ - inUse = yaffs_CountChunkBits(dev, n); @@ -4201,27 +4805,27 @@ -static void yaffs_VerifyCollectedBlock(yaffs_Device *dev, yaffs_BlockInfo *bi, - int n) + -+static int yaffs_VerifyChunkWritten(yaffs_Device *dev, -+ int chunkInNAND, ++static int yaffs_verify_chunk_written(yaffs_dev_t *dev, ++ int nand_chunk, + const __u8 *data, -+ yaffs_ExtendedTags *tags) ++ yaffs_ext_tags *tags) { - yaffs_VerifyBlock(dev, bi, n); + int retval = YAFFS_OK; -+ yaffs_ExtendedTags tempTags; -+ __u8 *buffer = yaffs_GetTempBuffer(dev,__LINE__); ++ yaffs_ext_tags tempTags; ++ __u8 *buffer = yaffs_get_temp_buffer(dev,__LINE__); + int result; + -+ result = yaffs_ReadChunkWithTagsFromNAND(dev,chunkInNAND,buffer,&tempTags); -+ if(memcmp(buffer,data,dev->nDataBytesPerChunk) || -+ tempTags.objectId != tags->objectId || -+ tempTags.chunkId != tags->chunkId || -+ tempTags.byteCount != tags->byteCount) ++ result = yaffs_rd_chunk_tags_nand(dev,nand_chunk,buffer,&tempTags); ++ if(memcmp(buffer,data,dev->data_bytes_per_chunk) || ++ tempTags.obj_id != tags->obj_id || ++ tempTags.chunk_id != tags->chunk_id || ++ tempTags.n_bytes != tags->n_bytes) + retval = YAFFS_FAIL; - /* After collection the block should be in the erased state */ - /* This will need to change if we do partial gc */ -+ yaffs_ReleaseTempBuffer(dev, buffer, __LINE__); ++ yaffs_release_temp_buffer(dev, buffer, __LINE__); - if (bi->blockState != YAFFS_BLOCK_STATE_COLLECTING && - bi->blockState != YAFFS_BLOCK_STATE_EMPTY) { @@ -4232,9 +4836,9 @@ } -static void yaffs_VerifyBlocks(yaffs_Device *dev) -+static int yaffs_WriteNewChunkWithTagsToNAND(struct yaffs_DeviceStruct *dev, ++static int yaffs_write_new_chunk(struct yaffs_dev_s *dev, + const __u8 *data, -+ yaffs_ExtendedTags *tags, ++ yaffs_ext_tags *tags, + int useReserve) { - int i; @@ -4261,20 +4865,20 @@ - T(YAFFS_TRACE_VERIFY, (TSTR(""TENDSTR))); - T(YAFFS_TRACE_VERIFY, (TSTR("Block summary"TENDSTR))); -+ yaffs2_InvalidateCheckpoint(dev); ++ yaffs2_checkpt_invalidate(dev); - T(YAFFS_TRACE_VERIFY, (TSTR("%d blocks have illegal states"TENDSTR), nIllegalBlockStates)); - if (nBlocksPerState[YAFFS_BLOCK_STATE_ALLOCATING] > 1) - T(YAFFS_TRACE_VERIFY, (TSTR("Too many allocating blocks"TENDSTR))); + do { -+ yaffs_BlockInfo *bi = 0; ++ yaffs_block_info_t *bi = 0; + int erasedOk = 0; - for (i = 0; i < YAFFS_NUMBER_OF_BLOCK_STATES; i++) - T(YAFFS_TRACE_VERIFY, - (TSTR("%s %d blocks"TENDSTR), - blockStateName[i], nBlocksPerState[i])); -+ chunk = yaffs_AllocateChunk(dev, useReserve, &bi); ++ chunk = yaffs_alloc_chunk(dev, useReserve, &bi); + if (chunk < 0) { + /* no space */ + break; @@ -4319,12 +4923,12 @@ - T(YAFFS_TRACE_VERIFY, - (TSTR("Too many collecting blocks %d (max is 1)"TENDSTR), - nBlocksPerState[YAFFS_BLOCK_STATE_COLLECTING])); -+ if(dev->param.alwaysCheckErased) -+ bi->skipErasedCheck = 0; ++ if(dev->param.always_check_erased) ++ bi->skip_erased_check = 0; - T(YAFFS_TRACE_VERIFY, (TSTR(""TENDSTR))); -+ if (!bi->skipErasedCheck) { -+ erasedOk = yaffs_CheckChunkErased(dev, chunk); ++ if (!bi->skip_erased_check) { ++ erasedOk = yaffs_check_chunk_erased(dev, chunk); + if (erasedOk != YAFFS_OK) { + T(YAFFS_TRACE_ERROR, + (TSTR("**>> yaffs chunk %d was not erased" @@ -4334,8 +4938,8 @@ + /* If not erased, delete this one, + * skip rest of block and + * try another chunk */ -+ yaffs_DeleteChunk(dev,chunk,1,__LINE__); -+ yaffs_SkipRestOfBlock(dev); ++ yaffs_chunk_del(dev,chunk,1,__LINE__); ++ yaffs_skip_rest_of_block(dev); + continue; + } + } @@ -4348,7 +4952,7 @@ -{ - if (obj && yaffs_SkipVerification(obj->myDev)) - return; -+ writeOk = yaffs_WriteChunkWithTagsToNAND(dev, chunk, ++ writeOk = yaffs_wr_chunk_tags_nand(dev, chunk, + data, tags); - if (!(tags && obj && oh)) { @@ -4357,8 +4961,8 @@ - (__u32)tags, (__u32)obj, (__u32)oh)); - return; - } -+ if(!bi->skipErasedCheck) -+ writeOk = yaffs_VerifyChunkWritten(dev, chunk, data, tags); ++ if(!bi->skip_erased_check) ++ writeOk = yaffs_verify_chunk_written(dev, chunk, data, tags); - if (oh->type <= YAFFS_OBJECT_TYPE_UNKNOWN || - oh->type > YAFFS_OBJECT_TYPE_MAX) @@ -4368,7 +4972,7 @@ + if (writeOk != YAFFS_OK) { + /* Clean up aborted write, skip to next block and + * try another chunk */ -+ yaffs_HandleWriteChunkError(dev, chunk, erasedOk); ++ yaffs_handle_chunk_wr_error(dev, chunk, erasedOk); + continue; + } @@ -4376,10 +4980,10 @@ - T(YAFFS_TRACE_VERIFY, - (TSTR("Obj %d header mismatch objectId %d"TENDSTR), - tags->objectId, obj->objectId)); -+ bi->skipErasedCheck = 1; ++ bi->skip_erased_check = 1; + /* Copy the data into the robustification buffer */ -+ yaffs_HandleWriteChunkOk(dev, chunk, data, tags); ++ yaffs_handle_chunk_wr_ok(dev, chunk, data, tags); - /* - * Check that the object's parent ids match if parentCheck requested. @@ -4412,7 +5016,7 @@ - T(YAFFS_TRACE_VERIFY, - (TSTR("Obj %d header name is NULL"TENDSTR), - obj->objectId)); -+ dev->nRetriedWrites += (attempts - 1); ++ dev->n_retired_writes += (attempts - 1); + } - if (tags->objectId > 1 && ((__u8)(oh->name[0])) == 0xff) /* Trashed name */ @@ -4430,18 +5034,18 @@ -static int yaffs_VerifyTnodeWorker(yaffs_Object *obj, yaffs_Tnode *tn, - __u32 level, int chunkOffset) -+static void yaffs_RetireBlock(yaffs_Device *dev, int blockInNAND) ++static void yaffs_retire_block(yaffs_dev_t *dev, int flash_block) { - int i; - yaffs_Device *dev = obj->myDev; - int ok = 1; -+ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, blockInNAND); ++ yaffs_block_info_t *bi = yaffs_get_block_info(dev, flash_block); - if (tn) { - if (level > 0) { -+ yaffs2_InvalidateCheckpoint(dev); ++ yaffs2_checkpt_invalidate(dev); + -+ yaffs2_ClearOldestDirtySequence(dev,bi); ++ yaffs2_clear_oldest_dirty_seq(dev,bi); - for (i = 0; i < YAFFS_NTNODES_INTERNAL && ok; i++) { - if (tn->internal[i]) { @@ -4452,29 +5056,30 @@ - } - } - } else if (level == 0) { -+ if (yaffs_MarkBlockBad(dev, blockInNAND) != YAFFS_OK) { -+ if (yaffs_EraseBlockInNAND(dev, blockInNAND) != YAFFS_OK) { +- yaffs_ExtendedTags tags; +- __u32 objectId = obj->objectId; ++ if (yaffs_mark_bad(dev, flash_block) != YAFFS_OK) { ++ if (yaffs_erase_block(dev, flash_block) != YAFFS_OK) { + T(YAFFS_TRACE_ALWAYS, (TSTR( + "yaffs: Failed to mark bad and erase block %d" -+ TENDSTR), blockInNAND)); ++ TENDSTR), flash_block)); + } else { - yaffs_ExtendedTags tags; -- __u32 objectId = obj->objectId; -+ int chunkId = blockInNAND * dev->param.nChunksPerBlock; ++ yaffs_ext_tags tags; ++ int chunk_id = flash_block * dev->param.chunks_per_block; - chunkOffset <<= YAFFS_TNODES_LEVEL0_BITS; -+ __u8 *buffer = yaffs_GetTempBuffer(dev, __LINE__); ++ __u8 *buffer = yaffs_get_temp_buffer(dev, __LINE__); - for (i = 0; i < YAFFS_NTNODES_LEVEL0; i++) { - __u32 theChunk = yaffs_GetChunkGroupBase(dev, tn, i); -+ memset(buffer, 0xff, dev->nDataBytesPerChunk); -+ yaffs_InitialiseTags(&tags); -+ tags.sequenceNumber = YAFFS_SEQUENCE_BAD_BLOCK; -+ if (dev->param.writeChunkWithTagsToNAND(dev, chunkId - -+ dev->chunkOffset, buffer, &tags) != YAFFS_OK) ++ memset(buffer, 0xff, dev->data_bytes_per_chunk); ++ yaffs_init_tags(&tags); ++ tags.seq_number = YAFFS_SEQUENCE_BAD_BLOCK; ++ if (dev->param.write_chunk_tags_fn(dev, chunk_id - ++ dev->chunk_offset, buffer, &tags) != YAFFS_OK) + T(YAFFS_TRACE_ALWAYS, (TSTR("yaffs: Failed to " + TCONT("write bad block marker to block %d") -+ TENDSTR), blockInNAND)); ++ TENDSTR), flash_block)); - if (theChunk > 0) { - /* T(~0,(TSTR("verifying (%d:%d) %d"TENDSTR),tags.objectId,tags.chunkId,theChunk)); */ @@ -4487,16 +5092,16 @@ - } - chunkOffset++; - } -+ yaffs_ReleaseTempBuffer(dev, buffer, __LINE__); ++ yaffs_release_temp_buffer(dev, buffer, __LINE__); } } - return ok; -+ bi->blockState = YAFFS_BLOCK_STATE_DEAD; -+ bi->gcPrioritise = 0; -+ bi->needsRetiring = 0; ++ bi->block_state = YAFFS_BLOCK_STATE_DEAD; ++ bi->gc_prioritise = 0; ++ bi->needs_retiring = 0; -+ dev->nRetiredBlocks++; ++ dev->n_retired_blocks++; } +/* @@ -4505,9 +5110,9 @@ + */ -static void yaffs_VerifyFile(yaffs_Object *obj) -+static void yaffs_HandleWriteChunkOk(yaffs_Device *dev, int chunkInNAND, ++static void yaffs_handle_chunk_wr_ok(yaffs_dev_t *dev, int nand_chunk, + const __u8 *data, -+ const yaffs_ExtendedTags *tags) ++ const yaffs_ext_tags *tags) { - int requiredTallness; - int actualTallness; @@ -4519,34 +5124,34 @@ - yaffs_Tnode *tn; - __u32 objectId; + dev=dev; -+ chunkInNAND=chunkInNAND; ++ nand_chunk=nand_chunk; + data=data; + tags=tags; +} - if (!obj) - return; -+static void yaffs_HandleUpdateChunk(yaffs_Device *dev, int chunkInNAND, -+ const yaffs_ExtendedTags *tags) ++static void yaffs_handle_chunk_update(yaffs_dev_t *dev, int nand_chunk, ++ const yaffs_ext_tags *tags) +{ + dev=dev; -+ chunkInNAND=chunkInNAND; ++ nand_chunk=nand_chunk; + tags=tags; +} - if (yaffs_SkipVerification(obj->myDev)) - return; -+void yaffs_HandleChunkError(yaffs_Device *dev, yaffs_BlockInfo *bi) ++void yaffs_handle_chunk_error(yaffs_dev_t *dev, yaffs_block_info_t *bi) +{ -+ if (!bi->gcPrioritise) { -+ bi->gcPrioritise = 1; -+ dev->hasPendingPrioritisedGCs = 1; -+ bi->chunkErrorStrikes++; ++ if (!bi->gc_prioritise) { ++ bi->gc_prioritise = 1; ++ dev->has_pending_prioritised_gc = 1; ++ bi->chunk_error_strikes++; - dev = obj->myDev; - objectId = obj->objectId; -+ if (bi->chunkErrorStrikes > 3) { -+ bi->needsRetiring = 1; /* Too many stikes, so retire this */ ++ if (bi->chunk_error_strikes > 3) { ++ bi->needs_retiring = 1; /* Too many stikes, so retire this */ + T(YAFFS_TRACE_ALWAYS, (TSTR("yaffs: Block struck out" TENDSTR))); - /* Check file size is consistent with tnode depth */ @@ -4559,51 +5164,42 @@ + } } +} -+ -+static void yaffs_HandleWriteChunkError(yaffs_Device *dev, int chunkInNAND, -+ int erasedOk) -+{ -+ int blockInNAND = chunkInNAND / dev->param.nChunksPerBlock; -+ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, blockInNAND); - actualTallness = obj->variant.fileVariant.topLevel; -+ yaffs_HandleChunkError(dev, bi); ++static void yaffs_handle_chunk_wr_error(yaffs_dev_t *dev, int nand_chunk, ++ int erasedOk) ++{ ++ int flash_block = nand_chunk / dev->param.chunks_per_block; ++ yaffs_block_info_t *bi = yaffs_get_block_info(dev, flash_block); - if (requiredTallness > actualTallness) - T(YAFFS_TRACE_VERIFY, - (TSTR("Obj %d had tnode tallness %d, needs to be %d"TENDSTR), - obj->objectId, actualTallness, requiredTallness)); ++ yaffs_handle_chunk_error(dev, bi); + + if (erasedOk) { + /* Was an actual write failure, so mark the block for retirement */ -+ bi->needsRetiring = 1; ++ bi->needs_retiring = 1; + T(YAFFS_TRACE_ERROR | YAFFS_TRACE_BAD_BLOCKS, -+ (TSTR("**>> Block %d needs retiring" TENDSTR), blockInNAND)); ++ (TSTR("**>> Block %d needs retiring" TENDSTR), flash_block)); + } -+ -+ /* Delete the chunk */ -+ yaffs_DeleteChunk(dev, chunkInNAND, 1, __LINE__); -+ yaffs_SkipRestOfBlock(dev); -+} - - /* Check that the chunks in the tnode tree are all correct. - * We do this by scanning through the tnode tree and - * checking the tags for every chunk match. - */ -+/*---------------- Name handling functions ------------*/ ++ /* Delete the chunk */ ++ yaffs_chunk_del(dev, nand_chunk, 1, __LINE__); ++ yaffs_skip_rest_of_block(dev); ++} - if (yaffs_SkipNANDVerification(dev)) - return; -+static __u16 yaffs_CalcNameSum(const YCHAR *name) -+{ -+ __u16 sum = 0; -+ __u16 i = 1; - for (i = 1; i <= lastChunk; i++) { - tn = yaffs_FindLevel0Tnode(dev, &obj->variant.fileVariant, i); -+ const YUCHAR *bname = (const YUCHAR *) name; -+ if (bname) { -+ while ((*bname) && (i < (YAFFS_MAX_NAME_LENGTH/2))) { ++/*---------------- Name handling functions ------------*/ - if (tn) { - __u32 theChunk = yaffs_GetChunkGroupBase(dev, tn, i); @@ -4616,6 +5212,15 @@ - tags.objectId, tags.chunkId)); - } - } ++static __u16 yaffs_calc_name_sum(const YCHAR *name) ++{ ++ __u16 sum = 0; ++ __u16 i = 1; ++ ++ const YUCHAR *bname = (const YUCHAR *) name; ++ if (bname) { ++ while ((*bname) && (i < (YAFFS_MAX_NAME_LENGTH/2))) { ++ +#ifdef CONFIG_YAFFS_CASE_INSENSITIVE + sum += yaffs_toupper(*bname) * i; +#else @@ -4630,72 +5235,47 @@ - -static void yaffs_VerifyHardLink(yaffs_Object *obj) -+void yaffs_SetObjectName(yaffs_Object *obj, const YCHAR *name) ++void yaffs_set_obj_name(yaffs_obj_t *obj, const YCHAR *name) { - if (obj && yaffs_SkipVerification(obj->myDev)) - return; -+#ifdef CONFIG_YAFFS_SHORT_NAMES_IN_RAM -+ memset(obj->shortName, 0, sizeof(YCHAR) * (YAFFS_SHORT_NAME_LENGTH+1)); -+ if (name && yaffs_strnlen(name,YAFFS_SHORT_NAME_LENGTH+1) <= YAFFS_SHORT_NAME_LENGTH) -+ yaffs_strcpy(obj->shortName, name); -+ else -+ obj->shortName[0] = _Y('\0'); -+#endif -+ obj->sum = yaffs_CalcNameSum(name); -+} - +- - /* Verify sane equivalent object */ -+void yaffs_SetObjectNameFromOH(yaffs_Object *obj, const yaffs_ObjectHeader *oh) -+{ -+#ifdef CONFIG_YAFFS_AUTO_UNICODE -+ YCHAR tmpName[YAFFS_MAX_NAME_LENGTH+1]; -+ memset(tmpName,0,sizeof(tmpName)); -+ yaffs_LoadNameFromObjectHeader(obj->myDev,tmpName,oh->name,YAFFS_MAX_NAME_LENGTH+1); -+ yaffs_SetObjectName(obj,tmpName); -+#else -+ yaffs_SetObjectName(obj,oh->name); ++#ifdef CONFIG_YAFFS_SHORT_NAMES_IN_RAM ++ memset(obj->short_name, 0, sizeof(YCHAR) * (YAFFS_SHORT_NAME_LENGTH+1)); ++ if (name && yaffs_strnlen(name,YAFFS_SHORT_NAME_LENGTH+1) <= YAFFS_SHORT_NAME_LENGTH) ++ yaffs_strcpy(obj->short_name, name); ++ else ++ obj->short_name[0] = _Y('\0'); +#endif ++ obj->sum = yaffs_calc_name_sum(name); } -static void yaffs_VerifySymlink(yaffs_Object *obj) -+/*-------------------- TNODES ------------------- -+ -+ * List of spare tnodes -+ * The list is hooked together using the first pointer -+ * in the tnode. -+ */ -+ -+ -+yaffs_Tnode *yaffs_GetTnode(yaffs_Device *dev) ++void yaffs_set_obj_name_from_oh(yaffs_obj_t *obj, const yaffs_obj_header *oh) { - if (obj && yaffs_SkipVerification(obj->myDev)) - return; -+ yaffs_Tnode *tn = yaffs_AllocateRawTnode(dev); -+ if (tn){ -+ memset(tn, 0, dev->tnodeSize); -+ dev->nTnodes++; -+ } -+ -+ dev->nCheckpointBlocksRequired = 0; /* force recalculation*/ - +- - /* Verify symlink string */ -+ return tn; ++#ifdef CONFIG_YAFFS_AUTO_UNICODE ++ YCHAR tmpName[YAFFS_MAX_NAME_LENGTH+1]; ++ memset(tmpName,0,sizeof(tmpName)); ++ yaffs_load_name_from_oh(obj->my_dev,tmpName,oh->name,YAFFS_MAX_NAME_LENGTH+1); ++ yaffs_set_obj_name(obj,tmpName); ++#else ++ yaffs_set_obj_name(obj,oh->name); ++#endif } -static void yaffs_VerifySpecial(yaffs_Object *obj) -+/* FreeTnode frees up a tnode and puts it back on the free list */ -+static void yaffs_FreeTnode(yaffs_Device *dev, yaffs_Tnode *tn) - { +-{ - if (obj && yaffs_SkipVerification(obj->myDev)) - return; -+ yaffs_FreeRawTnode(dev,tn); -+ dev->nTnodes--; -+ dev->nCheckpointBlocksRequired = 0; /* force recalculation*/ - } - +-} +- -static void yaffs_VerifyObject(yaffs_Object *obj) -+static void yaffs_DeinitialiseTnodesAndObjects(yaffs_Device *dev) - { +-{ - yaffs_Device *dev; - - __u32 chunkMin; @@ -4708,37 +5288,32 @@ - - if (!obj) - return; -+ yaffs_DeinitialiseRawTnodesAndObjects(dev); -+ dev->nObjects = 0; -+ dev->nTnodes = 0; -+} - +- - if (obj->beingCreated) - return; ++/*-------------------- TNODES ------------------- - dev = obj->myDev; -+void yaffs_LoadLevel0Tnode(yaffs_Device *dev, yaffs_Tnode *tn, unsigned pos, -+ unsigned val) -+{ -+ __u32 *map = (__u32 *)tn; -+ __u32 bitInMap; -+ __u32 bitInWord; -+ __u32 wordInMap; -+ __u32 mask; ++ * List of spare tnodes ++ * The list is hooked together using the first pointer ++ * in the tnode. ++ */ - if (yaffs_SkipVerification(dev)) - return; -+ pos &= YAFFS_TNODES_LEVEL0_MASK; -+ val >>= dev->chunkGroupBits; - /* Check sane object header chunk */ -+ bitInMap = pos * dev->tnodeWidth; -+ wordInMap = bitInMap / 32; -+ bitInWord = bitInMap & (32 - 1); ++yaffs_tnode_t *yaffs_get_tnode(yaffs_dev_t *dev) ++{ ++ yaffs_tnode_t *tn = yaffs_alloc_raw_tnode(dev); ++ if (tn){ ++ memset(tn, 0, dev->tnode_size); ++ dev->n_tnodes++; ++ } - chunkMin = dev->internalStartBlock * dev->nChunksPerBlock; - chunkMax = (dev->internalEndBlock+1) * dev->nChunksPerBlock - 1; -+ mask = dev->tnodeMask << bitInWord; ++ dev->checkpoint_blocks_required = 0; /* force recalculation*/ - chunkInRange = (((unsigned)(obj->hdrChunk)) >= chunkMin && ((unsigned)(obj->hdrChunk)) <= chunkMax); - chunkIdOk = chunkInRange || obj->hdrChunk == 0; @@ -4747,8 +5322,8 @@ - obj->hdrChunk / dev->nChunksPerBlock, - obj->hdrChunk % dev->nChunksPerBlock); - chunkShouldNotBeDeleted = chunkInRange && !chunkValid; -+ map[wordInMap] &= ~mask; -+ map[wordInMap] |= (mask & (val << bitInWord)); ++ return tn; ++} - if (!obj->fake && - (!chunkIdOk || chunkShouldNotBeDeleted)) { @@ -4757,42 +5332,48 @@ - obj->objectId, obj->hdrChunk, - chunkIdOk ? "" : ",out of range", - chunkShouldNotBeDeleted ? ",marked as deleted" : "")); -+ if (dev->tnodeWidth > (32 - bitInWord)) { -+ bitInWord = (32 - bitInWord); -+ wordInMap++;; -+ mask = dev->tnodeMask >> (/*dev->tnodeWidth -*/ bitInWord); -+ map[wordInMap] &= ~mask; -+ map[wordInMap] |= (mask & (val >> bitInWord)); - } +- } ++/* FreeTnode frees up a tnode and puts it back on the free list */ ++static void yaffs_free_tnode(yaffs_dev_t *dev, yaffs_tnode_t *tn) ++{ ++ yaffs_free_raw_tnode(dev,tn); ++ dev->n_tnodes--; ++ dev->checkpoint_blocks_required = 0; /* force recalculation*/ +} - if (chunkValid && !yaffs_SkipNANDVerification(dev)) { - yaffs_ExtendedTags tags; - yaffs_ObjectHeader *oh; - __u8 *buffer = yaffs_GetTempBuffer(dev, __LINE__); -- ++static void yaffs_deinit_tnodes_and_objs(yaffs_dev_t *dev) ++{ ++ yaffs_deinit_raw_tnodes_and_objs(dev); ++ dev->n_obj = 0; ++ dev->n_tnodes = 0; ++} + - oh = (yaffs_ObjectHeader *)buffer; -+__u32 yaffs_GetChunkGroupBase(yaffs_Device *dev, yaffs_Tnode *tn, -+ unsigned pos) + +- yaffs_ReadChunkWithTagsFromNAND(dev, obj->hdrChunk, buffer, +- &tags); ++void yaffs_load_tnode_0(yaffs_dev_t *dev, yaffs_tnode_t *tn, unsigned pos, ++ unsigned val) +{ + __u32 *map = (__u32 *)tn; + __u32 bitInMap; + __u32 bitInWord; + __u32 wordInMap; -+ __u32 val; - -- yaffs_ReadChunkWithTagsFromNAND(dev, obj->hdrChunk, buffer, -- &tags); -+ pos &= YAFFS_TNODES_LEVEL0_MASK; ++ __u32 mask; - yaffs_VerifyObjectHeader(obj, oh, &tags, 1); -+ bitInMap = pos * dev->tnodeWidth; -+ wordInMap = bitInMap / 32; -+ bitInWord = bitInMap & (32 - 1); ++ pos &= YAFFS_TNODES_LEVEL0_MASK; ++ val >>= dev->chunk_grp_bits; - yaffs_ReleaseTempBuffer(dev, buffer, __LINE__); - } -+ val = map[wordInMap] >> bitInWord; ++ bitInMap = pos * dev->tnode_width; ++ wordInMap = bitInMap / 32; ++ bitInWord = bitInMap & (32 - 1); - /* Verify it has a parent */ - if (obj && !obj->fake && @@ -4800,11 +5381,8 @@ - T(YAFFS_TRACE_VERIFY, - (TSTR("Obj %d has parent pointer %p which does not look like an object"TENDSTR), - obj->objectId, obj->parent)); -+ if (dev->tnodeWidth > (32 - bitInWord)) { -+ bitInWord = (32 - bitInWord); -+ wordInMap++;; -+ val |= (map[wordInMap] << bitInWord); - } +- } ++ mask = dev->tnode_mask << bitInWord; - /* Verify parent is a directory */ - if (obj->parent && obj->parent->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) { @@ -4812,8 +5390,8 @@ - (TSTR("Obj %d's parent is not a directory (type %d)"TENDSTR), - obj->objectId, obj->parent->variantType)); - } -+ val &= dev->tnodeMask; -+ val <<= dev->chunkGroupBits; ++ map[wordInMap] &= ~mask; ++ map[wordInMap] |= (mask & (val << bitInWord)); - switch (obj->variantType) { - case YAFFS_OBJECT_TYPE_FILE: @@ -4837,39 +5415,36 @@ - (TSTR("Obj %d has illegaltype %d"TENDSTR), - obj->objectId, obj->variantType)); - break; -- } -+ return val; ++ if (dev->tnode_width > (32 - bitInWord)) { ++ bitInWord = (32 - bitInWord); ++ wordInMap++;; ++ mask = dev->tnode_mask >> (/*dev->tnode_width -*/ bitInWord); ++ map[wordInMap] &= ~mask; ++ map[wordInMap] |= (mask & (val >> bitInWord)); + } } -static void yaffs_VerifyObjects(yaffs_Device *dev) -+/* ------------------- End of individual tnode manipulation -----------------*/ -+ -+/* ---------Functions to manipulate the look-up tree (made up of tnodes) ------ -+ * The look up tree is represented by the top tnode and the number of topLevel -+ * in the tree. 0 means only the level 0 tnode is in the tree. -+ */ -+ -+/* FindLevel0Tnode finds the level 0 tnode, if one exists. */ -+yaffs_Tnode *yaffs_FindLevel0Tnode(yaffs_Device *dev, -+ yaffs_FileStructure *fStruct, -+ __u32 chunkId) ++__u32 yaffs_get_group_base(yaffs_dev_t *dev, yaffs_tnode_t *tn, ++ unsigned pos) { - yaffs_Object *obj; - int i; - struct ylist_head *lh; -+ yaffs_Tnode *tn = fStruct->top; -+ __u32 i; -+ int requiredTallness; -+ int level = fStruct->topLevel; ++ __u32 *map = (__u32 *)tn; ++ __u32 bitInMap; ++ __u32 bitInWord; ++ __u32 wordInMap; ++ __u32 val; - if (yaffs_SkipVerification(dev)) - return; -+ dev=dev; ++ pos &= YAFFS_TNODES_LEVEL0_MASK; - /* Iterate through the objects in each hash entry */ -+ /* Check sane level and chunk Id */ -+ if (level < 0 || level > YAFFS_TNODES_MAX_LEVEL) -+ return NULL; ++ bitInMap = pos * dev->tnode_width; ++ wordInMap = bitInMap / 32; ++ bitInWord = bitInMap & (32 - 1); - for (i = 0; i < YAFFS_NOBJECT_BUCKETS; i++) { - ylist_for_each(lh, &dev->objectBucket[i].list) { @@ -4878,81 +5453,66 @@ - yaffs_VerifyObject(obj); - } - } -+ if (chunkId > YAFFS_MAX_CHUNK_ID) -+ return NULL; -+ -+ /* First check we're tall enough (ie enough topLevel) */ -+ -+ i = chunkId >> YAFFS_TNODES_LEVEL0_BITS; -+ requiredTallness = 0; -+ while (i) { -+ i >>= YAFFS_TNODES_INTERNAL_BITS; -+ requiredTallness++; - } +- } -} ++ val = map[wordInMap] >> bitInWord; -+ if (requiredTallness > fStruct->topLevel) -+ return NULL; /* Not tall enough, so we can't find it */ ++ if (dev->tnode_width > (32 - bitInWord)) { ++ bitInWord = (32 - bitInWord); ++ wordInMap++;; ++ val |= (map[wordInMap] << bitInWord); ++ } -/* - * Simple hash function. Needs to have a reasonable spread - */ -+ /* Traverse down to level 0 */ -+ while (level > 0 && tn) { -+ tn = tn->internal[(chunkId >> -+ (YAFFS_TNODES_LEVEL0_BITS + -+ (level - 1) * -+ YAFFS_TNODES_INTERNAL_BITS)) & -+ YAFFS_TNODES_INTERNAL_MASK]; -+ level--; -+ } ++ val &= dev->tnode_mask; ++ val <<= dev->chunk_grp_bits; -static Y_INLINE int yaffs_HashFunction(int n) -{ - n = abs(n); - return n % YAFFS_NOBJECT_BUCKETS; -+ return tn; ++ return val; } -/* - * Access functions to useful fake objects. - * Note that root might have a presence in NAND if permissions are set. -+/* AddOrFindLevel0Tnode finds the level 0 tnode if it exists, otherwise first expands the tree. -+ * This happens in two steps: -+ * 1. If the tree isn't tall enough, then make it taller. -+ * 2. Scan down the tree towards the level 0 tnode adding tnodes if required. -+ * -+ * Used when modifying the tree. -+ * -+ * If the tn argument is NULL, then a fresh tnode will be added otherwise the specified tn will -+ * be plugged into the ttree. ++/* ------------------- End of individual tnode manipulation -----------------*/ ++ ++/* ---------Functions to manipulate the look-up tree (made up of tnodes) ------ ++ * The look up tree is represented by the top tnode and the number of top_level ++ * in the tree. 0 means only the level 0 tnode is in the tree. */ -yaffs_Object *yaffs_Root(yaffs_Device *dev) -+yaffs_Tnode *yaffs_AddOrFindLevel0Tnode(yaffs_Device *dev, -+ yaffs_FileStructure *fStruct, -+ __u32 chunkId, -+ yaffs_Tnode *passedTn) ++/* FindLevel0Tnode finds the level 0 tnode, if one exists. */ ++yaffs_tnode_t *yaffs_find_tnode_0(yaffs_dev_t *dev, ++ yaffs_file_s *file_struct, ++ __u32 chunk_id) { - return dev->rootDir; -} ++ yaffs_tnode_t *tn = file_struct->top; ++ __u32 i; + int requiredTallness; -+ int i; -+ int l; -+ yaffs_Tnode *tn; ++ int level = file_struct->top_level; -yaffs_Object *yaffs_LostNFound(yaffs_Device *dev) -{ - return dev->lostNFoundDir; -} -+ __u32 x; ++ dev=dev; ++ /* Check sane level and chunk Id */ ++ if (level < 0 || level > YAFFS_TNODES_MAX_LEVEL) ++ return NULL; -/* - * Erased NAND checking functions - */ -+ /* Check sane level and page Id */ -+ if (fStruct->topLevel < 0 || fStruct->topLevel > YAFFS_TNODES_MAX_LEVEL) ++ if (chunk_id > YAFFS_MAX_CHUNK_ID) + return NULL; -int yaffs_CheckFF(__u8 *buffer, int nBytes) @@ -4962,10 +5522,17 @@ - if (*buffer != 0xFF) - return 0; - buffer++; -- } ++ /* First check we're tall enough (ie enough top_level) */ ++ ++ i = chunk_id >> YAFFS_TNODES_LEVEL0_BITS; ++ requiredTallness = 0; ++ while (i) { ++ i >>= YAFFS_TNODES_INTERNAL_BITS; ++ requiredTallness++; + } - return 1; -} -- + -static int yaffs_CheckChunkErased(struct yaffs_DeviceStruct *dev, - int chunkInNAND) -{ @@ -4973,24 +5540,61 @@ - __u8 *data = yaffs_GetTempBuffer(dev, __LINE__); - yaffs_ExtendedTags tags; - int result; -- ++ if (requiredTallness > file_struct->top_level) ++ return NULL; /* Not tall enough, so we can't find it */ ++ ++ /* Traverse down to level 0 */ ++ while (level > 0 && tn) { ++ tn = tn->internal[(chunk_id >> ++ (YAFFS_TNODES_LEVEL0_BITS + ++ (level - 1) * ++ YAFFS_TNODES_INTERNAL_BITS)) & ++ YAFFS_TNODES_INTERNAL_MASK]; ++ level--; ++ } + - result = yaffs_ReadChunkWithTagsFromNAND(dev, chunkInNAND, data, &tags); -- ++ return tn; ++} + - if (tags.eccResult > YAFFS_ECC_RESULT_NO_ERROR) - retval = YAFFS_FAIL; -- ++/* AddOrFindLevel0Tnode finds the level 0 tnode if it exists, otherwise first expands the tree. ++ * This happens in two steps: ++ * 1. If the tree isn't tall enough, then make it taller. ++ * 2. Scan down the tree towards the level 0 tnode adding tnodes if required. ++ * ++ * Used when modifying the tree. ++ * ++ * If the tn argument is NULL, then a fresh tnode will be added otherwise the specified tn will ++ * be plugged into the ttree. ++ */ + - if (!yaffs_CheckFF(data, dev->nDataBytesPerChunk) || tags.chunkUsed) { - T(YAFFS_TRACE_NANDACCESS, - (TSTR("Chunk %d not erased" TENDSTR), chunkInNAND)); - retval = YAFFS_FAIL; - } -- ++yaffs_tnode_t *yaffs_add_find_tnode_0(yaffs_dev_t *dev, ++ yaffs_file_s *file_struct, ++ __u32 chunk_id, ++ yaffs_tnode_t *passed_tn) ++{ ++ int requiredTallness; ++ int i; ++ int l; ++ yaffs_tnode_t *tn; + - yaffs_ReleaseTempBuffer(dev, data, __LINE__); -- ++ __u32 x; + - return retval; -- + -} -- ++ /* Check sane level and page Id */ ++ if (file_struct->top_level < 0 || file_struct->top_level > YAFFS_TNODES_MAX_LEVEL) ++ return NULL; + -static int yaffs_WriteNewChunkWithTagsToNAND(struct yaffs_DeviceStruct *dev, - const __u8 *data, - yaffs_ExtendedTags *tags, @@ -4999,19 +5603,28 @@ - int attempts = 0; - int writeOk = 0; - int chunk; -- ++ if (chunk_id > YAFFS_MAX_CHUNK_ID) ++ return NULL; + - yaffs_InvalidateCheckpoint(dev); -- ++ /* First check we're tall enough (ie enough top_level) */ + - do { - yaffs_BlockInfo *bi = 0; - int erasedOk = 0; -- ++ x = chunk_id >> YAFFS_TNODES_LEVEL0_BITS; ++ requiredTallness = 0; ++ while (x) { ++ x >>= YAFFS_TNODES_INTERNAL_BITS; ++ requiredTallness++; ++ } + - chunk = yaffs_AllocateChunk(dev, useReserve, &bi); - if (chunk < 0) { - /* no space */ - break; - } -- + - /* First check this chunk is erased, if it needs - * checking. The checking policy (unless forced - * always on) is as follows: @@ -5036,26 +5649,38 @@ - /* try another chunk */ - continue; - } -- ++ if (requiredTallness > file_struct->top_level) { ++ /* Not tall enough, gotta make the tree taller */ ++ for (i = file_struct->top_level; i < requiredTallness; i++) { + - /* let's give it a try */ - attempts++; -- ++ tn = yaffs_get_tnode(dev); + -#ifdef CONFIG_YAFFS_ALWAYS_CHECK_CHUNK_ERASED - bi->skipErasedCheck = 0; -#endif - if (!bi->skipErasedCheck) { - erasedOk = yaffs_CheckChunkErased(dev, chunk); - if (erasedOk != YAFFS_OK) { -- T(YAFFS_TRACE_ERROR, ++ if (tn) { ++ tn->internal[0] = file_struct->top; ++ file_struct->top = tn; ++ file_struct->top_level++; ++ } else { + T(YAFFS_TRACE_ERROR, - (TSTR("**>> yaffs chunk %d was not erased" - TENDSTR), chunk)); - - /* try another chunk */ - continue; -- } ++ (TSTR("yaffs: no more tnodes" TENDSTR))); ++ return NULL; + } - bi->skipErasedCheck = 1; -- } -- + } ++ } + - writeOk = yaffs_WriteChunkWithTagsToNAND(dev, chunk, - data, tags); - if (writeOk != YAFFS_OK) { @@ -5063,37 +5688,99 @@ - /* try another chunk */ - continue; - } -- ++ /* Traverse down to level 0, adding anything we need */ + - /* Copy the data into the robustification buffer */ - yaffs_HandleWriteChunkOk(dev, chunk, data, tags); -- ++ l = file_struct->top_level; ++ tn = file_struct->top; + - } while (writeOk != YAFFS_OK && - (yaffs_wr_attempts <= 0 || attempts <= yaffs_wr_attempts)); -- ++ if (l > 0) { ++ while (l > 0 && tn) { ++ x = (chunk_id >> ++ (YAFFS_TNODES_LEVEL0_BITS + ++ (l - 1) * YAFFS_TNODES_INTERNAL_BITS)) & ++ YAFFS_TNODES_INTERNAL_MASK; + - if (!writeOk) - chunk = -1; -- + - if (attempts > 1) { - T(YAFFS_TRACE_ERROR, - (TSTR("**>> yaffs write required %d attempts" TENDSTR), - attempts)); -- ++ if ((l > 1) && !tn->internal[x]) { ++ /* Add missing non-level-zero tnode */ ++ tn->internal[x] = yaffs_get_tnode(dev); ++ if(!tn->internal[x]) ++ return NULL; ++ } else if (l == 1) { ++ /* Looking from level 1 at level 0 */ ++ if (passed_tn) { ++ /* If we already have one, then release it.*/ ++ if (tn->internal[x]) ++ yaffs_free_tnode(dev, tn->internal[x]); ++ tn->internal[x] = passed_tn; ++ ++ } else if (!tn->internal[x]) { ++ /* Don't have one, none passed in */ ++ tn->internal[x] = yaffs_get_tnode(dev); ++ if(!tn->internal[x]) ++ return NULL; ++ } ++ } + - dev->nRetriedWrites += (attempts - 1); -- } -- ++ tn = tn->internal[x]; ++ l--; ++ } ++ } else { ++ /* top is level 0 */ ++ if (passed_tn) { ++ memcpy(tn, passed_tn, (dev->tnode_width * YAFFS_NTNODES_LEVEL0)/8); ++ yaffs_free_tnode(dev, passed_tn); ++ } + } + - return chunk; --} -- ++ return tn; + } + -/* - * Block retiring for handling a broken block. - */ - -static void yaffs_RetireBlock(yaffs_Device *dev, int blockInNAND) --{ ++static int yaffs_find_chunk_in_group(yaffs_dev_t *dev, int theChunk, ++ yaffs_ext_tags *tags, int obj_id, ++ int inode_chunk) + { - yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, blockInNAND); -- ++ int j; + - yaffs_InvalidateCheckpoint(dev); -- ++ for (j = 0; theChunk && j < dev->chunk_grp_size; j++) { ++ if (yaffs_check_chunk_bit(dev, theChunk / dev->param.chunks_per_block, ++ theChunk % dev->param.chunks_per_block)) { ++ ++ if(dev->chunk_grp_size == 1) ++ return theChunk; ++ else { ++ yaffs_rd_chunk_tags_nand(dev, theChunk, NULL, ++ tags); ++ if (yaffs_tags_match(tags, obj_id, inode_chunk)) { ++ /* found it; */ ++ return theChunk; ++ } ++ } ++ } ++ theChunk++; ++ } ++ return -1; ++} + - if (yaffs_MarkBlockBad(dev, blockInNAND) != YAFFS_OK) { - if (yaffs_EraseBlockInNAND(dev, blockInNAND) != YAFFS_OK) { - T(YAFFS_TRACE_ALWAYS, (TSTR( @@ -5102,9 +5789,25 @@ - } else { - yaffs_ExtendedTags tags; - int chunkId = blockInNAND * dev->nChunksPerBlock; -- ++#if 0 ++/* Experimental code not being used yet. Might speed up file deletion */ ++/* DeleteWorker scans backwards through the tnode tree and deletes all the ++ * chunks and tnodes in the file. ++ * Returns 1 if the tree was deleted. ++ * Returns 0 if it stopped early due to hitting the limit and the delete is incomplete. ++ */ + - __u8 *buffer = yaffs_GetTempBuffer(dev, __LINE__); -- ++static int yaffs_del_worker(yaffs_obj_t *in, yaffs_tnode_t *tn, __u32 level, ++ int chunk_offset, int *limit) ++{ ++ int i; ++ int inode_chunk; ++ int theChunk; ++ yaffs_ext_tags tags; ++ int foundChunk; ++ yaffs_dev_t *dev = in->my_dev; + - memset(buffer, 0xff, dev->nDataBytesPerChunk); - yaffs_InitialiseTags(&tags); - tags.sequenceNumber = YAFFS_SEQUENCE_BAD_BLOCK; @@ -5113,80 +5816,208 @@ - T(YAFFS_TRACE_ALWAYS, (TSTR("yaffs: Failed to " - TCONT("write bad block marker to block %d") - TENDSTR), blockInNAND)); -- ++ int allDone = 1; + - yaffs_ReleaseTempBuffer(dev, buffer, __LINE__); - } - } -- ++ if (tn) { ++ if (level > 0) { ++ for (i = YAFFS_NTNODES_INTERNAL - 1; allDone && i >= 0; ++ i--) { ++ if (tn->internal[i]) { ++ if (limit && (*limit) < 0) { ++ allDone = 0; ++ } else { ++ allDone = ++ yaffs_del_worker(in, ++ tn-> ++ internal ++ [i], ++ level - ++ 1, ++ (chunk_offset ++ << ++ YAFFS_TNODES_INTERNAL_BITS) ++ + i, ++ limit); ++ } ++ if (allDone) { ++ yaffs_free_tnode(dev, ++ tn-> ++ internal[i]); ++ tn->internal[i] = NULL; ++ } ++ } ++ } ++ return (allDone) ? 1 : 0; ++ } else if (level == 0) { ++ int hitLimit = 0; + - bi->blockState = YAFFS_BLOCK_STATE_DEAD; - bi->gcPrioritise = 0; - bi->needsRetiring = 0; -- ++ for (i = YAFFS_NTNODES_LEVEL0 - 1; i >= 0 && !hitLimit; ++ i--) { ++ theChunk = yaffs_get_group_base(dev, tn, i); ++ if (theChunk) { + - dev->nRetiredBlocks++; -} -- ++ inode_chunk = (chunk_offset << ++ YAFFS_TNODES_LEVEL0_BITS) + i; + -/* - * Functions for robustisizing TODO - * - */ -- ++ foundChunk = ++ yaffs_find_chunk_in_group(dev, ++ theChunk, ++ &tags, ++ in->obj_id, ++ inode_chunk); + -static void yaffs_HandleWriteChunkOk(yaffs_Device *dev, int chunkInNAND, - const __u8 *data, - const yaffs_ExtendedTags *tags) -{ -} -- ++ if (foundChunk > 0) { ++ yaffs_chunk_del(dev, ++ foundChunk, 1, ++ __LINE__); ++ in->n_data_chunks--; ++ if (limit) { ++ *limit = *limit - 1; ++ if (*limit <= 0) ++ hitLimit = 1; ++ } + -static void yaffs_HandleUpdateChunk(yaffs_Device *dev, int chunkInNAND, - const yaffs_ExtendedTags *tags) -{ -} -- ++ } + -void yaffs_HandleChunkError(yaffs_Device *dev, yaffs_BlockInfo *bi) -{ - if (!bi->gcPrioritise) { - bi->gcPrioritise = 1; - dev->hasPendingPrioritisedGCs = 1; - bi->chunkErrorStrikes++; -- ++ yaffs_load_tnode_0(dev, tn, i, 0); ++ } + - if (bi->chunkErrorStrikes > 3) { - bi->needsRetiring = 1; /* Too many stikes, so retire this */ - T(YAFFS_TRACE_ALWAYS, (TSTR("yaffs: Block struck out" TENDSTR))); -- -- } -- } --} -- ++ } ++ return (i < 0) ? 1 : 0; + + } ++ + } ++ ++ return 1; ++ + } + -static void yaffs_HandleWriteChunkError(yaffs_Device *dev, int chunkInNAND, - int erasedOk) --{ ++#endif ++ ++static void yaffs_soft_del_chunk(yaffs_dev_t *dev, int chunk) + { - int blockInNAND = chunkInNAND / dev->nChunksPerBlock; - yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, blockInNAND); -- ++ yaffs_block_info_t *theBlock; ++ unsigned block_no; + - yaffs_HandleChunkError(dev, bi); -- ++ T(YAFFS_TRACE_DELETION, (TSTR("soft delete chunk %d" TENDSTR), chunk)); + - if (erasedOk) { - /* Was an actual write failure, so mark the block for retirement */ - bi->needsRetiring = 1; - T(YAFFS_TRACE_ERROR | YAFFS_TRACE_BAD_BLOCKS, - (TSTR("**>> Block %d needs retiring" TENDSTR), blockInNAND)); -- } ++ block_no = chunk / dev->param.chunks_per_block; ++ theBlock = yaffs_get_block_info(dev, block_no); ++ if (theBlock) { ++ theBlock->soft_del_pages++; ++ dev->n_free_chunks++; ++ yaffs2_update_oldest_dirty_seq(dev, block_no, theBlock); + } - - /* Delete the chunk */ - yaffs_DeleteChunk(dev, chunkInNAND, 1, __LINE__); --} -- -- + } + ++/* SoftDeleteWorker scans backwards through the tnode tree and soft deletes all the chunks in the file. ++ * All soft deleting does is increment the block's softdelete count and pulls the chunk out ++ * of the tnode. ++ * Thus, essentially this is the same as DeleteWorker except that the chunks are soft deleted. ++ */ + -/*---------------- Name handling functions ------------*/ - -static __u16 yaffs_CalcNameSum(const YCHAR *name) --{ ++static int yaffs_soft_del_worker(yaffs_obj_t *in, yaffs_tnode_t *tn, ++ __u32 level, int chunk_offset) + { - __u16 sum = 0; - __u16 i = 1; -- ++ int i; ++ int theChunk; ++ int allDone = 1; ++ yaffs_dev_t *dev = in->my_dev; + - const YUCHAR *bname = (const YUCHAR *) name; - if (bname) { - while ((*bname) && (i < (YAFFS_MAX_NAME_LENGTH/2))) { -- ++ if (tn) { ++ if (level > 0) { ++ ++ for (i = YAFFS_NTNODES_INTERNAL - 1; allDone && i >= 0; ++ i--) { ++ if (tn->internal[i]) { ++ allDone = ++ yaffs_soft_del_worker(in, ++ tn-> ++ internal[i], ++ level - 1, ++ (chunk_offset ++ << ++ YAFFS_TNODES_INTERNAL_BITS) ++ + i); ++ if (allDone) { ++ yaffs_free_tnode(dev, ++ tn-> ++ internal[i]); ++ tn->internal[i] = NULL; ++ } else { ++ /* Hoosterman... how could this happen? */ ++ } ++ } ++ } ++ return (allDone) ? 1 : 0; ++ } else if (level == 0) { ++ ++ for (i = YAFFS_NTNODES_LEVEL0 - 1; i >= 0; i--) { ++ theChunk = yaffs_get_group_base(dev, tn, i); ++ if (theChunk) { ++ /* Note this does not find the real chunk, only the chunk group. ++ * We make an assumption that a chunk group is not larger than ++ * a block. ++ */ ++ yaffs_soft_del_chunk(dev, theChunk); ++ yaffs_load_tnode_0(dev, tn, i, 0); ++ } ++ ++ } ++ return 1; + -#ifdef CONFIG_YAFFS_CASE_INSENSITIVE - sum += yaffs_toupper(*bname) * i; -#else @@ -5194,13 +6025,18 @@ -#endif - i++; - bname++; -- } -- } + } ++ + } - return sum; --} -- ++ ++ return 1; ++ + } + -static void yaffs_SetObjectName(yaffs_Object *obj, const YCHAR *name) --{ ++static void yaffs_soft_del_file(yaffs_obj_t *obj) + { -#ifdef CONFIG_YAFFS_SHORT_NAMES_IN_RAM - memset(obj->shortName, 0, sizeof(YCHAR) * (YAFFS_SHORT_NAME_LENGTH+1)); - if (name && yaffs_strlen(name) <= YAFFS_SHORT_NAME_LENGTH) @@ -5209,8 +6045,27 @@ - obj->shortName[0] = _Y('\0'); -#endif - obj->sum = yaffs_CalcNameSum(name); --} -- ++ if (obj->deleted && ++ obj->variant_type == YAFFS_OBJECT_TYPE_FILE && !obj->soft_del) { ++ if (obj->n_data_chunks <= 0) { ++ /* Empty file with no duplicate object headers, just delete it immediately */ ++ yaffs_free_tnode(obj->my_dev, ++ obj->variant.file_variant.top); ++ obj->variant.file_variant.top = NULL; ++ T(YAFFS_TRACE_TRACING, ++ (TSTR("yaffs: Deleting empty file %d" TENDSTR), ++ obj->obj_id)); ++ yaffs_generic_obj_del(obj); ++ } else { ++ yaffs_soft_del_worker(obj, ++ obj->variant.file_variant.top, ++ obj->variant.file_variant. ++ top_level, 0); ++ obj->soft_del = 1; ++ } ++ } + } + -/*-------------------- TNODES ------------------- - - * List of spare tnodes @@ -5221,39 +6076,81 @@ -/* yaffs_CreateTnodes creates a bunch more tnodes and - * adds them to the tnode free list. - * Don't use this function directly -- */ -- ++/* Pruning removes any part of the file structure tree that is beyond the ++ * bounds of the file (ie that does not point to chunks). ++ * ++ * A file should only get pruned when its size is reduced. ++ * ++ * Before pruning, the chunks must be pulled from the tree and the ++ * level 0 tnode entries must be zeroed out. ++ * Could also use this for file deletion, but that's probably better handled ++ * by a special case. ++ * ++ * This function is recursive. For levels > 0 the function is called again on ++ * any sub-tree. For level == 0 we just check if the sub-tree has data. ++ * If there is no data in a subtree then it is pruned. + */ + -static int yaffs_CreateTnodes(yaffs_Device *dev, int nTnodes) --{ -- int i; ++static yaffs_tnode_t *yaffs_prune_worker(yaffs_dev_t *dev, yaffs_tnode_t *tn, ++ __u32 level, int del0) + { + int i; - int tnodeSize; - yaffs_Tnode *newTnodes; - __u8 *mem; - yaffs_Tnode *curr; - yaffs_Tnode *next; - yaffs_TnodeList *tnl; -- ++ int hasData; + - if (nTnodes < 1) - return YAFFS_OK; -- ++ if (tn) { ++ hasData = 0; + - /* Calculate the tnode size in bytes for variable width tnode support. - * Must be a multiple of 32-bits */ - tnodeSize = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8; -- ++ if(level > 0){ ++ for (i = 0; i < YAFFS_NTNODES_INTERNAL; i++) { ++ if (tn->internal[i]) { ++ tn->internal[i] = ++ yaffs_prune_worker(dev, tn->internal[i], ++ level - 1, ++ (i == 0) ? del0 : 1); ++ } + - if (tnodeSize < sizeof(yaffs_Tnode)) - tnodeSize = sizeof(yaffs_Tnode); -- ++ if (tn->internal[i]) ++ hasData++; ++ } ++ } else { ++ int tnode_size_u32 = dev->tnode_size/sizeof(__u32); ++ __u32 *map = (__u32 *)tn; + - /* make these things */ -- ++ for(i = 0; !hasData && i < tnode_size_u32; i++){ ++ if(map[i]) ++ hasData++; ++ } ++ } + - newTnodes = YMALLOC(nTnodes * tnodeSize); - mem = (__u8 *)newTnodes; -- ++ if (hasData == 0 && del0) { ++ /* Free and return NULL */ + - if (!newTnodes) { - T(YAFFS_TRACE_ERROR, - (TSTR("yaffs: Could not allocate Tnodes" TENDSTR))); - return YAFFS_FAIL; - } -- ++ yaffs_free_tnode(dev, tn); ++ tn = NULL; ++ } + - /* Hook them into the free list */ -#if 0 - for (i = 0; i < nTnodes - 1; i++) { @@ -5261,8 +6158,8 @@ -#ifdef CONFIG_YAFFS_TNODE_LIST_DEBUG - newTnodes[i].internal[YAFFS_NTNODES_INTERNAL] = (void *)1; -#endif -- } -- + } + - newTnodes[nTnodes - 1].internal[0] = dev->freeTnodes; -#ifdef CONFIG_YAFFS_TNODE_LIST_DEBUG - newTnodes[nTnodes - 1].internal[YAFFS_NTNODES_INTERNAL] = (void *)1; @@ -5275,22 +6172,48 @@ - next = (yaffs_Tnode *) &mem[(i+1) * tnodeSize]; - curr->internal[0] = next; - } -- ++ return tn; + - curr = (yaffs_Tnode *) &mem[(nTnodes - 1) * tnodeSize]; - curr->internal[0] = dev->freeTnodes; - dev->freeTnodes = (yaffs_Tnode *)mem; -- ++} + -#endif -- -- ++static int yaffs_prune_tree(yaffs_dev_t *dev, ++ yaffs_file_s *file_struct) ++{ ++ int i; ++ int hasData; ++ int done = 0; ++ yaffs_tnode_t *tn; + ++ if (file_struct->top_level > 0) { ++ file_struct->top = ++ yaffs_prune_worker(dev, file_struct->top, file_struct->top_level, 0); ++ ++ /* Now we have a tree with all the non-zero branches NULL but the height ++ * is the same as it was. ++ * Let's see if we can trim internal tnodes to shorten the tree. ++ * We can do this if only the 0th element in the tnode is in use ++ * (ie all the non-zero are NULL) ++ */ + - dev->nFreeTnodes += nTnodes; - dev->nTnodesCreated += nTnodes; -- ++ while (file_struct->top_level && !done) { ++ tn = file_struct->top; + - /* Now add this bunch of tnodes to a list for freeing up. - * NB If we can't add this to the management list it isn't fatal - * but it just means we can't free this bunch of tnodes later. - */ -- ++ hasData = 0; ++ for (i = 1; i < YAFFS_NTNODES_INTERNAL; i++) { ++ if (tn->internal[i]) ++ hasData++; ++ } + - tnl = YMALLOC(sizeof(yaffs_TnodeList)); - if (!tnl) { - T(YAFFS_TRACE_ERROR, @@ -5301,19 +6224,32 @@ - tnl->tnodes = newTnodes; - tnl->next = dev->allocatedTnodeList; - dev->allocatedTnodeList = tnl; -- } -- ++ if (!hasData) { ++ file_struct->top = tn->internal[0]; ++ file_struct->top_level--; ++ yaffs_free_tnode(dev, tn); ++ } else { ++ done = 1; ++ } ++ } + } + - T(YAFFS_TRACE_ALLOCATE, (TSTR("yaffs: Tnodes added" TENDSTR))); - -- return YAFFS_OK; --} -- + return YAFFS_OK; + } + -/* GetTnode gets us a clean tnode. Tries to make allocate more if we run out */ -- ++/*-------------------- End of File Structure functions.-------------------*/ ++ + -static yaffs_Tnode *yaffs_GetTnodeRaw(yaffs_Device *dev) --{ ++/* AllocateEmptyObject gets us a clean Object. Tries to make allocate more if we run out */ ++static yaffs_obj_t *yaffs_alloc_empty_obj(yaffs_dev_t *dev) + { - yaffs_Tnode *tn = NULL; -- ++ yaffs_obj_t *obj = yaffs_alloc_raw_obj(dev); + - /* If there are none left make more */ - if (!dev->freeTnodes) - yaffs_CreateTnodes(dev, YAFFS_ALLOCATION_NTNODES); @@ -5330,29 +6266,60 @@ - dev->freeTnodes = dev->freeTnodes->internal[0]; - dev->nFreeTnodes--; - } -- ++ if (obj) { ++ dev->n_obj++; + - dev->nCheckpointBlocksRequired = 0; /* force recalculation*/ -- ++ /* Now sweeten it up... */ + - return tn; -} -- ++ memset(obj, 0, sizeof(yaffs_obj_t)); ++ obj->being_created = 1; + -static yaffs_Tnode *yaffs_GetTnode(yaffs_Device *dev) -{ - yaffs_Tnode *tn = yaffs_GetTnodeRaw(dev); - int tnodeSize = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8; -- ++ obj->my_dev = dev; ++ obj->hdr_chunk = 0; ++ obj->variant_type = YAFFS_OBJECT_TYPE_UNKNOWN; ++ YINIT_LIST_HEAD(&(obj->hard_links)); ++ YINIT_LIST_HEAD(&(obj->hash_link)); ++ YINIT_LIST_HEAD(&obj->siblings); + - if (tnodeSize < sizeof(yaffs_Tnode)) - tnodeSize = sizeof(yaffs_Tnode); -- + - if (tn) - memset(tn, 0, tnodeSize); -- ++ /* Now make the directory sane */ ++ if (dev->root_dir) { ++ obj->parent = dev->root_dir; ++ ylist_add(&(obj->siblings), &dev->root_dir->variant.dir_variant.children); ++ } + - return tn; --} -- ++ /* Add it to the lost and found directory. ++ * NB Can't put root or lostNFound in lostNFound so ++ * check if lostNFound exists first ++ */ ++ if (dev->lost_n_found) ++ yaffs_add_obj_to_dir(dev->lost_n_found, obj); ++ ++ obj->being_created = 0; ++ } ++ ++ dev->checkpoint_blocks_required = 0; /* force recalculation*/ ++ ++ return obj; + } + -/* FreeTnode frees up a tnode and puts it back on the free list */ -static void yaffs_FreeTnode(yaffs_Device *dev, yaffs_Tnode *tn) --{ ++static yaffs_obj_t *yaffs_create_fake_dir(yaffs_dev_t *dev, int number, ++ __u32 mode) + { - if (tn) { -#ifdef CONFIG_YAFFS_TNODE_LIST_DEBUG - if (tn->internal[YAFFS_NTNODES_INTERNAL] != 0) { @@ -5365,40 +6332,90 @@ - tn->internal[0] = dev->freeTnodes; - dev->freeTnodes = tn; - dev->nFreeTnodes++; -- } ++ ++ yaffs_obj_t *obj = ++ yaffs_new_obj(dev, number, YAFFS_OBJECT_TYPE_DIRECTORY); ++ if (obj) { ++ obj->fake = 1; /* it is fake so it might have no NAND presence... */ ++ obj->rename_allowed = 0; /* ... and we're not allowed to rename it... */ ++ obj->unlink_allowed = 0; /* ... or unlink it */ ++ obj->deleted = 0; ++ obj->unlinked = 0; ++ obj->yst_mode = mode; ++ obj->my_dev = dev; ++ obj->hdr_chunk = 0; /* Not a valid chunk. */ ++ } ++ ++ return obj; ++ ++} ++ ++static void yaffs_unhash_obj(yaffs_obj_t *obj) ++{ ++ int bucket; ++ yaffs_dev_t *dev = obj->my_dev; ++ ++ /* If it is still linked into the bucket list, free from the list */ ++ if (!ylist_empty(&obj->hash_link)) { ++ ylist_del_init(&obj->hash_link); ++ bucket = yaffs_hash_fn(obj->obj_id); ++ dev->obj_bucket[bucket].count--; + } - dev->nCheckpointBlocksRequired = 0; /* force recalculation*/ --} -- + } + -static void yaffs_DeinitialiseTnodes(yaffs_Device *dev) --{ ++/* FreeObject frees up a Object and puts it back on the free list */ ++static void yaffs_free_obj(yaffs_obj_t *obj) + { - /* Free the list of allocated tnodes */ - yaffs_TnodeList *tmp; -- ++ yaffs_dev_t *dev = obj->my_dev; ++ ++ T(YAFFS_TRACE_OS, (TSTR("FreeObject %p inode %p"TENDSTR), obj, obj->my_inode)); + - while (dev->allocatedTnodeList) { - tmp = dev->allocatedTnodeList->next; -- ++ if (!obj) ++ YBUG(); ++ if (obj->parent) ++ YBUG(); ++ if (!ylist_empty(&obj->siblings)) ++ YBUG(); + - YFREE(dev->allocatedTnodeList->tnodes); - YFREE(dev->allocatedTnodeList); - dev->allocatedTnodeList = tmp; -- -- } -- + ++ if (obj->my_inode) { ++ /* We're still hooked up to a cached inode. ++ * Don't delete now, but mark for later deletion ++ */ ++ obj->defered_free = 1; ++ return; + } + - dev->freeTnodes = NULL; - dev->nFreeTnodes = 0; -} -- ++ yaffs_unhash_obj(obj); + -static void yaffs_InitialiseTnodes(yaffs_Device *dev) -{ - dev->allocatedTnodeList = NULL; - dev->freeTnodes = NULL; - dev->nFreeTnodes = 0; - dev->nTnodesCreated = 0; --} -- -- ++ yaffs_free_raw_obj(dev,obj); ++ dev->n_obj--; ++ dev->checkpoint_blocks_required = 0; /* force recalculation*/ + } + + -void yaffs_PutLevel0Tnode(yaffs_Device *dev, yaffs_Tnode *tn, unsigned pos, - unsigned val) --{ ++void yaffs_handle_defered_free(yaffs_obj_t *obj) + { - __u32 *map = (__u32 *)tn; - __u32 bitInMap; - __u32 bitInWord; @@ -5407,54 +6424,81 @@ - - pos &= YAFFS_TNODES_LEVEL0_MASK; - val >>= dev->chunkGroupBits; -- ++ if (obj->defered_free) ++ yaffs_free_obj(obj); ++} + - bitInMap = pos * dev->tnodeWidth; - wordInMap = bitInMap / 32; - bitInWord = bitInMap & (32 - 1); -- ++static void yaffs_init_tnodes_and_objs(yaffs_dev_t *dev) ++{ ++ int i; + - mask = dev->tnodeMask << bitInWord; -- ++ dev->n_obj = 0; ++ dev->n_tnodes = 0; + - map[wordInMap] &= ~mask; - map[wordInMap] |= (mask & (val << bitInWord)); -- ++ yaffs_init_raw_tnodes_and_objs(dev); + - if (dev->tnodeWidth > (32 - bitInWord)) { - bitInWord = (32 - bitInWord); - wordInMap++;; - mask = dev->tnodeMask >> (/*dev->tnodeWidth -*/ bitInWord); - map[wordInMap] &= ~mask; - map[wordInMap] |= (mask & (val >> bitInWord)); -- } --} -- ++ for (i = 0; i < YAFFS_NOBJECT_BUCKETS; i++) { ++ YINIT_LIST_HEAD(&dev->obj_bucket[i].list); ++ dev->obj_bucket[i].count = 0; + } + } + -static __u32 yaffs_GetChunkGroupBase(yaffs_Device *dev, yaffs_Tnode *tn, - unsigned pos) --{ ++static int yaffs_find_nice_bucket(yaffs_dev_t *dev) + { - __u32 *map = (__u32 *)tn; - __u32 bitInMap; - __u32 bitInWord; - __u32 wordInMap; - __u32 val; -- ++ int i; ++ int l = 999; ++ int lowest = 999999; + - pos &= YAFFS_TNODES_LEVEL0_MASK; -- + - bitInMap = pos * dev->tnodeWidth; - wordInMap = bitInMap / 32; - bitInWord = bitInMap & (32 - 1); -- ++ /* Search for the shortest list or one that ++ * isn't too long. ++ */ + - val = map[wordInMap] >> bitInWord; -- ++ for (i = 0; i < 10 && lowest > 4; i++) { ++ dev->bucket_finder++; ++ dev->bucket_finder %= YAFFS_NOBJECT_BUCKETS; ++ if (dev->obj_bucket[dev->bucket_finder].count < lowest) { ++ lowest = dev->obj_bucket[dev->bucket_finder].count; ++ l = dev->bucket_finder; ++ } + - if (dev->tnodeWidth > (32 - bitInWord)) { - bitInWord = (32 - bitInWord); - wordInMap++;; - val |= (map[wordInMap] << bitInWord); -- } -- + } + - val &= dev->tnodeMask; - val <<= dev->chunkGroupBits; - - return val; --} -- ++ return l; + } + -/* ------------------- End of individual tnode manipulation -----------------*/ - -/* ---------Functions to manipulate the look-up tree (made up of tnodes) ------ @@ -5466,7 +6510,8 @@ -static yaffs_Tnode *yaffs_FindLevel0Tnode(yaffs_Device *dev, - yaffs_FileStructure *fStruct, - __u32 chunkId) --{ ++static int yaffs_new_obj_id(yaffs_dev_t *dev) + { - yaffs_Tnode *tn = fStruct->top; - __u32 i; - int requiredTallness; @@ -5475,22 +6520,30 @@ - /* Check sane level and chunk Id */ - if (level < 0 || level > YAFFS_TNODES_MAX_LEVEL) - return NULL; -- ++ int bucket = yaffs_find_nice_bucket(dev); + - if (chunkId > YAFFS_MAX_CHUNK_ID) - return NULL; -- ++ /* Now find an object value that has not already been taken ++ * by scanning the list. ++ */ + - /* First check we're tall enough (ie enough topLevel) */ -- ++ int found = 0; ++ struct ylist_head *i; + - i = chunkId >> YAFFS_TNODES_LEVEL0_BITS; - requiredTallness = 0; - while (i) { - i >>= YAFFS_TNODES_INTERNAL_BITS; - requiredTallness++; - } -- ++ __u32 n = (__u32) bucket; + - if (requiredTallness > fStruct->topLevel) - return NULL; /* Not tall enough, so we can't find it */ -- ++ /* yaffs_check_obj_hash_sane(); */ + - /* Traverse down to level 0 */ - while (level > 0 && tn) { - tn = tn->internal[(chunkId >> @@ -5499,11 +6552,24 @@ - YAFFS_TNODES_INTERNAL_BITS)) & - YAFFS_TNODES_INTERNAL_MASK]; - level--; -- } -- ++ while (!found) { ++ found = 1; ++ n += YAFFS_NOBJECT_BUCKETS; ++ if (1 || dev->obj_bucket[bucket].count > 0) { ++ ylist_for_each(i, &dev->obj_bucket[bucket].list) { ++ /* If there is already one in the list */ ++ if (i && ylist_entry(i, yaffs_obj_t, ++ hash_link)->obj_id == n) { ++ found = 0; ++ } ++ } ++ } + } + - return tn; --} -- ++ return n; + } + -/* AddOrFindLevel0Tnode finds the level 0 tnode if it exists, otherwise first expands the tree. - * This happens in two steps: - * 1. If the tree isn't tall enough, then make it taller. @@ -5519,38 +6585,69 @@ - yaffs_FileStructure *fStruct, - __u32 chunkId, - yaffs_Tnode *passedTn) --{ ++static void yaffs_hash_obj(yaffs_obj_t *in) + { - int requiredTallness; - int i; - int l; - yaffs_Tnode *tn; - - __u32 x; -- -- ++ int bucket = yaffs_hash_fn(in->obj_id); ++ yaffs_dev_t *dev = in->my_dev; + ++ ylist_add(&in->hash_link, &dev->obj_bucket[bucket].list); ++ dev->obj_bucket[bucket].count++; ++} + - /* Check sane level and page Id */ - if (fStruct->topLevel < 0 || fStruct->topLevel > YAFFS_TNODES_MAX_LEVEL) - return NULL; -- ++yaffs_obj_t *yaffs_find_by_number(yaffs_dev_t *dev, __u32 number) ++{ ++ int bucket = yaffs_hash_fn(number); ++ struct ylist_head *i; ++ yaffs_obj_t *in; + - if (chunkId > YAFFS_MAX_CHUNK_ID) - return NULL; -- ++ ylist_for_each(i, &dev->obj_bucket[bucket].list) { ++ /* Look if it is in the list */ ++ if (i) { ++ in = ylist_entry(i, yaffs_obj_t, hash_link); ++ if (in->obj_id == number) { + - /* First check we're tall enough (ie enough topLevel) */ -- ++ /* Don't tell the VFS about this one if it is defered free */ ++ if (in->defered_free) ++ return NULL; + - x = chunkId >> YAFFS_TNODES_LEVEL0_BITS; - requiredTallness = 0; - while (x) { - x >>= YAFFS_TNODES_INTERNAL_BITS; - requiredTallness++; -- } -- -- ++ return in; ++ } ++ } + } + ++ return NULL; ++} + - if (requiredTallness > fStruct->topLevel) { - /* Not tall enough, gotta make the tree taller */ - for (i = fStruct->topLevel; i < requiredTallness; i++) { -- ++yaffs_obj_t *yaffs_new_obj(yaffs_dev_t *dev, int number, ++ yaffs_obj_type type) ++{ ++ yaffs_obj_t *theObject=NULL; ++ yaffs_tnode_t *tn = NULL; + - tn = yaffs_GetTnode(dev); -- ++ if (number < 0) ++ number = yaffs_new_obj_id(dev); + - if (tn) { - tn->internal[0] = fStruct->top; - fStruct->top = tn; @@ -5559,27 +6656,86 @@ - (TSTR("yaffs: no more tnodes" TENDSTR))); - } - } -- ++ if (type == YAFFS_OBJECT_TYPE_FILE) { ++ tn = yaffs_get_tnode(dev); ++ if (!tn) ++ return NULL; ++ } + - fStruct->topLevel = requiredTallness; -- } -- ++ theObject = yaffs_alloc_empty_obj(dev); ++ if (!theObject){ ++ if(tn) ++ yaffs_free_tnode(dev,tn); ++ return NULL; + } + - /* Traverse down to level 0, adding anything we need */ -- + - l = fStruct->topLevel; - tn = fStruct->top; -- ++ if (theObject) { ++ theObject->fake = 0; ++ theObject->rename_allowed = 1; ++ theObject->unlink_allowed = 1; ++ theObject->obj_id = number; ++ yaffs_hash_obj(theObject); ++ theObject->variant_type = type; ++#ifdef CONFIG_YAFFS_WINCE ++ yfsd_win_file_time_now(theObject->win_atime); ++ theObject->win_ctime[0] = theObject->win_mtime[0] = ++ theObject->win_atime[0]; ++ theObject->win_ctime[1] = theObject->win_mtime[1] = ++ theObject->win_atime[1]; ++ ++#else + - if (l > 0) { - while (l > 0 && tn) { - x = (chunkId >> - (YAFFS_TNODES_LEVEL0_BITS + - (l - 1) * YAFFS_TNODES_INTERNAL_BITS)) & - YAFFS_TNODES_INTERNAL_MASK; -- -- ++ theObject->yst_atime = theObject->yst_mtime = ++ theObject->yst_ctime = Y_CURRENT_TIME; ++#endif ++ switch (type) { ++ case YAFFS_OBJECT_TYPE_FILE: ++ theObject->variant.file_variant.file_size = 0; ++ theObject->variant.file_variant.scanned_size = 0; ++ theObject->variant.file_variant.shrink_size = 0xFFFFFFFF; /* max __u32 */ ++ theObject->variant.file_variant.top_level = 0; ++ theObject->variant.file_variant.top = tn; ++ break; ++ case YAFFS_OBJECT_TYPE_DIRECTORY: ++ YINIT_LIST_HEAD(&theObject->variant.dir_variant. ++ children); ++ YINIT_LIST_HEAD(&theObject->variant.dir_variant. ++ dirty); ++ break; ++ case YAFFS_OBJECT_TYPE_SYMLINK: ++ case YAFFS_OBJECT_TYPE_HARDLINK: ++ case YAFFS_OBJECT_TYPE_SPECIAL: ++ /* No action required */ ++ break; ++ case YAFFS_OBJECT_TYPE_UNKNOWN: ++ /* todo this should not happen */ ++ break; ++ } ++ } + ++ return theObject; ++} + - if ((l > 1) && !tn->internal[x]) { - /* Add missing non-level-zero tnode */ - tn->internal[x] = yaffs_GetTnode(dev); -- ++yaffs_obj_t *yaffs_find_or_create_by_number(yaffs_dev_t *dev, ++ int number, ++ yaffs_obj_type type) ++{ ++ yaffs_obj_t *theObject = NULL; + - } else if (l == 1) { - /* Looking from level 1 at level 0 */ - if (passedTn) { @@ -5587,13 +6743,17 @@ - if (tn->internal[x]) - yaffs_FreeTnode(dev, tn->internal[x]); - tn->internal[x] = passedTn; -- ++ if (number > 0) ++ theObject = yaffs_find_by_number(dev, number); + - } else if (!tn->internal[x]) { - /* Don't have one, none passed in */ - tn->internal[x] = yaffs_GetTnode(dev); - } - } -- ++ if (!theObject) ++ theObject = yaffs_new_obj(dev, number, type); + - tn = tn->internal[x]; - l--; - } @@ -5604,16 +6764,21 @@ - yaffs_FreeTnode(dev, passedTn); - } - } -- ++ return theObject; + - return tn; --} -- + } + -static int yaffs_FindChunkInGroup(yaffs_Device *dev, int theChunk, - yaffs_ExtendedTags *tags, int objectId, - int chunkInInode) --{ ++ ++YCHAR *yaffs_clone_str(const YCHAR *str) + { - int j; -- ++ YCHAR *newStr = NULL; ++ int len; + - for (j = 0; theChunk && j < dev->chunkGroupSize; j++) { - if (yaffs_CheckChunkBit(dev, theChunk / dev->nChunksPerBlock, - theChunk % dev->nChunksPerBlock)) { @@ -5625,20 +6790,43 @@ - } - } - theChunk++; -- } ++ if (!str) ++ str = _Y(""); ++ ++ len = yaffs_strnlen(str,YAFFS_MAX_ALIAS_LENGTH); ++ newStr = YMALLOC((len + 1) * sizeof(YCHAR)); ++ if (newStr){ ++ yaffs_strncpy(newStr, str,len); ++ newStr[len] = 0; + } - return -1; -} -- -- ++ return newStr; + ++} + -/* DeleteWorker scans backwards through the tnode tree and deletes all the - * chunks and tnodes in the file - * Returns 1 if the tree was deleted. - * Returns 0 if it stopped early due to hitting the limit and the delete is incomplete. -- */ -- ++/* ++ * Mknod (create) a new object. ++ * equiv_obj only has meaning for a hard link; ++ * aliasString only has meaning for a symlink. ++ * rdev only has meaning for devices (a subset of special objects) + */ + -static int yaffs_DeleteWorker(yaffs_Object *in, yaffs_Tnode *tn, __u32 level, - int chunkOffset, int *limit) --{ ++static yaffs_obj_t *yaffs_create_obj(yaffs_obj_type type, ++ yaffs_obj_t *parent, ++ const YCHAR *name, ++ __u32 mode, ++ __u32 uid, ++ __u32 gid, ++ yaffs_obj_t *equiv_obj, ++ const YCHAR *aliasString, __u32 rdev) + { - int i; - int chunkInInode; - int theChunk; @@ -7237,9 +8425,7 @@ - } - - yaffs_VerifyCollectedBlock(dev, bi, block); -+ if (chunkId > YAFFS_MAX_CHUNK_ID) -+ return NULL; - +- - chunksAfter = yaffs_GetErasedChunks(dev); - if (chunksBefore >= chunksAfter) { - T(YAFFS_TRACE_GC, @@ -7247,24 +8433,18 @@ - ("gc did not increase free chunks before %d after %d" - TENDSTR), chunksBefore, chunksAfter)); - } -+ /* First check we're tall enough (ie enough topLevel) */ - +- - /* If the gc completed then clear the current gcBlock so that we find another. */ - if (bi->blockState != YAFFS_BLOCK_STATE_COLLECTING) { - dev->gcBlock = -1; - dev->gcChunk = 0; -+ x = chunkId >> YAFFS_TNODES_LEVEL0_BITS; -+ requiredTallness = 0; -+ while (x) { -+ x >>= YAFFS_TNODES_INTERNAL_BITS; -+ requiredTallness++; - } - +- } +- - dev->isDoingGC = 0; - - return retVal; -} - +- -/* New garbage collector - * If we're very low on erased blocks then we do aggressive garbage collection - * otherwise we do "leasurely" garbage collection. @@ -7280,28 +8460,14 @@ - int aggressive; - int gcOk = YAFFS_OK; - int maxTries = 0; -+ if (requiredTallness > fStruct->topLevel) { -+ /* Not tall enough, gotta make the tree taller */ -+ for (i = fStruct->topLevel; i < requiredTallness; i++) { - +- - int checkpointBlockAdjust; -+ tn = yaffs_GetTnode(dev); - +- - if (dev->isDoingGC) { - /* Bail out so we don't get recursive gc */ - return YAFFS_OK; -+ if (tn) { -+ tn->internal[0] = fStruct->top; -+ fStruct->top = tn; -+ fStruct->topLevel++; -+ } else { -+ T(YAFFS_TRACE_ERROR, -+ (TSTR("yaffs: no more tnodes" TENDSTR))); -+ return NULL; -+ } -+ } - } - +- } +- - /* This loop should pass the first time. - * We'll only see looping here if the erase of the collected block fails. - */ @@ -7312,8 +8478,7 @@ - checkpointBlockAdjust = yaffs_CalcCheckpointBlocksRequired(dev) - dev->blocksInCheckpoint; - if (checkpointBlockAdjust < 0) - checkpointBlockAdjust = 0; -+ /* Traverse down to level 0, adding anything we need */ - +- - if (dev->nErasedBlocks < (dev->nReservedBlocks + checkpointBlockAdjust + 2)) { - /* We need a block soon...*/ - aggressive = 1; @@ -7321,189 +8486,81 @@ - /* We're in no hurry */ - aggressive = 0; - } -+ l = fStruct->topLevel; -+ tn = fStruct->top; - +- - if (dev->gcBlock <= 0) { - dev->gcBlock = yaffs_FindBlockForGarbageCollection(dev, aggressive); - dev->gcChunk = 0; - } -+ if (l > 0) { -+ while (l > 0 && tn) { -+ x = (chunkId >> -+ (YAFFS_TNODES_LEVEL0_BITS + -+ (l - 1) * YAFFS_TNODES_INTERNAL_BITS)) & -+ YAFFS_TNODES_INTERNAL_MASK; - +- - block = dev->gcBlock; - +- - if (block > 0) { - dev->garbageCollections++; - if (!aggressive) - dev->passiveGarbageCollections++; -+ 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 */ -+ if (passedTn) { -+ /* If we already have one, then release it.*/ -+ if (tn->internal[x]) -+ yaffs_FreeTnode(dev, tn->internal[x]); -+ tn->internal[x] = passedTn; - +- - T(YAFFS_TRACE_GC, - (TSTR - ("yaffs: GC erasedBlocks %d aggressive %d" TENDSTR), - dev->nErasedBlocks, aggressive)); -+ } else if (!tn->internal[x]) { -+ /* Don't have one, none passed in */ -+ tn->internal[x] = yaffs_GetTnode(dev); -+ if(!tn->internal[x]) -+ return NULL; -+ } -+ } - +- - gcOk = yaffs_GarbageCollectBlock(dev, block, aggressive); -+ tn = tn->internal[x]; -+ l--; - } +- } - - if (dev->nErasedBlocks < (dev->nReservedBlocks) && block > 0) { - T(YAFFS_TRACE_GC, - (TSTR - ("yaffs: GC !!!no reclaim!!! erasedBlocks %d after try %d block %d" - TENDSTR), dev->nErasedBlocks, maxTries, block)); -+ } else { -+ /* top is level 0 */ -+ if (passedTn) { -+ memcpy(tn, passedTn, (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8); -+ yaffs_FreeTnode(dev, passedTn); - } +- } - } while ((dev->nErasedBlocks < dev->nReservedBlocks) && - (block > 0) && - (maxTries < 2)); -+ } - +- - return aggressive ? gcOk : YAFFS_OK; -+ return tn; - } - +-} +- -/*------------------------- TAGS --------------------------------*/ - -static int yaffs_TagsMatch(const yaffs_ExtendedTags *tags, int objectId, - int chunkInObject) -+static int yaffs_FindChunkInGroup(yaffs_Device *dev, int theChunk, -+ yaffs_ExtendedTags *tags, int objectId, -+ int chunkInInode) - { +-{ - return (tags->chunkId == chunkInObject && - tags->objectId == objectId && !tags->chunkDeleted) ? 1 : 0; -+ int j; - -+ for (j = 0; theChunk && j < dev->chunkGroupSize; j++) { -+ if (yaffs_CheckChunkBit(dev, theChunk / dev->param.nChunksPerBlock, -+ theChunk % dev->param.nChunksPerBlock)) { -+ -+ if(dev->chunkGroupSize == 1) -+ return theChunk; -+ else { -+ yaffs_ReadChunkWithTagsFromNAND(dev, theChunk, NULL, -+ tags); -+ if (yaffs_TagsMatch(tags, objectId, chunkInInode)) { -+ /* found it; */ -+ return theChunk; -+ } -+ } -+ } -+ theChunk++; -+ } -+ return -1; - } - -+#if 0 -+/* Experimental code not being used yet. Might speed up file deletion */ -+/* DeleteWorker scans backwards through the tnode tree and deletes all the -+ * chunks and tnodes in the file. -+ * Returns 1 if the tree was deleted. -+ * Returns 0 if it stopped early due to hitting the limit and the delete is incomplete. -+ */ - +- +-} +- +- -/*-------------------- Data file manipulation -----------------*/ - -static int yaffs_FindChunkInFile(yaffs_Object *in, int chunkInInode, - yaffs_ExtendedTags *tags) -+static int yaffs_DeleteWorker(yaffs_Object *in, yaffs_Tnode *tn, __u32 level, -+ int chunkOffset, int *limit) - { +-{ - /*Get the Tnode, then get the level 0 offset chunk offset */ - yaffs_Tnode *tn; - int theChunk = -1; - yaffs_ExtendedTags localTags; - int retVal = -1; - -+ int i; -+ int chunkInInode; -+ int theChunk; -+ yaffs_ExtendedTags tags; -+ int foundChunk; - yaffs_Device *dev = in->myDev; - +- yaffs_Device *dev = in->myDev; +- - if (!tags) { - /* Passed a NULL, so use our own tags space */ - tags = &localTags; - } - - tn = yaffs_FindLevel0Tnode(dev, &in->variant.fileVariant, chunkInInode); -+ int allDone = 1; - - if (tn) { +- +- if (tn) { - theChunk = yaffs_GetChunkGroupBase(dev, tn, chunkInInode); -+ if (level > 0) { -+ for (i = YAFFS_NTNODES_INTERNAL - 1; allDone && i >= 0; -+ i--) { -+ if (tn->internal[i]) { -+ if (limit && (*limit) < 0) { -+ allDone = 0; -+ } else { -+ allDone = -+ yaffs_DeleteWorker(in, -+ tn-> -+ internal -+ [i], -+ level - -+ 1, -+ (chunkOffset -+ << -+ YAFFS_TNODES_INTERNAL_BITS) -+ + i, -+ limit); -+ } -+ if (allDone) { -+ yaffs_FreeTnode(dev, -+ tn-> -+ internal[i]); -+ tn->internal[i] = NULL; -+ } -+ } -+ } -+ return (allDone) ? 1 : 0; -+ } else if (level == 0) { -+ int hitLimit = 0; - +- - retVal = - yaffs_FindChunkInGroup(dev, theChunk, tags, in->objectId, - chunkInInode); - } - return retVal; -} -+ for (i = YAFFS_NTNODES_LEVEL0 - 1; i >= 0 && !hitLimit; -+ i--) { -+ theChunk = yaffs_GetChunkGroupBase(dev, tn, i); -+ if (theChunk) { - +- -static int yaffs_FindAndDeleteChunkInFile(yaffs_Object *in, int chunkInInode, - yaffs_ExtendedTags *tags) -{ @@ -7511,88 +8568,37 @@ - yaffs_Tnode *tn; - int theChunk = -1; - yaffs_ExtendedTags localTags; -+ chunkInInode = (chunkOffset << -+ YAFFS_TNODES_LEVEL0_BITS) + i; -+ -+ foundChunk = -+ yaffs_FindChunkInGroup(dev, -+ theChunk, -+ &tags, -+ in->objectId, -+ chunkInInode); -+ -+ if (foundChunk > 0) { -+ yaffs_DeleteChunk(dev, -+ foundChunk, 1, -+ __LINE__); -+ in->nDataChunks--; -+ if (limit) { -+ *limit = *limit - 1; -+ if (*limit <= 0) -+ hitLimit = 1; -+ } - +- - yaffs_Device *dev = in->myDev; - int retVal = -1; -+ } -+ -+ yaffs_LoadLevel0Tnode(dev, tn, i, 0); -+ } -+ -+ } -+ return (i < 0) ? 1 : 0; -+ -+ } - +- - if (!tags) { - /* Passed a NULL, so use our own tags space */ - tags = &localTags; - } - +- } +- - tn = yaffs_FindLevel0Tnode(dev, &in->variant.fileVariant, chunkInInode); -+ return 1; - +- - if (tn) { -+} - +- - theChunk = yaffs_GetChunkGroupBase(dev, tn, chunkInInode); -+#endif - +- - retVal = - yaffs_FindChunkInGroup(dev, theChunk, tags, in->objectId, - chunkInInode); -+static void yaffs_SoftDeleteChunk(yaffs_Device *dev, int chunk) -+{ -+ yaffs_BlockInfo *theBlock; -+ unsigned blockNo; - +- - /* Delete the entry in the filestructure (if found) */ - if (retVal != -1) - yaffs_PutLevel0Tnode(dev, tn, chunkInInode, 0); - } -+ T(YAFFS_TRACE_DELETION, (TSTR("soft delete chunk %d" TENDSTR), chunk)); - +- - return retVal; -+ blockNo = chunk / dev->param.nChunksPerBlock; -+ theBlock = yaffs_GetBlockInfo(dev, blockNo); -+ if (theBlock) { -+ theBlock->softDeletions++; -+ dev->nFreeChunks++; -+ yaffs2_UpdateOldestDirtySequence(dev, blockNo, theBlock); -+ } - } - +-} +- -#ifdef YAFFS_PARANOID -+/* SoftDeleteWorker scans backwards through the tnode tree and soft deletes all the chunks in the file. -+ * All soft deleting does is increment the block's softdelete count and pulls the chunk out -+ * of the tnode. -+ * Thus, essentially this is the same as DeleteWorker except that the chunks are soft deleted. -+ */ - +- -static int yaffs_CheckFileSanity(yaffs_Object *in) -+static int yaffs_SoftDeleteWorker(yaffs_Object *in, yaffs_Tnode *tn, -+ __u32 level, int chunkOffset) - { +-{ - int chunk; - int nChunks; - int fSize; @@ -7601,17 +8607,12 @@ - yaffs_Tnode *tn; - yaffs_Tags localTags; - yaffs_Tags *tags = &localTags; -+ int i; - int theChunk; +- int theChunk; - int chunkDeleted; -+ int allDone = 1; -+ yaffs_Device *dev = in->myDev; - +- - if (in->variantType != YAFFS_OBJECT_TYPE_FILE) - return YAFFS_FAIL; -+ if (tn) { -+ if (level > 0) { - +- - objId = in->objectId; - fSize = in->variant.fileVariant.fileSize; - nChunks = @@ -7635,118 +8636,38 @@ - if (yaffs_TagsMatch - (tags, in->objectId, chunk, chunkDeleted)) { - /* found it; */ -+ for (i = YAFFS_NTNODES_INTERNAL - 1; allDone && i >= 0; -+ i--) { -+ if (tn->internal[i]) { -+ allDone = -+ yaffs_SoftDeleteWorker(in, -+ tn-> -+ internal[i], -+ level - 1, -+ (chunkOffset -+ << -+ YAFFS_TNODES_INTERNAL_BITS) -+ + i); -+ if (allDone) { -+ yaffs_FreeTnode(dev, -+ tn-> -+ internal[i]); -+ tn->internal[i] = NULL; -+ } else { -+ /* Hoosterman... how could this happen? */ -+ } -+ } -+ } -+ return (allDone) ? 1 : 0; -+ } else if (level == 0) { - -+ for (i = YAFFS_NTNODES_LEVEL0 - 1; i >= 0; i--) { -+ theChunk = yaffs_GetChunkGroupBase(dev, tn, i); -+ if (theChunk) { -+ /* Note this does not find the real chunk, only the chunk group. -+ * We make an assumption that a chunk group is not larger than -+ * a block. -+ */ -+ yaffs_SoftDeleteChunk(dev, theChunk); -+ yaffs_LoadLevel0Tnode(dev, tn, i, 0); - } +- +- } - } else { - +- - failed = 1; - } -+ return 1; - +- } +- - } else { - /* T(("No level 0 found for %d\n", chunk)); */ - } -+ - } - +- } +- } +- - return failed ? YAFFS_FAIL : YAFFS_OK; -+ return 1; -+ - } - +-} +- -#endif -+static void yaffs_SoftDeleteFile(yaffs_Object *obj) -+{ -+ if (obj->deleted && -+ obj->variantType == YAFFS_OBJECT_TYPE_FILE && !obj->softDeleted) { -+ if (obj->nDataChunks <= 0) { -+ /* Empty file with no duplicate object headers, just delete it immediately */ -+ yaffs_FreeTnode(obj->myDev, -+ obj->variant.fileVariant.top); -+ obj->variant.fileVariant.top = NULL; -+ T(YAFFS_TRACE_TRACING, -+ (TSTR("yaffs: Deleting empty file %d" TENDSTR), -+ obj->objectId)); -+ yaffs_DoGenericObjectDeletion(obj); -+ } else { -+ yaffs_SoftDeleteWorker(obj, -+ obj->variant.fileVariant.top, -+ obj->variant.fileVariant. -+ topLevel, 0); -+ obj->softDeleted = 1; -+ } -+ } -+} - +- -static int yaffs_PutChunkIntoFile(yaffs_Object *in, int chunkInInode, - int chunkInNAND, int inScan) -+/* Pruning removes any part of the file structure tree that is beyond the -+ * bounds of the file (ie that does not point to chunks). -+ * -+ * A file should only get pruned when its size is reduced. -+ * -+ * Before pruning, the chunks must be pulled from the tree and the -+ * level 0 tnode entries must be zeroed out. -+ * Could also use this for file deletion, but that's probably better handled -+ * by a special case. -+ * -+ * This function is recursive. For levels > 0 the function is called again on -+ * any sub-tree. For level == 0 we just check if the sub-tree has data. -+ * If there is no data in a subtree then it is pruned. -+ */ -+ -+static yaffs_Tnode *yaffs_PruneWorker(yaffs_Device *dev, yaffs_Tnode *tn, -+ __u32 level, int del0) - { +-{ - /* NB inScan is zero unless scanning. - * For forward scanning, inScan is > 0; - * for backward scanning inScan is < 0 - */ -+ int i; -+ int hasData; - +- - yaffs_Tnode *tn; - yaffs_Device *dev = in->myDev; - int existingChunk; - yaffs_ExtendedTags existingTags; - yaffs_ExtendedTags newTags; - unsigned existingSerial, newSerial; -+ if (tn) { -+ hasData = 0; - +- - if (in->variantType != YAFFS_OBJECT_TYPE_FILE) { - /* Just ignore an attempt at putting a chunk into a non-file during scanning - * If it is not during Scanning then something went wrong! @@ -7758,41 +8679,20 @@ - TENDSTR))); - YBUG(); - } -+ if(level > 0){ -+ for (i = 0; i < YAFFS_NTNODES_INTERNAL; i++) { -+ if (tn->internal[i]) { -+ tn->internal[i] = -+ yaffs_PruneWorker(dev, tn->internal[i], -+ level - 1, -+ (i == 0) ? del0 : 1); -+ } - +- - yaffs_DeleteChunk(dev, chunkInNAND, 1, __LINE__); - return YAFFS_OK; - } -+ if (tn->internal[i]) -+ hasData++; -+ } -+ } else { -+ int tnodeSize_u32 = dev->tnodeSize/sizeof(__u32); -+ __u32 *map = (__u32 *)tn; - +- - tn = yaffs_AddOrFindLevel0Tnode(dev, - &in->variant.fileVariant, - chunkInInode, - NULL); - if (!tn) - return YAFFS_FAIL; -+ for(i = 0; !hasData && i < tnodeSize_u32; i++){ -+ if(map[i]) -+ hasData++; -+ } -+ } - +- - existingChunk = yaffs_GetChunkGroupBase(dev, tn, chunkInInode); -+ if (hasData == 0 && del0) { -+ /* Free and return NULL */ - +- - if (inScan != 0) { - /* If we're scanning then we need to test for duplicates - * NB This does not need to be efficient since it should only ever @@ -7802,10 +8702,7 @@ - * Correction for YAFFS2: This could happen quite a lot and we need to think about efficiency! TODO - * Update: For backward scanning we don't need to re-read tags so this is quite cheap. - */ -+ yaffs_FreeTnode(dev, tn); -+ tn = NULL; -+ } - +- - if (existingChunk > 0) { - /* NB Right now existing chunk will not be real chunkId if the device >= 32MB - * thus we have to do a FindChunkInFile to get the real chunk id. @@ -7816,62 +8713,37 @@ - * Forward scanning YAFFS2: The new one is what we use, dump the old one. - * YAFFS1: Get both sets of tags and compare serial numbers. - */ -+ } - +- - if (inScan > 0) { - /* Only do this for forward scanning */ - yaffs_ReadChunkWithTagsFromNAND(dev, - chunkInNAND, - NULL, &newTags); -+ return tn; - +- - /* Do a proper find */ - existingChunk = - yaffs_FindChunkInFile(in, chunkInInode, - &existingTags); - } -+} - +- - if (existingChunk <= 0) { - /*Hoosterman - how did this happen? */ -+static int yaffs_PruneFileStructure(yaffs_Device *dev, -+ yaffs_FileStructure *fStruct) -+{ -+ int i; -+ int hasData; -+ int done = 0; -+ yaffs_Tnode *tn; - +- - T(YAFFS_TRACE_ERROR, - (TSTR - ("yaffs tragedy: existing chunk < 0 in scan" - TENDSTR))); -+ if (fStruct->topLevel > 0) { -+ fStruct->top = -+ yaffs_PruneWorker(dev, fStruct->top, fStruct->topLevel, 0); - +- - } -+ /* Now we have a tree with all the non-zero branches NULL but the height -+ * is the same as it was. -+ * Let's see if we can trim internal tnodes to shorten the tree. -+ * We can do this if only the 0th element in the tnode is in use -+ * (ie all the non-zero are NULL) -+ */ - +- - /* NB The deleted flags should be false, otherwise the chunks will - * not be loaded during a scan - */ -+ while (fStruct->topLevel && !done) { -+ tn = fStruct->top; - +- - if (inScan > 0) { - newSerial = newTags.serialNumber; - existingSerial = existingTags.serialNumber; -+ hasData = 0; -+ for (i = 1; i < YAFFS_NTNODES_INTERNAL; i++) { -+ if (tn->internal[i]) -+ hasData++; - } +- } - - if ((inScan > 0) && - (in->myDev->isYaffs2 || @@ -7891,26 +8763,19 @@ - yaffs_DeleteChunk(dev, chunkInNAND, 1, - __LINE__); - return YAFFS_OK; -+ -+ if (!hasData) { -+ fStruct->top = tn->internal[0]; -+ fStruct->topLevel--; -+ yaffs_FreeTnode(dev, tn); -+ } else { -+ done = 1; - } - } +- } +- } +- +- } - - } - - if (existingChunk == 0) - in->nDataChunks++; - - yaffs_PutLevel0Tnode(dev, tn, chunkInInode, chunkInNAND); - - return YAFFS_OK; - } - +- return YAFFS_OK; +-} +- -static int yaffs_ReadChunkDataFromObject(yaffs_Object *in, int chunkInInode, - __u8 *buffer) -{ @@ -7927,78 +8792,47 @@ - memset(buffer, 0, in->myDev->nDataBytesPerChunk); - return 0; - } -+/*-------------------- End of File Structure functions.-------------------*/ - +- -} - +- -void yaffs_DeleteChunk(yaffs_Device *dev, int chunkId, int markNAND, int lyn) -+/* AllocateEmptyObject gets us a clean Object. Tries to make allocate more if we run out */ -+static yaffs_Object *yaffs_AllocateEmptyObject(yaffs_Device *dev) - { +-{ - int block; - int page; - yaffs_ExtendedTags tags; - yaffs_BlockInfo *bi; -+ yaffs_Object *obj = yaffs_AllocateRawObject(dev); - +- - if (chunkId <= 0) - return; -+ if (obj) { -+ dev->nObjects++; - +- - dev->nDeletions++; - block = chunkId / dev->nChunksPerBlock; - page = chunkId % dev->nChunksPerBlock; -+ /* Now sweeten it up... */ - -+ memset(obj, 0, sizeof(yaffs_Object)); -+ obj->beingCreated = 1; - +- +- - if (!yaffs_CheckChunkBit(dev, block, page)) - T(YAFFS_TRACE_VERIFY, - (TSTR("Deleting invalid chunk %d"TENDSTR), - chunkId)); -+ obj->myDev = dev; -+ obj->hdrChunk = 0; -+ obj->variantType = YAFFS_OBJECT_TYPE_UNKNOWN; -+ YINIT_LIST_HEAD(&(obj->hardLinks)); -+ YINIT_LIST_HEAD(&(obj->hashLink)); -+ YINIT_LIST_HEAD(&obj->siblings); - +- - bi = yaffs_GetBlockInfo(dev, block); - +- - T(YAFFS_TRACE_DELETION, - (TSTR("line %d delete of chunk %d" TENDSTR), lyn, chunkId)); -+ /* Now make the directory sane */ -+ if (dev->rootDir) { -+ obj->parent = dev->rootDir; -+ ylist_add(&(obj->siblings), &dev->rootDir->variant.directoryVariant.children); -+ } - +- - if (markNAND && - bi->blockState != YAFFS_BLOCK_STATE_COLLECTING && !dev->isYaffs2) { -+ /* Add it to the lost and found directory. -+ * NB Can't put root or lostNFound in lostNFound so -+ * check if lostNFound exists first -+ */ -+ if (dev->lostNFoundDir) -+ yaffs_AddObjectToDirectory(dev->lostNFoundDir, obj); - +- - yaffs_InitialiseTags(&tags); -+ obj->beingCreated = 0; -+ } - +- - tags.chunkDeleted = 1; -+ dev->nCheckpointBlocksRequired = 0; /* force recalculation*/ - +- - yaffs_WriteChunkWithTagsToNAND(dev, chunkId, NULL, &tags); - yaffs_HandleUpdateChunk(dev, chunkId, &tags); - } else { - dev->nUnmarkedDeletions++; - } -+ return obj; -+} - +- - /* Pull out of the management area. - * If the whole block became dirty, this will kick off an erasure. - */ @@ -8007,290 +8841,151 @@ - bi->blockState == YAFFS_BLOCK_STATE_NEEDS_SCANNING || - bi->blockState == YAFFS_BLOCK_STATE_COLLECTING) { - dev->nFreeChunks++; -+static yaffs_Object *yaffs_CreateFakeDirectory(yaffs_Device *dev, int number, -+ __u32 mode) -+{ - +- - yaffs_ClearChunkBit(dev, block, page); -+ yaffs_Object *obj = -+ yaffs_CreateNewObject(dev, number, YAFFS_OBJECT_TYPE_DIRECTORY); -+ if (obj) { -+ obj->fake = 1; /* it is fake so it might have no NAND presence... */ -+ obj->renameAllowed = 0; /* ... and we're not allowed to rename it... */ -+ obj->unlinkAllowed = 0; /* ... or unlink it */ -+ obj->deleted = 0; -+ obj->unlinked = 0; -+ obj->yst_mode = mode; -+ obj->myDev = dev; -+ obj->hdrChunk = 0; /* Not a valid chunk. */ -+ } - +- - bi->pagesInUse--; -+ return obj; - +- - if (bi->pagesInUse == 0 && - !bi->hasShrinkHeader && - bi->blockState != YAFFS_BLOCK_STATE_ALLOCATING && - bi->blockState != YAFFS_BLOCK_STATE_NEEDS_SCANNING) { - yaffs_BlockBecameDirty(dev, block); - } -+} - +- - } -+static void yaffs_UnhashObject(yaffs_Object *obj) -+{ -+ int bucket; -+ yaffs_Device *dev = obj->myDev; - -+ /* If it is still linked into the bucket list, free from the list */ -+ if (!ylist_empty(&obj->hashLink)) { -+ ylist_del_init(&obj->hashLink); -+ bucket = yaffs_HashFunction(obj->objectId); -+ dev->objectBucket[bucket].count--; -+ } - } - +- +-} +- -static int yaffs_WriteChunkDataToObject(yaffs_Object *in, int chunkInInode, - const __u8 *buffer, int nBytes, - int useReserve) -+/* FreeObject frees up a Object and puts it back on the free list */ -+static void yaffs_FreeObject(yaffs_Object *obj) - { +-{ - /* Find old chunk Need to do this to get serial number - * Write new one and patch into tree. - * Invalidate old tags. - */ -+ yaffs_Device *dev = obj->myDev; - +- - int prevChunkId; - yaffs_ExtendedTags prevTags; -+ T(YAFFS_TRACE_OS, (TSTR("FreeObject %p inode %p"TENDSTR), obj, obj->myInode)); - +- - int newChunkId; - yaffs_ExtendedTags newTags; -+ if (!obj) -+ YBUG(); -+ if (obj->parent) -+ YBUG(); -+ if (!ylist_empty(&obj->siblings)) -+ YBUG(); - +- - yaffs_Device *dev = in->myDev; - +- - yaffs_CheckGarbageCollection(dev); -+ if (obj->myInode) { -+ /* We're still hooked up to a cached inode. -+ * Don't delete now, but mark for later deletion -+ */ -+ obj->deferedFree = 1; -+ return; -+ } -+ -+ yaffs_UnhashObject(obj); - +- - /* Get the previous chunk at this location in the file if it exists */ - prevChunkId = yaffs_FindChunkInFile(in, chunkInInode, &prevTags); -+ yaffs_FreeRawObject(dev,obj); -+ dev->nObjects--; -+ dev->nCheckpointBlocksRequired = 0; /* force recalculation*/ -+} - +- - /* Set up new tags */ - yaffs_InitialiseTags(&newTags); - +- - newTags.chunkId = chunkInInode; - newTags.objectId = in->objectId; - newTags.serialNumber = - (prevChunkId >= 0) ? prevTags.serialNumber + 1 : 1; - newTags.byteCount = nBytes; -+void yaffs_HandleDeferedFree(yaffs_Object *obj) -+{ -+ if (obj->deferedFree) -+ yaffs_FreeObject(obj); -+} - +- - if (nBytes < 1 || nBytes > dev->totalBytesPerChunk) { - T(YAFFS_TRACE_ERROR, - (TSTR("Writing %d bytes to chunk!!!!!!!!!" TENDSTR), nBytes)); - YBUG(); -+static void yaffs_InitialiseTnodesAndObjects(yaffs_Device *dev) -+{ -+ int i; -+ -+ dev->nObjects = 0; -+ dev->nTnodes = 0; -+ -+ yaffs_InitialiseRawTnodesAndObjects(dev); -+ -+ for (i = 0; i < YAFFS_NOBJECT_BUCKETS; i++) { -+ YINIT_LIST_HEAD(&dev->objectBucket[i].list); -+ dev->objectBucket[i].count = 0; - } -+} - +- } +- - newChunkId = - yaffs_WriteNewChunkWithTagsToNAND(dev, buffer, &newTags, - useReserve); -+static int yaffs_FindNiceObjectBucket(yaffs_Device *dev) -+{ -+ int i; -+ int l = 999; -+ int lowest = 999999; - +- - if (newChunkId >= 0) { - yaffs_PutChunkIntoFile(in, chunkInInode, newChunkId, 0); - +- - if (prevChunkId >= 0) - yaffs_DeleteChunk(dev, prevChunkId, 1, __LINE__); -+ /* Search for the shortest list or one that -+ * isn't too long. -+ */ -+ -+ for (i = 0; i < 10 && lowest > 4; i++) { -+ dev->bucketFinder++; -+ dev->bucketFinder %= YAFFS_NOBJECT_BUCKETS; -+ if (dev->objectBucket[dev->bucketFinder].count < lowest) { -+ lowest = dev->objectBucket[dev->bucketFinder].count; -+ l = dev->bucketFinder; -+ } - +- - yaffs_CheckFileSanity(in); - } +- } - return newChunkId; - -+ return l; - } - +- +-} +- -/* UpdateObjectHeader updates the header on NAND for an object. - * If name is not NULL, then that new name is used. - */ -int yaffs_UpdateObjectHeader(yaffs_Object *in, const YCHAR *name, int force, - int isShrink, int shadows) -+static int yaffs_CreateNewObjectNumber(yaffs_Device *dev) - { -+ int bucket = yaffs_FindNiceObjectBucket(dev); - +-{ +- - yaffs_BlockInfo *bi; -+ /* Now find an object value that has not already been taken -+ * by scanning the list. -+ */ - +- - yaffs_Device *dev = in->myDev; -+ int found = 0; -+ struct ylist_head *i; - +- - int prevChunkId; - int retVal = 0; - int result = 0; -+ __u32 n = (__u32) bucket; - +- - int newChunkId; - yaffs_ExtendedTags newTags; - yaffs_ExtendedTags oldTags; -+ /* yaffs_CheckObjectHashSanity(); */ - +- - __u8 *buffer = NULL; - YCHAR oldName[YAFFS_MAX_NAME_LENGTH + 1]; -+ while (!found) { -+ found = 1; -+ n += YAFFS_NOBJECT_BUCKETS; -+ if (1 || dev->objectBucket[bucket].count > 0) { -+ ylist_for_each(i, &dev->objectBucket[bucket].list) { -+ /* If there is already one in the list */ -+ if (i && ylist_entry(i, yaffs_Object, -+ hashLink)->objectId == n) { -+ found = 0; -+ } -+ } -+ } -+ } - +- - yaffs_ObjectHeader *oh = NULL; -+ return n; -+} ++ yaffs_obj_t *in; ++ YCHAR *str = NULL; - yaffs_strcpy(oldName, _Y("silly old name")); -+static void yaffs_HashObject(yaffs_Object *in) -+{ -+ int bucket = yaffs_HashFunction(in->objectId); -+ yaffs_Device *dev = in->myDev; ++ yaffs_dev_t *dev = parent->my_dev; -+ ylist_add(&in->hashLink, &dev->objectBucket[bucket].list); -+ dev->objectBucket[bucket].count++; -+} ++ /* Check if the entry exists. If it does then fail the call since we don't want a dup.*/ ++ if (yaffs_find_by_name(parent, name)) ++ return NULL; - if (!in->fake || - in == dev->rootDir || /* The rootDir should also be saved */ - force) { -+yaffs_Object *yaffs_FindObjectByNumber(yaffs_Device *dev, __u32 number) -+{ -+ int bucket = yaffs_HashFunction(number); -+ struct ylist_head *i; -+ yaffs_Object *in; ++ if (type == YAFFS_OBJECT_TYPE_SYMLINK) { ++ str = yaffs_clone_str(aliasString); ++ if (!str) ++ return NULL; ++ } - yaffs_CheckGarbageCollection(dev); - yaffs_CheckObjectDetailsLoaded(in); -+ ylist_for_each(i, &dev->objectBucket[bucket].list) { -+ /* Look if it is in the list */ -+ if (i) { -+ in = ylist_entry(i, yaffs_Object, hashLink); -+ if (in->objectId == number) { ++ in = yaffs_new_obj(dev, -1, type); - buffer = yaffs_GetTempBuffer(in->myDev, __LINE__); - oh = (yaffs_ObjectHeader *) buffer; -+ /* Don't tell the VFS about this one if it is defered free */ -+ if (in->deferedFree) -+ return NULL; ++ if (!in){ ++ if(str) ++ YFREE(str); ++ return NULL; ++ } - prevChunkId = in->hdrChunk; -+ return in; -+ } -+ } -+ } - if (prevChunkId > 0) { - result = yaffs_ReadChunkWithTagsFromNAND(dev, prevChunkId, - buffer, &oldTags); -+ return NULL; -+} - yaffs_VerifyObjectHeader(in, oh, &oldTags, 0); -+yaffs_Object *yaffs_CreateNewObject(yaffs_Device *dev, int number, -+ yaffs_ObjectType type) -+{ -+ yaffs_Object *theObject=NULL; -+ yaffs_Tnode *tn = NULL; -+ -+ if (number < 0) -+ number = yaffs_CreateNewObjectNumber(dev); - memcpy(oldName, oh->name, sizeof(oh->name)); - } -+ if (type == YAFFS_OBJECT_TYPE_FILE) { -+ tn = yaffs_GetTnode(dev); -+ if (!tn) -+ return NULL; -+ } - memset(buffer, 0xFF, dev->nDataBytesPerChunk); -+ theObject = yaffs_AllocateEmptyObject(dev); -+ if (!theObject){ -+ if(tn) -+ yaffs_FreeTnode(dev,tn); -+ return NULL; -+ } ++ if (in) { ++ in->hdr_chunk = 0; ++ in->valid = 1; ++ in->variant_type = type; - oh->type = in->variantType; - oh->yst_mode = in->yst_mode; - oh->shadowsObject = oh->inbandShadowsObject = shadows; ++ in->yst_mode = mode; -+ if (theObject) { -+ theObject->fake = 0; -+ theObject->renameAllowed = 1; -+ theObject->unlinkAllowed = 1; -+ theObject->objectId = number; -+ yaffs_HashObject(theObject); -+ theObject->variantType = type; #ifdef CONFIG_YAFFS_WINCE - oh->win_atime[0] = in->win_atime[0]; - oh->win_ctime[0] = in->win_ctime[0]; @@ -8298,19 +8993,29 @@ - oh->win_atime[1] = in->win_atime[1]; - oh->win_ctime[1] = in->win_ctime[1]; - oh->win_mtime[1] = in->win_mtime[1]; --#else ++ yfsd_win_file_time_now(in->win_atime); ++ in->win_ctime[0] = in->win_mtime[0] = in->win_atime[0]; ++ in->win_ctime[1] = in->win_mtime[1] = in->win_atime[1]; ++ + #else - oh->yst_uid = in->yst_uid; - oh->yst_gid = in->yst_gid; - oh->yst_atime = in->yst_atime; - oh->yst_mtime = in->yst_mtime; - oh->yst_ctime = in->yst_ctime; - oh->yst_rdev = in->yst_rdev; --#endif ++ in->yst_atime = in->yst_mtime = in->yst_ctime = Y_CURRENT_TIME; ++ ++ in->yst_rdev = rdev; ++ in->yst_uid = uid; ++ in->yst_gid = gid; + #endif - if (in->parent) - oh->parentObjectId = in->parent->objectId; - else - oh->parentObjectId = 0; -- ++ in->n_data_chunks = 0; + - if (name && *name) { - memset(oh->name, 0, sizeof(oh->name)); - yaffs_strncpy(oh->name, name, YAFFS_MAX_NAME_LENGTH); @@ -8318,63 +9023,54 @@ - memcpy(oh->name, oldName, sizeof(oh->name)); - else - memset(oh->name, 0, sizeof(oh->name)); -+ yfsd_WinFileTimeNow(theObject->win_atime); -+ theObject->win_ctime[0] = theObject->win_mtime[0] = -+ theObject->win_atime[0]; -+ theObject->win_ctime[1] = theObject->win_mtime[1] = -+ theObject->win_atime[1]; ++ yaffs_set_obj_name(in, name); ++ in->dirty = 1; - oh->isShrink = isShrink; -+#else ++ yaffs_add_obj_to_dir(parent, in); - switch (in->variantType) { - case YAFFS_OBJECT_TYPE_UNKNOWN: - /* Should not happen */ - break; -+ theObject->yst_atime = theObject->yst_mtime = -+ theObject->yst_ctime = Y_CURRENT_TIME; -+#endif -+ switch (type) { - case YAFFS_OBJECT_TYPE_FILE: +- case YAFFS_OBJECT_TYPE_FILE: - oh->fileSize = - (oh->parentObjectId == YAFFS_OBJECTID_DELETED - || oh->parentObjectId == - YAFFS_OBJECTID_UNLINKED) ? 0 : in->variant. - fileVariant.fileSize; -- break; -- case YAFFS_OBJECT_TYPE_HARDLINK: ++ in->my_dev = parent->my_dev; ++ ++ switch (type) { ++ case YAFFS_OBJECT_TYPE_SYMLINK: ++ in->variant.symlink_variant.alias = str; + break; + case YAFFS_OBJECT_TYPE_HARDLINK: - oh->equivalentObjectId = - in->variant.hardLinkVariant.equivalentObjectId; - break; - case YAFFS_OBJECT_TYPE_SPECIAL: - /* Do nothing */ -+ theObject->variant.fileVariant.fileSize = 0; -+ theObject->variant.fileVariant.scannedFileSize = 0; -+ theObject->variant.fileVariant.shrinkSize = 0xFFFFFFFF; /* max __u32 */ -+ theObject->variant.fileVariant.topLevel = 0; -+ theObject->variant.fileVariant.top = tn; ++ in->variant.hardlink_variant.equiv_obj = ++ equiv_obj; ++ in->variant.hardlink_variant.equiv_id = ++ equiv_obj->obj_id; ++ ylist_add(&in->hard_links, &equiv_obj->hard_links); break; ++ case YAFFS_OBJECT_TYPE_FILE: case YAFFS_OBJECT_TYPE_DIRECTORY: - /* Do nothing */ -+ YINIT_LIST_HEAD(&theObject->variant.directoryVariant. -+ children); -+ YINIT_LIST_HEAD(&theObject->variant.directoryVariant. -+ dirty); - break; - case YAFFS_OBJECT_TYPE_SYMLINK: +- break; +- case YAFFS_OBJECT_TYPE_SYMLINK: - yaffs_strncpy(oh->alias, - in->variant.symLinkVariant.alias, - YAFFS_MAX_ALIAS_LENGTH); - oh->alias[YAFFS_MAX_ALIAS_LENGTH] = 0; -+ case YAFFS_OBJECT_TYPE_HARDLINK: + case YAFFS_OBJECT_TYPE_SPECIAL: -+ /* No action required */ -+ break; + case YAFFS_OBJECT_TYPE_UNKNOWN: -+ /* todo this should not happen */ ++ /* do nothing */ break; } -+ } - /* Tags */ - yaffs_InitialiseTags(&newTags); @@ -8394,66 +9090,47 @@ - newTags.extraObjectType = in->variantType; - - yaffs_VerifyObjectHeader(in, oh, &newTags, 1); -+ return theObject; -+} - +- - /* Create new chunk in NAND */ - newChunkId = - yaffs_WriteNewChunkWithTagsToNAND(dev, buffer, &newTags, - (prevChunkId >= 0) ? 1 : 0); -+yaffs_Object *yaffs_FindOrCreateObjectByNumber(yaffs_Device *dev, -+ int number, -+ yaffs_ObjectType type) -+{ -+ yaffs_Object *theObject = NULL; - +- - if (newChunkId >= 0) { -+ if (number > 0) -+ theObject = yaffs_FindObjectByNumber(dev, number); - +- - in->hdrChunk = newChunkId; -+ if (!theObject) -+ theObject = yaffs_CreateNewObject(dev, number, type); - +- - if (prevChunkId >= 0) { - yaffs_DeleteChunk(dev, prevChunkId, 1, - __LINE__); - } -+ return theObject; - +- - if (!yaffs_ObjectHasCachedWriteData(in)) - in->dirty = 0; -+} - +- - /* If this was a shrink, then mark the block that the chunk lives on */ - if (isShrink) { - bi = yaffs_GetBlockInfo(in->myDev, - newChunkId / in->myDev->nChunksPerBlock); - bi->hasShrinkHeader = 1; - } - -- } -+YCHAR *yaffs_CloneString(const YCHAR *str) -+{ -+ YCHAR *newStr = NULL; -+ int len; +- ++ if (yaffs_update_oh(in, name, 0, 0, 0, NULL) < 0) { ++ /* Could not create the object header, fail the creation */ ++ yaffs_del_obj(in); ++ in = NULL; + } - retVal = newChunkId; -+ if (!str) -+ str = _Y(""); - -+ len = yaffs_strnlen(str,YAFFS_MAX_ALIAS_LENGTH); -+ newStr = YMALLOC((len + 1) * sizeof(YCHAR)); -+ if (newStr){ -+ yaffs_strncpy(newStr, str,len); -+ newStr[len] = 0; +- ++ yaffs_update_parent(parent); } -+ return newStr; - if (buffer) - yaffs_ReleaseTempBuffer(dev, buffer, __LINE__); - - return retVal; ++ return in; } -/*------------------------ Short Operations Cache ---------------------------------------- @@ -8467,69 +9144,66 @@ - * - * There are a limited number (~10) of cache chunks per device so that we don't - * need a very intelligent search. -+/* -+ * Mknod (create) a new object. -+ * equivalentObject only has meaning for a hard link; -+ * aliasString only has meaning for a symlink. -+ * rdev only has meaning for devices (a subset of special objects) - */ - +- */ +- -static int yaffs_ObjectHasCachedWriteData(yaffs_Object *obj) -+static yaffs_Object *yaffs_MknodObject(yaffs_ObjectType type, -+ yaffs_Object *parent, -+ const YCHAR *name, -+ __u32 mode, -+ __u32 uid, -+ __u32 gid, -+ yaffs_Object *equivalentObject, -+ const YCHAR *aliasString, __u32 rdev) ++yaffs_obj_t *yaffs_create_file(yaffs_obj_t *parent, const YCHAR *name, ++ __u32 mode, __u32 uid, __u32 gid) { - yaffs_Device *dev = obj->myDev; - int i; - yaffs_ChunkCache *cache; - int nCaches = obj->myDev->nShortOpCaches; -+ yaffs_Object *in; -+ YCHAR *str = NULL; - +- - for (i = 0; i < nCaches; i++) { - cache = &dev->srCache[i]; - if (cache->object == obj && - cache->dirty) - return 1; -+ yaffs_Device *dev = parent->myDev; -+ -+ /* Check if the entry exists. If it does then fail the call since we don't want a dup.*/ -+ if (yaffs_FindObjectByName(parent, name)) -+ return NULL; -+ -+ if (type == YAFFS_OBJECT_TYPE_SYMLINK) { -+ str = yaffs_CloneString(aliasString); -+ if (!str) -+ return NULL; - } +- } ++ return yaffs_create_obj(YAFFS_OBJECT_TYPE_FILE, parent, name, mode, ++ uid, gid, NULL, NULL, 0); ++} - return 0; --} -+ in = yaffs_CreateNewObject(dev, -1, type); ++yaffs_obj_t *yaffs_create_dir(yaffs_obj_t *parent, const YCHAR *name, ++ __u32 mode, __u32 uid, __u32 gid) ++{ ++ return yaffs_create_obj(YAFFS_OBJECT_TYPE_DIRECTORY, parent, name, ++ mode, uid, gid, NULL, NULL, 0); + } -+ if (!in){ -+ if(str) -+ YFREE(str); -+ return NULL; -+ } ++yaffs_obj_t *yaffs_create_special(yaffs_obj_t *parent, const YCHAR *name, ++ __u32 mode, __u32 uid, __u32 gid, __u32 rdev) ++{ ++ return yaffs_create_obj(YAFFS_OBJECT_TYPE_SPECIAL, parent, name, mode, ++ uid, gid, NULL, NULL, rdev); ++} -static void yaffs_FlushFilesChunkCache(yaffs_Object *obj) --{ ++yaffs_obj_t *yaffs_create_symlink(yaffs_obj_t *parent, const YCHAR *name, ++ __u32 mode, __u32 uid, __u32 gid, ++ const YCHAR *alias) + { - yaffs_Device *dev = obj->myDev; - int lowest = -99; /* Stop compiler whining. */ - int i; - yaffs_ChunkCache *cache; - int chunkWritten = 0; - int nCaches = obj->myDev->nShortOpCaches; ++ return yaffs_create_obj(YAFFS_OBJECT_TYPE_SYMLINK, parent, name, mode, ++ uid, gid, NULL, alias, 0); ++} - if (nCaches > 0) { - do { - cache = NULL; ++/* yaffs_link_obj returns the object id of the equivalent object.*/ ++yaffs_obj_t *yaffs_link_obj(yaffs_obj_t *parent, const YCHAR *name, ++ yaffs_obj_t *equiv_obj) ++{ ++ /* Get the real object in case we were fed a hard link as an equivalent object */ ++ equiv_obj = yaffs_get_equivalent_obj(equiv_obj); - /* Find the dirty cache for this object with the lowest chunk id. */ - for (i = 0; i < nCaches; i++) { @@ -8543,9 +9217,17 @@ - } - } - } ++ if (yaffs_create_obj ++ (YAFFS_OBJECT_TYPE_HARDLINK, parent, name, 0, 0, 0, ++ equiv_obj, NULL, 0)) { ++ return equiv_obj; ++ } else { ++ return NULL; ++ } - if (cache && !cache->locked) { - /* Write it out and free it up */ ++} - chunkWritten = - yaffs_WriteChunkDataToObject(cache->object, @@ -8556,86 +9238,59 @@ - cache->dirty = 0; - cache->object = NULL; - } -+ if (in) { -+ in->hdrChunk = 0; -+ in->valid = 1; -+ in->variantType = type; ++static int yaffs_change_obj_name(yaffs_obj_t *obj, yaffs_obj_t *new_dir, ++ const YCHAR *new_name, int force, int shadows) ++{ ++ int unlinkOp; ++ int deleteOp; - } while (cache && chunkWritten > 0); -+ in->yst_mode = mode; ++ yaffs_obj_t *existingTarget; - if (cache) { - /* Hoosterman, disk full while writing cache out. */ - T(YAFFS_TRACE_ERROR, - (TSTR("yaffs tragedy: no space during cache write" TENDSTR))); -+#ifdef CONFIG_YAFFS_WINCE -+ yfsd_WinFileTimeNow(in->win_atime); -+ in->win_ctime[0] = in->win_mtime[0] = in->win_atime[0]; -+ in->win_ctime[1] = in->win_mtime[1] = in->win_atime[1]; -+ -+#else -+ in->yst_atime = in->yst_mtime = in->yst_ctime = Y_CURRENT_TIME; -+ -+ in->yst_rdev = rdev; -+ in->yst_uid = uid; -+ in->yst_gid = gid; -+#endif -+ in->nDataChunks = 0; -+ -+ yaffs_SetObjectName(in, name); -+ in->dirty = 1; -+ -+ yaffs_AddObjectToDirectory(parent, in); -+ -+ in->myDev = parent->myDev; -+ -+ switch (type) { -+ case YAFFS_OBJECT_TYPE_SYMLINK: -+ in->variant.symLinkVariant.alias = str; -+ break; -+ case YAFFS_OBJECT_TYPE_HARDLINK: -+ in->variant.hardLinkVariant.equivalentObject = -+ equivalentObject; -+ in->variant.hardLinkVariant.equivalentObjectId = -+ equivalentObject->objectId; -+ ylist_add(&in->hardLinks, &equivalentObject->hardLinks); -+ break; -+ case YAFFS_OBJECT_TYPE_FILE: -+ case YAFFS_OBJECT_TYPE_DIRECTORY: -+ case YAFFS_OBJECT_TYPE_SPECIAL: -+ case YAFFS_OBJECT_TYPE_UNKNOWN: -+ /* do nothing */ -+ break; -+ } ++ if (new_dir == NULL) ++ new_dir = obj->parent; /* use the old directory */ -+ if (yaffs_UpdateObjectHeader(in, name, 0, 0, 0, NULL) < 0) { -+ /* Could not create the object header, fail the creation */ -+ yaffs_DeleteObject(in); -+ in = NULL; - } -+ -+ yaffs_UpdateParent(parent); +- } ++ if (new_dir->variant_type != YAFFS_OBJECT_TYPE_DIRECTORY) { ++ T(YAFFS_TRACE_ALWAYS, ++ (TSTR ++ ("tragedy: yaffs_change_obj_name: new_dir is not a directory" ++ TENDSTR))); ++ YBUG(); } -+ return in; - } +-} ++ /* TODO: Do we need this different handling for YAFFS2 and YAFFS1?? */ ++ if (obj->my_dev->param.is_yaffs2) ++ unlinkOp = (new_dir == obj->my_dev->unlinked_dir); ++ else ++ unlinkOp = (new_dir == obj->my_dev->unlinked_dir ++ && obj->variant_type == YAFFS_OBJECT_TYPE_FILE); -/*yaffs_FlushEntireDeviceCache(dev) - * - * - */ -- ++ deleteOp = (new_dir == obj->my_dev->del_dir); + -void yaffs_FlushEntireDeviceCache(yaffs_Device *dev) -+yaffs_Object *yaffs_MknodFile(yaffs_Object *parent, const YCHAR *name, -+ __u32 mode, __u32 uid, __u32 gid) - { +-{ - yaffs_Object *obj; - int nCaches = dev->nShortOpCaches; - int i; -- ++ existingTarget = yaffs_find_by_name(new_dir, new_name); + - /* Find a dirty object in the cache and flush it... - * until there are no further dirty objects. -- */ ++ /* If the object is a file going into the unlinked directory, ++ * then it is OK to just stuff it in since duplicate names are allowed. ++ * else only proceed if the new name does not exist and if we're putting ++ * it into a directory. + */ - do { - obj = NULL; - for (i = 0; i < nCaches && !obj; i++) { @@ -8646,32 +9301,20 @@ - } - if (obj) - yaffs_FlushFilesChunkCache(obj); -+ return yaffs_MknodObject(YAFFS_OBJECT_TYPE_FILE, parent, name, mode, -+ uid, gid, NULL, NULL, 0); -+} - +- - } while (obj); -+yaffs_Object *yaffs_MknodDirectory(yaffs_Object *parent, const YCHAR *name, -+ __u32 mode, __u32 uid, __u32 gid) -+{ -+ return yaffs_MknodObject(YAFFS_OBJECT_TYPE_DIRECTORY, parent, name, -+ mode, uid, gid, NULL, NULL, 0); -+} +- +-} ++ if ((unlinkOp || ++ deleteOp || ++ force || ++ (shadows > 0) || ++ !existingTarget) && ++ new_dir->variant_type == YAFFS_OBJECT_TYPE_DIRECTORY) { ++ yaffs_set_obj_name(obj, new_name); ++ obj->dirty = 1; -+yaffs_Object *yaffs_MknodSpecial(yaffs_Object *parent, const YCHAR *name, -+ __u32 mode, __u32 uid, __u32 gid, __u32 rdev) -+{ -+ return yaffs_MknodObject(YAFFS_OBJECT_TYPE_SPECIAL, parent, name, mode, -+ uid, gid, NULL, NULL, rdev); - } - -+yaffs_Object *yaffs_MknodSymLink(yaffs_Object *parent, const YCHAR *name, -+ __u32 mode, __u32 uid, __u32 gid, -+ const YCHAR *alias) -+{ -+ return yaffs_MknodObject(YAFFS_OBJECT_TYPE_SYMLINK, parent, name, mode, -+ uid, gid, NULL, alias, 0); -+} ++ yaffs_add_obj_to_dir(new_dir, obj); -/* Grab us a cache chunk for use. - * First look for an empty one. @@ -8679,33 +9322,28 @@ - * Then look for the least recently used dirty one...., flush and look again. - */ -static yaffs_ChunkCache *yaffs_GrabChunkCacheWorker(yaffs_Device *dev) -+/* yaffs_Link returns the object id of the equivalent object.*/ -+yaffs_Object *yaffs_Link(yaffs_Object *parent, const YCHAR *name, -+ yaffs_Object *equivalentObject) - { +-{ - int i; -+ /* Get the real object in case we were fed a hard link as an equivalent object */ -+ equivalentObject = yaffs_GetEquivalentObject(equivalentObject); ++ if (unlinkOp) ++ obj->unlinked = 1; - if (dev->nShortOpCaches > 0) { - for (i = 0; i < dev->nShortOpCaches; i++) { - if (!dev->srCache[i].object) - return &dev->srCache[i]; - } -+ if (yaffs_MknodObject -+ (YAFFS_OBJECT_TYPE_HARDLINK, parent, name, 0, 0, 0, -+ equivalentObject, NULL, 0)) { -+ return equivalentObject; -+ } else { -+ return NULL; ++ /* If it is a deletion then we mark it as a shrink for gc purposes. */ ++ if (yaffs_update_oh(obj, new_name, 0, deleteOp, shadows, NULL) >= 0) ++ return YAFFS_OK; } - return NULL; ++ return YAFFS_FAIL; } -static yaffs_ChunkCache *yaffs_GrabChunkCache(yaffs_Device *dev) -+static int yaffs_ChangeObjectName(yaffs_Object *obj, yaffs_Object *newDir, -+ const YCHAR *newName, int force, int shadows) ++int yaffs_rename_obj(yaffs_obj_t *old_dir, const YCHAR *old_name, ++ yaffs_obj_t *new_dir, const YCHAR *new_name) { - yaffs_ChunkCache *cache; - yaffs_Object *theObj; @@ -8715,11 +9353,13 @@ - - if (dev->nShortOpCaches > 0) { - /* Try find a non-dirty one... */ -+ int unlinkOp; -+ int deleteOp; - +- - cache = yaffs_GrabChunkCacheWorker(dev); -+ yaffs_Object *existingTarget; ++ yaffs_obj_t *obj = NULL; ++ yaffs_obj_t *existingTarget = NULL; ++ int force = 0; ++ int result; ++ yaffs_dev_t *dev; - if (!cache) { - /* They were all dirty, find the last recently used object and flush @@ -8727,28 +9367,18 @@ - * NB what's here is not very accurate, we actually flush the object - * the last recently used page. - */ -+ if (newDir == NULL) -+ newDir = obj->parent; /* use the old directory */ - /* With locking we can't assume we can use entry zero */ -+ if (newDir->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) { -+ T(YAFFS_TRACE_ALWAYS, -+ (TSTR -+ ("tragedy: yaffs_ChangeObjectName: newDir is not a directory" -+ TENDSTR))); ++ if (!old_dir || old_dir->variant_type != YAFFS_OBJECT_TYPE_DIRECTORY) ++ YBUG(); ++ if (!new_dir || new_dir->variant_type != YAFFS_OBJECT_TYPE_DIRECTORY) + YBUG(); -+ } - theObj = NULL; - usage = -1; - cache = NULL; - pushout = -1; -+ /* TODO: Do we need this different handling for YAFFS2 and YAFFS1?? */ -+ if (obj->myDev->param.isYaffs2) -+ unlinkOp = (newDir == obj->myDev->unlinkedDir); -+ else -+ unlinkOp = (newDir == obj->myDev->unlinkedDir -+ && obj->variantType == YAFFS_OBJECT_TYPE_FILE); ++ dev = old_dir->my_dev; - for (i = 0; i < dev->nShortOpCaches; i++) { - if (dev->srCache[i].object && @@ -8760,35 +9390,32 @@ - pushout = i; - } - } -+ deleteOp = (newDir == obj->myDev->deletedDir); ++#ifdef CONFIG_YAFFS_CASE_INSENSITIVE ++ /* Special case for case insemsitive systems (eg. WinCE). ++ * While look-up is case insensitive, the name isn't. ++ * Therefore we might want to change x.txt to X.txt ++ */ ++ if (old_dir == new_dir && yaffs_strcmp(old_name, new_name) == 0) ++ force = 1; ++#endif - if (!cache || cache->dirty) { - /* Flush and try again */ - yaffs_FlushFilesChunkCache(theObj); - cache = yaffs_GrabChunkCacheWorker(dev); - } -+ existingTarget = yaffs_FindObjectByName(newDir, newName); ++ if(yaffs_strnlen(new_name,YAFFS_MAX_NAME_LENGTH+1) > YAFFS_MAX_NAME_LENGTH) ++ /* ENAMETOOLONG */ ++ return YAFFS_FAIL; - } - return cache; - } else - return NULL; -+ /* If the object is a file going into the unlinked directory, -+ * then it is OK to just stuff it in since duplicate names are allowed. -+ * else only proceed if the new name does not exist and if we're putting -+ * it into a directory. -+ */ -+ if ((unlinkOp || -+ deleteOp || -+ force || -+ (shadows > 0) || -+ !existingTarget) && -+ newDir->variantType == YAFFS_OBJECT_TYPE_DIRECTORY) { -+ yaffs_SetObjectName(obj, newName); -+ obj->dirty = 1; ++ obj = yaffs_find_by_name(old_dir, old_name); -} -+ yaffs_AddObjectToDirectory(newDir, obj); ++ if (obj && obj->rename_allowed) { -/* Find a cached chunk */ -static yaffs_ChunkCache *yaffs_FindChunkCache(const yaffs_Object *obj, @@ -8801,102 +9428,14 @@ - if (dev->srCache[i].object == obj && - dev->srCache[i].chunkId == chunkId) { - dev->cacheHits++; -+ if (unlinkOp) -+ obj->unlinked = 1; ++ /* Now do the handling for an existing target, if there is one */ - return &dev->srCache[i]; - } -- } -+ /* If it is a deletion then we mark it as a shrink for gc purposes. */ -+ if (yaffs_UpdateObjectHeader(obj, newName, 0, deleteOp, shadows, NULL) >= 0) -+ return YAFFS_OK; - } -- return NULL; -+ -+ return YAFFS_FAIL; - } - --/* Mark the chunk for the least recently used algorithym */ --static void yaffs_UseChunkCache(yaffs_Device *dev, yaffs_ChunkCache *cache, -- int isAWrite) -+int yaffs_RenameObject(yaffs_Object *oldDir, const YCHAR *oldName, -+ yaffs_Object *newDir, const YCHAR *newName) - { -+ yaffs_Object *obj = NULL; -+ yaffs_Object *existingTarget = NULL; -+ int force = 0; -+ int result; -+ yaffs_Device *dev; - -- if (dev->nShortOpCaches > 0) { -- if (dev->srLastUse < 0 || dev->srLastUse > 100000000) { -- /* Reset the cache usages */ -- int i; -- for (i = 1; i < dev->nShortOpCaches; i++) -- dev->srCache[i].lastUse = 0; - -- dev->srLastUse = 0; -- } -+ if (!oldDir || oldDir->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) -+ YBUG(); -+ if (!newDir || newDir->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) -+ YBUG(); - -- dev->srLastUse++; -+ dev = oldDir->myDev; - -- cache->lastUse = dev->srLastUse; -+#ifdef CONFIG_YAFFS_CASE_INSENSITIVE -+ /* Special case for case insemsitive systems (eg. WinCE). -+ * While look-up is case insensitive, the name isn't. -+ * Therefore we might want to change x.txt to X.txt -+ */ -+ if (oldDir == newDir && yaffs_strcmp(oldName, newName) == 0) -+ force = 1; -+#endif - -- if (isAWrite) -- cache->dirty = 1; -- } --} -+ if(yaffs_strnlen(newName,YAFFS_MAX_NAME_LENGTH+1) > YAFFS_MAX_NAME_LENGTH) -+ /* ENAMETOOLONG */ -+ return YAFFS_FAIL; - --/* Invalidate a single cache page. -- * Do this when a whole page gets written, -- * ie the short cache for this page is no longer valid. -- */ --static void yaffs_InvalidateChunkCache(yaffs_Object *object, int chunkId) --{ -- if (object->myDev->nShortOpCaches > 0) { -- yaffs_ChunkCache *cache = yaffs_FindChunkCache(object, chunkId); -+ obj = yaffs_FindObjectByName(oldDir, oldName); - -- if (cache) -- cache->object = NULL; -- } --} -+ if (obj && obj->renameAllowed) { - --/* Invalidate all the cache pages associated with this object -- * Do this whenever ther file is deleted or resized. -- */ --static void yaffs_InvalidateWholeChunkCache(yaffs_Object *in) --{ -- int i; -- yaffs_Device *dev = in->myDev; -+ /* Now do the handling for an existing target, if there is one */ - -- if (dev->nShortOpCaches > 0) { -- /* Invalidate it. */ -- for (i = 0; i < dev->nShortOpCaches; i++) { -- if (dev->srCache[i].object == in) -- dev->srCache[i].object = NULL; -+ existingTarget = yaffs_FindObjectByName(newDir, newName); ++ existingTarget = yaffs_find_by_name(new_dir, new_name); + if (existingTarget && -+ existingTarget->variantType == YAFFS_OBJECT_TYPE_DIRECTORY && -+ !ylist_empty(&existingTarget->variant.directoryVariant.children)) { ++ existingTarget->variant_type == YAFFS_OBJECT_TYPE_DIRECTORY && ++ !ylist_empty(&existingTarget->variant.dir_variant.children)) { + /* There is a target that is a non-empty directory, so we fail */ + return YAFFS_FAIL; /* EEXIST or ENOTEMPTY */ + } else if (existingTarget && existingTarget != obj) { @@ -8906,76 +9445,167 @@ + * Note we must disable gc otherwise it can mess up the shadowing. + * + */ -+ dev->gcDisable=1; -+ yaffs_ChangeObjectName(obj, newDir, newName, force, -+ existingTarget->objectId); -+ existingTarget->isShadowed = 1; -+ yaffs_UnlinkObject(existingTarget); -+ dev->gcDisable=0; ++ dev->gc_disable=1; ++ yaffs_change_obj_name(obj, new_dir, new_name, force, ++ existingTarget->obj_id); ++ existingTarget->is_shadowed = 1; ++ yaffs_unlink_obj(existingTarget); ++ dev->gc_disable=0; } + -+ result = yaffs_ChangeObjectName(obj, newDir, newName, 1, 0); ++ result = yaffs_change_obj_name(obj, new_dir, new_name, 1, 0); + -+ yaffs_UpdateParent(oldDir); -+ if(newDir != oldDir) -+ yaffs_UpdateParent(newDir); ++ yaffs_update_parent(old_dir); ++ if(new_dir != old_dir) ++ yaffs_update_parent(new_dir); + + return result; } +- return NULL; + return YAFFS_FAIL; } --/*--------------------- Checkpointing --------------------*/ -- +-/* Mark the chunk for the least recently used algorithym */ +-static void yaffs_UseChunkCache(yaffs_Device *dev, yaffs_ChunkCache *cache, +- int isAWrite) +/*------------------------- Block Management and Page Allocation ----------------*/ ++ ++static int yaffs_init_blocks(yaffs_dev_t *dev) + { ++ int nBlocks = dev->internal_end_block - dev->internal_start_block + 1; + +- if (dev->nShortOpCaches > 0) { +- if (dev->srLastUse < 0 || dev->srLastUse > 100000000) { +- /* Reset the cache usages */ +- int i; +- for (i = 1; i < dev->nShortOpCaches; i++) +- dev->srCache[i].lastUse = 0; ++ dev->block_info = NULL; ++ dev->chunk_bits = NULL; + +- dev->srLastUse = 0; +- } ++ dev->alloc_block = -1; /* force it to get a new one */ + +- dev->srLastUse++; ++ /* If the first allocation strategy fails, thry the alternate one */ ++ dev->block_info = YMALLOC(nBlocks * sizeof(yaffs_block_info_t)); ++ if (!dev->block_info) { ++ dev->block_info = YMALLOC_ALT(nBlocks * sizeof(yaffs_block_info_t)); ++ dev->block_info_alt = 1; ++ } else ++ dev->block_info_alt = 0; + +- cache->lastUse = dev->srLastUse; ++ if (dev->block_info) { ++ /* Set up dynamic blockinfo stuff. */ ++ dev->chunk_bit_stride = (dev->param.chunks_per_block + 7) / 8; /* round up bytes */ ++ dev->chunk_bits = YMALLOC(dev->chunk_bit_stride * nBlocks); ++ if (!dev->chunk_bits) { ++ dev->chunk_bits = YMALLOC_ALT(dev->chunk_bit_stride * nBlocks); ++ dev->chunk_bits_alt = 1; ++ } else ++ dev->chunk_bits_alt = 0; ++ } + +- if (isAWrite) +- cache->dirty = 1; ++ if (dev->block_info && dev->chunk_bits) { ++ memset(dev->block_info, 0, nBlocks * sizeof(yaffs_block_info_t)); ++ memset(dev->chunk_bits, 0, dev->chunk_bit_stride * nBlocks); ++ return YAFFS_OK; + } ++ ++ return YAFFS_FAIL; + } + +-/* Invalidate a single cache page. +- * Do this when a whole page gets written, +- * ie the short cache for this page is no longer valid. +- */ +-static void yaffs_InvalidateChunkCache(yaffs_Object *object, int chunkId) ++static void yaffs_deinit_blocks(yaffs_dev_t *dev) + { +- if (object->myDev->nShortOpCaches > 0) { +- yaffs_ChunkCache *cache = yaffs_FindChunkCache(object, chunkId); ++ if (dev->block_info_alt && dev->block_info) ++ YFREE_ALT(dev->block_info); ++ else if (dev->block_info) ++ YFREE(dev->block_info); + +- if (cache) +- cache->object = NULL; +- } +-} ++ dev->block_info_alt = 0; + +-/* Invalidate all the cache pages associated with this object +- * Do this whenever ther file is deleted or resized. +- */ +-static void yaffs_InvalidateWholeChunkCache(yaffs_Object *in) +-{ +- int i; +- yaffs_Device *dev = in->myDev; ++ dev->block_info = NULL; + +- if (dev->nShortOpCaches > 0) { +- /* Invalidate it. */ +- for (i = 0; i < dev->nShortOpCaches; i++) { +- if (dev->srCache[i].object == in) +- dev->srCache[i].object = NULL; +- } +- } ++ if (dev->chunk_bits_alt && dev->chunk_bits) ++ YFREE_ALT(dev->chunk_bits); ++ else if (dev->chunk_bits) ++ YFREE(dev->chunk_bits); ++ dev->chunk_bits_alt = 0; ++ dev->chunk_bits = NULL; + } + +-/*--------------------- Checkpointing --------------------*/ ++void yaffs_block_became_dirty(yaffs_dev_t *dev, int block_no) ++{ ++ yaffs_block_info_t *bi = yaffs_get_block_info(dev, block_no); + ++ int erasedOk = 0; -static int yaffs_WriteCheckpointValidityMarker(yaffs_Device *dev, int head) -+static int yaffs_InitialiseBlocks(yaffs_Device *dev) - { +-{ - yaffs_CheckpointValidity cp; -+ int nBlocks = dev->internalEndBlock - dev->internalStartBlock + 1; ++ /* If the block is still healthy erase it and mark as clean. ++ * If the block has had a data failure, then retire it. ++ */ - memset(&cp, 0, sizeof(cp)); -+ dev->blockInfo = NULL; -+ dev->chunkBits = NULL; ++ T(YAFFS_TRACE_GC | YAFFS_TRACE_ERASE, ++ (TSTR("yaffs_block_became_dirty block %d state %d %s"TENDSTR), ++ block_no, bi->block_state, (bi->needs_retiring) ? "needs retiring" : "")); - cp.structType = sizeof(cp); - cp.magic = YAFFS_MAGIC; - cp.version = YAFFS_CHECKPOINT_VERSION; - cp.head = (head) ? 1 : 0; -+ dev->allocationBlock = -1; /* force it to get a new one */ ++ yaffs2_clear_oldest_dirty_seq(dev,bi); - return (yaffs_CheckpointWrite(dev, &cp, sizeof(cp)) == sizeof(cp)) ? - 1 : 0; -} -+ /* If the first allocation strategy fails, thry the alternate one */ -+ 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; ++ bi->block_state = YAFFS_BLOCK_STATE_DIRTY; -static int yaffs_ReadCheckpointValidityMarker(yaffs_Device *dev, int head) -{ - yaffs_CheckpointValidity cp; - int ok; -+ if (dev->blockInfo) { -+ /* Set up dynamic blockinfo stuff. */ -+ dev->chunkBitmapStride = (dev->param.nChunksPerBlock + 7) / 8; /* round up bytes */ -+ dev->chunkBits = YMALLOC(dev->chunkBitmapStride * nBlocks); -+ if (!dev->chunkBits) { -+ dev->chunkBits = YMALLOC_ALT(dev->chunkBitmapStride * nBlocks); -+ dev->chunkBitsAlt = 1; -+ } else -+ dev->chunkBitsAlt = 0; -+ } ++ /* If this is the block being garbage collected then stop gc'ing this block */ ++ if(block_no == dev->gc_block) ++ dev->gc_block = 0; - ok = (yaffs_CheckpointRead(dev, &cp, sizeof(cp)) == sizeof(cp)); -+ if (dev->blockInfo && dev->chunkBits) { -+ memset(dev->blockInfo, 0, nBlocks * sizeof(yaffs_BlockInfo)); -+ memset(dev->chunkBits, 0, dev->chunkBitmapStride * nBlocks); -+ return YAFFS_OK; ++ /* If this block is currently the best candidate for gc then drop as a candidate */ ++ if(block_no == dev->gc_dirtiest){ ++ dev->gc_dirtiest = 0; ++ dev->gc_pages_in_use = 0; + } - if (ok) @@ -8984,100 +9614,130 @@ - (cp.version == YAFFS_CHECKPOINT_VERSION) && - (cp.head == ((head) ? 1 : 0)); - return ok ? 1 : 0; -+ return YAFFS_FAIL; - } +-} ++ if (!bi->needs_retiring) { ++ yaffs2_checkpt_invalidate(dev); ++ erasedOk = yaffs_erase_block(dev, block_no); ++ if (!erasedOk) { ++ dev->n_erase_failures++; ++ T(YAFFS_TRACE_ERROR | YAFFS_TRACE_BAD_BLOCKS, ++ (TSTR("**>> Erasure failed %d" TENDSTR), block_no)); ++ } ++ } -static void yaffs_DeviceToCheckpointDevice(yaffs_CheckpointDevice *cp, - yaffs_Device *dev) -+static void yaffs_DeinitialiseBlocks(yaffs_Device *dev) - { +-{ - cp->nErasedBlocks = dev->nErasedBlocks; - cp->allocationBlock = dev->allocationBlock; - cp->allocationPage = dev->allocationPage; - cp->nFreeChunks = dev->nFreeChunks; -+ if (dev->blockInfoAlt && dev->blockInfo) -+ YFREE_ALT(dev->blockInfo); -+ else if (dev->blockInfo) -+ YFREE(dev->blockInfo); ++ if (erasedOk && ++ ((yaffs_trace_mask & YAFFS_TRACE_ERASE) || !yaffs_skip_verification(dev))) { ++ int i; ++ for (i = 0; i < dev->param.chunks_per_block; i++) { ++ if (!yaffs_check_chunk_erased ++ (dev, block_no * dev->param.chunks_per_block + i)) { ++ T(YAFFS_TRACE_ERROR, ++ (TSTR ++ (">>Block %d erasure supposedly OK, but chunk %d not erased" ++ TENDSTR), block_no, i)); ++ } ++ } ++ } + -+ dev->blockInfoAlt = 0; ++ if (erasedOk) { ++ /* Clean it up... */ ++ bi->block_state = YAFFS_BLOCK_STATE_EMPTY; ++ bi->seq_number = 0; ++ dev->n_erased_blocks++; ++ bi->pages_in_use = 0; ++ bi->soft_del_pages = 0; ++ bi->has_shrink_hdr = 0; ++ bi->skip_erased_check = 1; /* This is clean, so no need to check */ ++ bi->gc_prioritise = 0; ++ yaffs_clear_chunk_bits(dev, block_no); - cp->nDeletedFiles = dev->nDeletedFiles; - cp->nUnlinkedFiles = dev->nUnlinkedFiles; - cp->nBackgroundDeletions = dev->nBackgroundDeletions; - cp->sequenceNumber = dev->sequenceNumber; - cp->oldestDirtySequence = dev->oldestDirtySequence; -+ dev->blockInfo = NULL; ++ T(YAFFS_TRACE_ERASE, ++ (TSTR("Erased block %d" TENDSTR), block_no)); ++ } else { ++ dev->n_free_chunks -= dev->param.chunks_per_block; /* We lost a block of free space */ -+ if (dev->chunkBitsAlt && dev->chunkBits) -+ YFREE_ALT(dev->chunkBits); -+ else if (dev->chunkBits) -+ YFREE(dev->chunkBits); -+ dev->chunkBitsAlt = 0; -+ dev->chunkBits = NULL; ++ yaffs_retire_block(dev, block_no); ++ T(YAFFS_TRACE_ERROR | YAFFS_TRACE_BAD_BLOCKS, ++ (TSTR("**>> Block %d retired" TENDSTR), block_no)); ++ } } -static void yaffs_CheckpointDeviceToDevice(yaffs_Device *dev, - yaffs_CheckpointDevice *cp) -+void yaffs_BlockBecameDirty(yaffs_Device *dev, int blockNo) ++static int yaffs_find_alloc_block(yaffs_dev_t *dev) { - dev->nErasedBlocks = cp->nErasedBlocks; - dev->allocationBlock = cp->allocationBlock; - dev->allocationPage = cp->allocationPage; - dev->nFreeChunks = cp->nFreeChunks; -+ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, blockNo); - +- - dev->nDeletedFiles = cp->nDeletedFiles; - dev->nUnlinkedFiles = cp->nUnlinkedFiles; - dev->nBackgroundDeletions = cp->nBackgroundDeletions; - dev->sequenceNumber = cp->sequenceNumber; - dev->oldestDirtySequence = cp->oldestDirtySequence; -} -+ int erasedOk = 0; ++ int i; -+ /* If the block is still healthy erase it and mark as clean. -+ * If the block has had a data failure, then retire it. -+ */ ++ yaffs_block_info_t *bi; -static int yaffs_WriteCheckpointDevice(yaffs_Device *dev) -{ - yaffs_CheckpointDevice cp; - __u32 nBytes; - __u32 nBlocks = (dev->internalEndBlock - dev->internalStartBlock + 1); -+ T(YAFFS_TRACE_GC | YAFFS_TRACE_ERASE, -+ (TSTR("yaffs_BlockBecameDirty block %d state %d %s"TENDSTR), -+ blockNo, bi->blockState, (bi->needsRetiring) ? "needs retiring" : "")); ++ if (dev->n_erased_blocks < 1) { ++ /* Hoosterman we've got a problem. ++ * Can't get space to gc ++ */ ++ T(YAFFS_TRACE_ERROR, ++ (TSTR("yaffs tragedy: no more erased blocks" TENDSTR))); - int ok; -+ yaffs2_ClearOldestDirtySequence(dev,bi); ++ return -1; ++ } - /* Write device runtime values*/ - yaffs_DeviceToCheckpointDevice(&cp, dev); - cp.structType = sizeof(cp); -+ bi->blockState = YAFFS_BLOCK_STATE_DIRTY; ++ /* Find an empty block. */ - ok = (yaffs_CheckpointWrite(dev, &cp, sizeof(cp)) == sizeof(cp)); -+ /* If this is the block being garbage collected then stop gc'ing this block */ -+ if(blockNo == dev->gcBlock) -+ dev->gcBlock = 0; -+ -+ /* If this block is currently the best candidate for gc then drop as a candidate */ -+ if(blockNo == dev->gcDirtiest){ -+ dev->gcDirtiest = 0; -+ dev->gcPagesInUse = 0; -+ } ++ for (i = dev->internal_start_block; i <= dev->internal_end_block; i++) { ++ dev->alloc_block_finder++; ++ if (dev->alloc_block_finder < dev->internal_start_block ++ || dev->alloc_block_finder > dev->internal_end_block) { ++ dev->alloc_block_finder = dev->internal_start_block; ++ } - /* Write block info */ - if (ok) { - nBytes = nBlocks * sizeof(yaffs_BlockInfo); - ok = (yaffs_CheckpointWrite(dev, dev->blockInfo, nBytes) == nBytes); -+ if (!bi->needsRetiring) { -+ yaffs2_InvalidateCheckpoint(dev); -+ erasedOk = yaffs_EraseBlockInNAND(dev, blockNo); -+ if (!erasedOk) { -+ dev->nErasureFailures++; -+ T(YAFFS_TRACE_ERROR | YAFFS_TRACE_BAD_BLOCKS, -+ (TSTR("**>> Erasure failed %d" TENDSTR), blockNo)); ++ bi = yaffs_get_block_info(dev, dev->alloc_block_finder); ++ ++ if (bi->block_state == YAFFS_BLOCK_STATE_EMPTY) { ++ bi->block_state = YAFFS_BLOCK_STATE_ALLOCATING; ++ dev->seq_number++; ++ bi->seq_number = dev->seq_number; ++ dev->n_erased_blocks--; ++ T(YAFFS_TRACE_ALLOCATE, ++ (TSTR("Allocated block %d, seq %d, %d left" TENDSTR), ++ dev->alloc_block_finder, dev->seq_number, ++ dev->n_erased_blocks)); ++ return dev->alloc_block_finder; + } } @@ -9085,123 +9745,103 @@ - if (ok) { - nBytes = nBlocks * dev->chunkBitmapStride; - ok = (yaffs_CheckpointWrite(dev, dev->chunkBits, nBytes) == nBytes); -+ if (erasedOk && -+ ((yaffs_traceMask & YAFFS_TRACE_ERASE) || !yaffs_SkipVerification(dev))) { -+ int i; -+ for (i = 0; i < dev->param.nChunksPerBlock; i++) { -+ if (!yaffs_CheckChunkErased -+ (dev, blockNo * dev->param.nChunksPerBlock + i)) { -+ T(YAFFS_TRACE_ERROR, -+ (TSTR -+ (">>Block %d erasure supposedly OK, but chunk %d not erased" -+ TENDSTR), blockNo, i)); -+ } -+ } - } +- } - return ok ? 1 : 0; ++ T(YAFFS_TRACE_ALWAYS, ++ (TSTR ++ ("yaffs tragedy: no more erased blocks, but there should have been %d" ++ TENDSTR), dev->n_erased_blocks)); -+ if (erasedOk) { -+ /* Clean it up... */ -+ bi->blockState = YAFFS_BLOCK_STATE_EMPTY; -+ bi->sequenceNumber = 0; -+ dev->nErasedBlocks++; -+ bi->pagesInUse = 0; -+ bi->softDeletions = 0; -+ bi->hasShrinkHeader = 0; -+ bi->skipErasedCheck = 1; /* This is clean, so no need to check */ -+ bi->gcPrioritise = 0; -+ yaffs_ClearChunkBits(dev, blockNo); -+ -+ T(YAFFS_TRACE_ERASE, -+ (TSTR("Erased block %d" TENDSTR), blockNo)); -+ } else { -+ dev->nFreeChunks -= dev->param.nChunksPerBlock; /* We lost a block of free space */ -+ -+ yaffs_RetireBlock(dev, blockNo); -+ T(YAFFS_TRACE_ERROR | YAFFS_TRACE_BAD_BLOCKS, -+ (TSTR("**>> Block %d retired" TENDSTR), blockNo)); -+ } ++ return -1; } -static int yaffs_ReadCheckpointDevice(yaffs_Device *dev) -+static int yaffs_FindBlockForAllocation(yaffs_Device *dev) ++ ++/* ++ * Check if there's space to allocate... ++ * Thinks.... do we need top make this ths same as yaffs_get_free_chunks()? ++ */ ++int yaffs_check_alloc_available(yaffs_dev_t *dev, int n_chunks) { - yaffs_CheckpointDevice cp; - __u32 nBytes; - __u32 nBlocks = (dev->internalEndBlock - dev->internalStartBlock + 1); -- ++ int reservedChunks; ++ int reservedBlocks = dev->param.n_reserved_blocks; ++ int checkpointBlocks; + - int ok; -+ int i; ++ checkpointBlocks = yaffs_calc_checkpt_blocks_required(dev); - ok = (yaffs_CheckpointRead(dev, &cp, sizeof(cp)) == sizeof(cp)); - if (!ok) - return 0; -+ yaffs_BlockInfo *bi; ++ reservedChunks = ((reservedBlocks + checkpointBlocks) * dev->param.chunks_per_block); - if (cp.structType != sizeof(cp)) - return 0; -+ if (dev->nErasedBlocks < 1) { -+ /* Hoosterman we've got a problem. -+ * Can't get space to gc -+ */ -+ T(YAFFS_TRACE_ERROR, -+ (TSTR("yaffs tragedy: no more erased blocks" TENDSTR))); ++ return (dev->n_free_chunks > (reservedChunks + n_chunks)); ++} ++ ++static int yaffs_alloc_chunk(yaffs_dev_t *dev, int useReserve, ++ yaffs_block_info_t **blockUsedPtr) ++{ ++ int retVal; ++ yaffs_block_info_t *bi; ++ ++ if (dev->alloc_block < 0) { ++ /* Get next block to allocate off */ ++ dev->alloc_block = yaffs_find_alloc_block(dev); ++ dev->alloc_page = 0; ++ } ++ if (!useReserve && !yaffs_check_alloc_available(dev, 1)) { ++ /* Not enough space to allocate unless we're allowed to use the reserve. */ + return -1; + } - yaffs_CheckpointDeviceToDevice(dev, &cp); -+ /* Find an empty block. */ ++ if (dev->n_erased_blocks < dev->param.n_reserved_blocks ++ && dev->alloc_page == 0) { ++ T(YAFFS_TRACE_ALLOCATE, (TSTR("Allocating reserve" TENDSTR))); ++ } - nBytes = nBlocks * sizeof(yaffs_BlockInfo); -+ for (i = dev->internalStartBlock; i <= dev->internalEndBlock; i++) { -+ dev->allocationBlockFinder++; -+ if (dev->allocationBlockFinder < dev->internalStartBlock -+ || dev->allocationBlockFinder > dev->internalEndBlock) { -+ dev->allocationBlockFinder = dev->internalStartBlock; -+ } ++ /* Next page please.... */ ++ if (dev->alloc_block >= 0) { ++ bi = yaffs_get_block_info(dev, dev->alloc_block); - ok = (yaffs_CheckpointRead(dev, dev->blockInfo, nBytes) == nBytes); -+ bi = yaffs_GetBlockInfo(dev, dev->allocationBlockFinder); ++ retVal = (dev->alloc_block * dev->param.chunks_per_block) + ++ dev->alloc_page; ++ bi->pages_in_use++; ++ yaffs_set_chunk_bit(dev, dev->alloc_block, ++ dev->alloc_page); - if (!ok) - return 0; - nBytes = nBlocks * dev->chunkBitmapStride; -+ if (bi->blockState == YAFFS_BLOCK_STATE_EMPTY) { -+ bi->blockState = YAFFS_BLOCK_STATE_ALLOCATING; -+ dev->sequenceNumber++; -+ bi->sequenceNumber = dev->sequenceNumber; -+ dev->nErasedBlocks--; -+ T(YAFFS_TRACE_ALLOCATE, -+ (TSTR("Allocated block %d, seq %d, %d left" TENDSTR), -+ dev->allocationBlockFinder, dev->sequenceNumber, -+ dev->nErasedBlocks)); -+ return dev->allocationBlockFinder; -+ } -+ } ++ dev->alloc_page++; - ok = (yaffs_CheckpointRead(dev, dev->chunkBits, nBytes) == nBytes); -+ T(YAFFS_TRACE_ALWAYS, -+ (TSTR -+ ("yaffs tragedy: no more erased blocks, but there should have been %d" -+ TENDSTR), dev->nErasedBlocks)); ++ dev->n_free_chunks--; - return ok ? 1 : 0; -+ return -1; - } +-} ++ /* If the block is full set the state to full */ ++ if (dev->alloc_page >= dev->param.chunks_per_block) { ++ bi->block_state = YAFFS_BLOCK_STATE_FULL; ++ dev->alloc_block = -1; ++ } -static void yaffs_ObjectToCheckpointObject(yaffs_CheckpointObject *cp, - yaffs_Object *obj) +-{ ++ if (blockUsedPtr) ++ *blockUsedPtr = bi; + -+/* -+ * Check if there's space to allocate... -+ * Thinks.... do we need top make this ths same as yaffs_GetFreeChunks()? -+ */ -+int yaffs_CheckSpaceForAllocation(yaffs_Device *dev, int nChunks) - { -+ int reservedChunks; -+ int reservedBlocks = dev->param.nReservedBlocks; -+ int checkpointBlocks; ++ return retVal; ++ } - cp->objectId = obj->objectId; - cp->parentId = (obj->parent) ? obj->parent->objectId : 0; @@ -9215,30 +9855,23 @@ - cp->unlinkAllowed = obj->unlinkAllowed; - cp->serial = obj->serial; - cp->nDataChunks = obj->nDataChunks; -+ checkpointBlocks = yaffs2_CalcCheckpointBlocksRequired(dev); ++ T(YAFFS_TRACE_ERROR, ++ (TSTR("!!!!!!!!! Allocator out !!!!!!!!!!!!!!!!!" TENDSTR))); - if (obj->variantType == YAFFS_OBJECT_TYPE_FILE) - cp->fileSizeOrEquivalentObjectId = obj->variant.fileVariant.fileSize; - else if (obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK) - cp->fileSizeOrEquivalentObjectId = obj->variant.hardLinkVariant.equivalentObjectId; -+ reservedChunks = ((reservedBlocks + checkpointBlocks) * dev->param.nChunksPerBlock); -+ -+ return (dev->nFreeChunks > (reservedChunks + nChunks)); ++ return -1; } -static int yaffs_CheckpointObjectToObject(yaffs_Object *obj, yaffs_CheckpointObject *cp) -+static int yaffs_AllocateChunk(yaffs_Device *dev, int useReserve, -+ yaffs_BlockInfo **blockUsedPtr) ++static int yaffs_get_erased_chunks(yaffs_dev_t *dev) { -+ int retVal; -+ yaffs_BlockInfo *bi; ++ int n; - yaffs_Object *parent; -+ if (dev->allocationBlock < 0) { -+ /* Get next block to allocate off */ -+ dev->allocationBlock = yaffs_FindBlockForAllocation(dev); -+ dev->allocationPage = 0; -+ } ++ n = dev->n_erased_blocks * dev->param.chunks_per_block; - if (obj->variantType != cp->variantType) { - T(YAFFS_TRACE_ERROR, (TSTR("Checkpoint read object %d type %d " @@ -9246,16 +9879,12 @@ - TENDSTR), cp->objectId, cp->variantType, cp->hdrChunk, - obj->variantType)); - return 0; -+ if (!useReserve && !yaffs_CheckSpaceForAllocation(dev, 1)) { -+ /* Not enough space to allocate unless we're allowed to use the reserve. */ -+ return -1; - } +- } ++ if (dev->alloc_block > 0) ++ n += (dev->param.chunks_per_block - dev->alloc_page); - obj->objectId = cp->objectId; -+ if (dev->nErasedBlocks < dev->param.nReservedBlocks -+ && dev->allocationPage == 0) { -+ T(YAFFS_TRACE_ALLOCATE, (TSTR("Allocating reserve" TENDSTR))); -+ } ++ return n; - if (cp->parentId) - parent = yaffs_FindOrCreateObjectByNumber( @@ -9264,9 +9893,7 @@ - YAFFS_OBJECT_TYPE_DIRECTORY); - else - parent = NULL; -+ /* Next page please.... */ -+ if (dev->allocationBlock >= 0) { -+ bi = yaffs_GetBlockInfo(dev, dev->allocationBlock); ++} - if (parent) { - if (parent->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) { @@ -9276,15 +9903,21 @@ - cp->objectId, cp->parentId, cp->variantType, - cp->hdrChunk, parent->variantType)); - return 0; -- } ++/* ++ * yaffs_skip_rest_of_block() skips over the rest of the allocation block ++ * if we don't want to write to it. ++ */ ++void yaffs_skip_rest_of_block(yaffs_dev_t *dev) ++{ ++ if(dev->alloc_block > 0){ ++ yaffs_block_info_t *bi = yaffs_get_block_info(dev, dev->alloc_block); ++ if(bi->block_state == YAFFS_BLOCK_STATE_ALLOCATING){ ++ bi->block_state = YAFFS_BLOCK_STATE_FULL; ++ dev->alloc_block = -1; + } - yaffs_AddObjectToDirectory(parent, obj); -- } -+ retVal = (dev->allocationBlock * dev->param.nChunksPerBlock) + -+ dev->allocationPage; -+ bi->pagesInUse++; -+ yaffs_SetChunkBit(dev, dev->allocationBlock, -+ dev->allocationPage); - + } +- - obj->hdrChunk = cp->hdrChunk; - obj->variantType = cp->variantType; - obj->deleted = cp->deleted; @@ -9295,52 +9928,45 @@ - obj->unlinkAllowed = cp->unlinkAllowed; - obj->serial = cp->serial; - obj->nDataChunks = cp->nDataChunks; -+ dev->allocationPage++; - +- - if (obj->variantType == YAFFS_OBJECT_TYPE_FILE) - obj->variant.fileVariant.fileSize = cp->fileSizeOrEquivalentObjectId; - else if (obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK) - obj->variant.hardLinkVariant.equivalentObjectId = cp->fileSizeOrEquivalentObjectId; -+ dev->nFreeChunks--; - +- - if (obj->hdrChunk > 0) - obj->lazyLoaded = 1; - return 1; --} -+ /* If the block is full set the state to full */ -+ if (dev->allocationPage >= dev->param.nChunksPerBlock) { -+ bi->blockState = YAFFS_BLOCK_STATE_FULL; -+ dev->allocationBlock = -1; -+ } + } -+ if (blockUsedPtr) -+ *blockUsedPtr = bi; - -+ return retVal; -+ } +- -static int yaffs_CheckpointTnodeWorker(yaffs_Object *in, yaffs_Tnode *tn, - __u32 level, int chunkOffset) --{ -- int i; ++static int yaffs_gc_block(yaffs_dev_t *dev, int block, ++ int wholeBlock) + { ++ int oldChunk; ++ int newChunk; ++ int mark_flash; ++ int retVal = YAFFS_OK; + int i; - yaffs_Device *dev = in->myDev; - int ok = 1; - int tnodeSize = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8; -+ T(YAFFS_TRACE_ERROR, -+ (TSTR("!!!!!!!!! Allocator out !!!!!!!!!!!!!!!!!" TENDSTR))); - +- - if (tnodeSize < sizeof(yaffs_Tnode)) - tnodeSize = sizeof(yaffs_Tnode); -+ return -1; -+} ++ int isCheckpointBlock; ++ int matchingChunk; ++ int maxCopies; -+static int yaffs_GetErasedChunks(yaffs_Device *dev) -+{ -+ int n; ++ int chunksBefore = yaffs_get_erased_chunks(dev); ++ int chunksAfter; - if (tn) { - if (level > 0) { -+ n = dev->nErasedBlocks * dev->param.nChunksPerBlock; ++ yaffs_ext_tags tags; - for (i = 0; i < YAFFS_NTNODES_INTERNAL && ok; i++) { - if (tn->internal[i]) { @@ -9357,24 +9983,19 @@ - ok = (yaffs_CheckpointWrite(dev, tn, tnodeSize) == tnodeSize); - } - } -+ if (dev->allocationBlock > 0) -+ n += (dev->param.nChunksPerBlock - dev->allocationPage); ++ yaffs_block_info_t *bi = yaffs_get_block_info(dev, block); - return ok; -+ return n; ++ yaffs_obj_t *object; - } +-} ++ isCheckpointBlock = (bi->block_state == YAFFS_BLOCK_STATE_CHECKPOINT); -static int yaffs_WriteCheckpointTnodes(yaffs_Object *obj) -+/* -+ * yaffs_SkipRestOfBlock() skips over the rest of the allocation block -+ * if we don't want to write to it. -+ */ -+void yaffs_SkipRestOfBlock(yaffs_Device *dev) - { +-{ - __u32 endMarker = ~0; - int ok = 1; -- + - if (obj->variantType == YAFFS_OBJECT_TYPE_FILE) { - ok = yaffs_CheckpointTnodeWorker(obj, - obj->variant.fileVariant.top, @@ -9383,16 +10004,17 @@ - if (ok) - ok = (yaffs_CheckpointWrite(obj->myDev, &endMarker, sizeof(endMarker)) == - sizeof(endMarker)); -+ if(dev->allocationBlock > 0){ -+ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, dev->allocationBlock); -+ if(bi->blockState == YAFFS_BLOCK_STATE_ALLOCATING){ -+ bi->blockState = YAFFS_BLOCK_STATE_FULL; -+ dev->allocationBlock = -1; -+ } - } -- +- } ++ T(YAFFS_TRACE_TRACING, ++ (TSTR("Collecting block %d, in use %d, shrink %d, wholeBlock %d" TENDSTR), ++ block, ++ bi->pages_in_use, ++ bi->has_shrink_hdr, ++ wholeBlock)); + - return ok ? 1 : 0; - } +-} ++ /*yaffs_verify_free_chunks(dev); */ -static int yaffs_ReadCheckpointTnodes(yaffs_Object *obj) -{ @@ -9403,70 +10025,71 @@ - yaffs_Tnode *tn; - int nread = 0; - int tnodeSize = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8; ++ if(bi->block_state == YAFFS_BLOCK_STATE_FULL) ++ bi->block_state = YAFFS_BLOCK_STATE_COLLECTING; ++ ++ bi->has_shrink_hdr = 0; /* clear the flag so that the block can erase */ - if (tnodeSize < sizeof(yaffs_Tnode)) - tnodeSize = sizeof(yaffs_Tnode); -+static int yaffs_GarbageCollectBlock(yaffs_Device *dev, int block, -+ int wholeBlock) -+{ -+ int oldChunk; -+ int newChunk; -+ int markNAND; -+ int retVal = YAFFS_OK; -+ int i; -+ int isCheckpointBlock; -+ int matchingChunk; -+ int maxCopies; ++ dev->gc_disable = 1; - ok = (yaffs_CheckpointRead(dev, &baseChunk, sizeof(baseChunk)) == sizeof(baseChunk)); -+ int chunksBefore = yaffs_GetErasedChunks(dev); -+ int chunksAfter; ++ if (isCheckpointBlock || ++ !yaffs_still_some_chunks(dev, block)) { ++ T(YAFFS_TRACE_TRACING, ++ (TSTR ++ ("Collecting block %d that has no chunks in use" TENDSTR), ++ block)); ++ yaffs_block_became_dirty(dev, block); ++ } else { - while (ok && (~baseChunk)) { - nread++; - /* Read level 0 tnode */ -+ yaffs_ExtendedTags tags; ++ __u8 *buffer = yaffs_get_temp_buffer(dev, __LINE__); -+ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, block); ++ yaffs_verify_blk(dev, bi, block); - tn = yaffs_GetTnodeRaw(dev); - if (tn) - ok = (yaffs_CheckpointRead(dev, tn, tnodeSize) == tnodeSize); - else - ok = 0; -+ yaffs_Object *object; ++ maxCopies = (wholeBlock) ? dev->param.chunks_per_block : 5; ++ oldChunk = block * dev->param.chunks_per_block + dev->gc_chunk; - if (tn && ok) - ok = yaffs_AddOrFindLevel0Tnode(dev, - fileStructPtr, - baseChunk, - tn) ? 1 : 0; -+ isCheckpointBlock = (bi->blockState == YAFFS_BLOCK_STATE_CHECKPOINT); ++ for (/* init already done */; ++ retVal == YAFFS_OK && ++ dev->gc_chunk < dev->param.chunks_per_block && ++ (bi->block_state == YAFFS_BLOCK_STATE_COLLECTING) && ++ maxCopies > 0; ++ dev->gc_chunk++, oldChunk++) { ++ if (yaffs_check_chunk_bit(dev, block, dev->gc_chunk)) { - if (ok) - ok = (yaffs_CheckpointRead(dev, &baseChunk, sizeof(baseChunk)) == sizeof(baseChunk)); ++ /* This page is in use and might need to be copied off */ - } -+ T(YAFFS_TRACE_TRACING, -+ (TSTR("Collecting block %d, in use %d, shrink %d, wholeBlock %d" TENDSTR), -+ block, -+ bi->pagesInUse, -+ bi->hasShrinkHeader, -+ wholeBlock)); ++ maxCopies--; - T(YAFFS_TRACE_CHECKPOINT, ( - TSTR("Checkpoint read tnodes %d records, last %d. ok %d" TENDSTR), - nread, baseChunk, ok)); -+ /*yaffs_VerifyFreeChunks(dev); */ ++ mark_flash = 1; - return ok ? 1 : 0; -} -+ if(bi->blockState == YAFFS_BLOCK_STATE_FULL) -+ bi->blockState = YAFFS_BLOCK_STATE_COLLECTING; -+ -+ bi->hasShrinkHeader = 0; /* clear the flag so that the block can erase */ ++ yaffs_init_tags(&tags); -+ dev->gcDisable = 1; ++ yaffs_rd_chunk_tags_nand(dev, oldChunk, ++ buffer, &tags); -static int yaffs_WriteCheckpointObjects(yaffs_Device *dev) -{ @@ -9475,21 +10098,26 @@ - int i; - int ok = 1; - struct ylist_head *lh; -+ if (isCheckpointBlock || -+ !yaffs_StillSomeChunkBits(dev, block)) { -+ T(YAFFS_TRACE_TRACING, -+ (TSTR -+ ("Collecting block %d that has no chunks in use" TENDSTR), -+ block)); -+ yaffs_BlockBecameDirty(dev, block); -+ } else { ++ object = ++ yaffs_find_by_number(dev, ++ tags.obj_id); -+ __u8 *buffer = yaffs_GetTempBuffer(dev, __LINE__); ++ T(YAFFS_TRACE_GC_DETAIL, ++ (TSTR ++ ("Collecting chunk in block %d, %d %d %d " TENDSTR), ++ dev->gc_chunk, tags.obj_id, tags.chunk_id, ++ tags.n_bytes)); - /* Iterate through the objects in each hash entry, - * dumping them to the checkpointing stream. - */ -+ yaffs_VerifyBlock(dev, bi, block); ++ if (object && !yaffs_skip_verification(dev)) { ++ if (tags.chunk_id == 0) ++ matchingChunk = object->hdr_chunk; ++ else if (object->soft_del) ++ matchingChunk = oldChunk; /* Defeat the test */ ++ else ++ matchingChunk = yaffs_find_chunk_in_file(object, tags.chunk_id, NULL); - for (i = 0; ok && i < YAFFS_NOBJECT_BUCKETS; i++) { - ylist_for_each(lh, &dev->objectBucket[i].list) { @@ -9502,38 +10130,80 @@ - T(YAFFS_TRACE_CHECKPOINT, ( - TSTR("Checkpoint write object %d parent %d type %d chunk %d obj addr %x" TENDSTR), - cp.objectId, cp.parentId, cp.variantType, cp.hdrChunk, (unsigned) obj)); -+ maxCopies = (wholeBlock) ? dev->param.nChunksPerBlock : 5; -+ oldChunk = block * dev->param.nChunksPerBlock + dev->gcChunk; ++ if (oldChunk != matchingChunk) ++ T(YAFFS_TRACE_ERROR, ++ (TSTR("gc: page in gc mismatch: %d %d %d %d"TENDSTR), ++ oldChunk, matchingChunk, tags.obj_id, tags.chunk_id)); - ok = (yaffs_CheckpointWrite(dev, &cp, sizeof(cp)) == sizeof(cp)); -+ for (/* init already done */; -+ retVal == YAFFS_OK && -+ dev->gcChunk < dev->param.nChunksPerBlock && -+ (bi->blockState == YAFFS_BLOCK_STATE_COLLECTING) && -+ maxCopies > 0; -+ dev->gcChunk++, oldChunk++) { -+ if (yaffs_CheckChunkBit(dev, block, dev->gcChunk)) { ++ } - if (ok && obj->variantType == YAFFS_OBJECT_TYPE_FILE) - ok = yaffs_WriteCheckpointTnodes(obj); -- } ++ if (!object) { ++ T(YAFFS_TRACE_ERROR, ++ (TSTR ++ ("page %d in gc has no object: %d %d %d " ++ TENDSTR), oldChunk, ++ tags.obj_id, tags.chunk_id, tags.n_bytes)); + } - } - } - } -+ /* This page is in use and might need to be copied off */ - /* Dump end of list */ - memset(&cp, 0xFF, sizeof(yaffs_CheckpointObject)); - cp.structType = sizeof(cp); -+ maxCopies--; ++ if (object && ++ object->deleted && ++ object->soft_del && ++ tags.chunk_id != 0) { ++ /* Data chunk in a soft deleted file, throw it away ++ * It's a soft deleted data chunk, ++ * No need to copy this, just forget about it and ++ * fix up the object. ++ */ ++ ++ /* Free chunks already includes softdeleted chunks. ++ * How ever this chunk is going to soon be really deleted ++ * which will increment free chunks. ++ * We have to decrement free chunks so this works out properly. ++ */ ++ dev->n_free_chunks--; ++ bi->soft_del_pages--; ++ ++ object->n_data_chunks--; - if (ok) - ok = (yaffs_CheckpointWrite(dev, &cp, sizeof(cp)) == sizeof(cp)); -+ markNAND = 1; ++ if (object->n_data_chunks <= 0) { ++ /* remeber to clean up the object */ ++ dev->gc_cleanup_list[dev->n_clean_ups] = ++ tags.obj_id; ++ dev->n_clean_ups++; ++ } ++ mark_flash = 0; ++ } else if (0) { ++ /* Todo object && object->deleted && object->n_data_chunks == 0 */ ++ /* Deleted object header with no data chunks. ++ * Can be discarded and the file deleted. ++ */ ++ object->hdr_chunk = 0; ++ yaffs_free_tnode(object->my_dev, ++ object->variant. ++ file_variant.top); ++ object->variant.file_variant.top = NULL; ++ yaffs_generic_obj_del(object); - return ok ? 1 : 0; -} -+ yaffs_InitialiseTags(&tags); ++ } else if (object) { ++ /* It's either a data chunk in a live file or ++ * an ObjectHeader, so we're interested in it. ++ * NB Need to keep the ObjectHeaders of deleted files ++ * until the whole file has been deleted off ++ */ ++ tags.serial_number++; -static int yaffs_ReadCheckpointObjects(yaffs_Device *dev) -{ @@ -9542,8 +10212,7 @@ - int ok = 1; - int done = 0; - yaffs_Object *hardList = NULL; -+ yaffs_ReadChunkWithTagsFromNAND(dev, oldChunk, -+ buffer, &tags); ++ dev->n_gc_copies++; - while (ok && !done) { - ok = (yaffs_CheckpointRead(dev, &cp, sizeof(cp)) == sizeof(cp)); @@ -9575,112 +10244,7 @@ - ok = 0; - } - } -+ object = -+ yaffs_FindObjectByNumber(dev, -+ tags.objectId); - -- if (ok) -- yaffs_HardlinkFixup(dev, hardList); -+ T(YAFFS_TRACE_GC_DETAIL, -+ (TSTR -+ ("Collecting chunk in block %d, %d %d %d " TENDSTR), -+ dev->gcChunk, tags.objectId, tags.chunkId, -+ tags.byteCount)); - -- return ok ? 1 : 0; --} -+ if (object && !yaffs_SkipVerification(dev)) { -+ if (tags.chunkId == 0) -+ matchingChunk = object->hdrChunk; -+ else if (object->softDeleted) -+ matchingChunk = oldChunk; /* Defeat the test */ -+ else -+ matchingChunk = yaffs_FindChunkInFile(object, tags.chunkId, NULL); - --static int yaffs_WriteCheckpointSum(yaffs_Device *dev) --{ -- __u32 checkpointSum; -- int ok; -+ if (oldChunk != matchingChunk) -+ T(YAFFS_TRACE_ERROR, -+ (TSTR("gc: page in gc mismatch: %d %d %d %d"TENDSTR), -+ oldChunk, matchingChunk, tags.objectId, tags.chunkId)); - -- yaffs_GetCheckpointSum(dev, &checkpointSum); -+ } - -- ok = (yaffs_CheckpointWrite(dev, &checkpointSum, sizeof(checkpointSum)) == sizeof(checkpointSum)); -+ if (!object) { -+ T(YAFFS_TRACE_ERROR, -+ (TSTR -+ ("page %d in gc has no object: %d %d %d " -+ TENDSTR), oldChunk, -+ tags.objectId, tags.chunkId, tags.byteCount)); -+ } - -- if (!ok) -- return 0; -+ if (object && -+ object->deleted && -+ object->softDeleted && -+ tags.chunkId != 0) { -+ /* Data chunk in a soft deleted file, throw it away -+ * It's a soft deleted data chunk, -+ * No need to copy this, just forget about it and -+ * fix up the object. -+ */ -+ -+ /* Free chunks already includes softdeleted chunks. -+ * How ever this chunk is going to soon be really deleted -+ * which will increment free chunks. -+ * We have to decrement free chunks so this works out properly. -+ */ -+ dev->nFreeChunks--; -+ bi->softDeletions--; - -- return 1; --} -+ object->nDataChunks--; - --static int yaffs_ReadCheckpointSum(yaffs_Device *dev) --{ -- __u32 checkpointSum0; -- __u32 checkpointSum1; -- int ok; -+ if (object->nDataChunks <= 0) { -+ /* remeber to clean up the object */ -+ dev->gcCleanupList[dev->nCleanups] = -+ tags.objectId; -+ dev->nCleanups++; -+ } -+ markNAND = 0; -+ } else if (0) { -+ /* Todo object && object->deleted && object->nDataChunks == 0 */ -+ /* Deleted object header with no data chunks. -+ * Can be discarded and the file deleted. -+ */ -+ object->hdrChunk = 0; -+ yaffs_FreeTnode(object->myDev, -+ object->variant. -+ fileVariant.top); -+ object->variant.fileVariant.top = NULL; -+ yaffs_DoGenericObjectDeletion(object); - -- yaffs_GetCheckpointSum(dev, &checkpointSum0); -+ } else if (object) { -+ /* It's either a data chunk in a live file or -+ * an ObjectHeader, so we're interested in it. -+ * NB Need to keep the ObjectHeaders of deleted files -+ * until the whole file has been deleted off -+ */ -+ tags.serialNumber++; - -- ok = (yaffs_CheckpointRead(dev, &checkpointSum1, sizeof(checkpointSum1)) == sizeof(checkpointSum1)); -+ dev->nGCCopies++; - -- if (!ok) -- return 0; -+ if (tags.chunkId == 0) { ++ if (tags.chunk_id == 0) { + /* It is an object Id, + * We need to nuke the shrinkheader flags first + * Also need to clean up shadowing. @@ -9688,47 +10252,131 @@ + * and if it is left in place it will mess up scanning. + */ -- if (checkpointSum0 != checkpointSum1) +- if (ok) +- yaffs_HardlinkFixup(dev, hardList); ++ yaffs_obj_header *oh; ++ oh = (yaffs_obj_header *)buffer; + +- return ok ? 1 : 0; +-} ++ oh->is_shrink = 0; ++ tags.extra_is_shrink = 0; + +-static int yaffs_WriteCheckpointSum(yaffs_Device *dev) +-{ +- __u32 checkpointSum; +- int ok; ++ oh->shadows_obj = 0; ++ oh->inband_shadowed_obj_id = 0; ++ tags.extra_shadows = 0; ++ ++ /* Update file size */ ++ if(object->variant_type == YAFFS_OBJECT_TYPE_FILE){ ++ oh->file_size = object->variant.file_variant.file_size; ++ tags.extra_length = oh->file_size; ++ } ++ ++ yaffs_verify_oh(object, oh, &tags, 1); ++ newChunk = ++ yaffs_write_new_chunk(dev,(__u8 *) oh, &tags, 1); ++ } else ++ newChunk = ++ yaffs_write_new_chunk(dev, buffer, &tags, 1); ++ ++ if (newChunk < 0) { ++ retVal = YAFFS_FAIL; ++ } else { + +- yaffs_GetCheckpointSum(dev, &checkpointSum); ++ /* Ok, now fix up the Tnodes etc. */ + +- ok = (yaffs_CheckpointWrite(dev, &checkpointSum, sizeof(checkpointSum)) == sizeof(checkpointSum)); ++ if (tags.chunk_id == 0) { ++ /* It's a header */ ++ object->hdr_chunk = newChunk; ++ object->serial = tags.serial_number; ++ } else { ++ /* It's a data chunk */ ++ int ok; ++ ok = yaffs_put_chunk_in_file ++ (object, ++ tags.chunk_id, ++ newChunk, 0); ++ } ++ } ++ } + +- if (!ok) - return 0; -+ yaffs_ObjectHeader *oh; -+ oh = (yaffs_ObjectHeader *)buffer; ++ if (retVal == YAFFS_OK) ++ yaffs_chunk_del(dev, oldChunk, mark_flash, __LINE__); + +- return 1; +-} ++ } ++ } + +-static int yaffs_ReadCheckpointSum(yaffs_Device *dev) +-{ +- __u32 checkpointSum0; +- __u32 checkpointSum1; +- int ok; ++ yaffs_release_temp_buffer(dev, buffer, __LINE__); + +- yaffs_GetCheckpointSum(dev, &checkpointSum0); + +- ok = (yaffs_CheckpointRead(dev, &checkpointSum1, sizeof(checkpointSum1)) == sizeof(checkpointSum1)); + +- if (!ok) +- return 0; ++ } + +- if (checkpointSum0 != checkpointSum1) +- return 0; ++ yaffs_verify_collected_blk(dev, bi, block); - return 1; -} -+ oh->isShrink = 0; -+ tags.extraIsShrinkHeader = 0; -+ oh->shadowsObject = 0; -+ oh->inbandShadowsObject = 0; -+ tags.extraShadows = 0; -+ -+ /* Update file size */ -+ if(object->variantType == YAFFS_OBJECT_TYPE_FILE){ -+ oh->fileSize = object->variant.fileVariant.fileSize; -+ tags.extraFileLength = oh->fileSize; -+ } -static int yaffs_WriteCheckpointData(yaffs_Device *dev) -{ - int ok = 1; -+ yaffs_VerifyObjectHeader(object, oh, &tags, 1); -+ newChunk = -+ yaffs_WriteNewChunkWithTagsToNAND(dev,(__u8 *) oh, &tags, 1); -+ } else -+ newChunk = -+ yaffs_WriteNewChunkWithTagsToNAND(dev, buffer, &tags, 1); ++ if (bi->block_state == YAFFS_BLOCK_STATE_COLLECTING) { ++ /* ++ * The gc did not complete. Set block state back to FULL ++ * because checkpointing does not restore gc. ++ */ ++ bi->block_state = YAFFS_BLOCK_STATE_FULL; ++ } else { ++ /* The gc completed. */ ++ /* Do any required cleanups */ ++ for (i = 0; i < dev->n_clean_ups; i++) { ++ /* Time to delete the file too */ ++ object = ++ yaffs_find_by_number(dev, ++ dev->gc_cleanup_list[i]); ++ if (object) { ++ yaffs_free_tnode(dev, ++ object->variant.file_variant. ++ top); ++ object->variant.file_variant.top = NULL; ++ T(YAFFS_TRACE_GC, ++ (TSTR ++ ("yaffs: About to finally delete object %d" ++ TENDSTR), object->obj_id)); ++ yaffs_generic_obj_del(object); ++ object->my_dev->n_deleted_files--; ++ } - if (dev->skipCheckpointWrite || !dev->isYaffs2) { - T(YAFFS_TRACE_CHECKPOINT, (TSTR("skipping checkpoint write" TENDSTR))); - ok = 0; - } -+ if (newChunk < 0) { -+ retVal = YAFFS_FAIL; -+ } else { ++ } - if (ok) - ok = yaffs_CheckpointOpen(dev, 1); -+ /* Ok, now fix up the Tnodes etc. */ - if (ok) { - T(YAFFS_TRACE_CHECKPOINT, (TSTR("write checkpoint validity" TENDSTR))); @@ -9745,53 +10393,84 @@ - if (ok) { - T(YAFFS_TRACE_CHECKPOINT, (TSTR("write checkpoint validity" TENDSTR))); - ok = yaffs_WriteCheckpointValidityMarker(dev, 0); -- } -+ if (tags.chunkId == 0) { -+ /* It's a header */ -+ object->hdrChunk = newChunk; -+ object->serial = tags.serialNumber; -+ } else { -+ /* It's a data chunk */ -+ int ok; -+ ok = yaffs_PutChunkIntoFile -+ (object, -+ tags.chunkId, -+ newChunk, 0); -+ } -+ } -+ } ++ chunksAfter = yaffs_get_erased_chunks(dev); ++ if (chunksBefore >= chunksAfter) { ++ T(YAFFS_TRACE_GC, ++ (TSTR ++ ("gc did not increase free chunks before %d after %d" ++ TENDSTR), chunksBefore, chunksAfter)); ++ } ++ dev->gc_block = 0; ++ dev->gc_chunk = 0; ++ dev->n_clean_ups = 0; + } - if (ok) - ok = yaffs_WriteCheckpointSum(dev); -+ if (retVal == YAFFS_OK) -+ yaffs_DeleteChunk(dev, oldChunk, markNAND, __LINE__); - +- - if (!yaffs_CheckpointClose(dev)) - ok = 0; -+ } -+ } - +- - if (ok) - dev->isCheckpointed = 1; - else - dev->isCheckpointed = 0; -+ yaffs_ReleaseTempBuffer(dev, buffer, __LINE__); ++ dev->gc_disable = 0; - return dev->isCheckpointed; --} ++ return retVal; + } -static int yaffs_ReadCheckpointData(yaffs_Device *dev) --{ ++/* ++ * FindBlockForgarbageCollection is used to select the dirtiest block (or close enough) ++ * for garbage collection. ++ */ ++ ++static unsigned yaffs_find_gc_block(yaffs_dev_t *dev, ++ int aggressive, ++ int background) + { - int ok = 1; ++ int i; ++ int iterations; ++ unsigned selected = 0; ++ int prioritised = 0; ++ int prioritisedExists = 0; ++ yaffs_block_info_t *bi; ++ int threshold; - if (dev->skipCheckpointRead || !dev->isYaffs2) { - T(YAFFS_TRACE_CHECKPOINT, (TSTR("skipping checkpoint read" TENDSTR))); - ok = 0; - } +- } ++ /* First let's see if we need to grab a prioritised block */ ++ if (dev->has_pending_prioritised_gc && !aggressive) { ++ dev->gc_dirtiest = 0; ++ bi = dev->block_info; ++ for (i = dev->internal_start_block; ++ i <= dev->internal_end_block && !selected; ++ i++) { ++ ++ if (bi->gc_prioritise) { ++ prioritisedExists = 1; ++ if (bi->block_state == YAFFS_BLOCK_STATE_FULL && ++ yaffs_block_ok_for_gc(dev, bi)) { ++ selected = i; ++ prioritised = 1; ++ } ++ } ++ bi++; ++ } - if (ok) - ok = yaffs_CheckpointOpen(dev, 0); /* open for read */ -- ++ /* ++ * If there is a prioritised block and none was selected then ++ * this happened because there is at least one old dirty block gumming ++ * up the works. Let's gc the oldest dirty block. ++ */ + - if (ok) { - T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint validity" TENDSTR))); - ok = yaffs_ReadCheckpointValidityMarker(dev, 1); @@ -9808,51 +10487,42 @@ - T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint validity" TENDSTR))); - ok = yaffs_ReadCheckpointValidityMarker(dev, 0); - } -+ yaffs_VerifyCollectedBlock(dev, bi, block); ++ if(prioritisedExists && ++ !selected && ++ dev->oldest_dirty_block > 0) ++ selected = dev->oldest_dirty_block; - if (ok) { - ok = yaffs_ReadCheckpointSum(dev); - T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint checksum %d" TENDSTR), ok)); -- } ++ if (!prioritisedExists) /* None found, so we can clear this */ ++ dev->has_pending_prioritised_gc = 0; + } - if (!yaffs_CheckpointClose(dev)) - ok = 0; - +- - if (ok) - dev->isCheckpointed = 1; - else - dev->isCheckpointed = 0; -+ if (bi->blockState == YAFFS_BLOCK_STATE_COLLECTING) { -+ /* -+ * The gc did not complete. Set block state back to FULL -+ * because checkpointing does not restore gc. -+ */ -+ bi->blockState = YAFFS_BLOCK_STATE_FULL; -+ } else { -+ /* The gc completed. */ -+ /* Do any required cleanups */ -+ for (i = 0; i < dev->nCleanups; i++) { -+ /* Time to delete the file too */ -+ object = -+ yaffs_FindObjectByNumber(dev, -+ dev->gcCleanupList[i]); -+ if (object) { -+ yaffs_FreeTnode(dev, -+ object->variant.fileVariant. -+ top); -+ object->variant.fileVariant.top = NULL; -+ T(YAFFS_TRACE_GC, -+ (TSTR -+ ("yaffs: About to finally delete object %d" -+ TENDSTR), object->objectId)); -+ yaffs_DoGenericObjectDeletion(object); -+ object->myDev->nDeletedFiles--; -+ } - +- - return ok ? 1 : 0; -+ } ++ /* If we're doing aggressive GC then we are happy to take a less-dirty block, and ++ * search harder. ++ * else (we're doing a leasurely gc), then we only bother to do this if the ++ * block has only a few pages in use. ++ */ -} ++ if (!selected){ ++ int pagesUsed; ++ int nBlocks = dev->internal_end_block - dev->internal_start_block + 1; ++ if (aggressive){ ++ threshold = dev->param.chunks_per_block; ++ iterations = nBlocks; ++ } else { ++ int maxThreshold; -static void yaffs_InvalidateCheckpoint(yaffs_Device *dev) -{ @@ -9862,115 +10532,126 @@ - yaffs_CheckpointInvalidateStream(dev); - if (dev->superBlock && dev->markSuperBlockDirty) - dev->markSuperBlockDirty(dev->superBlock); -+ chunksAfter = yaffs_GetErasedChunks(dev); -+ if (chunksBefore >= chunksAfter) { -+ T(YAFFS_TRACE_GC, -+ (TSTR -+ ("gc did not increase free chunks before %d after %d" -+ TENDSTR), chunksBefore, chunksAfter)); -+ } -+ dev->gcBlock = 0; -+ dev->gcChunk = 0; -+ dev->nCleanups = 0; - } +- } -} ++ if(background) ++ maxThreshold = dev->param.chunks_per_block/2; ++ else ++ maxThreshold = dev->param.chunks_per_block/8; -+ dev->gcDisable = 0; ++ if(maxThreshold < YAFFS_GC_PASSIVE_THRESHOLD) ++ maxThreshold = YAFFS_GC_PASSIVE_THRESHOLD; -int yaffs_CheckpointSave(yaffs_Device *dev) -{ -- ++ threshold = background ? ++ (dev->gc_not_done + 2) * 2 : 0; ++ if(threshold maxThreshold) ++ threshold = maxThreshold; + - T(YAFFS_TRACE_CHECKPOINT, (TSTR("save entry: isCheckpointed %d"TENDSTR), dev->isCheckpointed)); -+ return retVal; -+} ++ iterations = nBlocks / 16 + 1; ++ if (iterations > 100) ++ iterations = 100; ++ } - yaffs_VerifyObjects(dev); - yaffs_VerifyBlocks(dev); - yaffs_VerifyFreeChunks(dev); -+/* -+ * FindBlockForgarbageCollection is used to select the dirtiest block (or close enough) -+ * for garbage collection. -+ */ ++ for (i = 0; ++ i < iterations && ++ (dev->gc_dirtiest < 1 || ++ dev->gc_pages_in_use > YAFFS_GC_GOOD_ENOUGH); ++ i++) { ++ dev->gc_block_finder++; ++ if (dev->gc_block_finder < dev->internal_start_block || ++ dev->gc_block_finder > dev->internal_end_block) ++ dev->gc_block_finder = dev->internal_start_block; - if (!dev->isCheckpointed) { - yaffs_InvalidateCheckpoint(dev); - yaffs_WriteCheckpointData(dev); - } -+static unsigned yaffs_FindBlockForGarbageCollection(yaffs_Device *dev, -+ int aggressive, -+ int background) -+{ -+ int i; -+ int iterations; -+ unsigned selected = 0; -+ int prioritised = 0; -+ int prioritisedExists = 0; -+ yaffs_BlockInfo *bi; -+ int threshold; ++ bi = yaffs_get_block_info(dev, dev->gc_block_finder); - T(YAFFS_TRACE_ALWAYS, (TSTR("save exit: isCheckpointed %d"TENDSTR), dev->isCheckpointed)); -+ /* First let's see if we need to grab a prioritised block */ -+ if (dev->hasPendingPrioritisedGCs && !aggressive) { -+ dev->gcDirtiest = 0; -+ bi = dev->blockInfo; -+ for (i = dev->internalStartBlock; -+ i <= dev->internalEndBlock && !selected; -+ i++) { ++ pagesUsed = bi->pages_in_use - bi->soft_del_pages; - return dev->isCheckpointed; -} -+ if (bi->gcPrioritise) { -+ prioritisedExists = 1; -+ if (bi->blockState == YAFFS_BLOCK_STATE_FULL && -+ yaffs2_BlockNotDisqualifiedFromGC(dev, bi)) { -+ selected = i; -+ prioritised = 1; -+ } ++ if (bi->block_state == YAFFS_BLOCK_STATE_FULL && ++ pagesUsed < dev->param.chunks_per_block && ++ (dev->gc_dirtiest < 1 || pagesUsed < dev->gc_pages_in_use) && ++ yaffs_block_ok_for_gc(dev, bi)) { ++ dev->gc_dirtiest = dev->gc_block_finder; ++ dev->gc_pages_in_use = pagesUsed; + } -+ bi++; + } -int yaffs_CheckpointRestore(yaffs_Device *dev) -{ - int retval; - T(YAFFS_TRACE_CHECKPOINT, (TSTR("restore entry: isCheckpointed %d"TENDSTR), dev->isCheckpointed)); -+ /* -+ * If there is a prioritised block and none was selected then -+ * this happened because there is at least one old dirty block gumming -+ * up the works. Let's gc the oldest dirty block. -+ */ ++ if(dev->gc_dirtiest > 0 && dev->gc_pages_in_use <= threshold) ++ selected = dev->gc_dirtiest; ++ } - retval = yaffs_ReadCheckpointData(dev); -+ if(prioritisedExists && -+ !selected && -+ dev->oldestDirtyBlock > 0) -+ selected = dev->oldestDirtyBlock; ++ /* ++ * If nothing has been selected for a while, try selecting the oldest dirty ++ * because that's gumming up the works. ++ */ - if (dev->isCheckpointed) { - yaffs_VerifyObjects(dev); - yaffs_VerifyBlocks(dev); - yaffs_VerifyFreeChunks(dev); -+ if (!prioritisedExists) /* None found, so we can clear this */ -+ dev->hasPendingPrioritisedGCs = 0; ++ if(!selected && dev->param.is_yaffs2 && ++ dev->gc_not_done >= ( background ? 10 : 20)){ ++ yaffs2_find_oldest_dirty_seq(dev); ++ if(dev->oldest_dirty_block > 0) { ++ selected = dev->oldest_dirty_block; ++ dev->gc_dirtiest = selected; ++ dev->oldest_dirty_gc_count++; ++ bi = yaffs_get_block_info(dev, selected); ++ dev->gc_pages_in_use = bi->pages_in_use - bi->soft_del_pages; ++ } else ++ dev->gc_not_done = 0; } - T(YAFFS_TRACE_CHECKPOINT, (TSTR("restore exit: isCheckpointed %d"TENDSTR), dev->isCheckpointed)); -+ /* If we're doing aggressive GC then we are happy to take a less-dirty block, and -+ * search harder. -+ * else (we're doing a leasurely gc), then we only bother to do this if the -+ * block has only a few pages in use. -+ */ ++ if(selected){ ++ T(YAFFS_TRACE_GC, ++ (TSTR("GC Selected block %d with %d free, prioritised:%d" TENDSTR), ++ selected, ++ dev->param.chunks_per_block - dev->gc_pages_in_use, ++ prioritised)); ++ ++ dev->n_gc_blocks++; ++ if(background) ++ dev->bg_gcs++; ++ ++ dev->gc_dirtiest = 0; ++ dev->gc_pages_in_use = 0; ++ dev->gc_not_done = 0; ++ if(dev->refresh_skip > 0) ++ dev->refresh_skip--; ++ } else{ ++ dev->gc_not_done++; ++ T(YAFFS_TRACE_GC, ++ (TSTR("GC none: finder %d skip %d threshold %d dirtiest %d using %d oldest %d%s" TENDSTR), ++ dev->gc_block_finder, dev->gc_not_done, ++ threshold, ++ dev->gc_dirtiest, dev->gc_pages_in_use, ++ dev->oldest_dirty_block, ++ background ? " bg" : "")); ++ } - return retval; --} -+ if (!selected){ -+ int pagesUsed; -+ int nBlocks = dev->internalEndBlock - dev->internalStartBlock + 1; -+ if (aggressive){ -+ threshold = dev->param.nChunksPerBlock; -+ iterations = nBlocks; -+ } else { -+ int maxThreshold; ++ return selected; + } -/*--------------------- File read/write ------------------------ - * Read and write have very similar structures. @@ -9978,19 +10659,27 @@ - * An incomplete chunk to start with (if the read/write is not chunk-aligned) - * Some complete chunks - * An incomplete chunk to end off with -- * ++/* New garbage collector ++ * If we're very low on erased blocks then we do aggressive garbage collection ++ * otherwise we do "leasurely" garbage collection. ++ * Aggressive gc looks further (whole array) and will accept less dirty blocks. ++ * Passive gc only inspects smaller areas and will only accept more dirty blocks. + * - * Curve-balls: the first chunk might also be the last chunk. -- */ -+ if(background) -+ maxThreshold = dev->param.nChunksPerBlock/2; -+ else -+ maxThreshold = dev->param.nChunksPerBlock/8; - ++ * The idea is to help clear out space in a more spread-out manner. ++ * Dunno if it really does anything useful. + */ +- -int yaffs_ReadDataFromFile(yaffs_Object *in, __u8 *buffer, loff_t offset, - int nBytes) --{ -+ if(maxThreshold < YAFFS_GC_PASSIVE_THRESHOLD) -+ maxThreshold = YAFFS_GC_PASSIVE_THRESHOLD; ++static int yaffs_check_gc(yaffs_dev_t *dev, int background) + { ++ int aggressive = 0; ++ int gcOk = YAFFS_OK; ++ int maxTries = 0; ++ int minErased; ++ int erasedChunks; ++ int checkpointBlockAdjust; - int chunk; - __u32 start; @@ -9998,37 +10687,17 @@ - int n = nBytes; - int nDone = 0; - yaffs_ChunkCache *cache; -+ threshold = background ? -+ (dev->gcNotDone + 2) * 2 : 0; -+ if(threshold maxThreshold) -+ threshold = maxThreshold; - +- - yaffs_Device *dev; -+ iterations = nBlocks / 16 + 1; -+ if (iterations > 100) -+ iterations = 100; -+ } - +- - dev = in->myDev; -+ for (i = 0; -+ i < iterations && -+ (dev->gcDirtiest < 1 || -+ dev->gcPagesInUse > YAFFS_GC_GOOD_ENOUGH); -+ i++) { -+ dev->gcBlockFinder++; -+ if (dev->gcBlockFinder < dev->internalStartBlock || -+ dev->gcBlockFinder > dev->internalEndBlock) -+ dev->gcBlockFinder = dev->internalStartBlock; - +- - while (n > 0) { - /* chunk = offset / dev->nDataBytesPerChunk + 1; */ - /* start = offset % dev->nDataBytesPerChunk; */ - yaffs_AddrToChunk(dev, offset, &chunk, &start); - chunk++; -+ bi = yaffs_GetBlockInfo(dev, dev->gcBlockFinder); - +- - /* OK now check for the curveball where the start and end are in - * the same chunk. - */ @@ -10036,46 +10705,20 @@ - nToCopy = n; - else - nToCopy = dev->nDataBytesPerChunk - start; -+ pagesUsed = bi->pagesInUse - bi->softDeletions; - +- - cache = yaffs_FindChunkCache(in, chunk); -+ if (bi->blockState == YAFFS_BLOCK_STATE_FULL && -+ pagesUsed < dev->param.nChunksPerBlock && -+ (dev->gcDirtiest < 1 || pagesUsed < dev->gcPagesInUse) && -+ yaffs2_BlockNotDisqualifiedFromGC(dev, bi)) { -+ dev->gcDirtiest = dev->gcBlockFinder; -+ dev->gcPagesInUse = pagesUsed; -+ } -+ } - +- - /* If the chunk is already in the cache or it is less than a whole chunk - * or we're using inband tags then use the cache (if there is caching) - * else bypass the cache. - */ - if (cache || nToCopy != dev->nDataBytesPerChunk || dev->inbandTags) { - if (dev->nShortOpCaches > 0) { -+ if(dev->gcDirtiest > 0 && dev->gcPagesInUse <= threshold) -+ selected = dev->gcDirtiest; -+ } -+ -+ /* -+ * If nothing has been selected for a while, try selecting the oldest dirty -+ * because that's gumming up the works. -+ */ - +- - /* If we can't find the data in the cache, then load it up. */ -+ if(!selected && dev->param.isYaffs2 && -+ dev->gcNotDone >= ( background ? 10 : 20)){ -+ yaffs2_FindOldestDirtySequence(dev); -+ if(dev->oldestDirtyBlock > 0) { -+ selected = dev->oldestDirtyBlock; -+ dev->gcDirtiest = selected; -+ dev->oldestDirtyGCs++; -+ bi = yaffs_GetBlockInfo(dev, selected); -+ dev->gcPagesInUse = bi->pagesInUse - bi->softDeletions; -+ } else -+ dev->gcNotDone = 0; -+ } ++ if(dev->param.gc_control && ++ (dev->param.gc_control(dev) & 1) == 0) ++ return YAFFS_OK; - if (!cache) { - cache = yaffs_GrabChunkCache(in->myDev); @@ -10088,167 +10731,117 @@ - data); - cache->nBytes = 0; - } -+ if(selected){ -+ T(YAFFS_TRACE_GC, -+ (TSTR("GC Selected block %d with %d free, prioritised:%d" TENDSTR), -+ selected, -+ dev->param.nChunksPerBlock - dev->gcPagesInUse, -+ prioritised)); -+ -+ dev->nGCBlocks++; -+ if(background) -+ dev->backgroundGCs++; -+ -+ dev->gcDirtiest = 0; -+ dev->gcPagesInUse = 0; -+ dev->gcNotDone = 0; -+ if(dev->refreshSkip > 0) -+ dev->refreshSkip--; -+ } else{ -+ dev->gcNotDone++; -+ T(YAFFS_TRACE_GC, -+ (TSTR("GC none: finder %d skip %d threshold %d dirtiest %d using %d oldest %d%s" TENDSTR), -+ dev->gcBlockFinder, dev->gcNotDone, -+ threshold, -+ dev->gcDirtiest, dev->gcPagesInUse, -+ dev->oldestDirtyBlock, -+ background ? " bg" : "")); -+ } - -- yaffs_UseChunkCache(dev, cache, 0); -+ return selected; -+} - -- cache->locked = 1; -+/* New garbage collector -+ * If we're very low on erased blocks then we do aggressive garbage collection -+ * otherwise we do "leasurely" garbage collection. -+ * Aggressive gc looks further (whole array) and will accept less dirty blocks. -+ * Passive gc only inspects smaller areas and will only accept more dirty blocks. -+ * -+ * The idea is to help clear out space in a more spread-out manner. -+ * Dunno if it really does anything useful. -+ */ -+static int yaffs_CheckGarbageCollection(yaffs_Device *dev, int background) -+{ -+ int aggressive = 0; -+ int gcOk = YAFFS_OK; -+ int maxTries = 0; -+ int minErased; -+ int erasedChunks; -+ int checkpointBlockAdjust; - -+ if(dev->param.gcControl && -+ (dev->param.gcControl(dev) & 1) == 0) -+ return YAFFS_OK; - -- memcpy(buffer, &cache->data[start], nToCopy); -+ if (dev->gcDisable) { ++ if (dev->gc_disable) { + /* Bail out so we don't get recursive gc */ + return YAFFS_OK; + } -- cache->locked = 0; -- } else { -- /* Read into the local buffer then copy..*/ +- yaffs_UseChunkCache(dev, cache, 0); + /* This loop should pass the first time. + * We'll only see looping here if the collection does not increase space. + */ +- cache->locked = 1; ++ do { ++ maxTries++; + ++ checkpointBlockAdjust = yaffs_calc_checkpt_blocks_required(dev); + +- memcpy(buffer, &cache->data[start], nToCopy); ++ minErased = dev->param.n_reserved_blocks + checkpointBlockAdjust + 1; ++ erasedChunks = dev->n_erased_blocks * dev->param.chunks_per_block; + +- cache->locked = 0; +- } else { +- /* Read into the local buffer then copy..*/ ++ /* If we need a block soon then do aggressive gc.*/ ++ if (dev->n_erased_blocks < minErased) ++ aggressive = 1; ++ else { ++ if(!background && erasedChunks > (dev->n_free_chunks / 4)) ++ break; + - __u8 *localBuffer = - yaffs_GetTempBuffer(dev, __LINE__); - yaffs_ReadChunkDataFromObject(in, chunk, - localBuffer); -+ do { -+ maxTries++; - -- memcpy(buffer, &localBuffer[start], nToCopy); -+ checkpointBlockAdjust = yaffs2_CalcCheckpointBlocksRequired(dev); - -+ minErased = dev->param.nReservedBlocks + checkpointBlockAdjust + 1; -+ erasedChunks = dev->nErasedBlocks * dev->param.nChunksPerBlock; - -- yaffs_ReleaseTempBuffer(dev, localBuffer, -- __LINE__); -+ /* If we need a block soon then do aggressive gc.*/ -+ if (dev->nErasedBlocks < minErased) -+ aggressive = 1; -+ else { -+ if(!background && erasedChunks > (dev->nFreeChunks / 4)) -+ break; -+ -+ if(dev->gcSkip > 20) -+ dev->gcSkip = 20; -+ if(erasedChunks < dev->nFreeChunks/2 || -+ dev->gcSkip < 1 || ++ if(dev->gc_skip > 20) ++ dev->gc_skip = 20; ++ if(erasedChunks < dev->n_free_chunks/2 || ++ dev->gc_skip < 1 || + background) + aggressive = 0; + else { -+ dev->gcSkip--; ++ dev->gc_skip--; + break; - } ++ } ++ } + +- memcpy(buffer, &localBuffer[start], nToCopy); ++ dev->gc_skip = 5; + ++ /* If we don't already have a block being gc'd then see if we should start another */ + +- yaffs_ReleaseTempBuffer(dev, localBuffer, +- __LINE__); +- } ++ if (dev->gc_block < 1 && !aggressive) { ++ dev->gc_block = yaffs2_find_refresh_block(dev); ++ dev->gc_chunk = 0; ++ dev->n_clean_ups=0; ++ } ++ if (dev->gc_block < 1) { ++ dev->gc_block = yaffs_find_gc_block(dev, aggressive, background); ++ dev->gc_chunk = 0; ++ dev->n_clean_ups=0; + } - } else { -+ dev->gcSkip = 5; ++ if (dev->gc_block > 0) { ++ dev->all_gcs++; ++ if (!aggressive) ++ dev->passive_gc_count++; - /* A full chunk. Read directly into the supplied buffer. */ - yaffs_ReadChunkDataFromObject(in, chunk, buffer); -+ /* If we don't already have a block being gc'd then see if we should start another */ ++ T(YAFFS_TRACE_GC, ++ (TSTR ++ ("yaffs: GC erasedBlocks %d aggressive %d" TENDSTR), ++ dev->n_erased_blocks, aggressive)); -+ if (dev->gcBlock < 1 && !aggressive) { -+ dev->gcBlock = yaffs2_FindRefreshBlock(dev); -+ dev->gcChunk = 0; -+ dev->nCleanups=0; -+ } -+ if (dev->gcBlock < 1) { -+ dev->gcBlock = yaffs_FindBlockForGarbageCollection(dev, aggressive, background); -+ dev->gcChunk = 0; -+ dev->nCleanups=0; ++ gcOk = yaffs_gc_block(dev, dev->gc_block, aggressive); } - n -= nToCopy; - offset += nToCopy; - buffer += nToCopy; - nDone += nToCopy; -+ if (dev->gcBlock > 0) { -+ dev->allGCs++; -+ if (!aggressive) -+ dev->passiveGCs++; - +- - } -+ T(YAFFS_TRACE_GC, -+ (TSTR -+ ("yaffs: GC erasedBlocks %d aggressive %d" TENDSTR), -+ dev->nErasedBlocks, aggressive)); - -- return nDone; -+ gcOk = yaffs_GarbageCollectBlock(dev, dev->gcBlock, aggressive); -+ } -+ -+ if (dev->nErasedBlocks < (dev->param.nReservedBlocks) && dev->gcBlock > 0) { ++ if (dev->n_erased_blocks < (dev->param.n_reserved_blocks) && dev->gc_block > 0) { + T(YAFFS_TRACE_GC, + (TSTR + ("yaffs: GC !!!no reclaim!!! erasedBlocks %d after try %d block %d" -+ TENDSTR), dev->nErasedBlocks, maxTries, dev->gcBlock)); ++ TENDSTR), dev->n_erased_blocks, maxTries, dev->gc_block)); + } -+ } while ((dev->nErasedBlocks < dev->param.nReservedBlocks) && -+ (dev->gcBlock > 0) && ++ } while ((dev->n_erased_blocks < dev->param.n_reserved_blocks) && ++ (dev->gc_block > 0) && + (maxTries < 2)); -+ + +- return nDone; + return aggressive ? gcOk : YAFFS_OK; } -int yaffs_WriteDataToFile(yaffs_Object *in, const __u8 *buffer, loff_t offset, - int nBytes, int writeThrough) +/* -+ * yaffs_BackgroundGarbageCollect() ++ * yaffs_bg_gc() + * Garbage collects. Intended to be called from a background thread. + * Returns non-zero if at least half the free chunks are erased. + */ -+int yaffs_BackgroundGarbageCollect(yaffs_Device *dev, unsigned urgency) ++int yaffs_bg_gc(yaffs_dev_t *dev, unsigned urgency) { -+ int erasedChunks = dev->nErasedBlocks * dev->param.nChunksPerBlock; ++ int erasedChunks = dev->n_erased_blocks * dev->param.chunks_per_block; - int chunk; - __u32 start; @@ -10263,8 +10856,8 @@ + T(YAFFS_TRACE_BACKGROUND, (TSTR("Background gc %u" TENDSTR),urgency)); - yaffs_Device *dev; -+ yaffs_CheckGarbageCollection(dev, 1); -+ return erasedChunks > dev->nFreeChunks/2; ++ yaffs_check_gc(dev, 1); ++ return erasedChunks > dev->n_free_chunks/2; +} - dev = in->myDev; @@ -10274,11 +10867,11 @@ - /* chunk = offset / dev->nDataBytesPerChunk + 1; */ - /* start = offset % dev->nDataBytesPerChunk; */ - yaffs_AddrToChunk(dev, offset, &chunk, &start); -+static int yaffs_TagsMatch(const yaffs_ExtendedTags *tags, int objectId, ++static int yaffs_tags_match(const yaffs_ext_tags *tags, int obj_id, + int chunkInObject) +{ -+ return (tags->chunkId == chunkInObject && -+ tags->objectId == objectId && !tags->chunkDeleted) ? 1 : 0; ++ return (tags->chunk_id == chunkInObject && ++ tags->obj_id == obj_id && !tags->is_deleted) ? 1 : 0; - if (chunk * dev->nDataBytesPerChunk + start != offset || - start >= dev->nDataBytesPerChunk) { @@ -10302,17 +10895,17 @@ - * If we're overwriting and not writing to then end of file then - * we need to write back as much as was there before. - */ -+static int yaffs_FindChunkInFile(yaffs_Object *in, int chunkInInode, -+ yaffs_ExtendedTags *tags) ++static int yaffs_find_chunk_in_file(yaffs_obj_t *in, int inode_chunk, ++ yaffs_ext_tags *tags) +{ + /*Get the Tnode, then get the level 0 offset chunk offset */ -+ yaffs_Tnode *tn; ++ yaffs_tnode_t *tn; + int theChunk = -1; -+ yaffs_ExtendedTags localTags; ++ yaffs_ext_tags localTags; + int retVal = -1; - chunkStart = ((chunk - 1) * dev->nDataBytesPerChunk); -+ yaffs_Device *dev = in->myDev; ++ yaffs_dev_t *dev = in->my_dev; - if (chunkStart > in->variant.fileVariant.fileSize) - nBytesRead = 0; /* Past end of file */ @@ -10325,19 +10918,19 @@ - if (nBytesRead > dev->nDataBytesPerChunk) - nBytesRead = dev->nDataBytesPerChunk; -+ tn = yaffs_FindLevel0Tnode(dev, &in->variant.fileVariant, chunkInInode); ++ tn = yaffs_find_tnode_0(dev, &in->variant.file_variant, inode_chunk); - nToWriteBack = - (nBytesRead > - (start + n)) ? nBytesRead : (start + n); + if (tn) { -+ theChunk = yaffs_GetChunkGroupBase(dev, tn, chunkInInode); ++ theChunk = yaffs_get_group_base(dev, tn, inode_chunk); - if (nToWriteBack < 0 || nToWriteBack > dev->nDataBytesPerChunk) - YBUG(); + retVal = -+ yaffs_FindChunkInGroup(dev, theChunk, tags, in->objectId, -+ chunkInInode); ++ yaffs_find_chunk_in_group(dev, theChunk, tags, in->obj_id, ++ inode_chunk); + } + return retVal; +} @@ -10346,13 +10939,13 @@ - nToCopy = dev->nDataBytesPerChunk - start; - nToWriteBack = dev->nDataBytesPerChunk; - } -+static int yaffs_FindAndDeleteChunkInFile(yaffs_Object *in, int chunkInInode, -+ yaffs_ExtendedTags *tags) ++static int yaffs_find_del_file_chunk(yaffs_obj_t *in, int inode_chunk, ++ yaffs_ext_tags *tags) +{ + /* Get the Tnode, then get the level 0 offset chunk offset */ -+ yaffs_Tnode *tn; ++ yaffs_tnode_t *tn; + int theChunk = -1; -+ yaffs_ExtendedTags localTags; ++ yaffs_ext_tags localTags; - if (nToCopy != dev->nDataBytesPerChunk || dev->inbandTags) { - /* An incomplete start or end chunk (or maybe both start and end chunk), @@ -10362,7 +10955,7 @@ - yaffs_ChunkCache *cache; - /* If we can't find the data in the cache, then load the cache */ - cache = yaffs_FindChunkCache(in, chunk); -+ yaffs_Device *dev = in->myDev; ++ yaffs_dev_t *dev = in->my_dev; + int retVal = -1; - if (!cache @@ -10392,23 +10985,23 @@ - if (cache) { - yaffs_UseChunkCache(dev, cache, 1); - cache->locked = 1; -+ tn = yaffs_FindLevel0Tnode(dev, &in->variant.fileVariant, chunkInInode); ++ tn = yaffs_find_tnode_0(dev, &in->variant.file_variant, inode_chunk); + if (tn) { - memcpy(&cache->data[start], buffer, - nToCopy); -+ theChunk = yaffs_GetChunkGroupBase(dev, tn, chunkInInode); ++ theChunk = yaffs_get_group_base(dev, tn, inode_chunk); + retVal = -+ yaffs_FindChunkInGroup(dev, theChunk, tags, in->objectId, -+ chunkInInode); ++ yaffs_find_chunk_in_group(dev, theChunk, tags, in->obj_id, ++ inode_chunk); - cache->locked = 0; - cache->nBytes = nToWriteBack; + /* Delete the entry in the filestructure (if found) */ + if (retVal != -1) -+ yaffs_LoadLevel0Tnode(dev, tn, chunkInInode, 0); ++ yaffs_load_tnode_0(dev, tn, inode_chunk, 0); + } - if (writeThrough) { @@ -10433,28 +11026,30 @@ - __u8 *localBuffer = - yaffs_GetTempBuffer(dev, __LINE__); -+int yaffs_PutChunkIntoFile(yaffs_Object *in, int chunkInInode, -+ int chunkInNAND, int inScan) ++int yaffs_put_chunk_in_file(yaffs_obj_t *in, int inode_chunk, ++ int nand_chunk, int in_scan) +{ -+ /* NB inScan is zero unless scanning. -+ * For forward scanning, inScan is > 0; -+ * for backward scanning inScan is < 0 ++ /* NB in_scan is zero unless scanning. ++ * For forward scanning, in_scan is > 0; ++ * for backward scanning in_scan is < 0 + * -+ * chunkInNAND = 0 is a dummy insert to make sure the tnodes are there. ++ * nand_chunk = 0 is a dummy insert to make sure the tnodes are there. + */ -+ -+ yaffs_Tnode *tn; -+ yaffs_Device *dev = in->myDev; + +- yaffs_ReadChunkDataFromObject(in, chunk, +- localBuffer); ++ yaffs_tnode_t *tn; ++ yaffs_dev_t *dev = in->my_dev; + int existingChunk; -+ yaffs_ExtendedTags existingTags; -+ yaffs_ExtendedTags newTags; ++ yaffs_ext_tags existingTags; ++ yaffs_ext_tags newTags; + unsigned existingSerial, newSerial; -+ -+ if (in->variantType != YAFFS_OBJECT_TYPE_FILE) { + ++ if (in->variant_type != YAFFS_OBJECT_TYPE_FILE) { + /* Just ignore an attempt at putting a chunk into a non-file during scanning + * If it is not during Scanning then something went wrong! + */ -+ if (!inScan) { ++ if (!in_scan) { + T(YAFFS_TRACE_ERROR, + (TSTR + ("yaffs tragedy:attempt to put data chunk into a non-file" @@ -10462,27 +11057,32 @@ + YBUG(); + } -- yaffs_ReadChunkDataFromObject(in, chunk, -- localBuffer); -+ yaffs_DeleteChunk(dev, chunkInNAND, 1, __LINE__); ++ yaffs_chunk_del(dev, nand_chunk, 1, __LINE__); + return YAFFS_OK; + } -+ tn = yaffs_AddOrFindLevel0Tnode(dev, -+ &in->variant.fileVariant, -+ chunkInInode, +- memcpy(&localBuffer[start], buffer, nToCopy); ++ tn = yaffs_add_find_tnode_0(dev, ++ &in->variant.file_variant, ++ inode_chunk, + NULL); + if (!tn) + return YAFFS_FAIL; + -+ if(!chunkInNAND) ++ if(!nand_chunk) + /* Dummy insert, bail now */ + return YAFFS_OK; -+ existingChunk = yaffs_GetChunkGroupBase(dev, tn, chunkInInode); +- chunkWritten = +- yaffs_WriteChunkDataToObject(in, chunk, +- localBuffer, +- nToWriteBack, +- 0); ++ existingChunk = yaffs_get_group_base(dev, tn, inode_chunk); -- memcpy(&localBuffer[start], buffer, nToCopy); -+ if (inScan != 0) { +- yaffs_ReleaseTempBuffer(dev, localBuffer, +- __LINE__); ++ if (in_scan != 0) { + /* If we're scanning then we need to test for duplicates + * NB This does not need to be efficient since it should only ever + * happen when the power fails during a write, then only one @@ -10491,14 +11091,9 @@ + * Correction for YAFFS2: This could happen quite a lot and we need to think about efficiency! TODO + * Update: For backward scanning we don't need to re-read tags so this is quite cheap. + */ - -- chunkWritten = -- yaffs_WriteChunkDataToObject(in, chunk, -- localBuffer, -- nToWriteBack, -- 0); ++ + if (existingChunk > 0) { -+ /* NB Right now existing chunk will not be real chunkId if the chunk group size > 1 ++ /* NB Right now existing chunk will not be real chunk_id if the chunk group size > 1 + * thus we have to do a FindChunkInFile to get the real chunk id. + * + * We have a duplicate now we need to decide which one to use: @@ -10507,18 +11102,16 @@ + * Forward scanning YAFFS2: The new one is what we use, dump the old one. + * YAFFS1: Get both sets of tags and compare serial numbers. + */ - -- yaffs_ReleaseTempBuffer(dev, localBuffer, -- __LINE__); -+ if (inScan > 0) { ++ ++ if (in_scan > 0) { + /* Only do this for forward scanning */ -+ yaffs_ReadChunkWithTagsFromNAND(dev, -+ chunkInNAND, ++ yaffs_rd_chunk_tags_nand(dev, ++ nand_chunk, + NULL, &newTags); + /* Do a proper find */ + existingChunk = -+ yaffs_FindChunkInFile(in, chunkInInode, ++ yaffs_find_chunk_in_file(in, inode_chunk, + &existingTags); } @@ -10545,9 +11138,9 @@ - /* Since we've overwritten the cached data, we better invalidate it. */ - yaffs_InvalidateChunkCache(in, chunk); - } -+ if (inScan > 0) { -+ newSerial = newTags.serialNumber; -+ existingSerial = existingTags.serialNumber; ++ if (in_scan > 0) { ++ newSerial = newTags.serial_number; ++ existingSerial = existingTags.serial_number; + } - if (chunkWritten >= 0) { @@ -10555,21 +11148,21 @@ - offset += nToCopy; - buffer += nToCopy; - nDone += nToCopy; -+ if ((inScan > 0) && ++ if ((in_scan > 0) && + (existingChunk <= 0 || + ((existingSerial + 1) & 3) == newSerial)) { + /* Forward scanning. + * Use new + * Delete the old one and drop through to update the tnode + */ -+ yaffs_DeleteChunk(dev, existingChunk, 1, ++ yaffs_chunk_del(dev, existingChunk, 1, + __LINE__); + } else { + /* Backward scanning or we want to use the existing one + * Use existing. + * Delete the new one and return early so that the tnode isn't changed + */ -+ yaffs_DeleteChunk(dev, chunkInNAND, 1, ++ yaffs_chunk_del(dev, nand_chunk, 1, + __LINE__); + return YAFFS_OK; + } @@ -10582,66 +11175,98 @@ - if ((startOfWrite + nDone) > in->variant.fileVariant.fileSize) - in->variant.fileVariant.fileSize = (startOfWrite + nDone); + if (existingChunk == 0) -+ in->nDataChunks++; ++ in->n_data_chunks++; - in->dirty = 1; -+ yaffs_LoadLevel0Tnode(dev, tn, chunkInInode, chunkInNAND); ++ yaffs_load_tnode_0(dev, tn, inode_chunk, nand_chunk); - return nDone; + return YAFFS_OK; } -+static int yaffs_ReadChunkDataFromObject(yaffs_Object *in, int chunkInInode, ++static int yaffs_rd_data_obj(yaffs_obj_t *in, int inode_chunk, + __u8 *buffer) +{ -+ int chunkInNAND = yaffs_FindChunkInFile(in, chunkInInode, NULL); ++ int nand_chunk = yaffs_find_chunk_in_file(in, inode_chunk, NULL); -/* ---------------------- File resizing stuff ------------------ */ -+ if (chunkInNAND >= 0) -+ return yaffs_ReadChunkWithTagsFromNAND(in->myDev, chunkInNAND, ++ if (nand_chunk >= 0) ++ return yaffs_rd_chunk_tags_nand(in->my_dev, nand_chunk, + buffer, NULL); + else { + T(YAFFS_TRACE_NANDACCESS, + (TSTR("Chunk %d not found zero instead" TENDSTR), -+ chunkInNAND)); ++ nand_chunk)); + /* get sane (zero) data if you read a hole */ -+ memset(buffer, 0, in->myDev->nDataBytesPerChunk); ++ memset(buffer, 0, in->my_dev->data_bytes_per_chunk); + return 0; + } ++ ++} -static void yaffs_PruneResizedChunks(yaffs_Object *in, int newSize) --{ -+} ++void yaffs_chunk_del(yaffs_dev_t *dev, int chunk_id, int mark_flash, int lyn) + { ++ int block; ++ int page; ++ yaffs_ext_tags tags; ++ yaffs_block_info_t *bi; - yaffs_Device *dev = in->myDev; - int oldFileSize = in->variant.fileVariant.fileSize; -+void yaffs_DeleteChunk(yaffs_Device *dev, int chunkId, int markNAND, int lyn) -+{ -+ int block; -+ int page; -+ yaffs_ExtendedTags tags; -+ yaffs_BlockInfo *bi; ++ if (chunk_id <= 0) ++ return; - int lastDel = 1 + (oldFileSize - 1) / dev->nDataBytesPerChunk; -+ if (chunkId <= 0) -+ return; ++ dev->n_deletions++; ++ block = chunk_id / dev->param.chunks_per_block; ++ page = chunk_id % dev->param.chunks_per_block; - int startDel = 1 + (newSize + dev->nDataBytesPerChunk - 1) / - dev->nDataBytesPerChunk; - int i; - int chunkId; -+ dev->nDeletions++; -+ block = chunkId / dev->param.nChunksPerBlock; -+ page = chunkId % dev->param.nChunksPerBlock; - /* Delete backwards so that we don't end up with holes if - * power is lost part-way through the operation. -- */ ++ if (!yaffs_check_chunk_bit(dev, block, page)) ++ T(YAFFS_TRACE_VERIFY, ++ (TSTR("Deleting invalid chunk %d"TENDSTR), ++ chunk_id)); ++ ++ bi = yaffs_get_block_info(dev, block); ++ ++ yaffs2_update_oldest_dirty_seq(dev, block, bi); ++ ++ T(YAFFS_TRACE_DELETION, ++ (TSTR("line %d delete of chunk %d" TENDSTR), lyn, chunk_id)); ++ ++ if (!dev->param.is_yaffs2 && mark_flash && ++ bi->block_state != YAFFS_BLOCK_STATE_COLLECTING) { ++ ++ yaffs_init_tags(&tags); ++ ++ tags.is_deleted = 1; ++ ++ yaffs_wr_chunk_tags_nand(dev, chunk_id, NULL, &tags); ++ yaffs_handle_chunk_update(dev, chunk_id, &tags); ++ } else { ++ dev->n_unmarked_deletions++; ++ } ++ ++ /* Pull out of the management area. ++ * If the whole block became dirty, this will kick off an erasure. + */ - for (i = lastDel; i >= startDel; i--) { - /* NB this could be optimised somewhat, - * eg. could retrieve the tags and write them without - * using yaffs_DeleteChunk - */ ++ if (bi->block_state == YAFFS_BLOCK_STATE_ALLOCATING || ++ bi->block_state == YAFFS_BLOCK_STATE_FULL || ++ bi->block_state == YAFFS_BLOCK_STATE_NEEDS_SCANNING || ++ bi->block_state == YAFFS_BLOCK_STATE_COLLECTING) { ++ dev->n_free_chunks++; - chunkId = yaffs_FindAndDeleteChunkInFile(in, i, NULL); - if (chunkId > 0) { @@ -10657,128 +11282,136 @@ - in->nDataChunks--; - yaffs_DeleteChunk(dev, chunkId, 1, __LINE__); - } -- } -- } -+ if (!yaffs_CheckChunkBit(dev, block, page)) -+ T(YAFFS_TRACE_VERIFY, -+ (TSTR("Deleting invalid chunk %d"TENDSTR), -+ chunkId)); ++ yaffs_clear_chunk_bit(dev, block, page); ++ ++ bi->pages_in_use--; ++ ++ if (bi->pages_in_use == 0 && ++ !bi->has_shrink_hdr && ++ bi->block_state != YAFFS_BLOCK_STATE_ALLOCATING && ++ bi->block_state != YAFFS_BLOCK_STATE_NEEDS_SCANNING) { ++ yaffs_block_became_dirty(dev, block); + } ++ + } --} -+ bi = yaffs_GetBlockInfo(dev, block); -+ -+ yaffs2_UpdateOldestDirtySequence(dev, block, bi); + } -int yaffs_ResizeFile(yaffs_Object *in, loff_t newSize) --{ -+ T(YAFFS_TRACE_DELETION, -+ (TSTR("line %d delete of chunk %d" TENDSTR), lyn, chunkId)); - -- int oldFileSize = in->variant.fileVariant.fileSize; -- __u32 newSizeOfPartialChunk; -- int newFullChunks; -+ if (!dev->param.isYaffs2 && markNAND && -+ bi->blockState != YAFFS_BLOCK_STATE_COLLECTING) { - -- yaffs_Device *dev = in->myDev; -+ yaffs_InitialiseTags(&tags); - -- yaffs_AddrToChunk(dev, newSize, &newFullChunks, &newSizeOfPartialChunk); -+ tags.chunkDeleted = 1; - -- yaffs_FlushFilesChunkCache(in); -- yaffs_InvalidateWholeChunkCache(in); -+ yaffs_WriteChunkWithTagsToNAND(dev, chunkId, NULL, &tags); -+ yaffs_HandleUpdateChunk(dev, chunkId, &tags); -+ } else { -+ dev->nUnmarkedDeletions++; -+ } - -- yaffs_CheckGarbageCollection(dev); -+ /* Pull out of the management area. -+ * If the whole block became dirty, this will kick off an erasure. -+ */ -+ if (bi->blockState == YAFFS_BLOCK_STATE_ALLOCATING || -+ bi->blockState == YAFFS_BLOCK_STATE_FULL || -+ bi->blockState == YAFFS_BLOCK_STATE_NEEDS_SCANNING || -+ bi->blockState == YAFFS_BLOCK_STATE_COLLECTING) { -+ dev->nFreeChunks++; - -- if (in->variantType != YAFFS_OBJECT_TYPE_FILE) -- return YAFFS_FAIL; -+ yaffs_ClearChunkBit(dev, block, page); - -- if (newSize == oldFileSize) -- return YAFFS_OK; -+ bi->pagesInUse--; - -- if (newSize < oldFileSize) { -+ if (bi->pagesInUse == 0 && -+ !bi->hasShrinkHeader && -+ bi->blockState != YAFFS_BLOCK_STATE_ALLOCATING && -+ bi->blockState != YAFFS_BLOCK_STATE_NEEDS_SCANNING) { -+ yaffs_BlockBecameDirty(dev, block); -+ } - -- yaffs_PruneResizedChunks(in, newSize); -+ } - -- if (newSizeOfPartialChunk != 0) { -- int lastChunk = 1 + newFullChunks; -+} - -- __u8 *localBuffer = yaffs_GetTempBuffer(dev, __LINE__); -+static int yaffs_WriteChunkDataToObject(yaffs_Object *in, int chunkInInode, -+ const __u8 *buffer, int nBytes, ++static int yaffs_wr_data_obj(yaffs_obj_t *in, int inode_chunk, ++ const __u8 *buffer, int n_bytes, + int useReserve) -+{ + { + /* Find old chunk Need to do this to get serial number + * Write new one and patch into tree. + * Invalidate old tags. + */ -- /* Got to read and rewrite the last chunk with its new size and zero pad */ -- yaffs_ReadChunkDataFromObject(in, lastChunk, -- localBuffer); +- int oldFileSize = in->variant.fileVariant.fileSize; +- __u32 newSizeOfPartialChunk; +- int newFullChunks; + int prevChunkId; -+ yaffs_ExtendedTags prevTags; ++ yaffs_ext_tags prevTags; -- memset(localBuffer + newSizeOfPartialChunk, 0, -- dev->nDataBytesPerChunk - newSizeOfPartialChunk); +- yaffs_Device *dev = in->myDev; + int newChunkId; -+ yaffs_ExtendedTags newTags; ++ yaffs_ext_tags newTags; -- yaffs_WriteChunkDataToObject(in, lastChunk, localBuffer, -- newSizeOfPartialChunk, 1); -+ yaffs_Device *dev = in->myDev; +- yaffs_AddrToChunk(dev, newSize, &newFullChunks, &newSizeOfPartialChunk); ++ yaffs_dev_t *dev = in->my_dev; -- yaffs_ReleaseTempBuffer(dev, localBuffer, __LINE__); -- } -+ yaffs_CheckGarbageCollection(dev,0); +- yaffs_FlushFilesChunkCache(in); +- yaffs_InvalidateWholeChunkCache(in); ++ yaffs_check_gc(dev,0); -- in->variant.fileVariant.fileSize = newSize; +- yaffs_CheckGarbageCollection(dev); + /* Get the previous chunk at this location in the file if it exists. + * If it does not exist then put a zero into the tree. This creates + * the tnode now, rather than later when it is harder to clean up. + */ -+ prevChunkId = yaffs_FindChunkInFile(in, chunkInInode, &prevTags); ++ prevChunkId = yaffs_find_chunk_in_file(in, inode_chunk, &prevTags); + if(prevChunkId < 1 && -+ !yaffs_PutChunkIntoFile(in, chunkInInode, 0, 0)) ++ !yaffs_put_chunk_in_file(in, inode_chunk, 0, 0)) + return 0; +- if (in->variantType != YAFFS_OBJECT_TYPE_FILE) +- return YAFFS_FAIL; ++ /* Set up new tags */ ++ yaffs_init_tags(&newTags); + +- if (newSize == oldFileSize) +- return YAFFS_OK; ++ newTags.chunk_id = inode_chunk; ++ newTags.obj_id = in->obj_id; ++ newTags.serial_number = ++ (prevChunkId > 0) ? prevTags.serial_number + 1 : 1; ++ newTags.n_bytes = n_bytes; + +- if (newSize < oldFileSize) { ++ if (n_bytes < 1 || n_bytes > dev->param.total_bytes_per_chunk) { ++ T(YAFFS_TRACE_ERROR, ++ (TSTR("Writing %d bytes to chunk!!!!!!!!!" TENDSTR), n_bytes)); ++ YBUG(); ++ } ++ ++ ++ newChunkId = ++ yaffs_write_new_chunk(dev, buffer, &newTags, ++ useReserve); + +- yaffs_PruneResizedChunks(in, newSize); ++ if (newChunkId > 0) { ++ yaffs_put_chunk_in_file(in, inode_chunk, newChunkId, 0); + +- if (newSizeOfPartialChunk != 0) { +- int lastChunk = 1 + newFullChunks; ++ if (prevChunkId > 0) ++ yaffs_chunk_del(dev, prevChunkId, 1, __LINE__); + +- __u8 *localBuffer = yaffs_GetTempBuffer(dev, __LINE__); ++ yaffs_verify_file_sane(in); ++ } ++ return newChunkId; + +- /* Got to read and rewrite the last chunk with its new size and zero pad */ +- yaffs_ReadChunkDataFromObject(in, lastChunk, +- localBuffer); ++} + +- memset(localBuffer + newSizeOfPartialChunk, 0, +- dev->nDataBytesPerChunk - newSizeOfPartialChunk); ++/* UpdateObjectHeader updates the header on NAND for an object. ++ * If name is not NULL, then that new name is used. ++ */ ++int yaffs_update_oh(yaffs_obj_t *in, const YCHAR *name, int force, ++ int is_shrink, int shadows, yaffs_xattr_mod *xmod) ++{ + +- yaffs_WriteChunkDataToObject(in, lastChunk, localBuffer, +- newSizeOfPartialChunk, 1); ++ yaffs_block_info_t *bi; + +- yaffs_ReleaseTempBuffer(dev, localBuffer, __LINE__); +- } ++ yaffs_dev_t *dev = in->my_dev; + +- in->variant.fileVariant.fileSize = newSize; ++ int prevChunkId; ++ int retVal = 0; ++ int result = 0; + - yaffs_PruneFileStructure(dev, &in->variant.fileVariant); - } else { - /* newsSize > oldFileSize */ - in->variant.fileVariant.fileSize = newSize; - } -+ /* Set up new tags */ -+ yaffs_InitialiseTags(&newTags); ++ int newChunkId; ++ yaffs_ext_tags newTags; ++ yaffs_ext_tags oldTags; ++ const YCHAR *alias = NULL; -+ newTags.chunkId = chunkInInode; -+ newTags.objectId = in->objectId; -+ newTags.serialNumber = -+ (prevChunkId > 0) ? prevTags.serialNumber + 1 : 1; -+ newTags.byteCount = nBytes; ++ __u8 *buffer = NULL; ++ YCHAR old_name[YAFFS_MAX_NAME_LENGTH + 1]; - /* Write a new object header. - * show we've shrunk the file, if need be @@ -10789,27 +11422,15 @@ - in->parent->objectId != YAFFS_OBJECTID_DELETED) - yaffs_UpdateObjectHeader(in, NULL, 0, - (newSize < oldFileSize) ? 1 : 0, 0); -+ if (nBytes < 1 || nBytes > dev->param.totalBytesPerChunk) { -+ T(YAFFS_TRACE_ERROR, -+ (TSTR("Writing %d bytes to chunk!!!!!!!!!" TENDSTR), nBytes)); -+ YBUG(); -+ } -+ -+ -+ newChunkId = -+ yaffs_WriteNewChunkWithTagsToNAND(dev, buffer, &newTags, -+ useReserve); ++ yaffs_obj_header *oh = NULL; - return YAFFS_OK; -} -+ if (newChunkId > 0) { -+ yaffs_PutChunkIntoFile(in, chunkInInode, newChunkId, 0); ++ yaffs_strcpy(old_name, _Y("silly old name")); -loff_t yaffs_GetFileSize(yaffs_Object *obj) -{ - obj = yaffs_GetEquivalentObject(obj); -+ if (prevChunkId > 0) -+ yaffs_DeleteChunk(dev, prevChunkId, 1, __LINE__); - switch (obj->variantType) { - case YAFFS_OBJECT_TYPE_FILE: @@ -10818,20 +11439,34 @@ - return yaffs_strlen(obj->variant.symLinkVariant.alias); - default: - return 0; -+ yaffs_VerifyFileSanity(in); - } -+ return newChunkId; +- } +-} ++ if (!in->fake || ++ in == dev->root_dir || /* The root_dir should also be saved */ ++ force || xmod) { + ++ yaffs_check_gc(dev,0); ++ yaffs_check_obj_details_loaded(in); + ++ buffer = yaffs_get_temp_buffer(in->my_dev, __LINE__); ++ oh = (yaffs_obj_header *) buffer; + - } - -+/* UpdateObjectHeader updates the header on NAND for an object. -+ * If name is not NULL, then that new name is used. -+ */ -+int yaffs_UpdateObjectHeader(yaffs_Object *in, const YCHAR *name, int force, -+ int isShrink, int shadows, yaffs_XAttrMod *xmod) -+{ - -+ yaffs_BlockInfo *bi; ++ prevChunkId = in->hdr_chunk; ++ ++ if (prevChunkId > 0) { ++ result = yaffs_rd_chunk_tags_nand(dev, prevChunkId, ++ buffer, &oldTags); ++ ++ yaffs_verify_oh(in, oh, &oldTags, 0); ++ ++ memcpy(old_name, oh->name, sizeof(oh->name)); ++ memset(buffer, 0xFF, sizeof(yaffs_obj_header)); ++ } else ++ memset(buffer, 0xFF, dev->data_bytes_per_chunk); ++ ++ oh->type = in->variant_type; ++ oh->yst_mode = in->yst_mode; ++ oh->shadows_obj = oh->inband_shadowed_obj_id = shadows; -int yaffs_FlushFile(yaffs_Object *in, int updateTime) -{ @@ -10839,91 +11474,8 @@ - if (in->dirty) { - yaffs_FlushFilesChunkCache(in); - if (updateTime) { --#ifdef CONFIG_YAFFS_WINCE + #ifdef CONFIG_YAFFS_WINCE - yfsd_WinFileTimeNow(in->win_mtime); --#else -+ yaffs_Device *dev = in->myDev; - -- in->yst_mtime = Y_CURRENT_TIME; -+ int prevChunkId; -+ int retVal = 0; -+ int result = 0; - --#endif -- } -+ int newChunkId; -+ yaffs_ExtendedTags newTags; -+ yaffs_ExtendedTags oldTags; -+ const YCHAR *alias = NULL; - -- retVal = (yaffs_UpdateObjectHeader(in, NULL, 0, 0, 0) >= -- 0) ? YAFFS_OK : YAFFS_FAIL; -- } else { -- retVal = YAFFS_OK; -- } -+ __u8 *buffer = NULL; -+ YCHAR oldName[YAFFS_MAX_NAME_LENGTH + 1]; - -- return retVal; -+ yaffs_ObjectHeader *oh = NULL; - --} -+ yaffs_strcpy(oldName, _Y("silly old name")); - --static int yaffs_DoGenericObjectDeletion(yaffs_Object *in) --{ - -- /* First off, invalidate the file's data in the cache, without flushing. */ -- yaffs_InvalidateWholeChunkCache(in); -+ if (!in->fake || -+ in == dev->rootDir || /* The rootDir should also be saved */ -+ force || xmod) { - -- if (in->myDev->isYaffs2 && (in->parent != in->myDev->deletedDir)) { -- /* Move to the unlinked directory so we have a record that it was deleted. */ -- yaffs_ChangeObjectName(in, in->myDev->deletedDir, _Y("deleted"), 0, 0); -+ yaffs_CheckGarbageCollection(dev,0); -+ yaffs_CheckObjectDetailsLoaded(in); - -- } -+ buffer = yaffs_GetTempBuffer(in->myDev, __LINE__); -+ oh = (yaffs_ObjectHeader *) buffer; - -- yaffs_RemoveObjectFromDirectory(in); -- yaffs_DeleteChunk(in->myDev, in->hdrChunk, 1, __LINE__); -- in->hdrChunk = 0; -+ prevChunkId = in->hdrChunk; - -- yaffs_FreeObject(in); -- return YAFFS_OK; -+ if (prevChunkId > 0) { -+ result = yaffs_ReadChunkWithTagsFromNAND(dev, prevChunkId, -+ buffer, &oldTags); - --} -+ yaffs_VerifyObjectHeader(in, oh, &oldTags, 0); - --/* yaffs_DeleteFile deletes the whole file data -- * and the inode associated with the file. -- * It does not delete the links associated with the file. -- */ --static int yaffs_UnlinkFileIfNeeded(yaffs_Object *in) --{ -+ memcpy(oldName, oh->name, sizeof(oh->name)); -+ memset(buffer, 0xFF, sizeof(yaffs_ObjectHeader)); -+ } else -+ memset(buffer, 0xFF, dev->nDataBytesPerChunk); - -- int retVal; -- int immediateDeletion = 0; -+ oh->type = in->variantType; -+ oh->yst_mode = in->yst_mode; -+ oh->shadowsObject = oh->inbandShadowsObject = shadows; - --#ifdef __KERNEL__ -- if (!in->myInode) -- immediateDeletion = 1; -+#ifdef CONFIG_YAFFS_WINCE + oh->win_atime[0] = in->win_atime[0]; + oh->win_ctime[0] = in->win_ctime[0]; + oh->win_mtime[0] = in->win_mtime[0]; @@ -10931,19 +11483,149 @@ + oh->win_ctime[1] = in->win_ctime[1]; + oh->win_mtime[1] = in->win_mtime[1]; #else -- if (in->inUse <= 0) -- immediateDeletion = 1; + oh->yst_uid = in->yst_uid; + oh->yst_gid = in->yst_gid; + oh->yst_atime = in->yst_atime; + oh->yst_mtime = in->yst_mtime; + oh->yst_ctime = in->yst_ctime; + oh->yst_rdev = in->yst_rdev; - #endif ++#endif + if (in->parent) -+ oh->parentObjectId = in->parent->objectId; ++ oh->parent_obj_id = in->parent->obj_id; + else -+ oh->parentObjectId = 0; ++ oh->parent_obj_id = 0; ++ ++ if (name && *name) { ++ memset(oh->name, 0, sizeof(oh->name)); ++ yaffs_load_oh_from_name(dev,oh->name,name); ++ } else if (prevChunkId > 0) ++ memcpy(oh->name, old_name, sizeof(oh->name)); ++ else ++ memset(oh->name, 0, sizeof(oh->name)); + +- in->yst_mtime = Y_CURRENT_TIME; ++ oh->is_shrink = is_shrink; + +-#endif ++ switch (in->variant_type) { ++ case YAFFS_OBJECT_TYPE_UNKNOWN: ++ /* Should not happen */ ++ break; ++ case YAFFS_OBJECT_TYPE_FILE: ++ oh->file_size = ++ (oh->parent_obj_id == YAFFS_OBJECTID_DELETED ++ || oh->parent_obj_id == ++ YAFFS_OBJECTID_UNLINKED) ? 0 : in->variant. ++ file_variant.file_size; ++ break; ++ case YAFFS_OBJECT_TYPE_HARDLINK: ++ oh->equiv_id = ++ in->variant.hardlink_variant.equiv_id; ++ break; ++ case YAFFS_OBJECT_TYPE_SPECIAL: ++ /* Do nothing */ ++ break; ++ case YAFFS_OBJECT_TYPE_DIRECTORY: ++ /* Do nothing */ ++ break; ++ case YAFFS_OBJECT_TYPE_SYMLINK: ++ alias = in->variant.symlink_variant.alias; ++ if(!alias) ++ alias = _Y("no alias"); ++ yaffs_strncpy(oh->alias, ++ alias, ++ YAFFS_MAX_ALIAS_LENGTH); ++ oh->alias[YAFFS_MAX_ALIAS_LENGTH] = 0; ++ break; + } + +- retVal = (yaffs_UpdateObjectHeader(in, NULL, 0, 0, 0) >= +- 0) ? YAFFS_OK : YAFFS_FAIL; +- } else { +- retVal = YAFFS_OK; +- } ++ /* process any xattrib modifications */ ++ if(xmod) ++ yaffs_apply_xattrib_mod(in, (char *)buffer, xmod); + +- return retVal; + +-} ++ /* Tags */ ++ yaffs_init_tags(&newTags); ++ in->serial++; ++ newTags.chunk_id = 0; ++ newTags.obj_id = in->obj_id; ++ newTags.serial_number = in->serial; + +-static int yaffs_DoGenericObjectDeletion(yaffs_Object *in) +-{ ++ /* Add extra info for file header */ + +- /* First off, invalidate the file's data in the cache, without flushing. */ +- yaffs_InvalidateWholeChunkCache(in); ++ newTags.extra_available = 1; ++ newTags.extra_parent_id = oh->parent_obj_id; ++ newTags.extra_length = oh->file_size; ++ newTags.extra_is_shrink = oh->is_shrink; ++ newTags.extra_equiv_id = oh->equiv_id; ++ newTags.extra_shadows = (oh->shadows_obj > 0) ? 1 : 0; ++ newTags.extra_obj_type = in->variant_type; + +- if (in->myDev->isYaffs2 && (in->parent != in->myDev->deletedDir)) { +- /* Move to the unlinked directory so we have a record that it was deleted. */ +- yaffs_ChangeObjectName(in, in->myDev->deletedDir, _Y("deleted"), 0, 0); ++ yaffs_verify_oh(in, oh, &newTags, 1); + +- } ++ /* Create new chunk in NAND */ ++ newChunkId = ++ yaffs_write_new_chunk(dev, buffer, &newTags, ++ (prevChunkId > 0) ? 1 : 0); + +- yaffs_RemoveObjectFromDirectory(in); +- yaffs_DeleteChunk(in->myDev, in->hdrChunk, 1, __LINE__); +- in->hdrChunk = 0; ++ if (newChunkId >= 0) { + +- yaffs_FreeObject(in); +- return YAFFS_OK; ++ in->hdr_chunk = newChunkId; + +-} ++ if (prevChunkId > 0) { ++ yaffs_chunk_del(dev, prevChunkId, 1, ++ __LINE__); ++ } + +-/* yaffs_DeleteFile deletes the whole file data +- * and the inode associated with the file. +- * It does not delete the links associated with the file. +- */ +-static int yaffs_UnlinkFileIfNeeded(yaffs_Object *in) +-{ ++ if (!yaffs_obj_cache_dirty(in)) ++ in->dirty = 0; + +- int retVal; +- int immediateDeletion = 0; ++ /* If this was a shrink, then mark the block that the chunk lives on */ ++ if (is_shrink) { ++ bi = yaffs_get_block_info(in->my_dev, ++ newChunkId / in->my_dev->param.chunks_per_block); ++ bi->has_shrink_hdr = 1; ++ } + +-#ifdef __KERNEL__ +- if (!in->myInode) +- immediateDeletion = 1; +-#else +- if (in->inUse <= 0) +- immediateDeletion = 1; +-#endif ++ } ++ ++ retVal = newChunkId; - if (immediateDeletion) { - retVal = @@ -10961,74 +11643,28 @@ - retVal = - yaffs_ChangeObjectName(in, in->myDev->unlinkedDir, - _Y("unlinked"), 0, 0); -- } -+ if (name && *name) { -+ memset(oh->name, 0, sizeof(oh->name)); -+ yaffs_LoadObjectHeaderFromName(dev,oh->name,name); -+ } else if (prevChunkId > 0) -+ memcpy(oh->name, oldName, sizeof(oh->name)); -+ else -+ memset(oh->name, 0, sizeof(oh->name)); + } -+ oh->isShrink = isShrink; ++ if (buffer) ++ yaffs_release_temp_buffer(dev, buffer, __LINE__); -- return retVal; --} -+ switch (in->variantType) { -+ case YAFFS_OBJECT_TYPE_UNKNOWN: -+ /* Should not happen */ -+ break; -+ case YAFFS_OBJECT_TYPE_FILE: -+ oh->fileSize = -+ (oh->parentObjectId == YAFFS_OBJECTID_DELETED -+ || oh->parentObjectId == -+ YAFFS_OBJECTID_UNLINKED) ? 0 : in->variant. -+ fileVariant.fileSize; -+ break; -+ case YAFFS_OBJECT_TYPE_HARDLINK: -+ oh->equivalentObjectId = -+ in->variant.hardLinkVariant.equivalentObjectId; -+ break; -+ case YAFFS_OBJECT_TYPE_SPECIAL: -+ /* Do nothing */ -+ break; -+ case YAFFS_OBJECT_TYPE_DIRECTORY: -+ /* Do nothing */ -+ break; -+ case YAFFS_OBJECT_TYPE_SYMLINK: -+ alias = in->variant.symLinkVariant.alias; -+ if(!alias) -+ alias = _Y("no alias"); -+ yaffs_strncpy(oh->alias, -+ alias, -+ YAFFS_MAX_ALIAS_LENGTH); -+ oh->alias[YAFFS_MAX_ALIAS_LENGTH] = 0; -+ break; -+ } + return retVal; + } -int yaffs_DeleteFile(yaffs_Object *in) -{ - int retVal = YAFFS_OK; - int deleted = in->deleted; -+ /* process any xattrib modifications */ -+ if(xmod) -+ yaffs_ApplyXMod(in, (char *)buffer, xmod); - +- - yaffs_ResizeFile(in, 0); - +- - if (in->nDataChunks > 0) { - /* Use soft deletion if there is data in the file. - * That won't be the case if it has been resized to zero. - */ - if (!in->unlinked) - retVal = yaffs_UnlinkFileIfNeeded(in); -+ /* Tags */ -+ yaffs_InitialiseTags(&newTags); -+ in->serial++; -+ newTags.chunkId = 0; -+ newTags.objectId = in->objectId; -+ newTags.serialNumber = in->serial; - +- - if (retVal == YAFFS_OK && in->unlinked && !in->deleted) { - in->deleted = 1; - deleted = 1; @@ -11041,68 +11677,67 @@ - yaffs_FreeTnode(in->myDev, in->variant.fileVariant.top); - in->variant.fileVariant.top = NULL; - yaffs_DoGenericObjectDeletion(in); -+ /* Add extra info for file header */ - +- - return YAFFS_OK; - } -} -+ newTags.extraHeaderInfoAvailable = 1; -+ newTags.extraParentObjectId = oh->parentObjectId; -+ newTags.extraFileLength = oh->fileSize; -+ newTags.extraIsShrinkHeader = oh->isShrink; -+ newTags.extraEquivalentObjectId = oh->equivalentObjectId; -+ newTags.extraShadows = (oh->shadowsObject > 0) ? 1 : 0; -+ newTags.extraObjectType = in->variantType; ++/*------------------------ Short Operations Cache ---------------------------------------- ++ * In many situations where there is no high level buffering (eg WinCE) a lot of ++ * reads might be short sequential reads, and a lot of writes may be short ++ * sequential writes. eg. scanning/writing a jpeg file. ++ * In these cases, a short read/write cache can provide a huge perfomance benefit ++ * with dumb-as-a-rock code. ++ * In Linux, the page cache provides read buffering aand the short op cache provides write ++ * buffering. ++ * ++ * There are a limited number (~10) of cache chunks per device so that we don't ++ * need a very intelligent search. ++ */ -static int yaffs_DeleteDirectory(yaffs_Object *in) --{ ++static int yaffs_obj_cache_dirty(yaffs_obj_t *obj) + { - /* First check that the directory is empty. */ - if (ylist_empty(&in->variant.directoryVariant.children)) - return yaffs_DoGenericObjectDeletion(in); -+ yaffs_VerifyObjectHeader(in, oh, &newTags, 1); ++ yaffs_dev_t *dev = obj->my_dev; ++ int i; ++ yaffs_cache_t *cache; ++ int nCaches = obj->my_dev->param.n_caches; - return YAFFS_FAIL; -+ /* Create new chunk in NAND */ -+ newChunkId = -+ yaffs_WriteNewChunkWithTagsToNAND(dev, buffer, &newTags, -+ (prevChunkId > 0) ? 1 : 0); ++ for (i = 0; i < nCaches; i++) { ++ cache = &dev->cache[i]; ++ if (cache->object == obj && ++ cache->dirty) ++ return 1; ++ } --} -+ if (newChunkId >= 0) { ++ return 0; + } -static int yaffs_DeleteSymLink(yaffs_Object *in) -{ - YFREE(in->variant.symLinkVariant.alias); -+ in->hdrChunk = newChunkId; - +- - return yaffs_DoGenericObjectDeletion(in); -} -+ if (prevChunkId > 0) { -+ yaffs_DeleteChunk(dev, prevChunkId, 1, -+ __LINE__); -+ } -static int yaffs_DeleteHardLink(yaffs_Object *in) --{ ++static void yaffs_flush_file_cache(yaffs_obj_t *obj) + { - /* remove this hardlink from the list assocaited with the equivalent - * object - */ - ylist_del_init(&in->hardLinks); - return yaffs_DoGenericObjectDeletion(in); -} -+ if (!yaffs_ObjectHasCachedWriteData(in)) -+ in->dirty = 0; -+ -+ /* If this was a shrink, then mark the block that the chunk lives on */ -+ if (isShrink) { -+ bi = yaffs_GetBlockInfo(in->myDev, -+ newChunkId / in->myDev->param.nChunksPerBlock); -+ bi->hasShrinkHeader = 1; -+ } -+ -+ } -+ -+ retVal = newChunkId; ++ yaffs_dev_t *dev = obj->my_dev; ++ int lowest = -99; /* Stop compiler whining. */ ++ int i; ++ yaffs_cache_t *cache; ++ int chunkWritten = 0; ++ int nCaches = obj->my_dev->param.n_caches; -int yaffs_DeleteObject(yaffs_Object *obj) -{ @@ -11126,42 +11761,41 @@ - case YAFFS_OBJECT_TYPE_UNKNOWN: - retVal = 0; - break; /* should not happen. */ - } +- } ++ if (nCaches > 0) { ++ do { ++ cache = NULL; -+ if (buffer) -+ yaffs_ReleaseTempBuffer(dev, buffer, __LINE__); -+ - return retVal; - } +- return retVal; +-} ++ /* Find the dirty cache for this object with the lowest chunk id. */ ++ for (i = 0; i < nCaches; i++) { ++ if (dev->cache[i].object == obj && ++ dev->cache[i].dirty) { ++ if (!cache ++ || dev->cache[i].chunk_id < ++ lowest) { ++ cache = &dev->cache[i]; ++ lowest = cache->chunk_id; ++ } ++ } ++ } -static int yaffs_UnlinkWorker(yaffs_Object *obj) -+/*------------------------ Short Operations Cache ---------------------------------------- -+ * In many situations where there is no high level buffering (eg WinCE) a lot of -+ * reads might be short sequential reads, and a lot of writes may be short -+ * sequential writes. eg. scanning/writing a jpeg file. -+ * In these cases, a short read/write cache can provide a huge perfomance benefit -+ * with dumb-as-a-rock code. -+ * In Linux, the page cache provides read buffering aand the short op cache provides write -+ * buffering. -+ * -+ * There are a limited number (~10) of cache chunks per device so that we don't -+ * need a very intelligent search. -+ */ -+ -+static int yaffs_ObjectHasCachedWriteData(yaffs_Object *obj) - { -+ yaffs_Device *dev = obj->myDev; -+ int i; -+ yaffs_ChunkCache *cache; -+ int nCaches = obj->myDev->param.nShortOpCaches; +-{ ++ if (cache && !cache->locked) { ++ /* Write it out and free it up */ - int immediateDeletion = 0; -+ for (i = 0; i < nCaches; i++) { -+ cache = &dev->srCache[i]; -+ if (cache->object == obj && -+ cache->dirty) -+ return 1; -+ } ++ chunkWritten = ++ yaffs_wr_data_obj(cache->object, ++ cache->chunk_id, ++ cache->data, ++ cache->n_bytes, ++ 1); ++ cache->dirty = 0; ++ cache->object = NULL; ++ } -#ifdef __KERNEL__ - if (!obj->myInode) @@ -11170,8 +11804,7 @@ - if (obj->inUse <= 0) - immediateDeletion = 1; -#endif -+ return 0; -+} ++ } while (cache && chunkWritten > 0); - if (obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK) { - return yaffs_DeleteHardLink(obj); @@ -11189,64 +11822,54 @@ - * - Rename the object to the hardlink's name. - * - Delete the hardlink - */ - -- yaffs_Object *hl; -- int retVal; -- YCHAR name[YAFFS_MAX_NAME_LENGTH + 1]; -+static void yaffs_FlushFilesChunkCache(yaffs_Object *obj) -+{ -+ yaffs_Device *dev = obj->myDev; -+ int lowest = -99; /* Stop compiler whining. */ -+ int i; -+ yaffs_ChunkCache *cache; -+ int chunkWritten = 0; -+ int nCaches = obj->myDev->param.nShortOpCaches; - -- hl = ylist_entry(obj->hardLinks.next, yaffs_Object, hardLinks); -+ if (nCaches > 0) { -+ do { -+ cache = NULL; - -- ylist_del_init(&hl->hardLinks); -- ylist_del_init(&hl->siblings); -+ /* Find the dirty cache for this object with the lowest chunk id. */ -+ for (i = 0; i < nCaches; i++) { -+ if (dev->srCache[i].object == obj && -+ dev->srCache[i].dirty) { -+ if (!cache -+ || dev->srCache[i].chunkId < -+ lowest) { -+ cache = &dev->srCache[i]; -+ lowest = cache->chunkId; -+ } -+ } -+ } - -- yaffs_GetObjectName(hl, name, YAFFS_MAX_NAME_LENGTH + 1); -+ if (cache && !cache->locked) { -+ /* Write it out and free it up */ - -- retVal = yaffs_ChangeObjectName(obj, hl->parent, name, 0, 0); -+ chunkWritten = -+ yaffs_WriteChunkDataToObject(cache->object, -+ cache->chunkId, -+ cache->data, -+ cache->nBytes, -+ 1); -+ cache->dirty = 0; -+ cache->object = NULL; -+ } - -- if (retVal == YAFFS_OK) -- retVal = yaffs_DoGenericObjectDeletion(hl); -+ } while (cache && chunkWritten > 0); - -- return retVal; + if (cache) { + /* Hoosterman, disk full while writing cache out. */ + T(YAFFS_TRACE_ERROR, + (TSTR("yaffs tragedy: no space during cache write" TENDSTR))); +- yaffs_Object *hl; +- int retVal; +- YCHAR name[YAFFS_MAX_NAME_LENGTH + 1]; ++ } ++ } + +- hl = ylist_entry(obj->hardLinks.next, yaffs_Object, hardLinks); ++} + +- ylist_del_init(&hl->hardLinks); +- ylist_del_init(&hl->siblings); ++/*yaffs_flush_whole_cache(dev) ++ * ++ * ++ */ + +- yaffs_GetObjectName(hl, name, YAFFS_MAX_NAME_LENGTH + 1); ++void yaffs_flush_whole_cache(yaffs_dev_t *dev) ++{ ++ yaffs_obj_t *obj; ++ int nCaches = dev->param.n_caches; ++ int i; + +- retVal = yaffs_ChangeObjectName(obj, hl->parent, name, 0, 0); ++ /* Find a dirty object in the cache and flush it... ++ * until there are no further dirty objects. ++ */ ++ do { ++ obj = NULL; ++ for (i = 0; i < nCaches && !obj; i++) { ++ if (dev->cache[i].object && ++ dev->cache[i].dirty) ++ obj = dev->cache[i].object; + +- if (retVal == YAFFS_OK) +- retVal = yaffs_DoGenericObjectDeletion(hl); ++ } ++ if (obj) ++ yaffs_flush_file_cache(obj); + +- return retVal; ++ } while (obj); + - } else if (immediateDeletion) { - switch (obj->variantType) { - case YAFFS_OBJECT_TYPE_FILE: @@ -11265,80 +11888,53 @@ - case YAFFS_OBJECT_TYPE_UNKNOWN: - default: - return YAFFS_FAIL; - } +- } - } else - return yaffs_ChangeObjectName(obj, obj->myDev->unlinkedDir, - _Y("unlinked"), 0, 0); -+ } -+ } -+/*yaffs_FlushEntireDeviceCache(dev) -+ * -+ * -+ */ -static int yaffs_UnlinkObject(yaffs_Object *obj) -+void yaffs_FlushEntireDeviceCache(yaffs_Device *dev) - { -+ yaffs_Object *obj; -+ int nCaches = dev->param.nShortOpCaches; -+ int i; - -- if (obj && obj->unlinkAllowed) -- return yaffs_UnlinkWorker(obj); -+ /* Find a dirty object in the cache and flush it... -+ * until there are no further dirty objects. -+ */ -+ do { -+ obj = NULL; -+ for (i = 0; i < nCaches && !obj; i++) { -+ if (dev->srCache[i].object && -+ dev->srCache[i].dirty) -+ obj = dev->srCache[i].object; - -- return YAFFS_FAIL; -+ } -+ if (obj) -+ yaffs_FlushFilesChunkCache(obj); -+ -+ } while (obj); - - } --int yaffs_Unlink(yaffs_Object *dir, const YCHAR *name) -+ -+ +/* Grab us a cache chunk for use. + * First look for an empty one. + * Then look for the least recently used non-dirty one. + * Then look for the least recently used dirty one...., flush and look again. + */ -+static yaffs_ChunkCache *yaffs_GrabChunkCacheWorker(yaffs_Device *dev) ++static yaffs_cache_t *yaffs_grab_chunk_worker(yaffs_dev_t *dev) { -- yaffs_Object *obj; + int i; -- obj = yaffs_FindObjectByName(dir, name); -- return yaffs_UnlinkObject(obj); +- if (obj && obj->unlinkAllowed) +- return yaffs_UnlinkWorker(obj); +- +- return YAFFS_FAIL; +- -} -+ if (dev->param.nShortOpCaches > 0) { -+ for (i = 0; i < dev->param.nShortOpCaches; i++) { -+ if (!dev->srCache[i].object) -+ return &dev->srCache[i]; +-int yaffs_Unlink(yaffs_Object *dir, const YCHAR *name) +-{ +- yaffs_Object *obj; ++ if (dev->param.n_caches > 0) { ++ for (i = 0; i < dev->param.n_caches; i++) { ++ if (!dev->cache[i].object) ++ return &dev->cache[i]; + } + } --/*----------------------- Initialisation Scanning ---------------------- */ +- obj = yaffs_FindObjectByName(dir, name); +- return yaffs_UnlinkObject(obj); + return NULL; -+} + } +-/*----------------------- Initialisation Scanning ---------------------- */ +- -static void yaffs_HandleShadowedObject(yaffs_Device *dev, int objId, - int backwardScanning) -+static yaffs_ChunkCache *yaffs_GrabChunkCache(yaffs_Device *dev) ++static yaffs_cache_t *yaffs_grab_chunk_cache(yaffs_dev_t *dev) { - yaffs_Object *obj; -+ yaffs_ChunkCache *cache; -+ yaffs_Object *theObj; ++ yaffs_cache_t *cache; ++ yaffs_obj_t *theObj; + int usage; + int i; + int pushout; @@ -11347,7 +11943,7 @@ - /* Handle YAFFS1 forward scanning case - * For YAFFS1 we always do the deletion - */ -+ if (dev->param.nShortOpCaches > 0) { ++ if (dev->param.n_caches > 0) { + /* Try find a non-dirty one... */ - } else { @@ -11357,7 +11953,7 @@ - if (yaffs_FindObjectByNumber(dev, objId)) - return; - } -+ cache = yaffs_GrabChunkCacheWorker(dev); ++ cache = yaffs_grab_chunk_worker(dev); - /* Let's create it (if it does not exist) assuming it is a file so that it can do shrinking etc. - * We put it in unlinked dir to be cleaned up after the scanning @@ -11389,13 +11985,13 @@ + cache = NULL; + pushout = -1; -+ for (i = 0; i < dev->param.nShortOpCaches; i++) { -+ if (dev->srCache[i].object && -+ !dev->srCache[i].locked && -+ (dev->srCache[i].lastUse < usage || !cache)) { -+ usage = dev->srCache[i].lastUse; -+ theObj = dev->srCache[i].object; -+ cache = &dev->srCache[i]; ++ for (i = 0; i < dev->param.n_caches; i++) { ++ if (dev->cache[i].object && ++ !dev->cache[i].locked && ++ (dev->cache[i].last_use < usage || !cache)) { ++ usage = dev->cache[i].last_use; ++ theObj = dev->cache[i].object; ++ cache = &dev->cache[i]; + pushout = i; + } + } @@ -11406,8 +12002,8 @@ - yaffs_Object *in; + if (!cache || cache->dirty) { + /* Flush and try again */ -+ yaffs_FlushFilesChunkCache(theObj); -+ cache = yaffs_GrabChunkCacheWorker(dev); ++ yaffs_flush_file_cache(theObj); ++ cache = yaffs_grab_chunk_worker(dev); + } - while (hardList) { @@ -11434,18 +12030,18 @@ - hl->variant.hardLinkVariant.equivalentObject = NULL; - YINIT_LIST_HEAD(&hl->hardLinks); +/* Find a cached chunk */ -+static yaffs_ChunkCache *yaffs_FindChunkCache(const yaffs_Object *obj, -+ int chunkId) ++static yaffs_cache_t *yaffs_find_chunk_cache(const yaffs_obj_t *obj, ++ int chunk_id) +{ -+ yaffs_Device *dev = obj->myDev; ++ yaffs_dev_t *dev = obj->my_dev; + int i; -+ if (dev->param.nShortOpCaches > 0) { -+ for (i = 0; i < dev->param.nShortOpCaches; i++) { -+ if (dev->srCache[i].object == obj && -+ dev->srCache[i].chunkId == chunkId) { -+ dev->cacheHits++; ++ if (dev->param.n_caches > 0) { ++ for (i = 0; i < dev->param.n_caches; i++) { ++ if (dev->cache[i].object == obj && ++ dev->cache[i].chunk_id == chunk_id) { ++ dev->cache_hits++; -+ return &dev->srCache[i]; ++ return &dev->cache[i]; + } } } @@ -11453,23 +12049,23 @@ } +/* Mark the chunk for the least recently used algorithym */ -+static void yaffs_UseChunkCache(yaffs_Device *dev, yaffs_ChunkCache *cache, ++static void yaffs_use_cache(yaffs_dev_t *dev, yaffs_cache_t *cache, + int isAWrite) +{ + -+ if (dev->param.nShortOpCaches > 0) { -+ if (dev->srLastUse < 0 || dev->srLastUse > 100000000) { ++ if (dev->param.n_caches > 0) { ++ if (dev->cache_last_use < 0 || dev->cache_last_use > 100000000) { + /* Reset the cache usages */ + int i; -+ for (i = 1; i < dev->param.nShortOpCaches; i++) -+ dev->srCache[i].lastUse = 0; ++ for (i = 1; i < dev->param.n_caches; i++) ++ dev->cache[i].last_use = 0; -+ dev->srLastUse = 0; ++ dev->cache_last_use = 0; + } -+ dev->srLastUse++; ++ dev->cache_last_use++; -+ cache->lastUse = dev->srLastUse; ++ cache->last_use = dev->cache_last_use; -static int ybicmp(const void *a, const void *b) -{ @@ -11490,10 +12086,10 @@ + * Do this when a whole page gets written, + * ie the short cache for this page is no longer valid. + */ -+static void yaffs_InvalidateChunkCache(yaffs_Object *object, int chunkId) ++static void yaffs_invalidate_chunk_cache(yaffs_obj_t *object, int chunk_id) +{ -+ if (object->myDev->param.nShortOpCaches > 0) { -+ yaffs_ChunkCache *cache = yaffs_FindChunkCache(object, chunkId); ++ if (object->my_dev->param.n_caches > 0) { ++ yaffs_cache_t *cache = yaffs_find_chunk_cache(object, chunk_id); -struct yaffs_ShadowFixerStruct { - int objectId; @@ -11510,7 +12106,7 @@ +/* Invalidate all the cache pages associated with this object + * Do this whenever ther file is deleted or resized. + */ -+static void yaffs_InvalidateWholeChunkCache(yaffs_Object *in) ++static void yaffs_invalidate_whole_cache(yaffs_obj_t *in) { - /* - * Sort out state of unlinked and deleted objects after scanning. @@ -11519,7 +12115,7 @@ - struct ylist_head *n; - yaffs_Object *l; + int i; -+ yaffs_Device *dev = in->myDev; ++ yaffs_dev_t *dev = in->my_dev; - /* Soft delete all the unlinked files */ - ylist_for_each_safe(i, n, @@ -11527,11 +12123,11 @@ - if (i) { - l = ylist_entry(i, yaffs_Object, siblings); - yaffs_DeleteObject(l); -+ if (dev->param.nShortOpCaches > 0) { ++ if (dev->param.n_caches > 0) { + /* Invalidate it. */ -+ for (i = 0; i < dev->param.nShortOpCaches; i++) { -+ if (dev->srCache[i].object == in) -+ dev->srCache[i].object = NULL; ++ for (i = 0; i < dev->param.n_caches; i++) { ++ if (dev->cache[i].object == in) ++ dev->cache[i].object = NULL; } } +} @@ -11556,8 +12152,8 @@ + */ -static int yaffs_Scan(yaffs_Device *dev) -+int yaffs_ReadDataFromFile(yaffs_Object *in, __u8 *buffer, loff_t offset, -+ int nBytes) ++int yaffs_file_rd(yaffs_obj_t *in, __u8 *buffer, loff_t offset, ++ int n_bytes) { - yaffs_ExtendedTags tags; - int blk; @@ -11576,82 +12172,90 @@ - yaffs_ObjectHeader *oh; - yaffs_Object *in; - yaffs_Object *parent; -- -- int alloc_failed = 0; + __u32 start; + int nToCopy; -+ int n = nBytes; ++ int n = n_bytes; + int nDone = 0; -+ yaffs_ChunkCache *cache; ++ yaffs_cache_t *cache; + +- int alloc_failed = 0; ++ yaffs_dev_t *dev; - struct yaffs_ShadowFixerStruct *shadowFixerList = NULL; -+ yaffs_Device *dev; ++ dev = in->my_dev; -+ dev = in->myDev; - -- __u8 *chunkData; + while (n > 0) { -+ /* chunk = offset / dev->nDataBytesPerChunk + 1; */ -+ /* start = offset % dev->nDataBytesPerChunk; */ -+ yaffs_AddrToChunk(dev, offset, &chunk, &start); ++ /* chunk = offset / dev->data_bytes_per_chunk + 1; */ ++ /* start = offset % dev->data_bytes_per_chunk; */ ++ yaffs_addr_to_chunk(dev, offset, &chunk, &start); + chunk++; +- __u8 *chunkData; + /* OK now check for the curveball where the start and end are in + * the same chunk. + */ -+ if ((start + n) < dev->nDataBytesPerChunk) ++ if ((start + n) < dev->data_bytes_per_chunk) + nToCopy = n; + else -+ nToCopy = dev->nDataBytesPerChunk - start; ++ nToCopy = dev->data_bytes_per_chunk - start; -+ cache = yaffs_FindChunkCache(in, chunk); ++ cache = yaffs_find_chunk_cache(in, chunk); + ++ /* If the chunk is already in the cache or it is less than a whole chunk ++ * or we're using inband tags then use the cache (if there is caching) ++ * else bypass the cache. ++ */ ++ if (cache || nToCopy != dev->data_bytes_per_chunk || dev->param.inband_tags) { ++ if (dev->param.n_caches > 0) { - T(YAFFS_TRACE_SCAN, - (TSTR("yaffs_Scan starts intstartblk %d intendblk %d..." TENDSTR), - dev->internalStartBlock, dev->internalEndBlock)); -- ++ /* If we can't find the data in the cache, then load it up. */ + - chunkData = yaffs_GetTempBuffer(dev, __LINE__); -- ++ if (!cache) { ++ cache = yaffs_grab_chunk_cache(in->my_dev); ++ cache->object = in; ++ cache->chunk_id = chunk; ++ cache->dirty = 0; ++ cache->locked = 0; ++ yaffs_rd_data_obj(in, chunk, ++ cache-> ++ data); ++ cache->n_bytes = 0; ++ } + - dev->sequenceNumber = YAFFS_LOWEST_SEQUENCE_NUMBER; -- ++ yaffs_use_cache(dev, cache, 0); + - /* Scan all the blocks to determine their state */ - for (blk = dev->internalStartBlock; blk <= dev->internalEndBlock; blk++) { - bi = yaffs_GetBlockInfo(dev, blk); - yaffs_ClearChunkBits(dev, blk); - bi->pagesInUse = 0; - bi->softDeletions = 0; -+ /* If the chunk is already in the cache or it is less than a whole chunk -+ * or we're using inband tags then use the cache (if there is caching) -+ * else bypass the cache. -+ */ -+ if (cache || nToCopy != dev->nDataBytesPerChunk || dev->param.inbandTags) { -+ if (dev->param.nShortOpCaches > 0) { ++ cache->locked = 1; - yaffs_QueryInitialBlockState(dev, blk, &state, &sequenceNumber); -+ /* If we can't find the data in the cache, then load it up. */ - bi->blockState = state; - bi->sequenceNumber = sequenceNumber; -+ if (!cache) { -+ cache = yaffs_GrabChunkCache(in->myDev); -+ cache->object = in; -+ cache->chunkId = chunk; -+ cache->dirty = 0; -+ cache->locked = 0; -+ yaffs_ReadChunkDataFromObject(in, chunk, -+ cache-> -+ data); -+ cache->nBytes = 0; -+ } ++ memcpy(buffer, &cache->data[start], nToCopy); - if (bi->sequenceNumber == YAFFS_SEQUENCE_BAD_BLOCK) - bi->blockState = state = YAFFS_BLOCK_STATE_DEAD; -+ yaffs_UseChunkCache(dev, cache, 0); ++ cache->locked = 0; ++ } else { ++ /* Read into the local buffer then copy..*/ - T(YAFFS_TRACE_SCAN_DEBUG, - (TSTR("Block scanning block %d state %d seq %d" TENDSTR), blk, - state, sequenceNumber)); -+ cache->locked = 1; ++ __u8 *localBuffer = ++ yaffs_get_temp_buffer(dev, __LINE__); ++ yaffs_rd_data_obj(in, chunk, ++ localBuffer); - if (state == YAFFS_BLOCK_STATE_DEAD) { - T(YAFFS_TRACE_BAD_BLOCKS, @@ -11663,55 +12267,63 @@ - dev->nFreeChunks += dev->nChunksPerBlock; - } - } ++ memcpy(buffer, &localBuffer[start], nToCopy); - startIterator = dev->internalStartBlock; - endIterator = dev->internalEndBlock; -+ memcpy(buffer, &cache->data[start], nToCopy); - /* For each block.... */ - for (blockIterator = startIterator; !alloc_failed && blockIterator <= endIterator; - blockIterator++) { -+ cache->locked = 0; -+ } else { -+ /* Read into the local buffer then copy..*/ - -- YYIELD(); -+ __u8 *localBuffer = -+ yaffs_GetTempBuffer(dev, __LINE__); -+ yaffs_ReadChunkDataFromObject(in, chunk, -+ localBuffer); - -- YYIELD(); -+ memcpy(buffer, &localBuffer[start], nToCopy); - -- blk = blockIterator; - -- bi = yaffs_GetBlockInfo(dev, blk); -- state = bi->blockState; -+ yaffs_ReleaseTempBuffer(dev, localBuffer, ++ yaffs_release_temp_buffer(dev, localBuffer, + __LINE__); + } -- deleted = 0; +- YYIELD(); + } else { +- YYIELD(); ++ /* A full chunk. Read directly into the supplied buffer. */ ++ yaffs_rd_data_obj(in, chunk, buffer); + +- blk = blockIterator; ++ } + +- bi = yaffs_GetBlockInfo(dev, blk); +- state = bi->blockState; ++ n -= nToCopy; ++ offset += nToCopy; ++ buffer += nToCopy; ++ nDone += nToCopy; + +- deleted = 0; ++ } + - /* For each chunk in each block that needs scanning....*/ - for (c = 0; !alloc_failed && c < dev->nChunksPerBlock && - state == YAFFS_BLOCK_STATE_NEEDS_SCANNING; c++) { - /* Read the tags and decide what to do */ - chunk = blk * dev->nChunksPerBlock + c; -+ /* A full chunk. Read directly into the supplied buffer. */ -+ yaffs_ReadChunkDataFromObject(in, chunk, buffer); ++ return nDone; ++} - result = yaffs_ReadChunkWithTagsFromNAND(dev, chunk, NULL, - &tags); -+ } ++int yaffs_do_file_wr(yaffs_obj_t *in, const __u8 *buffer, loff_t offset, ++ int n_bytes, int write_trhrough) ++{ - /* Let's have a good look at this chunk... */ -+ n -= nToCopy; -+ offset += nToCopy; -+ buffer += nToCopy; -+ nDone += nToCopy; ++ int chunk; ++ __u32 start; ++ int nToCopy; ++ int n = n_bytes; ++ int nDone = 0; ++ int nToWriteBack; ++ int startOfWrite = offset; ++ int chunkWritten = 0; ++ __u32 n_bytesRead; ++ __u32 chunkStart; - if (tags.eccResult == YAFFS_ECC_RESULT_UNFIXED || tags.chunkDeleted) { - /* YAFFS1 only... @@ -11725,7 +12337,7 @@ - * This means that either the block is empty or - * this is the one being allocated from - */ -+ } ++ yaffs_dev_t *dev; - if (c == 0) { - /* We're looking at the first chunk in the block so the block is unused */ @@ -11742,13 +12354,11 @@ - dev->allocationPage = c; - dev->allocationBlockFinder = blk; - /* Set it to here to encourage the allocator to go forth from here. */ -+ return nDone; -+} ++ dev = in->my_dev; - } -+int yaffs_DoWriteDataToFile(yaffs_Object *in, const __u8 *buffer, loff_t offset, -+ int nBytes, int writeThrough) -+{ ++ while (n > 0 && chunkWritten >= 0) { ++ yaffs_addr_to_chunk(dev, offset, &chunk, &start); - dev->nFreeChunks += (dev->nChunksPerBlock - c); - } else if (tags.chunkId > 0) { @@ -11765,26 +12375,27 @@ - /* PutChunkIntoFile checks for a clash (two data chunks with - * the same chunkId). - */ -+ int chunk; -+ __u32 start; -+ int nToCopy; -+ int n = nBytes; -+ int nDone = 0; -+ int nToWriteBack; -+ int startOfWrite = offset; -+ int chunkWritten = 0; -+ __u32 nBytesRead; -+ __u32 chunkStart; ++ if (chunk * dev->data_bytes_per_chunk + start != offset || ++ start >= dev->data_bytes_per_chunk) { ++ T(YAFFS_TRACE_ERROR, ( ++ TSTR("AddrToChunk of offset %d gives chunk %d start %d" ++ TENDSTR), ++ (int)offset, chunk, start)); ++ } ++ chunk++; /* File pos to chunk in file offset */ - if (!in) - alloc_failed = 1; -+ yaffs_Device *dev; ++ /* OK now check for the curveball where the start and end are in ++ * the same chunk. ++ */ - if (in) { - if (!yaffs_PutChunkIntoFile(in, tags.chunkId, chunk, 1)) - alloc_failed = 1; - } -+ dev = in->myDev; ++ if ((start + n) < dev->data_bytes_per_chunk) { ++ nToCopy = n; - endpos = - (tags.chunkId - 1) * dev->nDataBytesPerChunk + @@ -11801,8 +12412,10 @@ - in->variant.fileVariant. - scannedFileSize; - } -+ while (n > 0 && chunkWritten >= 0) { -+ yaffs_AddrToChunk(dev, offset, &chunk, &start); ++ /* Now folks, to calculate how many bytes to write back.... ++ * If we're overwriting and not writing to then end of file then ++ * we need to write back as much as was there before. ++ */ - } - /* T((" %d %d data %d %d\n",blk,c,tags.objectId,tags.chunkId)); */ @@ -11812,14 +12425,7 @@ - */ - yaffs_SetChunkBit(dev, blk, c); - bi->pagesInUse++; -+ if (chunk * dev->nDataBytesPerChunk + start != offset || -+ start >= dev->nDataBytesPerChunk) { -+ T(YAFFS_TRACE_ERROR, ( -+ TSTR("AddrToChunk of offset %d gives chunk %d start %d" -+ TENDSTR), -+ (int)offset, chunk, start)); -+ } -+ chunk++; /* File pos to chunk in file offset */ ++ chunkStart = ((chunk - 1) * dev->data_bytes_per_chunk); - result = yaffs_ReadChunkWithTagsFromNAND(dev, chunk, - chunkData, @@ -11834,20 +12440,20 @@ - * Wev'e ended up with an objectId that has been reused but not yet - * deleted, and worse still it has changed type. Delete the old object. - */ -+ /* OK now check for the curveball where the start and end are in -+ * the same chunk. -+ */ ++ if (chunkStart > in->variant.file_variant.file_size) ++ n_bytesRead = 0; /* Past end of file */ ++ else ++ n_bytesRead = in->variant.file_variant.file_size - chunkStart; - yaffs_DeleteObject(in); -+ if ((start + n) < dev->nDataBytesPerChunk) { -+ nToCopy = n; ++ if (n_bytesRead > dev->data_bytes_per_chunk) ++ n_bytesRead = dev->data_bytes_per_chunk; - in = 0; - } -+ /* Now folks, to calculate how many bytes to write back.... -+ * If we're overwriting and not writing to then end of file then -+ * we need to write back as much as was there before. -+ */ ++ nToWriteBack = ++ (n_bytesRead > ++ (start + n)) ? n_bytesRead : (start + n); - in = yaffs_FindOrCreateObjectByNumber(dev, - tags. @@ -11867,24 +12473,49 @@ - fixer->objectId = tags.objectId; - fixer->shadowedId = oh->shadowsObject; - } -+ chunkStart = ((chunk - 1) * dev->nDataBytesPerChunk); ++ if (nToWriteBack < 0 || nToWriteBack > dev->data_bytes_per_chunk) ++ YBUG(); ++ ++ } else { ++ nToCopy = dev->data_bytes_per_chunk - start; ++ nToWriteBack = dev->data_bytes_per_chunk; ++ } ++ ++ if (nToCopy != dev->data_bytes_per_chunk || dev->param.inband_tags) { ++ /* An incomplete start or end chunk (or maybe both start and end chunk), ++ * or we're using inband tags, so we want to use the cache buffers. ++ */ ++ if (dev->param.n_caches > 0) { ++ yaffs_cache_t *cache; ++ /* If we can't find the data in the cache, then load the cache */ ++ cache = yaffs_find_chunk_cache(in, chunk); -- } -+ if (chunkStart > in->variant.fileVariant.fileSize) -+ nBytesRead = 0; /* Past end of file */ -+ else -+ nBytesRead = in->variant.fileVariant.fileSize - chunkStart; ++ if (!cache ++ && yaffs_check_alloc_available(dev, 1)) { ++ cache = yaffs_grab_chunk_cache(dev); ++ cache->object = in; ++ cache->chunk_id = chunk; ++ cache->dirty = 0; ++ cache->locked = 0; ++ yaffs_rd_data_obj(in, chunk, ++ cache->data); ++ } else if (cache && ++ !cache->dirty && ++ !yaffs_check_alloc_available(dev, 1)) { ++ /* Drop the cache if it was a read cache item and ++ * no space check has been made for it. ++ */ ++ cache = NULL; + } - if (in && in->valid) { - /* We have already filled this one. We have a duplicate and need to resolve it. */ -+ if (nBytesRead > dev->nDataBytesPerChunk) -+ nBytesRead = dev->nDataBytesPerChunk; ++ if (cache) { ++ yaffs_use_cache(dev, cache, 1); ++ cache->locked = 1; - unsigned existingSerial = in->serial; - unsigned newSerial = tags.serialNumber; -+ nToWriteBack = -+ (nBytesRead > -+ (start + n)) ? nBytesRead : (start + n); - if (((existingSerial + 1) & 3) == newSerial) { - /* Use new one - destroy the exisiting one */ @@ -11896,10 +12527,30 @@ - /* Use existing - destroy this one. */ - yaffs_DeleteChunk(dev, chunk, 1, - __LINE__); -- } -- } -+ if (nToWriteBack < 0 || nToWriteBack > dev->nDataBytesPerChunk) -+ YBUG(); ++ memcpy(&cache->data[start], buffer, ++ nToCopy); ++ ++ ++ cache->locked = 0; ++ cache->n_bytes = nToWriteBack; ++ ++ if (write_trhrough) { ++ chunkWritten = ++ yaffs_wr_data_obj ++ (cache->object, ++ cache->chunk_id, ++ cache->data, cache->n_bytes, ++ 1); ++ cache->dirty = 0; + } ++ ++ } else { ++ chunkWritten = -1; /* fail the write */ + } ++ } else { ++ /* An incomplete start or end chunk (or maybe both start and end chunk) ++ * Read into the local buffer then copy, then copy over and write back. ++ */ - if (in && !in->valid && - (tags.objectId == YAFFS_OBJECTID_ROOT || @@ -11907,10 +12558,8 @@ - /* We only load some info, don't fiddle with directory structure */ - in->valid = 1; - in->variantType = oh->type; -+ } else { -+ nToCopy = dev->nDataBytesPerChunk - start; -+ nToWriteBack = dev->nDataBytesPerChunk; -+ } ++ __u8 *localBuffer = ++ yaffs_get_temp_buffer(dev, __LINE__); - in->yst_mode = oh->yst_mode; -#ifdef CONFIG_YAFFS_WINCE @@ -11930,40 +12579,14 @@ -#endif - in->hdrChunk = chunk; - in->serial = tags.serialNumber; -+ if (nToCopy != dev->nDataBytesPerChunk || dev->param.inbandTags) { -+ /* An incomplete start or end chunk (or maybe both start and end chunk), -+ * or we're using inband tags, so we want to use the cache buffers. -+ */ -+ if (dev->param.nShortOpCaches > 0) { -+ yaffs_ChunkCache *cache; -+ /* If we can't find the data in the cache, then load the cache */ -+ cache = yaffs_FindChunkCache(in, chunk); ++ yaffs_rd_data_obj(in, chunk, ++ localBuffer); - } else if (in && !in->valid) { - /* we need to load this info */ -+ if (!cache -+ && yaffs_CheckSpaceForAllocation(dev, 1)) { -+ cache = yaffs_GrabChunkCache(dev); -+ cache->object = in; -+ cache->chunkId = chunk; -+ cache->dirty = 0; -+ cache->locked = 0; -+ yaffs_ReadChunkDataFromObject(in, chunk, -+ cache->data); -+ } else if (cache && -+ !cache->dirty && -+ !yaffs_CheckSpaceForAllocation(dev, 1)) { -+ /* Drop the cache if it was a read cache item and -+ * no space check has been made for it. -+ */ -+ cache = NULL; -+ } - in->valid = 1; - in->variantType = oh->type; -+ if (cache) { -+ yaffs_UseChunkCache(dev, cache, 1); -+ cache->locked = 1; - in->yst_mode = oh->yst_mode; -#ifdef CONFIG_YAFFS_WINCE @@ -11983,15 +12606,21 @@ -#endif - in->hdrChunk = chunk; - in->serial = tags.serialNumber; ++ memcpy(&localBuffer[start], buffer, nToCopy); - yaffs_SetObjectName(in, oh->name); - in->dirty = 0; -+ memcpy(&cache->data[start], buffer, -+ nToCopy); ++ chunkWritten = ++ yaffs_wr_data_obj(in, chunk, ++ localBuffer, ++ nToWriteBack, ++ 0); - /* directory stuff... - * hook up to parent - */ ++ yaffs_release_temp_buffer(dev, localBuffer, ++ __LINE__); - parent = - yaffs_FindOrCreateObjectByNumber @@ -12012,32 +12641,18 @@ - /* Hoosterman, another problem.... - * We're trying to use a non-directory as a directory - */ -+ cache->locked = 0; -+ cache->nBytes = nToWriteBack; ++ } - T(YAFFS_TRACE_ERROR, - (TSTR - ("yaffs tragedy: attempting to use non-directory as a directory in scan. Put in lost+found." - TENDSTR))); - parent = dev->lostNFoundDir; -+ if (writeThrough) { -+ chunkWritten = -+ yaffs_WriteChunkDataToObject -+ (cache->object, -+ cache->chunkId, -+ cache->data, cache->nBytes, -+ 1); -+ cache->dirty = 0; - } +- } ++ } else { ++ /* A full chunk. Write directly from the supplied buffer. */ - yaffs_AddObjectToDirectory(parent, in); -+ } else { -+ chunkWritten = -1; /* fail the write */ -+ } -+ } else { -+ /* An incomplete start or end chunk (or maybe both start and end chunk) -+ * Read into the local buffer then copy, then copy over and write back. -+ */ - if (0 && (parent == dev->deletedDir || - parent == dev->unlinkedDir)) { @@ -12050,8 +12665,6 @@ - * After scanning is complete, we should have all the objects, so we run through this - * list and fix up all the chains. - */ -+ __u8 *localBuffer = -+ yaffs_GetTempBuffer(dev, __LINE__); - switch (in->variantType) { - case YAFFS_OBJECT_TYPE_UNKNOWN: @@ -12087,8 +12700,10 @@ - alloc_failed = 1; - break; - } -+ yaffs_ReadChunkDataFromObject(in, chunk, -+ localBuffer); ++ chunkWritten = ++ yaffs_wr_data_obj(in, chunk, buffer, ++ dev->data_bytes_per_chunk, ++ 0); -/* - if (parent == dev->deletedDir) { @@ -12098,15 +12713,22 @@ -*/ - } - } -- } ++ /* Since we've overwritten the cached data, we better invalidate it. */ ++ yaffs_invalidate_chunk_cache(in, chunk); + } - if (state == YAFFS_BLOCK_STATE_NEEDS_SCANNING) { - /* If we got this far while scanning, then the block is fully allocated.*/ - state = YAFFS_BLOCK_STATE_FULL; -- } ++ if (chunkWritten >= 0) { ++ n -= nToCopy; ++ offset += nToCopy; ++ buffer += nToCopy; ++ nDone += nToCopy; + } - bi->blockState = state; -+ memcpy(&localBuffer[start], buffer, nToCopy); ++ } - /* Now let's see if it was dirty */ - if (bi->pagesInUse == 0 && @@ -12114,27 +12736,29 @@ - bi->blockState == YAFFS_BLOCK_STATE_FULL) { - yaffs_BlockBecameDirty(dev, blk); - } -+ chunkWritten = -+ yaffs_WriteChunkDataToObject(in, chunk, -+ localBuffer, -+ nToWriteBack, -+ 0); ++ /* Update file object */ - } -+ yaffs_ReleaseTempBuffer(dev, localBuffer, -+ __LINE__); ++ if ((startOfWrite + nDone) > in->variant.file_variant.file_size) ++ in->variant.file_variant.file_size = (startOfWrite + nDone); -+ } ++ in->dirty = 1; - /* Ok, we've done all the scanning. - * Fix up the hard link chains. - * We should now have scanned all the objects, now it's time to add these - * hardlinks. - */ -+ } else { -+ /* A full chunk. Write directly from the supplied buffer. */ ++ return nDone; ++} - yaffs_HardlinkFixup(dev, hardList); ++int yaffs_wr_file(yaffs_obj_t *in, const __u8 *buffer, loff_t offset, ++ int n_bytes, int write_trhrough) ++{ ++ yaffs2_handle_hole(in,offset); ++ return yaffs_do_file_wr(in,buffer,offset,n_bytes,write_trhrough); ++} - /* Fix up any shadowed objects */ - { @@ -12152,79 +12776,100 @@ - yaffs_DeleteObject(obj); - obj = yaffs_FindObjectByNumber(dev, fixer->objectId); -+ chunkWritten = -+ yaffs_WriteChunkDataToObject(in, chunk, buffer, -+ dev->nDataBytesPerChunk, -+ 0); - if (obj) - yaffs_UpdateObjectHeader(obj, NULL, 1, 0, 0); -+ /* Since we've overwritten the cached data, we better invalidate it. */ -+ yaffs_InvalidateChunkCache(in, chunk); -+ } ++/* ---------------------- File resizing stuff ------------------ */ - YFREE(fixer); -+ if (chunkWritten >= 0) { -+ n -= nToCopy; -+ offset += nToCopy; -+ buffer += nToCopy; -+ nDone += nToCopy; - } +- } - } ++static void yaffs_prune_chunks(yaffs_obj_t *in, int new_size) ++{ - yaffs_ReleaseTempBuffer(dev, chunkData, __LINE__); -+ } ++ yaffs_dev_t *dev = in->my_dev; ++ int oldFileSize = in->variant.file_variant.file_size; - if (alloc_failed) - return YAFFS_FAIL; -+ /* Update file object */ ++ int lastDel = 1 + (oldFileSize - 1) / dev->data_bytes_per_chunk; ++ ++ int startDel = 1 + (new_size + dev->data_bytes_per_chunk - 1) / ++ dev->data_bytes_per_chunk; ++ int i; ++ int chunk_id; - T(YAFFS_TRACE_SCAN, (TSTR("yaffs_Scan ends" TENDSTR))); -+ if ((startOfWrite + nDone) > in->variant.fileVariant.fileSize) -+ in->variant.fileVariant.fileSize = (startOfWrite + nDone); ++ /* Delete backwards so that we don't end up with holes if ++ * power is lost part-way through the operation. ++ */ ++ for (i = lastDel; i >= startDel; i--) { ++ /* NB this could be optimised somewhat, ++ * eg. could retrieve the tags and write them without ++ * using yaffs_chunk_del ++ */ -+ in->dirty = 1; ++ chunk_id = yaffs_find_del_file_chunk(in, i, NULL); ++ if (chunk_id > 0) { ++ if (chunk_id < ++ (dev->internal_start_block * dev->param.chunks_per_block) ++ || chunk_id >= ++ ((dev->internal_end_block + ++ 1) * dev->param.chunks_per_block)) { ++ T(YAFFS_TRACE_ALWAYS, ++ (TSTR("Found daft chunk_id %d for %d" TENDSTR), ++ chunk_id, i)); ++ } else { ++ in->n_data_chunks--; ++ yaffs_chunk_del(dev, chunk_id, 1, __LINE__); ++ } ++ } ++ } - return YAFFS_OK; -+ return nDone; } -static void yaffs_CheckObjectDetailsLoaded(yaffs_Object *in) -+int yaffs_WriteDataToFile(yaffs_Object *in, const __u8 *buffer, loff_t offset, -+ int nBytes, int writeThrough) - { +-{ - __u8 *chunkData; - yaffs_ObjectHeader *oh; - yaffs_Device *dev; - yaffs_ExtendedTags tags; - int result; - int alloc_failed = 0; -+ yaffs2_HandleHole(in,offset); -+ return yaffs_DoWriteDataToFile(in,buffer,offset,nBytes,writeThrough); -+} - if (!in) - return; ++void yaffs_resize_file_down( yaffs_obj_t *obj, loff_t new_size) ++{ ++ int newFullChunks; ++ __u32 new_sizeOfPartialChunk; ++ yaffs_dev_t *dev = obj->my_dev; - dev = in->myDev; ++ yaffs_addr_to_chunk(dev, new_size, &newFullChunks, &new_sizeOfPartialChunk); -#if 0 - T(YAFFS_TRACE_SCAN, (TSTR("details for object %d %s loaded" TENDSTR), - in->objectId, - in->lazyLoaded ? "not yet" : "already")); -#endif -+/* ---------------------- File resizing stuff ------------------ */ ++ yaffs_prune_chunks(obj, new_size); - if (in->lazyLoaded && in->hdrChunk > 0) { - in->lazyLoaded = 0; - chunkData = yaffs_GetTempBuffer(dev, __LINE__); -+static void yaffs_PruneResizedChunks(yaffs_Object *in, int newSize) -+{ ++ if (new_sizeOfPartialChunk != 0) { ++ int lastChunk = 1 + newFullChunks; ++ __u8 *localBuffer = yaffs_get_temp_buffer(dev, __LINE__); - result = yaffs_ReadChunkWithTagsFromNAND(dev, in->hdrChunk, chunkData, &tags); - oh = (yaffs_ObjectHeader *) chunkData; -+ yaffs_Device *dev = in->myDev; -+ int oldFileSize = in->variant.fileVariant.fileSize; ++ /* Got to read and rewrite the last chunk with its new size and zero pad */ ++ yaffs_rd_data_obj(obj, lastChunk, localBuffer); ++ memset(localBuffer + new_sizeOfPartialChunk, 0, ++ dev->data_bytes_per_chunk - new_sizeOfPartialChunk); - in->yst_mode = oh->yst_mode; -#ifdef CONFIG_YAFFS_WINCE @@ -12241,14 +12886,13 @@ - in->yst_mtime = oh->yst_mtime; - in->yst_ctime = oh->yst_ctime; - in->yst_rdev = oh->yst_rdev; -+ int lastDel = 1 + (oldFileSize - 1) / dev->nDataBytesPerChunk; ++ yaffs_wr_data_obj(obj, lastChunk, localBuffer, ++ new_sizeOfPartialChunk, 1); -#endif - yaffs_SetObjectName(in, oh->name); -+ int startDel = 1 + (newSize + dev->nDataBytesPerChunk - 1) / -+ dev->nDataBytesPerChunk; -+ int i; -+ int chunkId; ++ yaffs_release_temp_buffer(dev, localBuffer, __LINE__); ++ } - if (in->variantType == YAFFS_OBJECT_TYPE_SYMLINK) { - in->variant.symLinkVariant.alias = @@ -12256,49 +12900,22 @@ - if (!in->variant.symLinkVariant.alias) - alloc_failed = 1; /* Not returned to caller */ - } -+ /* Delete backwards so that we don't end up with holes if -+ * power is lost part-way through the operation. -+ */ -+ for (i = lastDel; i >= startDel; i--) { -+ /* NB this could be optimised somewhat, -+ * eg. could retrieve the tags and write them without -+ * using yaffs_DeleteChunk -+ */ ++ obj->variant.file_variant.file_size = new_size; - yaffs_ReleaseTempBuffer(dev, chunkData, __LINE__); -+ chunkId = yaffs_FindAndDeleteChunkInFile(in, i, NULL); -+ if (chunkId > 0) { -+ if (chunkId < -+ (dev->internalStartBlock * dev->param.nChunksPerBlock) -+ || chunkId >= -+ ((dev->internalEndBlock + -+ 1) * dev->param.nChunksPerBlock)) { -+ T(YAFFS_TRACE_ALWAYS, -+ (TSTR("Found daft chunkId %d for %d" TENDSTR), -+ chunkId, i)); -+ } else { -+ in->nDataChunks--; -+ yaffs_DeleteChunk(dev, chunkId, 1, __LINE__); -+ } -+ } - } -+ +- } ++ yaffs_prune_tree(dev, &obj->variant.file_variant); } -static int yaffs_ScanBackwards(yaffs_Device *dev) -+ -+void yaffs_ResizeDown( yaffs_Object *obj, loff_t newSize) - { +-{ - yaffs_ExtendedTags tags; - int blk; - int blockIterator; - int startIterator; - int endIterator; - int nBlocksToScan = 0; -+ int newFullChunks; -+ __u32 newSizeOfPartialChunk; -+ yaffs_Device *dev = obj->myDev; - +- - int chunk; - int result; - int c; @@ -12313,121 +12930,100 @@ - int nBlocks = dev->internalEndBlock - dev->internalStartBlock + 1; - int itsUnlinked; - __u8 *chunkData; -+ yaffs_AddrToChunk(dev, newSize, &newFullChunks, &newSizeOfPartialChunk); - int fileSize; - int isShrink; - int foundChunksInBlock; - int equivalentObjectId; - int alloc_failed = 0; -+ yaffs_PruneResizedChunks(obj, newSize); ++int yaffs_resize_file(yaffs_obj_t *in, loff_t new_size) ++{ ++ yaffs_dev_t *dev = in->my_dev; ++ int oldFileSize = in->variant.file_variant.file_size; -+ if (newSizeOfPartialChunk != 0) { -+ int lastChunk = 1 + newFullChunks; -+ __u8 *localBuffer = yaffs_GetTempBuffer(dev, __LINE__); ++ yaffs_flush_file_cache(in); ++ yaffs_invalidate_whole_cache(in); - yaffs_BlockIndex *blockIndex = NULL; - int altBlockIndex = 0; -+ /* Got to read and rewrite the last chunk with its new size and zero pad */ -+ yaffs_ReadChunkDataFromObject(obj, lastChunk, localBuffer); -+ memset(localBuffer + newSizeOfPartialChunk, 0, -+ dev->nDataBytesPerChunk - newSizeOfPartialChunk); ++ yaffs_check_gc(dev,0); - if (!dev->isYaffs2) { - T(YAFFS_TRACE_SCAN, - (TSTR("yaffs_ScanBackwards is only for YAFFS2!" TENDSTR))); -- return YAFFS_FAIL; -+ yaffs_WriteChunkDataToObject(obj, lastChunk, localBuffer, -+ newSizeOfPartialChunk, 1); -+ -+ yaffs_ReleaseTempBuffer(dev, localBuffer, __LINE__); - } ++ if (in->variant_type != YAFFS_OBJECT_TYPE_FILE) + return YAFFS_FAIL; +- } - T(YAFFS_TRACE_SCAN, - (TSTR - ("yaffs_ScanBackwards starts intstartblk %d intendblk %d..." - TENDSTR), dev->internalStartBlock, dev->internalEndBlock)); -+ obj->variant.fileVariant.fileSize = newSize; -+ -+ yaffs_PruneFileStructure(dev, &obj->variant.fileVariant); -+} - - -- dev->sequenceNumber = YAFFS_LOWEST_SEQUENCE_NUMBER; -+int yaffs_ResizeFile(yaffs_Object *in, loff_t newSize) -+{ -+ yaffs_Device *dev = in->myDev; -+ int oldFileSize = in->variant.fileVariant.fileSize; - -- blockIndex = YMALLOC(nBlocks * sizeof(yaffs_BlockIndex)); -+ yaffs_FlushFilesChunkCache(in); -+ yaffs_InvalidateWholeChunkCache(in); - -- if (!blockIndex) { -- blockIndex = YMALLOC_ALT(nBlocks * sizeof(yaffs_BlockIndex)); -- altBlockIndex = 1; -- } -+ yaffs_CheckGarbageCollection(dev,0); - -- if (!blockIndex) { -- T(YAFFS_TRACE_SCAN, -- (TSTR("yaffs_Scan() could not allocate block index!" TENDSTR))); -+ if (in->variantType != YAFFS_OBJECT_TYPE_FILE) - return YAFFS_FAIL; -- } - -- dev->blocksInCheckpoint = 0; -+ if (newSize == oldFileSize) ++ if (new_size == oldFileSize) + return YAFFS_OK; + -+ if(newSize > oldFileSize){ -+ yaffs2_HandleHole(in,newSize); -+ in->variant.fileVariant.fileSize = newSize; ++ if(new_size > oldFileSize){ ++ yaffs2_handle_hole(in,new_size); ++ in->variant.file_variant.file_size = new_size; + } else { -+ /* newSize < oldFileSize */ -+ yaffs_ResizeDown(in, newSize); ++ /* new_size < oldFileSize */ ++ yaffs_resize_file_down(in, new_size); + } -+ + + /* Write a new object header to reflect the resize. + * show we've shrunk the file, if need be + * Do this only if the file is not in the deleted directories + * and is not shadowed. + */ + if (in->parent && -+ !in->isShadowed && -+ in->parent->objectId != YAFFS_OBJECTID_UNLINKED && -+ in->parent->objectId != YAFFS_OBJECTID_DELETED) -+ yaffs_UpdateObjectHeader(in, NULL, 0, 0, 0, NULL); -+ ++ !in->is_shadowed && ++ in->parent->obj_id != YAFFS_OBJECTID_UNLINKED && ++ in->parent->obj_id != YAFFS_OBJECTID_DELETED) ++ yaffs_update_oh(in, NULL, 0, 0, 0, NULL); -- chunkData = yaffs_GetTempBuffer(dev, __LINE__); +- dev->sequenceNumber = YAFFS_LOWEST_SEQUENCE_NUMBER; + +- blockIndex = YMALLOC(nBlocks * sizeof(yaffs_BlockIndex)); + return YAFFS_OK; +} +- if (!blockIndex) { +- blockIndex = YMALLOC_ALT(nBlocks * sizeof(yaffs_BlockIndex)); +- altBlockIndex = 1; +- } ++loff_t yaffs_get_file_size(yaffs_obj_t *obj) ++{ ++ YCHAR *alias = NULL; ++ obj = yaffs_get_equivalent_obj(obj); + +- if (!blockIndex) { +- T(YAFFS_TRACE_SCAN, +- (TSTR("yaffs_Scan() could not allocate block index!" TENDSTR))); +- return YAFFS_FAIL; ++ switch (obj->variant_type) { ++ case YAFFS_OBJECT_TYPE_FILE: ++ return obj->variant.file_variant.file_size; ++ case YAFFS_OBJECT_TYPE_SYMLINK: ++ alias = obj->variant.symlink_variant.alias; ++ if(!alias) ++ return 0; ++ return yaffs_strnlen(alias,YAFFS_MAX_ALIAS_LENGTH); ++ default: ++ return 0; + } ++} + +- dev->blocksInCheckpoint = 0; +- +- chunkData = yaffs_GetTempBuffer(dev, __LINE__); +- - /* Scan all the blocks to determine their state */ - for (blk = dev->internalStartBlock; blk <= dev->internalEndBlock; blk++) { - bi = yaffs_GetBlockInfo(dev, blk); - yaffs_ClearChunkBits(dev, blk); - bi->pagesInUse = 0; - bi->softDeletions = 0; -+loff_t yaffs_GetFileSize(yaffs_Object *obj) -+{ -+ YCHAR *alias = NULL; -+ obj = yaffs_GetEquivalentObject(obj); -+ -+ switch (obj->variantType) { -+ case YAFFS_OBJECT_TYPE_FILE: -+ return obj->variant.fileVariant.fileSize; -+ case YAFFS_OBJECT_TYPE_SYMLINK: -+ alias = obj->variant.symLinkVariant.alias; -+ if(!alias) -+ return 0; -+ return yaffs_strnlen(alias,YAFFS_MAX_ALIAS_LENGTH); -+ default: -+ return 0; -+ } -+} - +- - yaffs_QueryInitialBlockState(dev, blk, &state, &sequenceNumber); - bi->blockState = state; @@ -12437,17 +13033,17 @@ - bi->blockState = state = YAFFS_BLOCK_STATE_CHECKPOINT; - if (bi->sequenceNumber == YAFFS_SEQUENCE_BAD_BLOCK) - bi->blockState = state = YAFFS_BLOCK_STATE_DEAD; -+int yaffs_FlushFile(yaffs_Object *in, int updateTime, int dataSync) ++int yaffs_flush_file(yaffs_obj_t *in, int update_time, int data_sync) +{ + int retVal; + if (in->dirty) { -+ yaffs_FlushFilesChunkCache(in); -+ if(dataSync) /* Only sync data */ ++ yaffs_flush_file_cache(in); ++ if(data_sync) /* Only sync data */ + retVal=YAFFS_OK; + else { -+ if (updateTime) { ++ if (update_time) { +#ifdef CONFIG_YAFFS_WINCE -+ yfsd_WinFileTimeNow(in->win_mtime); ++ yfsd_win_file_time_now(in->win_mtime); +#else - T(YAFFS_TRACE_SCAN_DEBUG, @@ -12460,7 +13056,7 @@ - if (state == YAFFS_BLOCK_STATE_CHECKPOINT) { - dev->blocksInCheckpoint++; -+ retVal = (yaffs_UpdateObjectHeader(in, NULL, 0, 0, 0, NULL) >= ++ retVal = (yaffs_update_oh(in, NULL, 0, 0, 0, NULL) >= + 0) ? YAFFS_OK : YAFFS_FAIL; + } + } else { @@ -12485,12 +13081,12 @@ - blockIndex[nBlocksToScan].seq = sequenceNumber; - blockIndex[nBlocksToScan].block = blk; -+static int yaffs_DoGenericObjectDeletion(yaffs_Object *in) ++static int yaffs_generic_obj_del(yaffs_obj_t *in) +{ - nBlocksToScan++; + /* First off, invalidate the file's data in the cache, without flushing. */ -+ yaffs_InvalidateWholeChunkCache(in); ++ yaffs_invalidate_whole_cache(in); - if (sequenceNumber >= dev->sequenceNumber) - dev->sequenceNumber = sequenceNumber; @@ -12500,9 +13096,9 @@ - (TSTR - ("Block scanning block %d has bad sequence number %d" - TENDSTR), blk, sequenceNumber)); -+ if (in->myDev->param.isYaffs2 && (in->parent != in->myDev->deletedDir)) { ++ if (in->my_dev->param.is_yaffs2 && (in->parent != in->my_dev->del_dir)) { + /* Move to the unlinked directory so we have a record that it was deleted. */ -+ yaffs_ChangeObjectName(in, in->myDev->deletedDir, _Y("deleted"), 0, 0); ++ yaffs_change_obj_name(in, in->my_dev->del_dir, _Y("deleted"), 0, 0); - } - } @@ -12510,21 +13106,21 @@ - T(YAFFS_TRACE_SCAN, - (TSTR("%d blocks to be sorted..." TENDSTR), nBlocksToScan)); -+ yaffs_RemoveObjectFromDirectory(in); -+ yaffs_DeleteChunk(in->myDev, in->hdrChunk, 1, __LINE__); -+ in->hdrChunk = 0; ++ yaffs_remove_obj_from_dir(in); ++ yaffs_chunk_del(in->my_dev, in->hdr_chunk, 1, __LINE__); ++ in->hdr_chunk = 0; -+ yaffs_FreeObject(in); ++ yaffs_free_obj(in); + return YAFFS_OK; +} - YYIELD(); -+/* yaffs_DeleteFile deletes the whole file data ++/* yaffs_del_file deletes the whole file data + * and the inode associated with the file. + * It does not delete the links associated with the file. + */ -+static int yaffs_UnlinkFileIfNeeded(yaffs_Object *in) ++static int yaffs_unlink_file_if_needed(yaffs_obj_t *in) +{ - /* Sort the blocks */ @@ -12538,12 +13134,12 @@ - /* Dungy old bubble sort... */ + int retVal; + int immediateDeletion = 0; -+ yaffs_Device *dev = in->myDev; ++ yaffs_dev_t *dev = in->my_dev; - yaffs_BlockIndex temp; - int i; - int j; -+ if (!in->myInode) ++ if (!in->my_inode) + immediateDeletion = 1; - for (i = 0; i < nBlocksToScan; i++) @@ -12555,19 +13151,19 @@ - } + if (immediateDeletion) { + retVal = -+ yaffs_ChangeObjectName(in, in->myDev->deletedDir, ++ yaffs_change_obj_name(in, in->my_dev->del_dir, + _Y("deleted"), 0, 0); + T(YAFFS_TRACE_TRACING, + (TSTR("yaffs: immediate deletion of file %d" TENDSTR), -+ in->objectId)); ++ in->obj_id)); + in->deleted = 1; -+ in->myDev->nDeletedFiles++; -+ if (dev->param.disableSoftDelete || dev->param.isYaffs2) -+ yaffs_ResizeFile(in, 0); -+ yaffs_SoftDeleteFile(in); ++ in->my_dev->n_deleted_files++; ++ if (dev->param.disable_soft_del || dev->param.is_yaffs2) ++ yaffs_resize_file(in, 0); ++ yaffs_soft_del_file(in); + } else { + retVal = -+ yaffs_ChangeObjectName(in, in->myDev->unlinkedDir, ++ yaffs_change_obj_name(in, in->my_dev->unlinked_dir, + _Y("unlinked"), 0, 0); } -#endif @@ -12577,29 +13173,17 @@ - T(YAFFS_TRACE_SCAN, (TSTR("...done" TENDSTR))); + return retVal; +} -+ -+int yaffs_DeleteFile(yaffs_Object *in) -+{ -+ int retVal = YAFFS_OK; -+ int deleted; /* Need to cache value on stack if in is freed */ -+ yaffs_Device *dev = in->myDev; -+ -+ if (dev->param.disableSoftDelete || dev->param.isYaffs2) -+ yaffs_ResizeFile(in, 0); -+ -+ if (in->nDataChunks > 0) { -+ /* Use soft deletion if there is data in the file. -+ * That won't be the case if it has been resized to zero. -+ */ -+ if (!in->unlinked) -+ retVal = yaffs_UnlinkFileIfNeeded(in); - /* Now scan the blocks looking at the data. */ - startIterator = 0; - endIterator = nBlocksToScan - 1; - T(YAFFS_TRACE_SCAN_DEBUG, - (TSTR("%d blocks to be scanned" TENDSTR), nBlocksToScan)); -+ deleted = in->deleted; ++int yaffs_del_file(yaffs_obj_t *in) ++{ ++ int retVal = YAFFS_OK; ++ int deleted; /* Need to cache value on stack if in is freed */ ++ yaffs_dev_t *dev = in->my_dev; - /* For each block.... backwards */ - for (blockIterator = endIterator; !alloc_failed && blockIterator >= startIterator; @@ -12607,48 +13191,45 @@ - /* Cooperative multitasking! This loop can run for so - long that watchdog timers expire. */ - YYIELD(); ++ if (dev->param.disable_soft_del || dev->param.is_yaffs2) ++ yaffs_resize_file(in, 0); + +- /* get the block to scan in the correct order */ +- blk = blockIndex[blockIterator].block; ++ if (in->n_data_chunks > 0) { ++ /* Use soft deletion if there is data in the file. ++ * That won't be the case if it has been resized to zero. ++ */ ++ if (!in->unlinked) ++ retVal = yaffs_unlink_file_if_needed(in); + +- bi = yaffs_GetBlockInfo(dev, blk); ++ deleted = in->deleted; + + if (retVal == YAFFS_OK && in->unlinked && !in->deleted) { + in->deleted = 1; + deleted = 1; -+ in->myDev->nDeletedFiles++; -+ yaffs_SoftDeleteFile(in); ++ in->my_dev->n_deleted_files++; ++ yaffs_soft_del_file(in); + } + return deleted ? YAFFS_OK : YAFFS_FAIL; + } else { + /* The file has no data chunks so we toss it immediately */ -+ yaffs_FreeTnode(in->myDev, in->variant.fileVariant.top); -+ in->variant.fileVariant.top = NULL; -+ yaffs_DoGenericObjectDeletion(in); ++ yaffs_free_tnode(in->my_dev, in->variant.file_variant.top); ++ in->variant.file_variant.top = NULL; ++ yaffs_generic_obj_del(in); -- /* get the block to scan in the correct order */ -- blk = blockIndex[blockIterator].block; +- state = bi->blockState; + return YAFFS_OK; + } +} -- bi = yaffs_GetBlockInfo(dev, blk); -+static int yaffs_IsNonEmptyDirectory(yaffs_Object *obj) -+{ -+ return (obj->variantType == YAFFS_OBJECT_TYPE_DIRECTORY) && -+ !(ylist_empty(&obj->variant.directoryVariant.children)); -+} - -+static int yaffs_DeleteDirectory(yaffs_Object *obj) -+{ -+ /* First check that the directory is empty. */ -+ if (yaffs_IsNonEmptyDirectory(obj)) -+ return YAFFS_FAIL; - -- state = bi->blockState; -+ return yaffs_DoGenericObjectDeletion(obj); -+} - - deleted = 0; -+static int yaffs_DeleteSymLink(yaffs_Object *in) ++static int yaffs_is_non_empty_dir(yaffs_obj_t *obj) +{ -+ if(in->variant.symLinkVariant.alias) -+ YFREE(in->variant.symLinkVariant.alias); -+ in->variant.symLinkVariant.alias=NULL; ++ return (obj->variant_type == YAFFS_OBJECT_TYPE_DIRECTORY) && ++ !(ylist_empty(&obj->variant.dir_variant.children)); ++} - /* For each chunk in each block that needs scanning.... */ - foundChunksInBlock = 0; @@ -12659,51 +13240,26 @@ - /* Scan backwards... - * Read the tags and decide what to do - */ -+ return yaffs_DoGenericObjectDeletion(in); -+} ++static int yaffs_del_dir(yaffs_obj_t *obj) ++{ ++ /* First check that the directory is empty. */ ++ if (yaffs_is_non_empty_dir(obj)) ++ return YAFFS_FAIL; - chunk = blk * dev->nChunksPerBlock + c; -+static int yaffs_DeleteHardLink(yaffs_Object *in) -+{ -+ /* remove this hardlink from the list assocaited with the equivalent -+ * object -+ */ -+ ylist_del_init(&in->hardLinks); -+ return yaffs_DoGenericObjectDeletion(in); ++ return yaffs_generic_obj_del(obj); +} - result = yaffs_ReadChunkWithTagsFromNAND(dev, chunk, NULL, - &tags); -+int yaffs_DeleteObject(yaffs_Object *obj) ++static int yaffs_del_symlink(yaffs_obj_t *in) +{ -+int retVal = -1; -+ switch (obj->variantType) { -+ case YAFFS_OBJECT_TYPE_FILE: -+ retVal = yaffs_DeleteFile(obj); -+ break; -+ case YAFFS_OBJECT_TYPE_DIRECTORY: -+ if(!ylist_empty(&obj->variant.directoryVariant.dirty)){ -+ T(YAFFS_TRACE_BACKGROUND, (TSTR("Remove object %d from dirty directories" TENDSTR),obj->objectId)); -+ ylist_del_init(&obj->variant.directoryVariant.dirty); -+ } -+ return yaffs_DeleteDirectory(obj); -+ break; -+ case YAFFS_OBJECT_TYPE_SYMLINK: -+ retVal = yaffs_DeleteSymLink(obj); -+ break; -+ case YAFFS_OBJECT_TYPE_HARDLINK: -+ retVal = yaffs_DeleteHardLink(obj); -+ break; -+ case YAFFS_OBJECT_TYPE_SPECIAL: -+ retVal = yaffs_DoGenericObjectDeletion(obj); -+ break; -+ case YAFFS_OBJECT_TYPE_UNKNOWN: -+ retVal = 0; -+ break; /* should not happen. */ -+ } ++ if(in->variant.symlink_variant.alias) ++ YFREE(in->variant.symlink_variant.alias); ++ in->variant.symlink_variant.alias=NULL; - /* Let's have a good look at this chunk... */ -+ return retVal; ++ return yaffs_generic_obj_del(in); +} - if (!tags.chunkUsed) { @@ -12715,8 +13271,14 @@ - * chunk and his means that either the block is empty or - * this is the one being allocated from - */ -+static int yaffs_UnlinkWorker(yaffs_Object *obj) ++static int yaffs_del_link(yaffs_obj_t *in) +{ ++ /* remove this hardlink from the list assocaited with the equivalent ++ * object ++ */ ++ ylist_del_init(&in->hard_links); ++ return yaffs_generic_obj_del(in); ++} - if (foundChunksInBlock) { - /* This is a chunk that was skipped due to failing the erased check */ @@ -12754,11 +13316,37 @@ - } - } - } -+ int immediateDeletion = 0; ++int yaffs_del_obj(yaffs_obj_t *obj) ++{ ++int retVal = -1; ++ switch (obj->variant_type) { ++ case YAFFS_OBJECT_TYPE_FILE: ++ retVal = yaffs_del_file(obj); ++ break; ++ case YAFFS_OBJECT_TYPE_DIRECTORY: ++ if(!ylist_empty(&obj->variant.dir_variant.dirty)){ ++ T(YAFFS_TRACE_BACKGROUND, (TSTR("Remove object %d from dirty directories" TENDSTR),obj->obj_id)); ++ ylist_del_init(&obj->variant.dir_variant.dirty); ++ } ++ return yaffs_del_dir(obj); ++ break; ++ case YAFFS_OBJECT_TYPE_SYMLINK: ++ retVal = yaffs_del_symlink(obj); ++ break; ++ case YAFFS_OBJECT_TYPE_HARDLINK: ++ retVal = yaffs_del_link(obj); ++ break; ++ case YAFFS_OBJECT_TYPE_SPECIAL: ++ retVal = yaffs_generic_obj_del(obj); ++ break; ++ case YAFFS_OBJECT_TYPE_UNKNOWN: ++ retVal = 0; ++ break; /* should not happen. */ ++ } - dev->nFreeChunks++; -+ if (!obj->myInode) -+ immediateDeletion = 1; ++ return retVal; ++} - } else if (tags.eccResult == YAFFS_ECC_RESULT_UNFIXED) { - T(YAFFS_TRACE_SCAN, @@ -12787,8 +13375,8 @@ - /* Out of memory */ - alloc_failed = 1; - } -+ if(obj) -+ yaffs_UpdateParent(obj->parent); ++static int yaffs_unlink_worker(yaffs_obj_t *obj) ++{ - if (in && - in->variantType == YAFFS_OBJECT_TYPE_FILE @@ -12799,22 +13387,7 @@ - chunk, -1)) { - alloc_failed = 1; - } -+ if (obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK) { -+ return yaffs_DeleteHardLink(obj); -+ } else if (!ylist_empty(&obj->hardLinks)) { -+ /* Curve ball: We're unlinking an object that has a hardlink. -+ * -+ * This problem arises because we are not strictly following -+ * The Linux link/inode model. -+ * -+ * We can't really delete the object. -+ * Instead, we do the following: -+ * - Select a hardlink. -+ * - Unhook it from the hard links -+ * - Move it from its parent directory (so that the rename can work) -+ * - Rename the object to the hardlink's name. -+ * - Delete the hardlink -+ */ ++ int immediateDeletion = 0; - /* File size is calculated by looking at the data chunks if we have not - * seen an object header yet. Stop this practice once we find an object header. @@ -12834,15 +13407,14 @@ - in->variant.fileVariant. - scannedFileSize; - } -+ yaffs_Object *hl; -+ yaffs_Object *parent; -+ int retVal; -+ YCHAR name[YAFFS_MAX_NAME_LENGTH + 1]; ++ if (!obj->my_inode) ++ immediateDeletion = 1; - } else if (in) { - /* This chunk has been invalidated by a resize, so delete */ - yaffs_DeleteChunk(dev, chunk, 1, __LINE__); -+ hl = ylist_entry(obj->hardLinks.next, yaffs_Object, hardLinks); ++ if(obj) ++ yaffs_update_parent(obj->parent); - } - } else { @@ -12850,16 +13422,33 @@ - * Thus, we read in the object header and make the object - */ - foundChunksInBlock = 1; -+ yaffs_GetObjectName(hl, name, YAFFS_MAX_NAME_LENGTH + 1); -+ parent = hl->parent; ++ if (obj->variant_type == YAFFS_OBJECT_TYPE_HARDLINK) { ++ return yaffs_del_link(obj); ++ } else if (!ylist_empty(&obj->hard_links)) { ++ /* Curve ball: We're unlinking an object that has a hardlink. ++ * ++ * This problem arises because we are not strictly following ++ * The Linux link/inode model. ++ * ++ * We can't really delete the object. ++ * Instead, we do the following: ++ * - Select a hardlink. ++ * - Unhook it from the hard links ++ * - Move it from its parent directory (so that the rename can work) ++ * - Rename the object to the hardlink's name. ++ * - Delete the hardlink ++ */ - yaffs_SetChunkBit(dev, blk, c); - bi->pagesInUse++; -+ ylist_del_init(&hl->hardLinks); ++ yaffs_obj_t *hl; ++ yaffs_obj_t *parent; ++ int retVal; ++ YCHAR name[YAFFS_MAX_NAME_LENGTH + 1]; - oh = NULL; - in = NULL; -+ yaffs_AddObjectToDirectory(obj->myDev->unlinkedDir, hl); ++ hl = ylist_entry(obj->hard_links.next, yaffs_obj_t, hard_links); - if (tags.extraHeaderInfoAvailable) { - in = yaffs_FindOrCreateObjectByNumber @@ -12868,7 +13457,8 @@ - if (!in) - alloc_failed = 1; - } -+ retVal = yaffs_ChangeObjectName(obj,parent, name, 0, 0); ++ yaffs_get_obj_name(hl, name, YAFFS_MAX_NAME_LENGTH + 1); ++ parent = hl->parent; - if (!in || -#ifdef CONFIG_YAFFS_DISABLE_LAZY_LOAD @@ -12883,8 +13473,7 @@ - * TODO In future we can probably defer reading the chunk and - * living with invalid data until needed. - */ -+ if (retVal == YAFFS_OK) -+ retVal = yaffs_DoGenericObjectDeletion(hl); ++ ylist_del_init(&hl->hard_links); - result = yaffs_ReadChunkWithTagsFromNAND(dev, - chunk, @@ -12898,41 +13487,18 @@ - oh->shadowsObject = oh->inbandShadowsObject; - oh->isShrink = oh->inbandIsShrink; - } -+ return retVal; ++ yaffs_add_obj_to_dir(obj->my_dev->unlinked_dir, hl); - if (!in) { - in = yaffs_FindOrCreateObjectByNumber(dev, tags.objectId, oh->type); - if (!in) - alloc_failed = 1; - } -+ } else if (immediateDeletion) { -+ switch (obj->variantType) { -+ case YAFFS_OBJECT_TYPE_FILE: -+ return yaffs_DeleteFile(obj); -+ break; -+ case YAFFS_OBJECT_TYPE_DIRECTORY: -+ ylist_del_init(&obj->variant.directoryVariant.dirty); -+ return yaffs_DeleteDirectory(obj); -+ break; -+ case YAFFS_OBJECT_TYPE_SYMLINK: -+ return yaffs_DeleteSymLink(obj); -+ break; -+ case YAFFS_OBJECT_TYPE_SPECIAL: -+ return yaffs_DoGenericObjectDeletion(obj); -+ break; -+ case YAFFS_OBJECT_TYPE_HARDLINK: -+ case YAFFS_OBJECT_TYPE_UNKNOWN: -+ default: -+ return YAFFS_FAIL; -+ } -+ } else if(yaffs_IsNonEmptyDirectory(obj)) -+ return YAFFS_FAIL; -+ else -+ return yaffs_ChangeObjectName(obj, obj->myDev->unlinkedDir, -+ _Y("unlinked"), 0, 0); -+} ++ retVal = yaffs_change_obj_name(obj,parent, name, 0, 0); - } ++ if (retVal == YAFFS_OK) ++ retVal = yaffs_generic_obj_del(hl); - if (!in) { - /* TODO Hoosterman we have a problem! */ @@ -12942,16 +13508,39 @@ - TENDSTR), tags.objectId, chunk)); - continue; - } -+static int yaffs_UnlinkObject(yaffs_Object *obj) -+{ ++ return retVal; - if (in->valid) { - /* We have already filled this one. - * We have a duplicate that will be discarded, but - * we first have to suck out resize info if it is a file. - */ -+ if (obj && obj->unlinkAllowed) -+ return yaffs_UnlinkWorker(obj); ++ } else if (immediateDeletion) { ++ switch (obj->variant_type) { ++ case YAFFS_OBJECT_TYPE_FILE: ++ return yaffs_del_file(obj); ++ break; ++ case YAFFS_OBJECT_TYPE_DIRECTORY: ++ ylist_del_init(&obj->variant.dir_variant.dirty); ++ return yaffs_del_dir(obj); ++ break; ++ case YAFFS_OBJECT_TYPE_SYMLINK: ++ return yaffs_del_symlink(obj); ++ break; ++ case YAFFS_OBJECT_TYPE_SPECIAL: ++ return yaffs_generic_obj_del(obj); ++ break; ++ case YAFFS_OBJECT_TYPE_HARDLINK: ++ case YAFFS_OBJECT_TYPE_UNKNOWN: ++ default: ++ return YAFFS_FAIL; ++ } ++ } else if(yaffs_is_non_empty_dir(obj)) ++ return YAFFS_FAIL; ++ else ++ return yaffs_change_obj_name(obj, obj->my_dev->unlinked_dir, ++ _Y("unlinked"), 0, 0); ++} - if ((in->variantType == YAFFS_OBJECT_TYPE_FILE) && - ((oh && @@ -12970,7 +13559,6 @@ - isShrink = - (oh) ? oh->isShrink : tags. - extraIsShrinkHeader; -+ return YAFFS_FAIL; - /* If it is deleted (unlinked at start also means deleted) - * we treat the file size as being zeroed at this point. @@ -12982,10 +13570,8 @@ - thisSize = 0; - isShrink = 1; - } -+} -+int yaffs_Unlink(yaffs_Object *dir, const YCHAR *name) ++static int yaffs_unlink_obj(yaffs_obj_t *obj) +{ -+ yaffs_Object *obj; - if (isShrink && - in->variant.fileVariant. @@ -12994,27 +13580,25 @@ - shrinkSize = - thisSize; - } -+ obj = yaffs_FindObjectByName(dir, name); -+ return yaffs_UnlinkObject(obj); -+} ++ if (obj && obj->unlink_allowed) ++ return yaffs_unlink_worker(obj); - if (isShrink) - bi->hasShrinkHeader = 1; -+/*----------------------- Initialisation Scanning ---------------------- */ ++ return YAFFS_FAIL; - } - /* Use existing - destroy this one. */ - yaffs_DeleteChunk(dev, chunk, 1, __LINE__); -+void yaffs_HandleShadowedObject(yaffs_Device *dev, int objId, -+ int backwardScanning) ++} ++int yaffs_unlinker(yaffs_obj_t *dir, const YCHAR *name) +{ -+ yaffs_Object *obj; ++ yaffs_obj_t *obj; - } -+ if (!backwardScanning) { -+ /* Handle YAFFS1 forward scanning case -+ * For YAFFS1 we always do the deletion -+ */ ++ obj = yaffs_find_by_name(dir, name); ++ return yaffs_unlink_obj(obj); ++} - if (!in->valid && in->variantType != - (oh ? oh->type : tags.extraObjectType)) @@ -13033,29 +13617,14 @@ - YAFFS_OBJECTID_LOSTNFOUND)) { - /* We only load some info, don't fiddle with directory structure */ - in->valid = 1; -+ } else { -+ /* Handle YAFFS2 case (backward scanning) -+ * If the shadowed object exists then ignore. -+ */ -+ obj = yaffs_FindObjectByNumber(dev, objId); -+ if(obj) -+ return; -+ } ++/*----------------------- Initialisation Scanning ---------------------- */ - if (oh) { - in->variantType = oh->type; -+ /* Let's create it (if it does not exist) assuming it is a file so that it can do shrinking etc. -+ * We put it in unlinked dir to be cleaned up after the scanning -+ */ -+ obj = -+ yaffs_FindOrCreateObjectByNumber(dev, objId, -+ YAFFS_OBJECT_TYPE_FILE); -+ if (!obj) -+ return; -+ obj->isShadowed = 1; -+ yaffs_AddObjectToDirectory(dev->unlinkedDir, obj); -+ obj->variant.fileVariant.shrinkSize = 0; -+ obj->valid = 1; /* So that we don't read any other info for this file */ ++void yaffs_handle_shadowed_obj(yaffs_dev_t *dev, int obj_id, ++ int backward_scanning) ++{ ++ yaffs_obj_t *obj; - in->yst_mode = oh->yst_mode; -#ifdef CONFIG_YAFFS_WINCE @@ -13072,44 +13641,52 @@ - in->yst_mtime = oh->yst_mtime; - in->yst_ctime = oh->yst_ctime; - in->yst_rdev = oh->yst_rdev; -+} ++ if (!backward_scanning) { ++ /* Handle YAFFS1 forward scanning case ++ * For YAFFS1 we always do the deletion ++ */ -#endif - } else { - in->variantType = tags.extraObjectType; - in->lazyLoaded = 1; - } ++ } else { ++ /* Handle YAFFS2 case (backward scanning) ++ * If the shadowed object exists then ignore. ++ */ ++ obj = yaffs_find_by_number(dev, obj_id); ++ if(obj) ++ return; ++ } - in->hdrChunk = chunk; -+void yaffs_HardlinkFixup(yaffs_Device *dev, yaffs_Object *hardList) -+{ -+ yaffs_Object *hl; -+ yaffs_Object *in; ++ /* Let's create it (if it does not exist) assuming it is a file so that it can do shrinking etc. ++ * We put it in unlinked dir to be cleaned up after the scanning ++ */ ++ obj = ++ yaffs_find_or_create_by_number(dev, obj_id, ++ YAFFS_OBJECT_TYPE_FILE); ++ if (!obj) ++ return; ++ obj->is_shadowed = 1; ++ yaffs_add_obj_to_dir(dev->unlinked_dir, obj); ++ obj->variant.file_variant.shrink_size = 0; ++ obj->valid = 1; /* So that we don't read any other info for this file */ - } else if (!in->valid) { - /* we need to load this info */ -+ while (hardList) { -+ hl = hardList; -+ hardList = (yaffs_Object *) (hardList->hardLinks.next); ++} - in->valid = 1; - in->hdrChunk = chunk; -+ in = yaffs_FindObjectByNumber(dev, -+ hl->variant.hardLinkVariant. -+ equivalentObjectId); - if (oh) { - in->variantType = oh->type; -+ if (in) { -+ /* Add the hardlink pointers */ -+ hl->variant.hardLinkVariant.equivalentObject = in; -+ ylist_add(&hl->hardLinks, &in->hardLinks); -+ } else { -+ /* Todo Need to report/handle this better. -+ * Got a problem... hardlink to a non-existant object -+ */ -+ hl->variant.hardLinkVariant.equivalentObject = NULL; -+ YINIT_LIST_HEAD(&hl->hardLinks); ++void yaffs_link_fixup(yaffs_dev_t *dev, yaffs_obj_t *hard_list) ++{ ++ yaffs_obj_t *hl; ++ yaffs_obj_t *in; - in->yst_mode = oh->yst_mode; -#ifdef CONFIG_YAFFS_WINCE @@ -13127,9 +13704,13 @@ - in->yst_ctime = oh->yst_ctime; - in->yst_rdev = oh->yst_rdev; -#endif -+ } -+ } -+} ++ while (hard_list) { ++ hl = hard_list; ++ hard_list = (yaffs_obj_t *) (hard_list->hard_links.next); ++ ++ in = yaffs_find_by_number(dev, ++ hl->variant.hardlink_variant. ++ equiv_id); - if (oh->shadowsObject > 0) - yaffs_HandleShadowedObject(dev, @@ -13147,6 +13728,16 @@ - fileSize = oh->fileSize; - isShrink = oh->isShrink; - equivalentObjectId = oh->equivalentObjectId; ++ if (in) { ++ /* Add the hardlink pointers */ ++ hl->variant.hardlink_variant.equiv_obj = in; ++ ylist_add(&hl->hard_links, &in->hard_links); ++ } else { ++ /* Todo Need to report/handle this better. ++ * Got a problem... hardlink to a non-existant object ++ */ ++ hl->variant.hardlink_variant.equiv_obj = NULL; ++ YINIT_LIST_HEAD(&hl->hard_links); - } else { - in->variantType = tags.extraObjectType; @@ -13158,41 +13749,29 @@ - isShrink = tags.extraIsShrinkHeader; - equivalentObjectId = tags.extraEquivalentObjectId; - in->lazyLoaded = 1; -+static void yaffs_StripDeletedObjects(yaffs_Device *dev) ++ } ++ } ++} + +- } +- in->dirty = 0; + +- if (!parent) +- alloc_failed = 1; ++static void yaffs_strip_deleted_objs(yaffs_dev_t *dev) +{ + /* + * Sort out state of unlinked and deleted objects after scanning. + */ + struct ylist_head *i; + struct ylist_head *n; -+ yaffs_Object *l; - -- } -- in->dirty = 0; -+ if (dev->readOnly) -+ return; - -- if (!parent) -- alloc_failed = 1; -+ /* Soft delete all the unlinked files */ -+ ylist_for_each_safe(i, n, -+ &dev->unlinkedDir->variant.directoryVariant.children) { -+ if (i) { -+ l = ylist_entry(i, yaffs_Object, siblings); -+ yaffs_DeleteObject(l); -+ } -+ } ++ yaffs_obj_t *l; - /* directory stuff... - * hook up to parent - */ -+ ylist_for_each_safe(i, n, -+ &dev->deletedDir->variant.directoryVariant.children) { -+ if (i) { -+ l = ylist_entry(i, yaffs_Object, siblings); -+ yaffs_DeleteObject(l); -+ } -+ } ++ if (dev->read_only) ++ return; - if (parent && parent->variantType == - YAFFS_OBJECT_TYPE_UNKNOWN) { @@ -13207,7 +13786,14 @@ - /* Hoosterman, another problem.... - * We're trying to use a non-directory as a directory - */ -+} ++ /* Soft delete all the unlinked files */ ++ ylist_for_each_safe(i, n, ++ &dev->unlinked_dir->variant.dir_variant.children) { ++ if (i) { ++ l = ylist_entry(i, yaffs_obj_t, siblings); ++ yaffs_del_obj(l); ++ } ++ } - T(YAFFS_TRACE_ERROR, - (TSTR @@ -13215,6 +13801,19 @@ - TENDSTR))); - parent = dev->lostNFoundDir; - } ++ ylist_for_each_safe(i, n, ++ &dev->del_dir->variant.dir_variant.children) { ++ if (i) { ++ l = ylist_entry(i, yaffs_obj_t, siblings); ++ yaffs_del_obj(l); ++ } ++ } + +- yaffs_AddObjectToDirectory(parent, in); ++} + +- itsUnlinked = (parent == dev->deletedDir) || +- (parent == dev->unlinkedDir); +/* + * This code iterates through all the objects making sure that they are rooted. + * Any unrooted objects are re-rooted in lost+found. @@ -13225,70 +13824,42 @@ + * Note: + * This code assumes that we don't ever change the current relationships between + * directories: -+ * rootDir->parent == unlinkedDir->parent == deletedDir->parent == NULL -+ * lostNfound->parent == rootDir ++ * root_dir->parent == unlinked_dir->parent == del_dir->parent == NULL ++ * lostNfound->parent == root_dir + * + * This fixes the problem where directories might have inadvertently been deleted + * leaving the object "hanging" without being rooted in the directory tree. + */ + -+static int yaffs_HasNULLParent(yaffs_Device *dev, yaffs_Object *obj) ++static int yaffs_has_null_parent(yaffs_dev_t *dev, yaffs_obj_t *obj) +{ -+ return (obj == dev->deletedDir || -+ obj == dev->unlinkedDir|| -+ obj == dev->rootDir); ++ return (obj == dev->del_dir || ++ obj == dev->unlinked_dir|| ++ obj == dev->root_dir); +} -- yaffs_AddObjectToDirectory(parent, in); -+static void yaffs_FixHangingObjects(yaffs_Device *dev) +- if (isShrink) { +- /* Mark the block as having a shrinkHeader */ +- bi->hasShrinkHeader = 1; +- } ++static void yaffs_fix_hanging_objs(yaffs_dev_t *dev) +{ -+ yaffs_Object *obj; -+ yaffs_Object *parent; ++ yaffs_obj_t *obj; ++ yaffs_obj_t *parent; + int i; + struct ylist_head *lh; + struct ylist_head *n; + int depthLimit; + int hanging; -- itsUnlinked = (parent == dev->deletedDir) || -- (parent == dev->unlinkedDir); -+ if (dev->readOnly) -+ return; - -- if (isShrink) { -- /* Mark the block as having a shrinkHeader */ -- bi->hasShrinkHeader = 1; -- } -+ /* Iterate through the objects in each hash entry, -+ * looking at each object. -+ * Make sure it is rooted. -+ */ - - /* Note re hardlinks. - * Since we might scan a hardlink before its equivalent object is scanned - * we put them all in a list. - * After scanning is complete, we should have all the objects, so we run - * through this list and fix up all the chains. -+ for (i = 0; i < YAFFS_NOBJECT_BUCKETS; i++) { -+ ylist_for_each_safe(lh, n, &dev->objectBucket[i].list) { -+ if (lh) { -+ obj = ylist_entry(lh, yaffs_Object, hashLink); -+ parent= obj->parent; -+ -+ if(yaffs_HasNULLParent(dev,obj)){ -+ /* These directories are not hanging */ -+ hanging = 0; -+ } -+ else if(!parent || parent->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) -+ hanging = 1; -+ else if(yaffs_HasNULLParent(dev,parent)) -+ hanging = 0; -+ else { -+ /* -+ * Need to follow the parent chain to see if it is hanging. - */ -+ hanging = 0; -+ depthLimit=100; +- */ ++ if (dev->read_only) ++ return; - switch (in->variantType) { - case YAFFS_OBJECT_TYPE_UNKNOWN: @@ -13307,12 +13878,36 @@ - in->variant.fileVariant.scannedFileSize = - in->variant.fileVariant.fileSize; - } -- ++ /* Iterate through the objects in each hash entry, ++ * looking at each object. ++ * Make sure it is rooted. ++ */ + - if (isShrink && - in->variant.fileVariant.shrinkSize > fileSize) { - in->variant.fileVariant.shrinkSize = fileSize; - } -- ++ for (i = 0; i < YAFFS_NOBJECT_BUCKETS; i++) { ++ ylist_for_each_safe(lh, n, &dev->obj_bucket[i].list) { ++ if (lh) { ++ obj = ylist_entry(lh, yaffs_obj_t, hash_link); ++ parent= obj->parent; ++ ++ if(yaffs_has_null_parent(dev,obj)){ ++ /* These directories are not hanging */ ++ hanging = 0; ++ } ++ else if(!parent || parent->variant_type != YAFFS_OBJECT_TYPE_DIRECTORY) ++ hanging = 1; ++ else if(yaffs_has_null_parent(dev,parent)) ++ hanging = 0; ++ else { ++ /* ++ * Need to follow the parent chain to see if it is hanging. ++ */ ++ hanging = 0; ++ depthLimit=100; + - break; - case YAFFS_OBJECT_TYPE_HARDLINK: - if (!itsUnlinked) { @@ -13337,22 +13932,22 @@ - alloc_failed = 1; - } - break; -+ while(parent != dev->rootDir && ++ while(parent != dev->root_dir && + parent->parent && -+ parent->parent->variantType == YAFFS_OBJECT_TYPE_DIRECTORY && ++ parent->parent->variant_type == YAFFS_OBJECT_TYPE_DIRECTORY && + depthLimit > 0){ + parent = parent->parent; + depthLimit--; } - -+ if(parent != dev->rootDir) ++ if(parent != dev->root_dir) + hanging = 1; + } + if(hanging){ + T(YAFFS_TRACE_SCAN, + (TSTR("Hanging object %d moved to lost and found" TENDSTR), -+ obj->objectId)); -+ yaffs_AddObjectToDirectory(dev->lostNFoundDir,obj); ++ obj->obj_id)); ++ yaffs_add_obj_to_dir(dev->lost_n_found,obj); } - } @@ -13369,25 +13964,25 @@ +/* + * Delete directory contents for cleaning up lost and found. + */ -+static void yaffs_DeleteDirectoryContents(yaffs_Object *dir) ++static void yaffs_del_dir_contents(yaffs_obj_t *dir) +{ -+ yaffs_Object *obj; ++ yaffs_obj_t *obj; + struct ylist_head *lh; + struct ylist_head *n; - bi->blockState = state; -+ if(dir->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) ++ if(dir->variant_type != YAFFS_OBJECT_TYPE_DIRECTORY) + YBUG(); + -+ ylist_for_each_safe(lh, n, &dir->variant.directoryVariant.children) { ++ ylist_for_each_safe(lh, n, &dir->variant.dir_variant.children) { + if (lh) { -+ obj = ylist_entry(lh, yaffs_Object, siblings); -+ if(obj->variantType == YAFFS_OBJECT_TYPE_DIRECTORY) -+ yaffs_DeleteDirectoryContents(obj); ++ obj = ylist_entry(lh, yaffs_obj_t, siblings); ++ if(obj->variant_type == YAFFS_OBJECT_TYPE_DIRECTORY) ++ yaffs_del_dir_contents(obj); + + T(YAFFS_TRACE_SCAN, + (TSTR("Deleting lost_found object %d" TENDSTR), -+ obj->objectId)); ++ obj->obj_id)); - /* Now let's see if it was dirty */ - if (bi->pagesInUse == 0 && @@ -13397,7 +13992,7 @@ + /* Need to use UnlinkObject since Delete would not handle + * hardlinked objects correctly. + */ -+ yaffs_UnlinkObject(obj); ++ yaffs_unlink_obj(obj); } - } @@ -13408,9 +14003,9 @@ - YFREE_ALT(blockIndex); - else - YFREE(blockIndex); -+static void yaffs_EmptyLostAndFound(yaffs_Device *dev) ++static void yaffs_empty_l_n_f(yaffs_dev_t *dev) +{ -+ yaffs_DeleteDirectoryContents(dev->lostNFoundDir); ++ yaffs_del_dir_contents(dev->lost_n_found); +} - /* Ok, we've done all the scanning. @@ -13419,12 +14014,12 @@ - * hardlinks. - */ - yaffs_HardlinkFixup(dev, hardList); -+static void yaffs_CheckObjectDetailsLoaded(yaffs_Object *in) ++static void yaffs_check_obj_details_loaded(yaffs_obj_t *in) +{ + __u8 *chunkData; -+ yaffs_ObjectHeader *oh; -+ yaffs_Device *dev; -+ yaffs_ExtendedTags tags; ++ yaffs_obj_header *oh; ++ yaffs_dev_t *dev; ++ yaffs_ext_tags tags; + int result; + int alloc_failed = 0; @@ -13432,25 +14027,25 @@ + return; - yaffs_ReleaseTempBuffer(dev, chunkData, __LINE__); -+ dev = in->myDev; ++ dev = in->my_dev; - if (alloc_failed) - return YAFFS_FAIL; +#if 0 + T(YAFFS_TRACE_SCAN, (TSTR("details for object %d %s loaded" TENDSTR), -+ in->objectId, -+ in->lazyLoaded ? "not yet" : "already")); ++ in->obj_id, ++ in->lazy_loaded ? "not yet" : "already")); +#endif - T(YAFFS_TRACE_SCAN, (TSTR("yaffs_ScanBackwards ends" TENDSTR))); -+ if (in->lazyLoaded && in->hdrChunk > 0) { -+ in->lazyLoaded = 0; -+ chunkData = yaffs_GetTempBuffer(dev, __LINE__); ++ if (in->lazy_loaded && in->hdr_chunk > 0) { ++ in->lazy_loaded = 0; ++ chunkData = yaffs_get_temp_buffer(dev, __LINE__); - return YAFFS_OK; -} -+ result = yaffs_ReadChunkWithTagsFromNAND(dev, in->hdrChunk, chunkData, &tags); -+ oh = (yaffs_ObjectHeader *) chunkData; ++ result = yaffs_rd_chunk_tags_nand(dev, in->hdr_chunk, chunkData, &tags); ++ oh = (yaffs_obj_header *) chunkData; -/*------------------------------ Directory Functions ----------------------------- */ + in->yst_mode = oh->yst_mode; @@ -13474,13 +14069,13 @@ - struct ylist_head *lh; - yaffs_Object *listObj; +#endif -+ yaffs_SetObjectNameFromOH(in, oh); ++ yaffs_set_obj_name_from_oh(in, oh); - int count = 0; -+ if (in->variantType == YAFFS_OBJECT_TYPE_SYMLINK) { -+ in->variant.symLinkVariant.alias = -+ yaffs_CloneString(oh->alias); -+ if (!in->variant.symLinkVariant.alias) ++ if (in->variant_type == YAFFS_OBJECT_TYPE_SYMLINK) { ++ in->variant.symlink_variant.alias = ++ yaffs_clone_str(oh->alias); ++ if (!in->variant.symlink_variant.alias) + alloc_failed = 1; /* Not returned to caller */ + } @@ -13488,7 +14083,7 @@ - T(YAFFS_TRACE_ALWAYS, (TSTR("No object to verify" TENDSTR))); - YBUG(); - return; -+ yaffs_ReleaseTempBuffer(dev, chunkData, __LINE__); ++ yaffs_release_temp_buffer(dev, chunkData, __LINE__); } +} @@ -13500,7 +14095,7 @@ - T(YAFFS_TRACE_ALWAYS, (TSTR("Object does not have parent" TENDSTR))); - YBUG(); +/* -+ *yaffs_UpdateParent() handles fixing a directories mtime and ctime when a new ++ *yaffs_update_parent() handles fixing a directories mtime and ctime when a new + * link (ie. name) is created or deleted in the directory. + * + * ie. @@ -13511,13 +14106,13 @@ + * This can be handled immediately or defered. Defering helps reduce the number + * of updates when many files in a directory are changed within a brief period. + * -+ * If the directory updating is defered then yaffs_UpdateDirtyDirecories must be ++ * If the directory updating is defered then yaffs_update_dirty_dirs must be + * called periodically. + */ + -+static void yaffs_UpdateParent(yaffs_Object *obj) ++static void yaffs_update_parent(yaffs_obj_t *obj) +{ -+ yaffs_Device *dev; ++ yaffs_dev_t *dev; + if(!obj) return; - } @@ -13536,15 +14131,15 @@ - yaffs_VerifyObject(listObj); - if (obj == listObj) - count++; -+ dev = obj->myDev; ++ dev = obj->my_dev; + obj->dirty = 1; + obj->yst_mtime = obj->yst_ctime = Y_CURRENT_TIME; -+ if(dev->param.deferDirectoryUpdate){ -+ struct ylist_head *link = &obj->variant.directoryVariant.dirty; ++ if(dev->param.defered_dir_update){ ++ struct ylist_head *link = &obj->variant.dir_variant.dirty; + + if(ylist_empty(link)){ -+ ylist_add(link,&dev->dirtyDirectories); -+ T(YAFFS_TRACE_BACKGROUND, (TSTR("Added object %d to dirty directories" TENDSTR),obj->objectId)); ++ ylist_add(link,&dev->dirty_dirs); ++ T(YAFFS_TRACE_BACKGROUND, (TSTR("Added object %d to dirty directories" TENDSTR),obj->obj_id)); } - } @@ -13553,12 +14148,12 @@ - YBUG(); - } + } else -+ yaffs_UpdateObjectHeader(obj, NULL, 0, 0, 0, NULL); ++ yaffs_update_oh(obj, NULL, 0, 0, 0, NULL); +#endif } -static void yaffs_VerifyDirectory(yaffs_Object *directory) -+void yaffs_UpdateDirtyDirectories(yaffs_Device *dev) ++void yaffs_update_dirty_dirs(yaffs_dev_t *dev) { - struct ylist_head *lh; - yaffs_Object *listObj; @@ -13568,9 +14163,9 @@ - return; - } + struct ylist_head *link; -+ yaffs_Object *obj; -+ yaffs_DirectoryStructure *dS; -+ yaffs_ObjectVariant *oV; ++ yaffs_obj_t *obj; ++ yaffs_dir_s *dS; ++ yaffs_obj_variant *oV; - if (yaffs_SkipFullVerification(directory->myDev)) - return; @@ -13580,16 +14175,16 @@ - T(YAFFS_TRACE_ALWAYS, (TSTR("Directory has wrong type: %d" TENDSTR), directory->variantType)); - YBUG(); - } -+ while(!ylist_empty(&dev->dirtyDirectories)){ -+ link = dev->dirtyDirectories.next; ++ while(!ylist_empty(&dev->dirty_dirs)){ ++ link = dev->dirty_dirs.next; + ylist_del_init(link); + -+ dS=ylist_entry(link,yaffs_DirectoryStructure,dirty); -+ oV = ylist_entry(dS,yaffs_ObjectVariant,directoryVariant); -+ obj = ylist_entry(oV,yaffs_Object,variant); ++ dS=ylist_entry(link,yaffs_dir_s,dirty); ++ oV = ylist_entry(dS,yaffs_obj_variant,dir_variant); ++ obj = ylist_entry(oV,yaffs_obj_t,variant); - /* Iterate through the objects in each hash entry */ -+ T(YAFFS_TRACE_BACKGROUND, (TSTR("Update directory %d" TENDSTR), obj->objectId)); ++ T(YAFFS_TRACE_BACKGROUND, (TSTR("Update directory %d" TENDSTR), obj->obj_id)); - ylist_for_each(lh, &directory->variant.directoryVariant.children) { - if (lh) { @@ -13601,47 +14196,211 @@ - yaffs_VerifyObjectInDirectory(listObj); - } + if(obj->dirty) -+ yaffs_UpdateObjectHeader(obj, NULL, 0, 0, 0, NULL); ++ yaffs_update_oh(obj, NULL, 0, 0, 0, NULL); } } - - static void yaffs_RemoveObjectFromDirectory(yaffs_Object *obj) +-static void yaffs_RemoveObjectFromDirectory(yaffs_Object *obj) ++static void yaffs_remove_obj_from_dir(yaffs_obj_t *obj) { - yaffs_Device *dev = obj->myDev; -@@ -6677,18 +4474,17 @@ static void yaffs_RemoveObjectFromDirect +- yaffs_Device *dev = obj->myDev; +- yaffs_Object *parent; ++ yaffs_dev_t *dev = obj->my_dev; ++ yaffs_obj_t *parent; - yaffs_VerifyDirectory(parent); +- yaffs_VerifyObjectInDirectory(obj); ++ yaffs_verify_obj_in_dir(obj); + parent = obj->parent; + +- yaffs_VerifyDirectory(parent); ++ yaffs_verify_dir(parent); - if (dev && dev->removeObjectCallback) - dev->removeObjectCallback(obj); -+ if (dev && dev->param.removeObjectCallback) -+ dev->param.removeObjectCallback(obj); ++ if (dev && dev->param.remove_obj_fn) ++ dev->param.remove_obj_fn(obj); ylist_del_init(&obj->siblings); obj->parent = NULL; - +- yaffs_VerifyDirectory(parent); + - yaffs_VerifyDirectory(parent); ++ yaffs_verify_dir(parent); } - -static void yaffs_AddObjectToDirectory(yaffs_Object *directory, -+void yaffs_AddObjectToDirectory(yaffs_Object *directory, - yaffs_Object *obj) +- yaffs_Object *obj) ++void yaffs_add_obj_to_dir(yaffs_obj_t *directory, ++ yaffs_obj_t *obj) { if (!directory) { -@@ -6781,7 +4577,7 @@ yaffs_Object *yaffs_FindObjectByName(yaf + T(YAFFS_TRACE_ALWAYS, +@@ -6699,7 +4495,7 @@ static void yaffs_AddObjectToDirectory(y + YBUG(); + return; + } +- if (directory->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) { ++ if (directory->variant_type != YAFFS_OBJECT_TYPE_DIRECTORY) { + T(YAFFS_TRACE_ALWAYS, + (TSTR + ("tragedy: Trying to add an object to a non-directory" +@@ -6713,27 +4509,27 @@ static void yaffs_AddObjectToDirectory(y + } + + +- yaffs_VerifyDirectory(directory); ++ yaffs_verify_dir(directory); + +- yaffs_RemoveObjectFromDirectory(obj); ++ yaffs_remove_obj_from_dir(obj); + + + /* Now add it */ +- ylist_add(&obj->siblings, &directory->variant.directoryVariant.children); ++ ylist_add(&obj->siblings, &directory->variant.dir_variant.children); + obj->parent = directory; + +- if (directory == obj->myDev->unlinkedDir +- || directory == obj->myDev->deletedDir) { ++ if (directory == obj->my_dev->unlinked_dir ++ || directory == obj->my_dev->del_dir) { + obj->unlinked = 1; +- obj->myDev->nUnlinkedFiles++; +- obj->renameAllowed = 0; ++ obj->my_dev->n_unlinked_files++; ++ obj->rename_allowed = 0; + } + +- yaffs_VerifyDirectory(directory); +- yaffs_VerifyObjectInDirectory(obj); ++ yaffs_verify_dir(directory); ++ yaffs_verify_obj_in_dir(obj); + } + +-yaffs_Object *yaffs_FindObjectByName(yaffs_Object *directory, ++yaffs_obj_t *yaffs_find_by_name(yaffs_obj_t *directory, + const YCHAR *name) + { + int sum; +@@ -6741,7 +4537,7 @@ yaffs_Object *yaffs_FindObjectByName(yaf + struct ylist_head *i; + YCHAR buffer[YAFFS_MAX_NAME_LENGTH + 1]; + +- yaffs_Object *l; ++ yaffs_obj_t *l; + + if (!name) + return NULL; +@@ -6749,39 +4545,39 @@ yaffs_Object *yaffs_FindObjectByName(yaf + if (!directory) { + T(YAFFS_TRACE_ALWAYS, + (TSTR +- ("tragedy: yaffs_FindObjectByName: null pointer directory" ++ ("tragedy: yaffs_find_by_name: null pointer directory" + TENDSTR))); + YBUG(); + return NULL; + } +- if (directory->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) { ++ if (directory->variant_type != YAFFS_OBJECT_TYPE_DIRECTORY) { + T(YAFFS_TRACE_ALWAYS, + (TSTR +- ("tragedy: yaffs_FindObjectByName: non-directory" TENDSTR))); ++ ("tragedy: yaffs_find_by_name: non-directory" TENDSTR))); + YBUG(); + } + +- sum = yaffs_CalcNameSum(name); ++ sum = yaffs_calc_name_sum(name); + +- ylist_for_each(i, &directory->variant.directoryVariant.children) { ++ ylist_for_each(i, &directory->variant.dir_variant.children) { + if (i) { +- l = ylist_entry(i, yaffs_Object, siblings); ++ l = ylist_entry(i, yaffs_obj_t, siblings); + + if (l->parent != directory) + YBUG(); + +- yaffs_CheckObjectDetailsLoaded(l); ++ yaffs_check_obj_details_loaded(l); + + /* Special case for lost-n-found */ +- if (l->objectId == YAFFS_OBJECTID_LOSTNFOUND) { ++ if (l->obj_id == YAFFS_OBJECTID_LOSTNFOUND) { + if (yaffs_strcmp(name, YAFFS_LOSTNFOUND_NAME) == 0) + return l; +- } else if (yaffs_SumCompare(l->sum, sum) || l->hdrChunk <= 0) { ++ } else if (yaffs_sum_cmp(l->sum, sum) || l->hdr_chunk <= 0) { + /* LostnFound chunk called Objxxx * Do a real check */ - yaffs_GetObjectName(l, buffer, +- yaffs_GetObjectName(l, buffer, - YAFFS_MAX_NAME_LENGTH); ++ yaffs_get_obj_name(l, buffer, + YAFFS_MAX_NAME_LENGTH + 1); if (yaffs_strncmp(name, buffer, YAFFS_MAX_NAME_LENGTH) == 0) return l; } -@@ -6842,36 +4638,124 @@ yaffs_Object *yaffs_GetEquivalentObject( +@@ -6793,31 +4589,31 @@ yaffs_Object *yaffs_FindObjectByName(yaf + + + #if 0 +-int yaffs_ApplyToDirectoryChildren(yaffs_Object *theDir, +- int (*fn) (yaffs_Object *)) ++int yaffs_ApplyToDirectoryChildren(yaffs_obj_t *the_dir, ++ int (*fn) (yaffs_obj_t *)) + { + struct ylist_head *i; +- yaffs_Object *l; ++ yaffs_obj_t *l; + +- if (!theDir) { ++ if (!the_dir) { + T(YAFFS_TRACE_ALWAYS, + (TSTR +- ("tragedy: yaffs_FindObjectByName: null pointer directory" ++ ("tragedy: yaffs_find_by_name: null pointer directory" + TENDSTR))); + YBUG(); + return YAFFS_FAIL; + } +- if (theDir->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) { ++ if (the_dir->variant_type != YAFFS_OBJECT_TYPE_DIRECTORY) { + T(YAFFS_TRACE_ALWAYS, + (TSTR +- ("tragedy: yaffs_FindObjectByName: non-directory" TENDSTR))); ++ ("tragedy: yaffs_find_by_name: non-directory" TENDSTR))); + YBUG(); + return YAFFS_FAIL; + } + +- ylist_for_each(i, &theDir->variant.directoryVariant.children) { ++ ylist_for_each(i, &the_dir->variant.dir_variant.children) { + if (i) { +- l = ylist_entry(i, yaffs_Object, siblings); ++ l = ylist_entry(i, yaffs_obj_t, siblings); + if (l && !fn(l)) + return YAFFS_FAIL; + } +@@ -6832,82 +4628,175 @@ int yaffs_ApplyToDirectoryChildren(yaffs + * actual object. + */ + +-yaffs_Object *yaffs_GetEquivalentObject(yaffs_Object *obj) ++yaffs_obj_t *yaffs_get_equivalent_obj(yaffs_obj_t *obj) + { +- if (obj && obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK) { ++ if (obj && obj->variant_type == YAFFS_OBJECT_TYPE_HARDLINK) { + /* We want the object id of the equivalent object, not this one */ +- obj = obj->variant.hardLinkVariant.equivalentObject; +- yaffs_CheckObjectDetailsLoaded(obj); ++ obj = obj->variant.hardlink_variant.equiv_obj; ++ yaffs_check_obj_details_loaded(obj); + } return obj; } @@ -13672,14 +14431,15 @@ - yaffs_strncpy(name, YAFFS_LOSTNFOUND_NAME, buffSize - 1); - } else if (obj->hdrChunk <= 0) { + */ -+static void yaffs_FixNullName(yaffs_Object * obj,YCHAR * name, int buffSize) ++static void yaffs_fix_null_name(yaffs_obj_t * obj,YCHAR * name, int buffer_size) +{ + /* Create an object name if we could not find one. */ + if(yaffs_strnlen(name,YAFFS_MAX_NAME_LENGTH) == 0){ YCHAR locName[20]; YCHAR numString[20]; YCHAR *x = &numString[19]; - unsigned v = obj->objectId; +- unsigned v = obj->objectId; ++ unsigned v = obj->obj_id; numString[19] = 0; - while (v > 0) { + while(v>0){ @@ -13690,15 +14450,16 @@ /* make up a name */ yaffs_strcpy(locName, YAFFS_LOSTNFOUND_PREFIX); - yaffs_strcat(locName, x); +- yaffs_strncpy(name, locName, buffSize - 1); + yaffs_strcat(locName,x); - yaffs_strncpy(name, locName, buffSize - 1); ++ yaffs_strncpy(name, locName, buffer_size - 1); + } +} + -+static void yaffs_LoadNameFromObjectHeader(yaffs_Device *dev,YCHAR *name, const YCHAR *ohName, int bufferSize) ++static void yaffs_load_name_from_oh(yaffs_dev_t *dev,YCHAR *name, const YCHAR *ohName, int bufferSize) +{ +#ifdef CONFIG_YAFFS_AUTO_UNICODE -+ if(dev->param.autoUnicode){ ++ if(dev->param.auto_unicode){ + if(*ohName){ + /* It is an ASCII name, so do an ASCII to unicode conversion */ + const char *asciiOhName = (const char *)ohName; @@ -13717,14 +14478,14 @@ +} + + -+static void yaffs_LoadObjectHeaderFromName(yaffs_Device *dev, YCHAR *ohName, const YCHAR *name) ++static void yaffs_load_oh_from_name(yaffs_dev_t *dev, YCHAR *ohName, const YCHAR *name) +{ +#ifdef CONFIG_YAFFS_AUTO_UNICODE + + int isAscii; + YCHAR *w; - -+ if(dev->param.autoUnicode){ ++ ++ if(dev->param.auto_unicode){ + + isAscii = 1; + w = name; @@ -13735,7 +14496,7 @@ + isAscii = 0; + w++; + } -+ + + if(isAscii){ + /* It is an ASCII name, so do a unicode to ascii conversion */ + char *asciiOhName = (char *)ohName; @@ -13758,78 +14519,178 @@ + +} + -+int yaffs_GetObjectName(yaffs_Object * obj, YCHAR * name, int buffSize) ++int yaffs_get_obj_name(yaffs_obj_t * obj, YCHAR * name, int buffer_size) +{ -+ memset(name, 0, buffSize * sizeof(YCHAR)); ++ memset(name, 0, buffer_size * sizeof(YCHAR)); + -+ yaffs_CheckObjectDetailsLoaded(obj); ++ yaffs_check_obj_details_loaded(obj); + -+ if (obj->objectId == YAFFS_OBJECTID_LOSTNFOUND) { -+ yaffs_strncpy(name, YAFFS_LOSTNFOUND_NAME, buffSize - 1); ++ if (obj->obj_id == YAFFS_OBJECTID_LOSTNFOUND) { ++ yaffs_strncpy(name, YAFFS_LOSTNFOUND_NAME, buffer_size - 1); + } #ifdef CONFIG_YAFFS_SHORT_NAMES_IN_RAM - else if (obj->shortName[0]) -+ else if (obj->shortName[0]) { - yaffs_strcpy(name, obj->shortName); +- yaffs_strcpy(name, obj->shortName); ++ else if (obj->short_name[0]) { ++ yaffs_strcpy(name, obj->short_name); + } #endif - else { -+ else if(obj->hdrChunk > 0) { ++ else if(obj->hdr_chunk > 0) { int result; - __u8 *buffer = yaffs_GetTempBuffer(obj->myDev, __LINE__); +- __u8 *buffer = yaffs_GetTempBuffer(obj->myDev, __LINE__); ++ __u8 *buffer = yaffs_get_temp_buffer(obj->my_dev, __LINE__); -@@ -6884,14 +4768,17 @@ int yaffs_GetObjectName(yaffs_Object *ob - obj->hdrChunk, buffer, +- yaffs_ObjectHeader *oh = (yaffs_ObjectHeader *) buffer; ++ yaffs_obj_header *oh = (yaffs_obj_header *) buffer; + +- memset(buffer, 0, obj->myDev->nDataBytesPerChunk); ++ memset(buffer, 0, obj->my_dev->data_bytes_per_chunk); + +- if (obj->hdrChunk > 0) { +- result = yaffs_ReadChunkWithTagsFromNAND(obj->myDev, +- obj->hdrChunk, buffer, ++ if (obj->hdr_chunk > 0) { ++ result = yaffs_rd_chunk_tags_nand(obj->my_dev, ++ obj->hdr_chunk, buffer, NULL); } - yaffs_strncpy(name, oh->name, buffSize - 1); -+ yaffs_LoadNameFromObjectHeader(obj->myDev,name,oh->name,buffSize); ++ yaffs_load_name_from_oh(obj->my_dev,name,oh->name,buffer_size); - yaffs_ReleaseTempBuffer(obj->myDev, buffer, __LINE__); +- yaffs_ReleaseTempBuffer(obj->myDev, buffer, __LINE__); ++ yaffs_release_temp_buffer(obj->my_dev, buffer, __LINE__); } - return yaffs_strlen(name); -+ yaffs_FixNullName(obj,name,buffSize); ++ yaffs_fix_null_name(obj,name,buffer_size); + + return yaffs_strnlen(name,YAFFS_MAX_NAME_LENGTH); } +-int yaffs_GetObjectFileLength(yaffs_Object *obj) + - int yaffs_GetObjectFileLength(yaffs_Object *obj) ++int yaffs_get_obj_length(yaffs_obj_t *obj) { /* Dereference any hard linking */ -@@ -6899,9 +4786,11 @@ int yaffs_GetObjectFileLength(yaffs_Obje +- obj = yaffs_GetEquivalentObject(obj); ++ obj = yaffs_get_equivalent_obj(obj); - if (obj->variantType == YAFFS_OBJECT_TYPE_FILE) - return obj->variant.fileVariant.fileSize; +- if (obj->variantType == YAFFS_OBJECT_TYPE_FILE) +- return obj->variant.fileVariant.fileSize; - if (obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK) - return yaffs_strlen(obj->variant.symLinkVariant.alias); - else { -+ if (obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK){ -+ if(!obj->variant.symLinkVariant.alias) ++ if (obj->variant_type == YAFFS_OBJECT_TYPE_FILE) ++ return obj->variant.file_variant.file_size; ++ if (obj->variant_type == YAFFS_OBJECT_TYPE_SYMLINK){ ++ if(!obj->variant.symlink_variant.alias) + return 0; -+ return yaffs_strnlen(obj->variant.symLinkVariant.alias,YAFFS_MAX_ALIAS_LENGTH); ++ return yaffs_strnlen(obj->variant.symlink_variant.alias,YAFFS_MAX_ALIAS_LENGTH); + } else { /* Only a directory should drop through to here */ - return obj->myDev->nDataBytesPerChunk; +- return obj->myDev->nDataBytesPerChunk; ++ return obj->my_dev->data_bytes_per_chunk; } -@@ -6992,7 +4881,7 @@ int yaffs_SetAttributes(yaffs_Object *ob + } + +-int yaffs_GetObjectLinkCount(yaffs_Object *obj) ++int yaffs_get_obj_link_count(yaffs_obj_t *obj) + { + int count = 0; + struct ylist_head *i; +@@ -6915,24 +4804,24 @@ int yaffs_GetObjectLinkCount(yaffs_Objec + if (!obj->unlinked) + count++; /* the object itself */ + +- ylist_for_each(i, &obj->hardLinks) ++ ylist_for_each(i, &obj->hard_links) + count++; /* add the hard links; */ + + return count; + } + +-int yaffs_GetObjectInode(yaffs_Object *obj) ++int yaffs_get_obj_inode(yaffs_obj_t *obj) + { +- obj = yaffs_GetEquivalentObject(obj); ++ obj = yaffs_get_equivalent_obj(obj); + +- return obj->objectId; ++ return obj->obj_id; + } + +-unsigned yaffs_GetObjectType(yaffs_Object *obj) ++unsigned yaffs_get_obj_type(yaffs_obj_t *obj) + { +- obj = yaffs_GetEquivalentObject(obj); ++ obj = yaffs_get_equivalent_obj(obj); + +- switch (obj->variantType) { ++ switch (obj->variant_type) { + case YAFFS_OBJECT_TYPE_FILE: + return DT_REG; + break; +@@ -6960,18 +4849,18 @@ unsigned yaffs_GetObjectType(yaffs_Objec + } + } + +-YCHAR *yaffs_GetSymlinkAlias(yaffs_Object *obj) ++YCHAR *yaffs_get_symlink_alias(yaffs_obj_t *obj) + { +- obj = yaffs_GetEquivalentObject(obj); +- if (obj->variantType == YAFFS_OBJECT_TYPE_SYMLINK) +- return yaffs_CloneString(obj->variant.symLinkVariant.alias); ++ obj = yaffs_get_equivalent_obj(obj); ++ if (obj->variant_type == YAFFS_OBJECT_TYPE_SYMLINK) ++ return yaffs_clone_str(obj->variant.symlink_variant.alias); + else +- return yaffs_CloneString(_Y("")); ++ return yaffs_clone_str(_Y("")); + } + + #ifndef CONFIG_YAFFS_WINCE + +-int yaffs_SetAttributes(yaffs_Object *obj, struct iattr *attr) ++int yaffs_set_attribs(yaffs_obj_t *obj, struct iattr *attr) + { + unsigned int valid = attr->ia_valid; + +@@ -6990,14 +4879,14 @@ int yaffs_SetAttributes(yaffs_Object *ob + obj->yst_mtime = Y_TIME_CONVERT(attr->ia_mtime); + if (valid & ATTR_SIZE) - yaffs_ResizeFile(obj, attr->ia_size); +- yaffs_ResizeFile(obj, attr->ia_size); ++ yaffs_resize_file(obj, attr->ia_size); - yaffs_UpdateObjectHeader(obj, NULL, 1, 0, 0); -+ yaffs_UpdateObjectHeader(obj, NULL, 1, 0, 0, NULL); ++ yaffs_update_oh(obj, NULL, 1, 0, 0, NULL); return YAFFS_OK; -@@ -7025,12 +4914,129 @@ int yaffs_GetAttributes(yaffs_Object *ob + } +-int yaffs_GetAttributes(yaffs_Object *obj, struct iattr *attr) ++int yaffs_get_attribs(yaffs_obj_t *obj, struct iattr *attr) + { + unsigned int valid = 0; + +@@ -7015,7 +4904,7 @@ int yaffs_GetAttributes(yaffs_Object *ob + Y_TIME_CONVERT(attr->ia_mtime) = obj->yst_mtime; + valid |= ATTR_MTIME; + +- attr->ia_size = yaffs_GetFileSize(obj); ++ attr->ia_size = yaffs_get_file_size(obj); + valid |= ATTR_SIZE; + + attr->ia_valid = valid; +@@ -7025,20 +4914,137 @@ int yaffs_GetAttributes(yaffs_Object *ob #endif + -+static int yaffs_DoXMod(yaffs_Object *obj, int set, const YCHAR *name, const void *value, int size, int flags) ++static int yaffs_do_xattrib_mod(yaffs_obj_t *obj, int set, const YCHAR *name, const void *value, int size, int flags) +{ -+ yaffs_XAttrMod xmod; ++ yaffs_xattr_mod xmod; + + int result; + @@ -13840,7 +14701,7 @@ + xmod.flags = flags; + xmod.result = -ENOSPC; + -+ result = yaffs_UpdateObjectHeader(obj, NULL, 0, 0, 0, &xmod); ++ result = yaffs_update_oh(obj, NULL, 0, 0, 0, &xmod); + + if(result > 0) + return xmod.result; @@ -13848,12 +14709,12 @@ + return -ENOSPC; +} + -+static int yaffs_ApplyXMod(yaffs_Object *obj, char *buffer, yaffs_XAttrMod *xmod) ++static int yaffs_apply_xattrib_mod(yaffs_obj_t *obj, char *buffer, yaffs_xattr_mod *xmod) +{ + int retval = 0; -+ int x_offs = sizeof(yaffs_ObjectHeader); -+ yaffs_Device *dev = obj->myDev; -+ int x_size = dev->nDataBytesPerChunk - sizeof(yaffs_ObjectHeader); ++ int x_offs = sizeof(yaffs_obj_header); ++ yaffs_dev_t *dev = obj->my_dev; ++ int x_size = dev->data_bytes_per_chunk - sizeof(yaffs_obj_header); + + char * x_buffer = buffer + x_offs; + @@ -13862,54 +14723,54 @@ + else + retval = nval_del(x_buffer, x_size, xmod->name); + -+ obj->hasXattr = nval_hasvalues(x_buffer, x_size); -+ obj->xattrKnown = 1; ++ obj->has_xattr = nval_hasvalues(x_buffer, x_size); ++ obj->xattr_known = 1; + + xmod->result = retval; + + return retval; +} + -+static int yaffs_DoXFetch(yaffs_Object *obj, const YCHAR *name, void *value, int size) ++static int yaffs_do_xattrib_fetch(yaffs_obj_t *obj, const YCHAR *name, void *value, int size) +{ + char *buffer = NULL; + int result; -+ yaffs_ExtendedTags tags; -+ yaffs_Device *dev = obj->myDev; -+ int x_offs = sizeof(yaffs_ObjectHeader); -+ int x_size = dev->nDataBytesPerChunk - sizeof(yaffs_ObjectHeader); ++ yaffs_ext_tags tags; ++ yaffs_dev_t *dev = obj->my_dev; ++ int x_offs = sizeof(yaffs_obj_header); ++ int x_size = dev->data_bytes_per_chunk - sizeof(yaffs_obj_header); + + char * x_buffer; + + int retval = 0; + -+ if(obj->hdrChunk < 1) ++ if(obj->hdr_chunk < 1) + return -ENODATA; + + /* If we know that the object has no xattribs then don't do all the + * reading and parsing. + */ -+ if(obj->xattrKnown && !obj->hasXattr){ ++ if(obj->xattr_known && !obj->has_xattr){ + if(name) + return -ENODATA; + else + return 0; + } + -+ buffer = (char *) yaffs_GetTempBuffer(dev, __LINE__); ++ buffer = (char *) yaffs_get_temp_buffer(dev, __LINE__); + if(!buffer) + return -ENOMEM; + -+ result = yaffs_ReadChunkWithTagsFromNAND(dev,obj->hdrChunk, (__u8 *)buffer, &tags); ++ result = yaffs_rd_chunk_tags_nand(dev,obj->hdr_chunk, (__u8 *)buffer, &tags); + + if(result != YAFFS_OK) + retval = -ENOENT; + else{ + x_buffer = buffer + x_offs; + -+ if (!obj->xattrKnown){ -+ obj->hasXattr = nval_hasvalues(x_buffer, x_size); -+ obj->xattrKnown = 1; ++ if (!obj->xattr_known){ ++ obj->has_xattr = nval_hasvalues(x_buffer, x_size); ++ obj->xattr_known = 1; + } + + if(name) @@ -13917,48 +14778,65 @@ + else + retval = nval_list(x_buffer, x_size, value,size); + } -+ yaffs_ReleaseTempBuffer(dev,(__u8 *)buffer,__LINE__); ++ yaffs_release_temp_buffer(dev,(__u8 *)buffer,__LINE__); + return retval; +} + -+int yaffs_SetXAttribute(yaffs_Object *obj, const YCHAR *name, const void * value, int size, int flags) ++int yaffs_set_xattrib(yaffs_obj_t *obj, const YCHAR *name, const void * value, int size, int flags) +{ -+ return yaffs_DoXMod(obj, 1, name, value, size, flags); ++ return yaffs_do_xattrib_mod(obj, 1, name, value, size, flags); +} + -+int yaffs_RemoveXAttribute(yaffs_Object *obj, const YCHAR *name) ++int yaffs_remove_xattrib(yaffs_obj_t *obj, const YCHAR *name) +{ -+ return yaffs_DoXMod(obj, 0, name, NULL, 0, 0); ++ return yaffs_do_xattrib_mod(obj, 0, name, NULL, 0, 0); +} + -+int yaffs_GetXAttribute(yaffs_Object *obj, const YCHAR *name, void *value, int size) ++int yaffs_get_xattrib(yaffs_obj_t *obj, const YCHAR *name, void *value, int size) +{ -+ return yaffs_DoXFetch(obj, name, value, size); ++ return yaffs_do_xattrib_fetch(obj, name, value, size); +} + -+int yaffs_ListXAttributes(yaffs_Object *obj, char *buffer, int size) ++int yaffs_list_xattrib(yaffs_obj_t *obj, char *buffer, int size) +{ -+ return yaffs_DoXFetch(obj, NULL, buffer,size); ++ return yaffs_do_xattrib_fetch(obj, NULL, buffer,size); +} + + + #if 0 - int yaffs_DumpObject(yaffs_Object *obj) +-int yaffs_DumpObject(yaffs_Object *obj) ++int yaffs_dump_obj(yaffs_obj_t *obj) { YCHAR name[257]; - yaffs_GetObjectName(obj, name, 256); -+ yaffs_GetObjectName(obj, name, YAFFS_MAX_NAME_LENGTH + 1); ++ yaffs_get_obj_name(obj, name, YAFFS_MAX_NAME_LENGTH + 1); T(YAFFS_TRACE_ALWAYS, (TSTR -@@ -7050,30 +5056,32 @@ static int yaffs_CheckDevFunctions(const + ("Object %d, inode %d \"%s\"\n dirty %d valid %d serial %d sum %d" + " chunk %d type %d size %d\n" +- TENDSTR), obj->objectId, yaffs_GetObjectInode(obj), name, +- obj->dirty, obj->valid, obj->serial, obj->sum, obj->hdrChunk, +- yaffs_GetObjectType(obj), yaffs_GetObjectFileLength(obj))); ++ TENDSTR), obj->obj_id, yaffs_get_obj_inode(obj), name, ++ obj->dirty, obj->valid, obj->serial, obj->sum, obj->hdr_chunk, ++ yaffs_get_obj_type(obj), yaffs_get_obj_length(obj))); + + return YAFFS_OK; + } +@@ -7046,72 +5052,74 @@ int yaffs_DumpObject(yaffs_Object *obj) + + /*---------------------------- Initialisation code -------------------------------------- */ + +-static int yaffs_CheckDevFunctions(const yaffs_Device *dev) ++static int yaffs_cehck_dev_fns(const yaffs_dev_t *dev) { /* Common functions, gotta have */ - if (!dev->eraseBlockInNAND || !dev->initialiseNAND) -+ if (!dev->param.eraseBlockInNAND || !dev->param.initialiseNAND) ++ if (!dev->param.erase_fn || !dev->param.initialise_flash_fn) return 0; #ifdef CONFIG_YAFFS_YAFFS2 @@ -13969,12 +14847,12 @@ - !dev->writeChunkToNAND && - !dev->readChunkFromNAND && - dev->markNANDBlockBad && dev->queryNANDBlock) -+ if (dev->param.writeChunkWithTagsToNAND && -+ dev->param.readChunkWithTagsFromNAND && -+ !dev->param.writeChunkToNAND && -+ !dev->param.readChunkFromNAND && -+ dev->param.markNANDBlockBad && -+ dev->param.queryNANDBlock) ++ if (dev->param.write_chunk_tags_fn && ++ dev->param.read_chunk_tags_fn && ++ !dev->param.write_chunk_fn && ++ !dev->param.read_chunk_fn && ++ dev->param.bad_block_fn && ++ dev->param.query_block_fn) return 1; #endif @@ -13985,13 +14863,13 @@ - dev->writeChunkToNAND && - dev->readChunkFromNAND && - !dev->markNANDBlockBad && !dev->queryNANDBlock) -+ if (!dev->param.isYaffs2 && -+ !dev->param.writeChunkWithTagsToNAND && -+ !dev->param.readChunkWithTagsFromNAND && -+ dev->param.writeChunkToNAND && -+ dev->param.readChunkFromNAND && -+ !dev->param.markNANDBlockBad && -+ !dev->param.queryNANDBlock) ++ if (!dev->param.is_yaffs2 && ++ !dev->param.write_chunk_tags_fn && ++ !dev->param.read_chunk_tags_fn && ++ dev->param.write_chunk_fn && ++ dev->param.read_chunk_fn && ++ !dev->param.bad_block_fn && ++ !dev->param.query_block_fn) return 1; - return 0; /* bad */ @@ -13999,30 +14877,89 @@ } -@@ -7120,35 +5128,35 @@ int yaffs_GutsInitialise(yaffs_Device *d +-static int yaffs_CreateInitialDirectories(yaffs_Device *dev) ++static int yaffs_create_initial_dir(yaffs_dev_t *dev) + { + /* Initialise the unlinked, deleted, root and lost and found directories */ + +- dev->lostNFoundDir = dev->rootDir = NULL; +- dev->unlinkedDir = dev->deletedDir = NULL; ++ dev->lost_n_found = dev->root_dir = NULL; ++ dev->unlinked_dir = dev->del_dir = NULL; + +- dev->unlinkedDir = +- yaffs_CreateFakeDirectory(dev, YAFFS_OBJECTID_UNLINKED, S_IFDIR); ++ dev->unlinked_dir = ++ yaffs_create_fake_dir(dev, YAFFS_OBJECTID_UNLINKED, S_IFDIR); + +- dev->deletedDir = +- yaffs_CreateFakeDirectory(dev, YAFFS_OBJECTID_DELETED, S_IFDIR); ++ dev->del_dir = ++ yaffs_create_fake_dir(dev, YAFFS_OBJECTID_DELETED, S_IFDIR); + +- dev->rootDir = +- yaffs_CreateFakeDirectory(dev, YAFFS_OBJECTID_ROOT, ++ dev->root_dir = ++ yaffs_create_fake_dir(dev, YAFFS_OBJECTID_ROOT, + YAFFS_ROOT_MODE | S_IFDIR); +- dev->lostNFoundDir = +- yaffs_CreateFakeDirectory(dev, YAFFS_OBJECTID_LOSTNFOUND, ++ dev->lost_n_found = ++ yaffs_create_fake_dir(dev, YAFFS_OBJECTID_LOSTNFOUND, + YAFFS_LOSTNFOUND_MODE | S_IFDIR); + +- if (dev->lostNFoundDir && dev->rootDir && dev->unlinkedDir && dev->deletedDir) { +- yaffs_AddObjectToDirectory(dev->rootDir, dev->lostNFoundDir); ++ if (dev->lost_n_found && dev->root_dir && dev->unlinked_dir && dev->del_dir) { ++ yaffs_add_obj_to_dir(dev->root_dir, dev->lost_n_found); + return YAFFS_OK; + } + + return YAFFS_FAIL; + } + +-int yaffs_GutsInitialise(yaffs_Device *dev) ++int yaffs_guts_initialise(yaffs_dev_t *dev) + { + int init_failed = 0; + unsigned x; + int bits; + +- T(YAFFS_TRACE_TRACING, (TSTR("yaffs: yaffs_GutsInitialise()" TENDSTR))); ++ T(YAFFS_TRACE_TRACING, (TSTR("yaffs: yaffs_guts_initialise()" TENDSTR))); + + /* Check stuff that must be set */ + +@@ -7120,52 +5128,52 @@ int yaffs_GutsInitialise(yaffs_Device *d return YAFFS_FAIL; } - dev->internalStartBlock = dev->startBlock; - dev->internalEndBlock = dev->endBlock; -+ dev->internalStartBlock = dev->param.startBlock; -+ dev->internalEndBlock = dev->param.endBlock; - dev->blockOffset = 0; - dev->chunkOffset = 0; - dev->nFreeChunks = 0; - +- dev->blockOffset = 0; +- dev->chunkOffset = 0; +- dev->nFreeChunks = 0; +- - dev->gcBlock = -1; -+ dev->gcBlock = 0; - +- - if (dev->startBlock == 0) { - dev->internalStartBlock = dev->startBlock + 1; - dev->internalEndBlock = dev->endBlock + 1; -+ if (dev->param.startBlock == 0) { -+ dev->internalStartBlock = dev->param.startBlock + 1; -+ dev->internalEndBlock = dev->param.endBlock + 1; - dev->blockOffset = 1; +- dev->blockOffset = 1; - dev->chunkOffset = dev->nChunksPerBlock; -+ dev->chunkOffset = dev->param.nChunksPerBlock; ++ dev->internal_start_block = dev->param.start_block; ++ dev->internal_end_block = dev->param.end_block; ++ dev->block_offset = 0; ++ dev->chunk_offset = 0; ++ dev->n_free_chunks = 0; ++ ++ dev->gc_block = 0; ++ ++ if (dev->param.start_block == 0) { ++ dev->internal_start_block = dev->param.start_block + 1; ++ dev->internal_end_block = dev->param.end_block + 1; ++ dev->block_offset = 1; ++ dev->chunk_offset = dev->param.chunks_per_block; } /* Check geometry parameters. */ @@ -14032,265 +14969,461 @@ - (dev->inbandTags && !dev->isYaffs2) || - dev->nChunksPerBlock < 2 || - dev->nReservedBlocks < 2 || -+ if ((!dev->param.inbandTags && dev->param.isYaffs2 && dev->param.totalBytesPerChunk < 1024) || -+ (!dev->param.isYaffs2 && dev->param.totalBytesPerChunk < 512) || -+ (dev->param.inbandTags && !dev->param.isYaffs2) || -+ dev->param.nChunksPerBlock < 2 || -+ dev->param.nReservedBlocks < 2 || - dev->internalStartBlock <= 0 || - dev->internalEndBlock <= 0 || +- dev->internalStartBlock <= 0 || +- dev->internalEndBlock <= 0 || - dev->internalEndBlock <= (dev->internalStartBlock + dev->nReservedBlocks + 2)) { /* otherwise it is too small */ -+ dev->internalEndBlock <= (dev->internalStartBlock + dev->param.nReservedBlocks + 2)) { /* otherwise it is too small */ ++ if ((!dev->param.inband_tags && dev->param.is_yaffs2 && dev->param.total_bytes_per_chunk < 1024) || ++ (!dev->param.is_yaffs2 && dev->param.total_bytes_per_chunk < 512) || ++ (dev->param.inband_tags && !dev->param.is_yaffs2) || ++ dev->param.chunks_per_block < 2 || ++ dev->param.n_reserved_blocks < 2 || ++ dev->internal_start_block <= 0 || ++ dev->internal_end_block <= 0 || ++ dev->internal_end_block <= (dev->internal_start_block + dev->param.n_reserved_blocks + 2)) { /* otherwise it is too small */ T(YAFFS_TRACE_ALWAYS, (TSTR - ("yaffs: NAND geometry problems: chunk size %d, type is yaffs%s, inbandTags %d " +- ("yaffs: NAND geometry problems: chunk size %d, type is yaffs%s, inbandTags %d " - TENDSTR), dev->totalBytesPerChunk, dev->isYaffs2 ? "2" : "", dev->inbandTags)); -+ TENDSTR), dev->param.totalBytesPerChunk, dev->param.isYaffs2 ? "2" : "", dev->param.inbandTags)); ++ ("yaffs: NAND geometry problems: chunk size %d, type is yaffs%s, inband_tags %d " ++ TENDSTR), dev->param.total_bytes_per_chunk, dev->param.is_yaffs2 ? "2" : "", dev->param.inband_tags)); return YAFFS_FAIL; } -@@ -7159,10 +5167,10 @@ int yaffs_GutsInitialise(yaffs_Device *d +- if (yaffs_InitialiseNAND(dev) != YAFFS_OK) { ++ if (yaffs_init_nand(dev) != YAFFS_OK) { + T(YAFFS_TRACE_ALWAYS, + (TSTR("yaffs: InitialiseNAND failed" TENDSTR))); + return YAFFS_FAIL; } /* Sort out space for inband tags, if required */ - if (dev->inbandTags) - dev->nDataBytesPerChunk = dev->totalBytesPerChunk - sizeof(yaffs_PackedTags2TagsPart); -+ if (dev->param.inbandTags) -+ dev->nDataBytesPerChunk = dev->param.totalBytesPerChunk - sizeof(yaffs_PackedTags2TagsPart); ++ if (dev->param.inband_tags) ++ dev->data_bytes_per_chunk = dev->param.total_bytes_per_chunk - sizeof(yaffs_PackedTags2TagsPart); else - dev->nDataBytesPerChunk = dev->totalBytesPerChunk; -+ dev->nDataBytesPerChunk = dev->param.totalBytesPerChunk; ++ dev->data_bytes_per_chunk = dev->param.total_bytes_per_chunk; /* Got the right mix of functions? */ - if (!yaffs_CheckDevFunctions(dev)) { -@@ -7209,12 +5217,12 @@ int yaffs_GutsInitialise(yaffs_Device *d - * We need to find the next power of 2 > than internalEndBlock +- if (!yaffs_CheckDevFunctions(dev)) { ++ if (!yaffs_cehck_dev_fns(dev)) { + /* Function missing */ + T(YAFFS_TRACE_ALWAYS, + (TSTR +@@ -7175,13 +5183,13 @@ int yaffs_GutsInitialise(yaffs_Device *d + } + + /* This is really a compilation check. */ +- if (!yaffs_CheckStructures()) { ++ if (!yaffs_check_structures()) { + T(YAFFS_TRACE_ALWAYS, +- (TSTR("yaffs_CheckStructures failed\n" TENDSTR))); ++ (TSTR("yaffs_check_structures failed\n" TENDSTR))); + return YAFFS_FAIL; + } + +- if (dev->isMounted) { ++ if (dev->is_mounted) { + T(YAFFS_TRACE_ALWAYS, + (TSTR("yaffs: device already mounted\n" TENDSTR))); + return YAFFS_FAIL; +@@ -7189,59 +5197,62 @@ int yaffs_GutsInitialise(yaffs_Device *d + + /* Finished with most checks. One or two more checks happen later on too. */ + +- dev->isMounted = 1; ++ dev->is_mounted = 1; + + /* OK now calculate a few things for the device */ + + /* + * Calculate all the chunk size manipulation numbers: + */ +- x = dev->nDataBytesPerChunk; +- /* We always use dev->chunkShift and dev->chunkDiv */ +- dev->chunkShift = Shifts(x); +- x >>= dev->chunkShift; +- dev->chunkDiv = x; +- /* We only use chunk mask if chunkDiv is 1 */ +- dev->chunkMask = (1<chunkShift) - 1; ++ x = dev->data_bytes_per_chunk; ++ /* We always use dev->chunk_shift and dev->chunk_div */ ++ dev->chunk_shift = Shifts(x); ++ x >>= dev->chunk_shift; ++ dev->chunk_div = x; ++ /* We only use chunk mask if chunk_div is 1 */ ++ dev->chunk_mask = (1<chunk_shift) - 1; + + /* +- * Calculate chunkGroupBits. +- * We need to find the next power of 2 > than internalEndBlock ++ * Calculate chunk_grp_bits. ++ * We need to find the next power of 2 > than internal_end_block */ - x = dev->nChunksPerBlock * (dev->internalEndBlock + 1); -+ x = dev->param.nChunksPerBlock * (dev->internalEndBlock + 1); ++ x = dev->param.chunks_per_block * (dev->internal_end_block + 1); bits = ShiftsGE(x); /* Set up tnode width if wide tnodes are enabled. */ - if (!dev->wideTnodesDisabled) { -+ if (!dev->param.wideTnodesDisabled) { ++ if (!dev->param.wide_tnodes_disabled) { /* bits must be even so that we end up with 32-bit words */ if (bits & 1) bits++; -@@ -7238,10 +5246,13 @@ int yaffs_GutsInitialise(yaffs_Device *d + if (bits < 16) +- dev->tnodeWidth = 16; ++ dev->tnode_width = 16; + else +- dev->tnodeWidth = bits; ++ dev->tnode_width = bits; + } else +- dev->tnodeWidth = 16; ++ dev->tnode_width = 16; + +- dev->tnodeMask = (1<tnodeWidth)-1; ++ dev->tnode_mask = (1<tnode_width)-1; + + /* Level0 Tnodes are 16 bits or wider (if wide tnodes are enabled), + * so if the bitwidth of the + * chunk range we're using is greater than 16 we need +- * to figure out chunk shift and chunkGroupSize ++ * to figure out chunk shift and chunk_grp_size + */ + +- if (bits <= dev->tnodeWidth) +- dev->chunkGroupBits = 0; ++ if (bits <= dev->tnode_width) ++ dev->chunk_grp_bits = 0; else - dev->chunkGroupBits = bits - dev->tnodeWidth; +- dev->chunkGroupBits = bits - dev->tnodeWidth; ++ dev->chunk_grp_bits = bits - dev->tnode_width; -+ dev->tnodeSize = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8; -+ if(dev->tnodeSize < sizeof(yaffs_Tnode)) -+ dev->tnodeSize = sizeof(yaffs_Tnode); ++ dev->tnode_size = (dev->tnode_width * YAFFS_NTNODES_LEVEL0)/8; ++ if(dev->tnode_size < sizeof(yaffs_tnode_t)) ++ dev->tnode_size = sizeof(yaffs_tnode_t); - dev->chunkGroupSize = 1 << dev->chunkGroupBits; +- dev->chunkGroupSize = 1 << dev->chunkGroupBits; ++ dev->chunk_grp_size = 1 << dev->chunk_grp_bits; - if (dev->nChunksPerBlock < dev->chunkGroupSize) { -+ if (dev->param.nChunksPerBlock < dev->chunkGroupSize) { ++ if (dev->param.chunks_per_block < dev->chunk_grp_size) { /* We have a problem because the soft delete won't work if * the chunk group size > chunks per block. * This can be remedied by using larger "virtual blocks". -@@ -7255,9 +5266,11 @@ int yaffs_GutsInitialise(yaffs_Device *d +@@ -7255,85 +5266,89 @@ int yaffs_GutsInitialise(yaffs_Device *d /* OK, we've finished verifying the device, lets continue with initialisation */ /* More device initialisation */ - dev->garbageCollections = 0; - dev->passiveGarbageCollections = 0; - dev->currentDirtyChecker = 0; -+ dev->allGCs = 0; -+ dev->passiveGCs = 0; -+ dev->oldestDirtyGCs = 0; -+ dev->backgroundGCs = 0; -+ dev->gcBlockFinder = 0; - dev->bufferedBlock = -1; - dev->doingBufferedBlockRewrite = 0; - dev->nDeletedFiles = 0; -@@ -7269,8 +5282,11 @@ int yaffs_GutsInitialise(yaffs_Device *d - dev->tagsEccUnfixed = 0; - dev->nErasureFailures = 0; - dev->nErasedBlocks = 0; +- dev->bufferedBlock = -1; +- dev->doingBufferedBlockRewrite = 0; +- dev->nDeletedFiles = 0; +- dev->nBackgroundDeletions = 0; +- dev->nUnlinkedFiles = 0; +- dev->eccFixed = 0; +- dev->eccUnfixed = 0; +- dev->tagsEccFixed = 0; +- dev->tagsEccUnfixed = 0; +- dev->nErasureFailures = 0; +- dev->nErasedBlocks = 0; - dev->isDoingGC = 0; -+ dev->gcDisable= 0; - dev->hasPendingPrioritisedGCs = 1; /* Assume the worst for now, will get fixed on first GC */ -+ YINIT_LIST_HEAD(&dev->dirtyDirectories); -+ dev->oldestDirtySequence = 0; -+ dev->oldestDirtyBlock = 0; +- dev->hasPendingPrioritisedGCs = 1; /* Assume the worst for now, will get fixed on first GC */ ++ dev->all_gcs = 0; ++ dev->passive_gc_count = 0; ++ dev->oldest_dirty_gc_count = 0; ++ dev->bg_gcs = 0; ++ dev->gc_block_finder = 0; ++ dev->buffered_block = -1; ++ dev->doing_buffered_block_rewrite = 0; ++ dev->n_deleted_files = 0; ++ dev->n_bg_deletions = 0; ++ dev->n_unlinked_files = 0; ++ dev->n_ecc_fixed = 0; ++ dev->n_ecc_unfixed = 0; ++ dev->n_tags_ecc_fixed = 0; ++ dev->n_tags_ecc_unfixed = 0; ++ dev->n_erase_failures = 0; ++ dev->n_erased_blocks = 0; ++ dev->gc_disable= 0; ++ dev->has_pending_prioritised_gc = 1; /* Assume the worst for now, will get fixed on first GC */ ++ YINIT_LIST_HEAD(&dev->dirty_dirs); ++ dev->oldest_dirty_seq = 0; ++ dev->oldest_dirty_block = 0; /* Initialise temporary buffers and caches. */ - if (!yaffs_InitialiseTempBuffers(dev)) -@@ -7281,13 +5297,13 @@ int yaffs_GutsInitialise(yaffs_Device *d +- if (!yaffs_InitialiseTempBuffers(dev)) ++ if (!yaffs_init_tmp_buffers(dev)) + init_failed = 1; + +- dev->srCache = NULL; +- dev->gcCleanupList = NULL; ++ dev->cache = NULL; ++ dev->gc_cleanup_list = NULL; if (!init_failed && - dev->nShortOpCaches > 0) { -+ dev->param.nShortOpCaches > 0) { ++ dev->param.n_caches > 0) { int i; void *buf; - int srCacheBytes = dev->nShortOpCaches * sizeof(yaffs_ChunkCache); -+ int srCacheBytes = dev->param.nShortOpCaches * sizeof(yaffs_ChunkCache); ++ int cacheBytes = dev->param.n_caches * sizeof(yaffs_cache_t); - if (dev->nShortOpCaches > YAFFS_MAX_SHORT_OP_CACHES) - dev->nShortOpCaches = YAFFS_MAX_SHORT_OP_CACHES; -+ if (dev->param.nShortOpCaches > YAFFS_MAX_SHORT_OP_CACHES) -+ dev->param.nShortOpCaches = YAFFS_MAX_SHORT_OP_CACHES; ++ if (dev->param.n_caches > YAFFS_MAX_SHORT_OP_CACHES) ++ dev->param.n_caches = YAFFS_MAX_SHORT_OP_CACHES; - dev->srCache = YMALLOC(srCacheBytes); +- dev->srCache = YMALLOC(srCacheBytes); ++ dev->cache = YMALLOC(cacheBytes); -@@ -7296,11 +5312,11 @@ int yaffs_GutsInitialise(yaffs_Device *d - if (dev->srCache) - memset(dev->srCache, 0, srCacheBytes); +- buf = (__u8 *) dev->srCache; ++ buf = (__u8 *) dev->cache; + +- if (dev->srCache) +- memset(dev->srCache, 0, srCacheBytes); ++ if (dev->cache) ++ memset(dev->cache, 0, cacheBytes); - for (i = 0; i < dev->nShortOpCaches && buf; i++) { -+ for (i = 0; i < dev->param.nShortOpCaches && buf; i++) { - dev->srCache[i].object = NULL; - dev->srCache[i].lastUse = 0; - dev->srCache[i].dirty = 0; +- dev->srCache[i].object = NULL; +- dev->srCache[i].lastUse = 0; +- dev->srCache[i].dirty = 0; - dev->srCache[i].data = buf = YMALLOC_DMA(dev->totalBytesPerChunk); -+ dev->srCache[i].data = buf = YMALLOC_DMA(dev->param.totalBytesPerChunk); ++ for (i = 0; i < dev->param.n_caches && buf; i++) { ++ dev->cache[i].object = NULL; ++ dev->cache[i].last_use = 0; ++ dev->cache[i].dirty = 0; ++ dev->cache[i].data = buf = YMALLOC_DMA(dev->param.total_bytes_per_chunk); } if (!buf) init_failed = 1; -@@ -7311,19 +5327,18 @@ int yaffs_GutsInitialise(yaffs_Device *d - dev->cacheHits = 0; + +- dev->srLastUse = 0; ++ dev->cache_last_use = 0; + } + +- dev->cacheHits = 0; ++ dev->cache_hits = 0; if (!init_failed) { - dev->gcCleanupList = YMALLOC(dev->nChunksPerBlock * sizeof(__u32)); -+ dev->gcCleanupList = YMALLOC(dev->param.nChunksPerBlock * sizeof(__u32)); - if (!dev->gcCleanupList) +- if (!dev->gcCleanupList) ++ dev->gc_cleanup_list = YMALLOC(dev->param.chunks_per_block * sizeof(__u32)); ++ if (!dev->gc_cleanup_list) init_failed = 1; } - if (dev->isYaffs2) - dev->useHeaderFileSize = 1; -+ if (dev->param.isYaffs2) -+ dev->param.useHeaderFileSize = 1; ++ if (dev->param.is_yaffs2) ++ dev->param.use_header_file_size = 1; - if (!init_failed && !yaffs_InitialiseBlocks(dev)) +- if (!init_failed && !yaffs_InitialiseBlocks(dev)) ++ if (!init_failed && !yaffs_init_blocks(dev)) init_failed = 1; - yaffs_InitialiseTnodes(dev); - yaffs_InitialiseObjects(dev); -+ yaffs_InitialiseTnodesAndObjects(dev); ++ yaffs_init_tnodes_and_objs(dev); - if (!init_failed && !yaffs_CreateInitialDirectories(dev)) +- if (!init_failed && !yaffs_CreateInitialDirectories(dev)) ++ if (!init_failed && !yaffs_create_initial_dir(dev)) init_failed = 1; -@@ -7331,8 +5346,8 @@ int yaffs_GutsInitialise(yaffs_Device *d + if (!init_failed) { /* Now scan the flash. */ - if (dev->isYaffs2) { - if (yaffs_CheckpointRestore(dev)) { -+ if (dev->param.isYaffs2) { -+ if (yaffs2_CheckpointRestore(dev)) { - yaffs_CheckObjectDetailsLoaded(dev->rootDir); +- yaffs_CheckObjectDetailsLoaded(dev->rootDir); ++ if (dev->param.is_yaffs2) { ++ if (yaffs2_checkpt_restore(dev)) { ++ yaffs_check_obj_details_loaded(dev->root_dir); T(YAFFS_TRACE_ALWAYS, (TSTR("yaffs: restored from checkpoint" TENDSTR))); -@@ -7342,9 +5357,8 @@ int yaffs_GutsInitialise(yaffs_Device *d + } else { +@@ -7341,128 +5356,129 @@ int yaffs_GutsInitialise(yaffs_Device *d + /* Clean up the mess caused by an aborted checkpoint load * and scan backwards. */ - yaffs_DeinitialiseBlocks(dev); +- yaffs_DeinitialiseBlocks(dev); - yaffs_DeinitialiseTnodes(dev); - yaffs_DeinitialiseObjects(dev); ++ yaffs_deinit_blocks(dev); -+ yaffs_DeinitialiseTnodesAndObjects(dev); ++ yaffs_deinit_tnodes_and_objs(dev); - dev->nErasedBlocks = 0; - dev->nFreeChunks = 0; -@@ -7353,24 +5367,25 @@ int yaffs_GutsInitialise(yaffs_Device *d - dev->nDeletedFiles = 0; - dev->nUnlinkedFiles = 0; - dev->nBackgroundDeletions = 0; +- dev->nErasedBlocks = 0; +- dev->nFreeChunks = 0; +- dev->allocationBlock = -1; +- dev->allocationPage = -1; +- dev->nDeletedFiles = 0; +- dev->nUnlinkedFiles = 0; +- dev->nBackgroundDeletions = 0; - dev->oldestDirtySequence = 0; ++ dev->n_erased_blocks = 0; ++ dev->n_free_chunks = 0; ++ dev->alloc_block = -1; ++ dev->alloc_page = -1; ++ dev->n_deleted_files = 0; ++ dev->n_unlinked_files = 0; ++ dev->n_bg_deletions = 0; - if (!init_failed && !yaffs_InitialiseBlocks(dev)) +- if (!init_failed && !yaffs_InitialiseBlocks(dev)) ++ if (!init_failed && !yaffs_init_blocks(dev)) init_failed = 1; - yaffs_InitialiseTnodes(dev); - yaffs_InitialiseObjects(dev); -+ yaffs_InitialiseTnodesAndObjects(dev); ++ yaffs_init_tnodes_and_objs(dev); - if (!init_failed && !yaffs_CreateInitialDirectories(dev)) +- if (!init_failed && !yaffs_CreateInitialDirectories(dev)) ++ if (!init_failed && !yaffs_create_initial_dir(dev)) init_failed = 1; - if (!init_failed && !yaffs_ScanBackwards(dev)) -+ if (!init_failed && !yaffs2_ScanBackwards(dev)) ++ if (!init_failed && !yaffs2_scan_backwards(dev)) init_failed = 1; } - } else if (!yaffs_Scan(dev)) -+ } else if (!yaffs1_Scan(dev)) ++ } else if (!yaffs1_scan(dev)) init_failed = 1; - yaffs_StripDeletedObjects(dev); -+ yaffs_FixHangingObjects(dev); -+ if(dev->param.emptyLostAndFound) -+ yaffs_EmptyLostAndFound(dev); +- yaffs_StripDeletedObjects(dev); ++ yaffs_strip_deleted_objs(dev); ++ yaffs_fix_hanging_objs(dev); ++ if(dev->param.empty_lost_n_found) ++ yaffs_empty_l_n_f(dev); } if (init_failed) { -@@ -7394,6 +5409,9 @@ int yaffs_GutsInitialise(yaffs_Device *d - yaffs_VerifyFreeChunks(dev); - yaffs_VerifyBlocks(dev); + /* Clean up the mess */ + T(YAFFS_TRACE_TRACING, +- (TSTR("yaffs: yaffs_GutsInitialise() aborted.\n" TENDSTR))); ++ (TSTR("yaffs: yaffs_guts_initialise() aborted.\n" TENDSTR))); +- yaffs_Deinitialise(dev); ++ yaffs_deinitialise(dev); + return YAFFS_FAIL; + } + + /* Zero out stats */ +- dev->nPageReads = 0; +- dev->nPageWrites = 0; +- dev->nBlockErasures = 0; +- dev->nGCCopies = 0; +- dev->nRetriedWrites = 0; +- +- dev->nRetiredBlocks = 0; +- +- yaffs_VerifyFreeChunks(dev); +- yaffs_VerifyBlocks(dev); +- ++ dev->n_page_reads = 0; ++ dev->n_page_writes = 0; ++ dev->n_erasures = 0; ++ dev->n_gc_copies = 0; ++ dev->n_retired_writes = 0; ++ ++ dev->n_retired_blocks = 0; ++ ++ yaffs_verify_free_chunks(dev); ++ yaffs_verify_blocks(dev); ++ + /* Clean up any aborted checkpoint data */ -+ if(!dev->isCheckpointed && dev->blocksInCheckpoint > 0) -+ yaffs2_InvalidateCheckpoint(dev); ++ if(!dev->is_checkpointed && dev->blocks_in_checkpt > 0) ++ yaffs2_checkpt_invalidate(dev); T(YAFFS_TRACE_TRACING, - (TSTR("yaffs: yaffs_GutsInitialise() done.\n" TENDSTR))); -@@ -7407,12 +5425,11 @@ void yaffs_Deinitialise(yaffs_Device *de +- (TSTR("yaffs: yaffs_GutsInitialise() done.\n" TENDSTR))); ++ (TSTR("yaffs: yaffs_guts_initialise() done.\n" TENDSTR))); + return YAFFS_OK; + + } + +-void yaffs_Deinitialise(yaffs_Device *dev) ++void yaffs_deinitialise(yaffs_dev_t *dev) + { +- if (dev->isMounted) { ++ if (dev->is_mounted) { int i; - yaffs_DeinitialiseBlocks(dev); +- yaffs_DeinitialiseBlocks(dev); - yaffs_DeinitialiseTnodes(dev); - yaffs_DeinitialiseObjects(dev); - if (dev->nShortOpCaches > 0 && -+ yaffs_DeinitialiseTnodesAndObjects(dev); -+ if (dev->param.nShortOpCaches > 0 && - dev->srCache) { +- dev->srCache) { ++ yaffs_deinit_blocks(dev); ++ yaffs_deinit_tnodes_and_objs(dev); ++ if (dev->param.n_caches > 0 && ++ dev->cache) { - for (i = 0; i < dev->nShortOpCaches; i++) { -+ for (i = 0; i < dev->param.nShortOpCaches; i++) { - if (dev->srCache[i].data) - YFREE(dev->srCache[i].data); - dev->srCache[i].data = NULL; -@@ -7429,34 +5446,33 @@ void yaffs_Deinitialise(yaffs_Device *de +- if (dev->srCache[i].data) +- YFREE(dev->srCache[i].data); +- dev->srCache[i].data = NULL; ++ for (i = 0; i < dev->param.n_caches; i++) { ++ if (dev->cache[i].data) ++ YFREE(dev->cache[i].data); ++ dev->cache[i].data = NULL; + } - dev->isMounted = 0; +- YFREE(dev->srCache); +- dev->srCache = NULL; ++ YFREE(dev->cache); ++ dev->cache = NULL; + } + +- YFREE(dev->gcCleanupList); ++ YFREE(dev->gc_cleanup_list); + + for (i = 0; i < YAFFS_N_TEMP_BUFFERS; i++) +- YFREE(dev->tempBuffer[i].buffer); ++ YFREE(dev->temp_buffer[i].buffer); + +- dev->isMounted = 0; ++ dev->is_mounted = 0; - if (dev->deinitialiseNAND) - dev->deinitialiseNAND(dev); -+ if (dev->param.deinitialiseNAND) -+ dev->param.deinitialiseNAND(dev); ++ if (dev->param.deinitialise_flash_fn) ++ dev->param.deinitialise_flash_fn(dev); } } -static int yaffs_CountFreeChunks(yaffs_Device *dev) -+int yaffs_CountFreeChunks(yaffs_Device *dev) ++int yaffs_count_free_chunks(yaffs_dev_t *dev) { - int nFree; + int nFree=0; int b; - yaffs_BlockInfo *blk; - +- yaffs_BlockInfo *blk; +- - for (nFree = 0, b = dev->internalStartBlock; b <= dev->internalEndBlock; - b++) { - blk = yaffs_GetBlockInfo(dev, b); -- -+ blk = dev->blockInfo; -+ for (b = dev->internalStartBlock; b <= dev->internalEndBlock; b++) { - switch (blk->blockState) { ++ yaffs_block_info_t *blk; + +- switch (blk->blockState) { ++ blk = dev->block_info; ++ for (b = dev->internal_start_block; b <= dev->internal_end_block; b++) { ++ switch (blk->block_state) { case YAFFS_BLOCK_STATE_EMPTY: case YAFFS_BLOCK_STATE_ALLOCATING: case YAFFS_BLOCK_STATE_COLLECTING: case YAFFS_BLOCK_STATE_FULL: nFree += - (dev->nChunksPerBlock - blk->pagesInUse + -+ (dev->param.nChunksPerBlock - blk->pagesInUse + - blk->softDeletions); +- blk->softDeletions); ++ (dev->param.chunks_per_block - blk->pages_in_use + ++ blk->soft_del_pages); break; default: break; @@ -14299,33 +15432,53 @@ } return nFree; -@@ -7481,21 +5497,19 @@ int yaffs_GetNumberOfFreeChunks(yaffs_De + } + +-int yaffs_GetNumberOfFreeChunks(yaffs_Device *dev) ++int yaffs_get_n_free_chunks(yaffs_dev_t *dev) + { + /* This is what we report to the outside world */ + +@@ -7472,30 +5488,28 @@ int yaffs_GetNumberOfFreeChunks(yaffs_De + int i; + + #if 1 +- nFree = dev->nFreeChunks; ++ nFree = dev->n_free_chunks; + #else +- nFree = yaffs_CountFreeChunks(dev); ++ nFree = yaffs_count_free_chunks(dev); + #endif + +- nFree += dev->nDeletedFiles; ++ nFree += dev->n_deleted_files; /* Now count the number of dirty chunks in the cache and subtract those */ - for (nDirtyCacheChunks = 0, i = 0; i < dev->nShortOpCaches; i++) { -+ for (nDirtyCacheChunks = 0, i = 0; i < dev->param.nShortOpCaches; i++) { - if (dev->srCache[i].dirty) +- if (dev->srCache[i].dirty) ++ for (nDirtyCacheChunks = 0, i = 0; i < dev->param.n_caches; i++) { ++ if (dev->cache[i].dirty) nDirtyCacheChunks++; } nFree -= nDirtyCacheChunks; - nFree -= ((dev->nReservedBlocks + 1) * dev->nChunksPerBlock); -+ nFree -= ((dev->param.nReservedBlocks + 1) * dev->param.nChunksPerBlock); ++ nFree -= ((dev->param.n_reserved_blocks + 1) * dev->param.chunks_per_block); /* Now we figure out how much to reserve for the checkpoint and report that... */ - blocksForCheckpoint = yaffs_CalcCheckpointBlocksRequired(dev) - dev->blocksInCheckpoint; - if (blocksForCheckpoint < 0) - blocksForCheckpoint = 0; -+ blocksForCheckpoint = yaffs2_CalcCheckpointBlocksRequired(dev); ++ blocksForCheckpoint = yaffs_calc_checkpt_blocks_required(dev); - nFree -= (blocksForCheckpoint * dev->nChunksPerBlock); -+ nFree -= (blocksForCheckpoint * dev->param.nChunksPerBlock); ++ nFree -= (blocksForCheckpoint * dev->param.chunks_per_block); if (nFree < 0) nFree = 0; -@@ -7504,27 +5518,6 @@ int yaffs_GetNumberOfFreeChunks(yaffs_De +@@ -7504,49 +5518,27 @@ int yaffs_GetNumberOfFreeChunks(yaffs_De } @@ -14353,7 +15506,8 @@ /*---------------------------------------- YAFFS test code ----------------------*/ -@@ -7532,7 +5525,7 @@ static void yaffs_VerifyFreeChunks(yaffs +-#define yaffs_CheckStruct(structure, syze, name) \ ++#define yaffs_check_struct(structure, syze, name) \ do { \ if (sizeof(structure) != syze) { \ T(YAFFS_TRACE_ALWAYS, (TSTR("%s should be %d but is %d\n" TENDSTR),\ @@ -14362,20 +15516,30 @@ return YAFFS_FAIL; \ } \ } while (0) -@@ -7542,9 +5535,8 @@ static int yaffs_CheckStructures(void) - /* yaffs_CheckStruct(yaffs_Tags,8,"yaffs_Tags"); */ - /* yaffs_CheckStruct(yaffs_TagsUnion,8,"yaffs_TagsUnion"); */ - /* yaffs_CheckStruct(yaffs_Spare,16,"yaffs_Spare"); */ + +-static int yaffs_CheckStructures(void) ++static int yaffs_check_structures(void) + { +-/* yaffs_CheckStruct(yaffs_Tags,8,"yaffs_Tags"); */ +-/* yaffs_CheckStruct(yaffs_TagsUnion,8,"yaffs_TagsUnion"); */ +-/* yaffs_CheckStruct(yaffs_Spare,16,"yaffs_Spare"); */ -#ifndef CONFIG_YAFFS_TNODE_LIST_DEBUG - yaffs_CheckStruct(yaffs_Tnode, 2 * YAFFS_NTNODES_LEVEL0, "yaffs_Tnode"); -#endif -+/* yaffs_CheckStruct(yaffs_Tnode, 2 * YAFFS_NTNODES_LEVEL0, "yaffs_Tnode"); */ ++/* yaffs_check_struct(yaffs_tags_t,8,"yaffs_tags_t"); */ ++/* yaffs_check_struct(yaffs_tags_union_t,8,"yaffs_tags_union_t"); */ ++/* yaffs_check_struct(yaffs_spare,16,"yaffs_spare"); */ ++/* yaffs_check_struct(yaffs_tnode_t, 2 * YAFFS_NTNODES_LEVEL0, "yaffs_tnode_t"); */ + #ifndef CONFIG_YAFFS_WINCE - yaffs_CheckStruct(yaffs_ObjectHeader, 512, "yaffs_ObjectHeader"); +- yaffs_CheckStruct(yaffs_ObjectHeader, 512, "yaffs_ObjectHeader"); ++ yaffs_check_struct(yaffs_obj_header, 512, "yaffs_obj_header"); #endif ---- a/fs/yaffs2/yaffs_guts.h -+++ b/fs/yaffs2/yaffs_guts.h + return YAFFS_OK; + } +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_guts.h linux-2.6.36-rc8.new/fs/yaffs2/yaffs_guts.h +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_guts.h 2010-10-20 13:17:58.954000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_guts.h 2010-10-20 13:28:16.061000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet another Flash File System . A NAND-flash specific file system. @@ -14429,18 +15593,165 @@ #define YAFFS_MAX_SHORT_OP_CACHES 20 -@@ -119,11 +119,7 @@ typedef struct { +@@ -113,18 +113,14 @@ + + /* ChunkCache is used for short read/write operations.*/ + typedef struct { +- struct yaffs_ObjectStruct *object; +- int chunkId; +- int lastUse; ++ struct yaffs_obj_s *object; ++ int chunk_id; ++ int last_use; int dirty; - int nBytes; /* Only valid if the cache is dirty */ +- int nBytes; /* Only valid if the cache is dirty */ ++ int n_bytes; /* Only valid if the cache is dirty */ int locked; /* Can't push out or flush while locked. */ -#ifdef CONFIG_YAFFS_YAFFS2 __u8 *data; -#else - __u8 data[YAFFS_BYTES_PER_CHUNK]; -#endif - } yaffs_ChunkCache; +-} yaffs_ChunkCache; ++} yaffs_cache_t; + +@@ -135,18 +131,18 @@ typedef struct { + + #ifndef CONFIG_YAFFS_NO_YAFFS1 + typedef struct { +- unsigned chunkId:20; +- unsigned serialNumber:2; +- unsigned byteCountLSB:10; +- unsigned objectId:18; ++ unsigned chunk_id:20; ++ unsigned serial_number:2; ++ unsigned n_bytes_lsb:10; ++ unsigned obj_id:18; + unsigned ecc:12; +- unsigned byteCountMSB:2; +-} yaffs_Tags; ++ unsigned n_bytes_msb:2; ++} yaffs_tags_t; + + typedef union { +- yaffs_Tags asTags; +- __u8 asBytes[8]; +-} yaffs_TagsUnion; ++ yaffs_tags_t as_tags; ++ __u8 as_bytes[8]; ++} yaffs_tags_union_t; + + #endif + +@@ -157,7 +153,7 @@ typedef enum { + YAFFS_ECC_RESULT_NO_ERROR, + YAFFS_ECC_RESULT_FIXED, + YAFFS_ECC_RESULT_UNFIXED +-} yaffs_ECCResult; ++} yaffs_ecc_result; + + typedef enum { + YAFFS_OBJECT_TYPE_UNKNOWN, +@@ -166,64 +162,64 @@ typedef enum { + YAFFS_OBJECT_TYPE_DIRECTORY, + YAFFS_OBJECT_TYPE_HARDLINK, + YAFFS_OBJECT_TYPE_SPECIAL +-} yaffs_ObjectType; ++} yaffs_obj_type; + + #define YAFFS_OBJECT_TYPE_MAX YAFFS_OBJECT_TYPE_SPECIAL + + typedef struct { + +- unsigned validMarker0; +- unsigned chunkUsed; /* Status of the chunk: used or unused */ +- unsigned objectId; /* If 0 then this is not part of an object (unused) */ +- unsigned chunkId; /* If 0 then this is a header, else a data chunk */ +- unsigned byteCount; /* Only valid for data chunks */ ++ unsigned validity1; ++ unsigned chunk_used; /* Status of the chunk: used or unused */ ++ unsigned obj_id; /* If 0 then this is not part of an object (unused) */ ++ unsigned chunk_id; /* If 0 then this is a header, else a data chunk */ ++ unsigned n_bytes; /* Only valid for data chunks */ + + /* The following stuff only has meaning when we read */ +- yaffs_ECCResult eccResult; +- unsigned blockBad; ++ yaffs_ecc_result ecc_result; ++ unsigned block_bad; + + /* YAFFS 1 stuff */ +- unsigned chunkDeleted; /* The chunk is marked deleted */ +- unsigned serialNumber; /* Yaffs1 2-bit serial number */ ++ unsigned is_deleted; /* The chunk is marked deleted */ ++ unsigned serial_number; /* Yaffs1 2-bit serial number */ + + /* YAFFS2 stuff */ +- unsigned sequenceNumber; /* The sequence number of this block */ ++ unsigned seq_number; /* The sequence number of this block */ + + /* Extra info if this is an object header (YAFFS2 only) */ + +- unsigned extraHeaderInfoAvailable; /* There is extra info available if this is not zero */ +- unsigned extraParentObjectId; /* The parent object */ +- unsigned extraIsShrinkHeader; /* Is it a shrink header? */ +- unsigned extraShadows; /* Does this shadow another object? */ ++ unsigned extra_available; /* There is extra info available if this is not zero */ ++ unsigned extra_parent_id; /* The parent object */ ++ unsigned extra_is_shrink; /* Is it a shrink header? */ ++ unsigned extra_shadows; /* Does this shadow another object? */ + +- yaffs_ObjectType extraObjectType; /* What object type? */ ++ yaffs_obj_type extra_obj_type; /* What object type? */ + +- unsigned extraFileLength; /* Length if it is a file */ +- unsigned extraEquivalentObjectId; /* Equivalent object Id if it is a hard link */ ++ unsigned extra_length; /* Length if it is a file */ ++ unsigned extra_equiv_id; /* Equivalent object Id if it is a hard link */ + +- unsigned validMarker1; ++ unsigned validty1; + +-} yaffs_ExtendedTags; ++} yaffs_ext_tags; + + /* Spare structure for YAFFS1 */ + typedef struct { +- __u8 tagByte0; +- __u8 tagByte1; +- __u8 tagByte2; +- __u8 tagByte3; +- __u8 pageStatus; /* set to 0 to delete the chunk */ +- __u8 blockStatus; +- __u8 tagByte4; +- __u8 tagByte5; ++ __u8 tb0; ++ __u8 tb1; ++ __u8 tb2; ++ __u8 tb3; ++ __u8 page_status; /* set to 0 to delete the chunk */ ++ __u8 block_status; ++ __u8 tb4; ++ __u8 tb5; + __u8 ecc1[3]; +- __u8 tagByte6; +- __u8 tagByte7; ++ __u8 tb6; ++ __u8 tb7; + __u8 ecc2[3]; +-} yaffs_Spare; ++} yaffs_spare; + + /*Special structure for passing through to mtd */ +-struct yaffs_NANDSpare { +- yaffs_Spare spare; ++struct yaffs_nand_spare { ++ yaffs_spare spare; + int eccres1; + int eccres2; + }; @@ -234,6 +230,8 @@ typedef enum { YAFFS_BLOCK_STATE_UNKNOWN = 0, @@ -14450,7 +15761,7 @@ YAFFS_BLOCK_STATE_NEEDS_SCANNING, /* The block might have something on it (ie it is allocating or full, perhaps empty) * but it needs to be scanned to determine its true state. -@@ -249,21 +247,23 @@ typedef enum { +@@ -249,67 +247,69 @@ typedef enum { /* This block is partially allocated. * At least one page holds valid data. * This is the one currently being used for page @@ -14478,20 +15789,122 @@ YAFFS_BLOCK_STATE_COLLECTING, /* This block is being garbage collected */ -@@ -351,23 +351,12 @@ typedef struct { + + YAFFS_BLOCK_STATE_DEAD + /* This block has failed and is not in use */ +-} yaffs_BlockState; ++} yaffs_block_state_t; + + #define YAFFS_NUMBER_OF_BLOCK_STATES (YAFFS_BLOCK_STATE_DEAD + 1) + + + typedef struct { + +- int softDeletions:10; /* number of soft deleted pages */ +- int pagesInUse:10; /* number of pages in use */ +- unsigned blockState:4; /* One of the above block states. NB use unsigned because enum is sometimes an int */ +- __u32 needsRetiring:1; /* Data has failed on this block, need to get valid data off */ ++ int soft_del_pages:10; /* number of soft deleted pages */ ++ int pages_in_use:10; /* number of pages in use */ ++ unsigned block_state:4; /* One of the above block states. NB use unsigned because enum is sometimes an int */ ++ __u32 needs_retiring:1; /* Data has failed on this block, need to get valid data off */ + /* and retire the block. */ +- __u32 skipErasedCheck:1; /* If this is set we can skip the erased check on this block */ +- __u32 gcPrioritise:1; /* An ECC check or blank check has failed on this block. ++ __u32 skip_erased_check:1; /* If this is set we can skip the erased check on this block */ ++ __u32 gc_prioritise:1; /* An ECC check or blank check has failed on this block. + It should be prioritised for GC */ +- __u32 chunkErrorStrikes:3; /* How many times we've had ecc etc failures on this block and tried to reuse it */ ++ __u32 chunk_error_strikes:3; /* How many times we've had ecc etc failures on this block and tried to reuse it */ + + #ifdef CONFIG_YAFFS_YAFFS2 +- __u32 hasShrinkHeader:1; /* This block has at least one shrink object header */ +- __u32 sequenceNumber; /* block sequence number for yaffs2 */ ++ __u32 has_shrink_hdr:1; /* This block has at least one shrink object header */ ++ __u32 seq_number; /* block sequence number for yaffs2 */ + #endif + +-} yaffs_BlockInfo; ++} yaffs_block_info_t; + + /* -------------------------- Object structure -------------------------------*/ + /* This is the object structure as stored on NAND */ + + typedef struct { +- yaffs_ObjectType type; ++ yaffs_obj_type type; + + /* Apply to everything */ +- int parentObjectId; +- __u16 sum__NoLongerUsed; /* checksum of name. No longer used */ ++ int parent_obj_id; ++ __u16 sum_no_longer_used; /* checksum of name. No longer used */ + YCHAR name[YAFFS_MAX_NAME_LENGTH + 1]; + + /* The following apply to directories, files, symlinks - not hard links */ + __u32 yst_mode; /* protection */ + + #ifdef CONFIG_YAFFS_WINCE +- __u32 notForWinCE[5]; ++ __u32 not_for_wince[5]; + #else + __u32 yst_uid; + __u32 yst_gid; +@@ -319,10 +319,10 @@ typedef struct { + #endif + + /* File size applies to files only */ +- int fileSize; ++ int file_size; + + /* Equivalent object id applies to hard links only. */ +- int equivalentObjectId; ++ int equiv_id; + + /* Alias is for symlinks only. */ + YCHAR alias[YAFFS_MAX_ALIAS_LENGTH + 1]; +@@ -334,40 +334,29 @@ typedef struct { + __u32 win_atime[2]; + __u32 win_mtime[2]; + #else +- __u32 roomToGrow[6]; ++ __u32 room_to_grow[6]; + + #endif +- __u32 inbandShadowsObject; +- __u32 inbandIsShrink; ++ __u32 inband_shadowed_obj_id; ++ __u32 inband_is_shrink; + +- __u32 reservedSpace[2]; +- int shadowsObject; /* This object header shadows the specified object if > 0 */ ++ __u32 reserved[2]; ++ int shadows_obj; /* This object header shadows the specified object if > 0 */ + +- /* isShrink applies to object headers written when we shrink the file (ie resize) */ +- __u32 isShrink; ++ /* is_shrink applies to object headers written when we shrink the file (ie resize) */ ++ __u32 is_shrink; + +-} yaffs_ObjectHeader; ++} yaffs_obj_header; + /*--------------------------- Tnode -------------------------- */ - union yaffs_Tnode_union { +-union yaffs_Tnode_union { -#ifdef CONFIG_YAFFS_TNODE_LIST_DEBUG - union yaffs_Tnode_union *internal[YAFFS_NTNODES_INTERNAL + 1]; -#else - union yaffs_Tnode_union *internal[YAFFS_NTNODES_INTERNAL]; +- union yaffs_Tnode_union *internal[YAFFS_NTNODES_INTERNAL]; -#endif -/* __u16 level0[YAFFS_NTNODES_LEVEL0]; */ ++union yaffs_tnode_union { ++ union yaffs_tnode_union *internal[YAFFS_NTNODES_INTERNAL]; }; - typedef union yaffs_Tnode_union yaffs_Tnode; +-typedef union yaffs_Tnode_union yaffs_Tnode; ++typedef union yaffs_tnode_union yaffs_tnode_t; -struct yaffs_TnodeList_struct { - struct yaffs_TnodeList_struct *next; @@ -14502,175 +15915,359 @@ /*------------------------ Object -----------------------------*/ /* An object can be one of: -@@ -387,6 +376,7 @@ typedef struct { +@@ -378,82 +367,85 @@ typedef struct yaffs_TnodeList_struct ya + */ + + typedef struct { +- __u32 fileSize; +- __u32 scannedFileSize; +- __u32 shrinkSize; +- int topLevel; +- yaffs_Tnode *top; +-} yaffs_FileStructure; ++ __u32 file_size; ++ __u32 scanned_size; ++ __u32 shrink_size; ++ int top_level; ++ yaffs_tnode_t *top; ++} yaffs_file_s; typedef struct { struct ylist_head children; /* list of child links */ +-} yaffs_DirectoryStructure; + struct ylist_head dirty; /* Entry for list of dirty directories */ - } yaffs_DirectoryStructure; ++} yaffs_dir_s; typedef struct { -@@ -405,6 +395,8 @@ typedef union { - yaffs_HardLinkStructure hardLinkVariant; - } yaffs_ObjectVariant; + YCHAR *alias; +-} yaffs_SymLinkStructure; ++} yaffs_symlink_t; + typedef struct { +- struct yaffs_ObjectStruct *equivalentObject; +- __u32 equivalentObjectId; +-} yaffs_HardLinkStructure; ++ struct yaffs_obj_s *equiv_obj; ++ __u32 equiv_id; ++} yaffs_hard_link_s; + + typedef union { +- yaffs_FileStructure fileVariant; +- yaffs_DirectoryStructure directoryVariant; +- yaffs_SymLinkStructure symLinkVariant; +- yaffs_HardLinkStructure hardLinkVariant; +-} yaffs_ObjectVariant; ++ yaffs_file_s file_variant; ++ yaffs_dir_s dir_variant; ++ yaffs_symlink_t symlink_variant; ++ yaffs_hard_link_s hardlink_variant; ++} yaffs_obj_variant; + + - struct yaffs_ObjectStruct { + +-struct yaffs_ObjectStruct { ++struct yaffs_obj_s { __u8 deleted:1; /* This should only apply to unlinked files. */ - __u8 softDeleted:1; /* it has also been soft deleted */ -@@ -424,6 +416,10 @@ struct yaffs_ObjectStruct { +- __u8 softDeleted:1; /* it has also been soft deleted */ ++ __u8 soft_del:1; /* it has also been soft deleted */ + __u8 unlinked:1; /* An unlinked file. The file should be in the unlinked directory.*/ + __u8 fake:1; /* A fake object has no presence on NAND. */ +- __u8 renameAllowed:1; /* Some objects are not allowed to be renamed. */ +- __u8 unlinkAllowed:1; ++ __u8 rename_allowed:1; /* Some objects are not allowed to be renamed. */ ++ __u8 unlink_allowed:1; + __u8 dirty:1; /* the object needs to be written to flash */ + __u8 valid:1; /* When the file system is being loaded up, this + * object might be created before the data + * is available (ie. file data records appear before the header). + */ +- __u8 lazyLoaded:1; /* This object has been lazy loaded and is missing some detail */ ++ __u8 lazy_loaded:1; /* This object has been lazy loaded and is missing some detail */ + +- __u8 deferedFree:1; /* For Linux kernel. Object is removed from NAND, but is ++ __u8 defered_free:1; /* For Linux kernel. Object is removed from NAND, but is + * 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 isShadowed:1; /* This object is shadowed on the way to being renamed. */ +- __u8 beingCreated:1; /* This object is still being created so skip some checks. */ ++ __u8 being_created:1; /* This object is still being created so skip some checks. */ ++ __u8 is_shadowed:1; /* This object is shadowed on the way to being renamed. */ + -+ __u8 xattrKnown:1; /* We know if this has object has xattribs or not. */ -+ __u8 hasXattr:1; /* This object has xattribs. Valid if xattrKnown. */ ++ __u8 xattr_known:1; /* We know if this has object has xattribs or not. */ ++ __u8 has_xattr:1; /* This object has xattribs. Valid if xattr_known. */ __u8 serial; /* serial number of chunk in NAND. Cached here */ __u16 sum; /* sum of the name to speed searching */ -@@ -452,10 +448,6 @@ struct yaffs_ObjectStruct { - YCHAR shortName[YAFFS_SHORT_NAME_LENGTH + 1]; - #endif --#ifndef __KERNEL__ -- __u32 inUse; +- struct yaffs_DeviceStruct *myDev; /* The device I'm on */ ++ struct yaffs_dev_s *my_dev; /* The device I'm on */ + +- struct ylist_head hashLink; /* list of objects in this hash bucket */ ++ struct ylist_head hash_link; /* list of objects in this hash bucket */ + +- struct ylist_head hardLinks; /* all the equivalent hard linked objects */ ++ struct ylist_head hard_links; /* all the equivalent hard linked objects */ + + /* directory structure stuff */ + /* also used for linking up the free list */ +- struct yaffs_ObjectStruct *parent; ++ struct yaffs_obj_s *parent; + struct ylist_head siblings; + + /* Where's my object header in NAND? */ +- int hdrChunk; ++ int hdr_chunk; + +- int nDataChunks; /* Number of data chunks attached to the file. */ ++ int n_data_chunks; /* Number of data chunks attached to the file. */ + +- __u32 objectId; /* the object id value */ ++ __u32 obj_id; /* the object id value */ + + __u32 yst_mode; + + #ifdef CONFIG_YAFFS_SHORT_NAMES_IN_RAM +- YCHAR shortName[YAFFS_SHORT_NAME_LENGTH + 1]; -#endif - +-#ifndef __KERNEL__ +- __u32 inUse; ++ YCHAR short_name[YAFFS_SHORT_NAME_LENGTH + 1]; + #endif + #ifdef CONFIG_YAFFS_WINCE - __u32 win_ctime[2]; - __u32 win_mtime[2]; -@@ -470,10 +462,7 @@ struct yaffs_ObjectStruct { +@@ -470,53 +462,43 @@ struct yaffs_ObjectStruct { __u32 yst_rdev; -#ifdef __KERNEL__ - struct inode *myInode; -- ++ void *my_inode; + -#endif -+ void *myInode; ++ yaffs_obj_type variant_type; - yaffs_ObjectType variantType; - -@@ -483,13 +472,6 @@ struct yaffs_ObjectStruct { - - typedef struct yaffs_ObjectStruct yaffs_Object; +- yaffs_ObjectType variantType; ++ yaffs_obj_variant variant; +- yaffs_ObjectVariant variant; +- +-}; +- +-typedef struct yaffs_ObjectStruct yaffs_Object; +- -struct yaffs_ObjectList_struct { - yaffs_Object *objects; - struct yaffs_ObjectList_struct *next; --}; -- + }; + -typedef struct yaffs_ObjectList_struct yaffs_ObjectList; -- ++typedef struct yaffs_obj_s yaffs_obj_t; + typedef struct { struct ylist_head list; int count; -@@ -531,12 +513,18 @@ typedef struct { +-} yaffs_ObjectBucket; ++} yaffs_obj_bucket; + + +-/* yaffs_CheckpointObject holds the definition of an object as dumped ++/* yaffs_checkpt_obj_t holds the definition of an object as dumped + * by checkpointing. + */ + + typedef struct { +- int structType; +- __u32 objectId; +- __u32 parentId; +- int hdrChunk; +- yaffs_ObjectType variantType:3; ++ int struct_type; ++ __u32 obj_id; ++ __u32 parent_id; ++ int hdr_chunk; ++ yaffs_obj_type variant_type:3; + __u8 deleted:1; +- __u8 softDeleted:1; ++ __u8 soft_del:1; + __u8 unlinked:1; + __u8 fake:1; +- __u8 renameAllowed:1; +- __u8 unlinkAllowed:1; ++ __u8 rename_allowed:1; ++ __u8 unlink_allowed:1; + __u8 serial; + +- int nDataChunks; +- __u32 fileSizeOrEquivalentObjectId; +-} yaffs_CheckpointObject; ++ int n_data_chunks; ++ __u32 size_or_equiv_obj; ++} yaffs_checkpt_obj_t; + + /*--------------------- Temporary buffers ---------------- + * +@@ -526,379 +508,462 @@ typedef struct { + typedef struct { + __u8 *buffer; + int line; /* track from whence this buffer was allocated */ +- int maxLine; +-} yaffs_TempBuffer; ++ int max_line; ++} yaffs_buffer_t; /*----------------- Device ---------------------------------*/ -struct yaffs_DeviceStruct { - struct ylist_head devList; - const char *name; - +- - /* Entry parameters set up way early. Yaffs sets up the rest.*/ - int nDataBytesPerChunk; /* Should be a power of 2 >= 512 */ -+struct yaffs_DeviceParamStruct { +- int nChunksPerBlock; /* does not need to be a power of 2 */ +- int spareBytesPerChunk; /* spare area size */ +- int startBlock; /* Start block we're allowed to use */ +- int endBlock; /* End block we're allowed to use */ +- int nReservedBlocks; /* We want this tuneable so that we can reduce */ +- /* reserved blocks on NOR and RAM. */ +- + +- /* Stuff used by the shared space checkpointing mechanism */ +- /* If this value is zero, then this mechanism is disabled */ ++struct yaffs_param_s { + const YCHAR *name; -+ + +-/* int nCheckpointReservedBlocks; */ /* Blocks to reserve for checkpoint data */ + /* + * Entry parameters set up way early. Yaffs sets up the rest. + * The structure should be zeroed out before use so that unused + * and defualt values are zero. + */ + -+ int inbandTags; /* Use unband tags */ -+ __u32 totalBytesPerChunk; /* Should be >= 512, does not need to be a power of 2 */ - int nChunksPerBlock; /* does not need to be a power of 2 */ - int spareBytesPerChunk; /* spare area size */ - int startBlock; /* Start block we're allowed to use */ -@@ -545,24 +533,24 @@ struct yaffs_DeviceStruct { - /* reserved blocks on NOR and RAM. */ ++ int inband_tags; /* Use unband tags */ ++ __u32 total_bytes_per_chunk; /* Should be >= 512, does not need to be a power of 2 */ ++ int chunks_per_block; /* does not need to be a power of 2 */ ++ int spare_bytes_per_chunk; /* spare area size */ ++ int start_block; /* Start block we're allowed to use */ ++ int end_block; /* End block we're allowed to use */ ++ int n_reserved_blocks; /* We want this tuneable so that we can reduce */ ++ /* reserved blocks on NOR and RAM. */ -- /* Stuff used by the shared space checkpointing mechanism */ -- /* If this value is zero, then this mechanism is disabled */ -- --/* int nCheckpointReservedBlocks; */ /* Blocks to reserve for checkpoint data */ -- -- - int nShortOpCaches; /* If <= 0, then short op caching is disabled, else +- int nShortOpCaches; /* If <= 0, then short op caching is disabled, else - * the number of short op caches (don't use too many) ++ int n_caches; /* If <= 0, then short op caching is disabled, else + * the number of short op caches (don't use too many). + * 10 to 20 is a good bet. */ -+ int useNANDECC; /* Flag to decide whether or not to use NANDECC on data (yaffs1) */ -+ int noTagsECC; /* Flag to decide whether or not to do ECC on packed tags (yaffs2) */ ++ int use_nand_ecc; /* Flag to decide whether or not to use NANDECC on data (yaffs1) */ ++ int no_tags_ecc; /* Flag to decide whether or not to do ECC on packed tags (yaffs2) */ - int useHeaderFileSize; /* Flag to determine if we should use file sizes from the header */ -+ int isYaffs2; /* Use yaffs2 mode on this device */ ++ int is_yaffs2; /* Use yaffs2 mode on this device */ - int useNANDECC; /* Flag to decide whether or not to use NANDECC */ -+ int emptyLostAndFound; /* Auto-empty lost+found directory on mount */ ++ int empty_lost_n_found; /* Auto-empty lost+found directory on mount */ - void *genericDevice; /* Pointer to device context - * On an mtd this holds the mtd pointer. - */ - void *superBlock; -+ int refreshPeriod; /* How often we should check to do a block refresh */ ++ int refresh_period; /* How often we should check to do a block refresh */ + + /* Checkpoint control. Can be set before or after initialisation */ -+ __u8 skipCheckpointRead; -+ __u8 skipCheckpointWrite; ++ __u8 skip_checkpt_rd; ++ __u8 skip_checkpt_wr; + -+ int enableXattr; /* Enable xattribs */ ++ int enable_xattr; /* Enable xattribs */ /* NAND access functions (Must be set before calling YAFFS)*/ -@@ -589,58 +577,68 @@ struct yaffs_DeviceStruct { - yaffs_BlockState *state, __u32 *sequenceNumber); - #endif +- int (*writeChunkToNAND) (struct yaffs_DeviceStruct *dev, +- int chunkInNAND, const __u8 *data, +- const yaffs_Spare *spare); +- int (*readChunkFromNAND) (struct yaffs_DeviceStruct *dev, +- int chunkInNAND, __u8 *data, +- yaffs_Spare *spare); +- int (*eraseBlockInNAND) (struct yaffs_DeviceStruct *dev, +- int blockInNAND); +- int (*initialiseNAND) (struct yaffs_DeviceStruct *dev); +- int (*deinitialiseNAND) (struct yaffs_DeviceStruct *dev); ++ int (*write_chunk_fn) (struct yaffs_dev_s *dev, ++ int nand_chunk, const __u8 *data, ++ const yaffs_spare *spare); ++ int (*read_chunk_fn) (struct yaffs_dev_s *dev, ++ int nand_chunk, __u8 *data, ++ yaffs_spare *spare); ++ int (*erase_fn) (struct yaffs_dev_s *dev, ++ int flash_block); ++ int (*initialise_flash_fn) (struct yaffs_dev_s *dev); ++ int (*deinitialise_flash_fn) (struct yaffs_dev_s *dev); + #ifdef CONFIG_YAFFS_YAFFS2 +- int (*writeChunkWithTagsToNAND) (struct yaffs_DeviceStruct *dev, +- int chunkInNAND, const __u8 *data, +- const yaffs_ExtendedTags *tags); +- int (*readChunkWithTagsFromNAND) (struct yaffs_DeviceStruct *dev, +- int chunkInNAND, __u8 *data, +- yaffs_ExtendedTags *tags); +- int (*markNANDBlockBad) (struct yaffs_DeviceStruct *dev, int blockNo); +- int (*queryNANDBlock) (struct yaffs_DeviceStruct *dev, int blockNo, +- yaffs_BlockState *state, __u32 *sequenceNumber); +-#endif +- - int isYaffs2; - - /* The removeObjectCallback function must be supplied by OS flavours that +- /* The removeObjectCallback function must be supplied by OS flavours that - * need it. The Linux kernel does not use this, but yaffs direct does use - * it to implement the faster readdir ++ int (*write_chunk_tags_fn) (struct yaffs_dev_s *dev, ++ int nand_chunk, const __u8 *data, ++ const yaffs_ext_tags *tags); ++ int (*read_chunk_tags_fn) (struct yaffs_dev_s *dev, ++ int nand_chunk, __u8 *data, ++ yaffs_ext_tags *tags); ++ int (*bad_block_fn) (struct yaffs_dev_s *dev, int block_no); ++ int (*query_block_fn) (struct yaffs_dev_s *dev, int block_no, ++ yaffs_block_state_t *state, __u32 *seq_number); ++#endif ++ ++ /* The remove_obj_fn function must be supplied by OS flavours that + * need it. + * yaffs direct uses it to implement the faster readdir. + * Linux uses it to protect the directory during unlocking. */ - void (*removeObjectCallback)(struct yaffs_ObjectStruct *obj); +- void (*removeObjectCallback)(struct yaffs_ObjectStruct *obj); ++ void (*remove_obj_fn)(struct yaffs_obj_s *obj); - /* Callback to mark the superblock dirsty */ - void (*markSuperBlockDirty)(void *superblock); + /* Callback to mark the superblock dirty */ -+ void (*markSuperBlockDirty)(struct yaffs_DeviceStruct *dev); ++ void (*sb_dirty_fn)(struct yaffs_dev_s *dev); + + /* Callback to control garbage collection. */ -+ unsigned (*gcControl)(struct yaffs_DeviceStruct *dev); - -+ /* Debug control flags. Don't use unless you know what you're doing */ -+ int useHeaderFileSize; /* Flag to determine if we should use file sizes from the header */ -+ int disableLazyLoad; /* Disable lazy loading on this device */ - int wideTnodesDisabled; /* Set to disable wide tnodes */ -+ int disableSoftDelete; /* yaffs 1 only: Set to disable the use of softdeletion. */ -+ -+ int deferDirectoryUpdate; /* Set to defer directory updates */ ++ unsigned (*gc_control)(struct yaffs_dev_s *dev); + ++ /* Debug control flags. Don't use unless you know what you're doing */ ++ int use_header_file_size; /* Flag to determine if we should use file sizes from the header */ ++ int disable_lazy_load; /* Disable lazy loading on this device */ ++ int wide_tnodes_disabled; /* Set to disable wide tnodes */ ++ int disable_soft_del; /* yaffs 1 only: Set to disable the use of softdeletion. */ ++ ++ int defered_dir_update; /* Set to defer directory updates */ + +- int wideTnodesDisabled; /* Set to disable wide tnodes */ +#ifdef CONFIG_YAFFS_AUTO_UNICODE -+ int autoUnicode; ++ int auto_unicode; +#endif -+ int alwaysCheckErased; /* Force chunk erased check always on */ ++ int always_check_erased; /* Force chunk erased check always on */ +}; - YCHAR *pathDividers; /* String of legal path dividers */ -+typedef struct yaffs_DeviceParamStruct yaffs_DeviceParam; ++typedef struct yaffs_param_s yaffs_param_t; -+struct yaffs_DeviceStruct { -+ struct yaffs_DeviceParamStruct param; ++struct yaffs_dev_s { ++ struct yaffs_param_s param; - /* End of stuff that must be set before initialisation. */ + /* Context storage. Holds extra OS specific data for this device */ @@ -14678,31 +16275,34 @@ - /* Checkpoint control. Can be set before or after initialisation */ - __u8 skipCheckpointRead; - __u8 skipCheckpointWrite; -+ void *osContext; -+ void *driverContext; ++ void *os_context; ++ void *driver_context; + -+ struct ylist_head devList; ++ struct ylist_head dev_list; /* Runtime parameters. Set up by YAFFS. */ -+ int nDataBytesPerChunk; ++ int data_bytes_per_chunk; - __u16 chunkGroupBits; /* 0 for devices <= 32MB. else log2(nchunks) - 16 */ +- __u16 chunkGroupSize; /* == 2^^chunkGroupBits */ + /* Non-wide tnode stuff */ -+ __u16 chunkGroupBits; /* Number of bits that need to be resolved if ++ __u16 chunk_grp_bits; /* Number of bits that need to be resolved if + * the tnodes are not wide enough. + */ - __u16 chunkGroupSize; /* == 2^^chunkGroupBits */ ++ __u16 chunk_grp_size; /* == 2^^chunk_grp_bits */ /* Stuff to support wide tnodes */ - __u32 tnodeWidth; - __u32 tnodeMask; -+ __u32 tnodeSize; +- __u32 tnodeWidth; +- __u32 tnodeMask; ++ __u32 tnode_width; ++ __u32 tnode_mask; ++ __u32 tnode_size; /* Stuff for figuring out file offset to chunk conversions */ - __u32 chunkShift; /* Shift value */ - __u32 chunkDiv; /* Divisor after shifting: 1 for power-of-2 sizes */ - __u32 chunkMask; /* Mask to use for power-of-2 case */ - +- __u32 chunkShift; /* Shift value */ +- __u32 chunkDiv; /* Divisor after shifting: 1 for power-of-2 sizes */ +- __u32 chunkMask; /* Mask to use for power-of-2 case */ +- - /* Stuff to handle inband tags */ - int inbandTags; - __u32 totalBytesPerChunk; @@ -14716,18 +16316,81 @@ - */ - void (*putSuperFunc) (struct super_block *sb); -#endif ++ __u32 chunk_shift; /* Shift value */ ++ __u32 chunk_div; /* Divisor after shifting: 1 for power-of-2 sizes */ ++ __u32 chunk_mask; /* Mask to use for power-of-2 case */ - int isMounted; -+ int isMounted; -+ int readOnly; - int isCheckpointed; +- int isCheckpointed; ++ ++ int is_mounted; ++ int read_only; ++ int is_checkpointed; -@@ -682,51 +680,31 @@ struct yaffs_DeviceStruct { - __u32 allocationPage; - int allocationBlockFinder; /* Used to search for next allocation block */ + /* Stuff to support block offsetting to support start block zero */ +- int internalStartBlock; +- int internalEndBlock; +- int blockOffset; +- int chunkOffset; ++ int internal_start_block; ++ int internal_end_block; ++ int block_offset; ++ int chunk_offset; + + /* Runtime checkpointing stuff */ +- int checkpointPageSequence; /* running sequence number of checkpoint pages */ +- int checkpointByteCount; +- int checkpointByteOffset; +- __u8 *checkpointBuffer; +- int checkpointOpenForWrite; +- int blocksInCheckpoint; +- int checkpointCurrentChunk; +- int checkpointCurrentBlock; +- int checkpointNextBlock; +- int *checkpointBlockList; +- int checkpointMaxBlocks; +- __u32 checkpointSum; +- __u32 checkpointXor; ++ int checkpt_page_seq; /* running sequence number of checkpoint pages */ ++ int checkpt_byte_count; ++ int checkpt_byte_offs; ++ __u8 *checkpt_buffer; ++ int checkpt_open_write; ++ int blocks_in_checkpt; ++ int checkpt_cur_chunk; ++ int checkpt_cur_block; ++ int checkpt_next_block; ++ int *checkpt_block_list; ++ int checkpt_max_blocks; ++ __u32 checkpt_sum; ++ __u32 checkpt_xor; + +- int nCheckpointBlocksRequired; /* Number of blocks needed to store current checkpoint set */ ++ int checkpoint_blocks_required; /* Number of blocks needed to store current checkpoint set */ + + /* Block Info */ +- yaffs_BlockInfo *blockInfo; +- __u8 *chunkBits; /* bitmap of chunks in use */ +- unsigned blockInfoAlt:1; /* was allocated using alternative strategy */ +- unsigned chunkBitsAlt:1; /* was allocated using alternative strategy */ +- int chunkBitmapStride; /* Number of bytes of chunkBits per block. +- * Must be consistent with nChunksPerBlock. ++ yaffs_block_info_t *block_info; ++ __u8 *chunk_bits; /* bitmap of chunks in use */ ++ unsigned block_info_alt:1; /* was allocated using alternative strategy */ ++ unsigned chunk_bits_alt:1; /* was allocated using alternative strategy */ ++ int chunk_bit_stride; /* Number of bytes of chunk_bits per block. ++ * Must be consistent with chunks_per_block. + */ + +- int nErasedBlocks; +- int allocationBlock; /* Current block being allocated off */ +- __u32 allocationPage; +- int allocationBlockFinder; /* Used to search for next allocation block */ +- - /* Runtime state */ - int nTnodesCreated; - yaffs_Tnode *freeTnodes; @@ -14741,27 +16404,20 @@ - int nObjectsCreated; - yaffs_Object *freeObjects; - int nFreeObjects; -+ /* Object and Tnode memory management */ -+ void *allocator; -+ int nObjects; -+ int nTnodes; - - int nHardLinks; - +- +- int nHardLinks; +- - yaffs_ObjectList *allocatedObjectList; - - yaffs_ObjectBucket objectBucket[YAFFS_NOBJECT_BUCKETS]; -+ __u32 bucketFinder; - - int nFreeChunks; - +- yaffs_ObjectBucket objectBucket[YAFFS_NOBJECT_BUCKETS]; +- +- int nFreeChunks; +- - int currentDirtyChecker; /* Used to find current dirtiest block */ - -+ /* Garbage collection control */ - __u32 *gcCleanupList; /* objects to delete at the end of a GC. */ +- __u32 *gcCleanupList; /* objects to delete at the end of a GC. */ - int nonAggressiveSkip; /* GC state/mode */ -+ __u32 nCleanups; - +- - /* Statistcs */ - int nPageWrites; - int nPageReads; @@ -14780,88 +16436,192 @@ - int nUnmarkedDeletions; - - int hasPendingPrioritisedGCs; /* We think this device might have pending prioritised gcs */ -+ unsigned hasPendingPrioritisedGCs; /* We think this device might have pending prioritised gcs */ -+ unsigned gcDisable; -+ unsigned gcBlockFinder; -+ unsigned gcDirtiest; -+ unsigned gcPagesInUse; -+ unsigned gcNotDone; -+ unsigned gcBlock; -+ unsigned gcChunk; -+ unsigned gcSkip; ++ int n_erased_blocks; ++ int alloc_block; /* Current block being allocated off */ ++ __u32 alloc_page; ++ int alloc_block_finder; /* Used to search for next allocation block */ ++ ++ /* Object and Tnode memory management */ ++ void *allocator; ++ int n_obj; ++ int n_tnodes; ++ ++ int n_hardlinks; ++ ++ yaffs_obj_bucket obj_bucket[YAFFS_NOBJECT_BUCKETS]; ++ __u32 bucket_finder; ++ ++ int n_free_chunks; ++ ++ /* Garbage collection control */ ++ __u32 *gc_cleanup_list; /* objects to delete at the end of a GC. */ ++ __u32 n_clean_ups; ++ ++ unsigned has_pending_prioritised_gc; /* We think this device might have pending prioritised gcs */ ++ unsigned gc_disable; ++ unsigned gc_block_finder; ++ unsigned gc_dirtiest; ++ unsigned gc_pages_in_use; ++ unsigned gc_not_done; ++ unsigned gc_block; ++ unsigned gc_chunk; ++ unsigned gc_skip; /* Special directories */ - yaffs_Object *rootDir; -@@ -743,8 +721,6 @@ struct yaffs_DeviceStruct { - yaffs_ChunkCache *srCache; - int srLastUse; +- yaffs_Object *rootDir; +- yaffs_Object *lostNFoundDir; ++ yaffs_obj_t *root_dir; ++ yaffs_obj_t *lost_n_found; + + /* Buffer areas for storing data to recover from write failures TODO +- * __u8 bufferedData[YAFFS_CHUNKS_PER_BLOCK][YAFFS_BYTES_PER_CHUNK]; +- * yaffs_Spare bufferedSpare[YAFFS_CHUNKS_PER_BLOCK]; ++ * __u8 buffered_data[YAFFS_CHUNKS_PER_BLOCK][YAFFS_BYTES_PER_CHUNK]; ++ * yaffs_spare buffered_spare[YAFFS_CHUNKS_PER_BLOCK]; + */ + +- int bufferedBlock; /* Which block is buffered here? */ +- int doingBufferedBlockRewrite; +- +- yaffs_ChunkCache *srCache; +- int srLastUse; ++ int buffered_block; /* Which block is buffered here? */ ++ int doing_buffered_block_rewrite; - int cacheHits; -- - /* Stuff for background deletion and unlinked files.*/ - yaffs_Object *unlinkedDir; /* Directory where unlinked and deleted files live. */ - yaffs_Object *deletedDir; /* Directory where deleted objects are sent to disappear. */ -@@ -753,7 +729,6 @@ struct yaffs_DeviceStruct { - int nUnlinkedFiles; /* Count of unlinked files. */ - int nBackgroundDeletions; /* Count of background deletions. */ ++ yaffs_cache_t *cache; ++ int cache_last_use; + /* Stuff for background deletion and unlinked files.*/ +- yaffs_Object *unlinkedDir; /* Directory where unlinked and deleted files live. */ +- yaffs_Object *deletedDir; /* Directory where deleted objects are sent to disappear. */ +- yaffs_Object *unlinkedDeletion; /* Current file being background deleted.*/ +- int nDeletedFiles; /* Count of files awaiting deletion;*/ +- int nUnlinkedFiles; /* Count of unlinked files. */ +- int nBackgroundDeletions; /* Count of background deletions. */ - ++ yaffs_obj_t *unlinked_dir; /* Directory where unlinked and deleted files live. */ ++ yaffs_obj_t *del_dir; /* Directory where deleted objects are sent to disappear. */ ++ yaffs_obj_t *unlinked_deletion; /* Current file being background deleted.*/ ++ int n_deleted_files; /* Count of files awaiting deletion;*/ ++ int n_unlinked_files; /* Count of unlinked files. */ ++ int n_bg_deletions; /* Count of background deletions. */ + /* Temporary buffer management */ - yaffs_TempBuffer tempBuffer[YAFFS_N_TEMP_BUFFERS]; - int maxTemp; -@@ -764,6 +739,36 @@ struct yaffs_DeviceStruct { +- yaffs_TempBuffer tempBuffer[YAFFS_N_TEMP_BUFFERS]; +- int maxTemp; +- int tempInUse; +- int unmanagedTempAllocations; +- int unmanagedTempDeallocations; ++ yaffs_buffer_t temp_buffer[YAFFS_N_TEMP_BUFFERS]; ++ int max_temp; ++ int temp_in_use; ++ int unmanaged_buffer_allocs; ++ int unmanaged_buffer_deallocs; + /* yaffs2 runtime stuff */ - unsigned sequenceNumber; /* Sequence number of currently allocating block */ - unsigned oldestDirtySequence; -+ unsigned oldestDirtyBlock; +- unsigned sequenceNumber; /* Sequence number of currently allocating block */ +- unsigned oldestDirtySequence; ++ unsigned seq_number; /* Sequence number of currently allocating block */ ++ unsigned oldest_dirty_seq; ++ unsigned oldest_dirty_block; + + /* Block refreshing */ -+ int refreshSkip; /* A skip down counter. Refresh happens when this gets to zero. */ ++ int refresh_skip; /* A skip down counter. Refresh happens when this gets to zero. */ + + /* Dirty directory handling */ -+ struct ylist_head dirtyDirectories; /* List of dirty directories */ ++ struct ylist_head dirty_dirs; /* List of dirty directories */ + + + /* Statistcs */ -+ __u32 nPageWrites; -+ __u32 nPageReads; -+ __u32 nBlockErasures; -+ __u32 nErasureFailures; -+ __u32 nGCCopies; -+ __u32 allGCs; -+ __u32 passiveGCs; -+ __u32 oldestDirtyGCs; -+ __u32 nGCBlocks; -+ __u32 backgroundGCs; -+ __u32 nRetriedWrites; -+ __u32 nRetiredBlocks; -+ __u32 eccFixed; -+ __u32 eccUnfixed; -+ __u32 tagsEccFixed; -+ __u32 tagsEccUnfixed; -+ __u32 nDeletions; -+ __u32 nUnmarkedDeletions; -+ __u32 refreshCount; -+ __u32 cacheHits; ++ __u32 n_page_writes; ++ __u32 n_page_reads; ++ __u32 n_erasures; ++ __u32 n_erase_failures; ++ __u32 n_gc_copies; ++ __u32 all_gcs; ++ __u32 passive_gc_count; ++ __u32 oldest_dirty_gc_count; ++ __u32 n_gc_blocks; ++ __u32 bg_gcs; ++ __u32 n_retired_writes; ++ __u32 n_retired_blocks; ++ __u32 n_ecc_fixed; ++ __u32 n_ecc_unfixed; ++ __u32 n_tags_ecc_fixed; ++ __u32 n_tags_ecc_unfixed; ++ __u32 n_deletions; ++ __u32 n_unmarked_deletions; ++ __u32 refresh_count; ++ __u32 cache_hits; }; -@@ -796,7 +801,6 @@ typedef struct { +-typedef struct yaffs_DeviceStruct yaffs_Device; ++typedef struct yaffs_dev_s yaffs_dev_t; + + /* The static layout of block usage etc is stored in the super block header */ + typedef struct { + int StructType; + int version; +- int checkpointStartBlock; +- int checkpointEndBlock; +- int startBlock; +- int endBlock; ++ int checkpt_start_block; ++ int checkpt_end_block; ++ int start_block; ++ int end_block; + int rfu[100]; +-} yaffs_SuperBlockHeader; ++} yaffs_sb_header; + + /* The CheckpointDevice structure holds the device information that changes at runtime and + * must be preserved over unmount/mount cycles. + */ + typedef struct { +- int structType; +- int nErasedBlocks; +- int allocationBlock; /* Current block being allocated off */ +- __u32 allocationPage; +- int nFreeChunks; +- +- int nDeletedFiles; /* Count of files awaiting deletion;*/ +- int nUnlinkedFiles; /* Count of unlinked files. */ +- int nBackgroundDeletions; /* Count of background deletions. */ ++ int struct_type; ++ int n_erased_blocks; ++ int alloc_block; /* Current block being allocated off */ ++ __u32 alloc_page; ++ int n_free_chunks; ++ ++ int n_deleted_files; /* Count of files awaiting deletion;*/ ++ int n_unlinked_files; /* Count of unlinked files. */ ++ int n_bg_deletions; /* Count of background deletions. */ /* yaffs2 runtime stuff */ - unsigned sequenceNumber; /* Sequence number of currently allocating block */ +- unsigned sequenceNumber; /* Sequence number of currently allocating block */ - unsigned oldestDirtySequence; ++ unsigned seq_number; /* Sequence number of currently allocating block */ - } yaffs_CheckpointDevice; - -@@ -809,6 +813,23 @@ typedef struct { - } yaffs_CheckpointValidity; +-} yaffs_CheckpointDevice; ++} yaffs_checkpt_dev_t; -+struct yaffs_ShadowFixerStruct { -+ int objectId; -+ int shadowedId; -+ struct yaffs_ShadowFixerStruct *next; + typedef struct { +- int structType; ++ int struct_type; + __u32 magic; + __u32 version; + __u32 head; +-} yaffs_CheckpointValidity; ++} yaffs_checkpt_validty_t; ++ ++ ++struct yaffs_shadow_fixer_s { ++ int obj_id; ++ int shadowed_id; ++ struct yaffs_shadow_fixer_s *next; +}; + +/* Structure for doing xattr modifications */ @@ -14872,103 +16632,199 @@ + int size; + int flags; + int result; -+}yaffs_XAttrMod; -+ -+ ++}yaffs_xattr_mod; + + /*----------------------- YAFFS Functions -----------------------*/ - int yaffs_GutsInitialise(yaffs_Device *dev); -@@ -840,7 +861,8 @@ int yaffs_ResizeFile(yaffs_Object *obj, +-int yaffs_GutsInitialise(yaffs_Device *dev); +-void yaffs_Deinitialise(yaffs_Device *dev); ++int yaffs_guts_initialise(yaffs_dev_t *dev); ++void yaffs_deinitialise(yaffs_dev_t *dev); - yaffs_Object *yaffs_MknodFile(yaffs_Object *parent, const YCHAR *name, +-int yaffs_GetNumberOfFreeChunks(yaffs_Device *dev); ++int yaffs_get_n_free_chunks(yaffs_dev_t *dev); + +-int yaffs_RenameObject(yaffs_Object *oldDir, const YCHAR *oldName, +- yaffs_Object *newDir, const YCHAR *newName); ++int yaffs_rename_obj(yaffs_obj_t *old_dir, const YCHAR *old_name, ++ yaffs_obj_t *new_dir, const YCHAR *new_name); + +-int yaffs_Unlink(yaffs_Object *dir, const YCHAR *name); +-int yaffs_DeleteObject(yaffs_Object *obj); ++int yaffs_unlinker(yaffs_obj_t *dir, const YCHAR *name); ++int yaffs_del_obj(yaffs_obj_t *obj); + +-int yaffs_GetObjectName(yaffs_Object *obj, YCHAR *name, int buffSize); +-int yaffs_GetObjectFileLength(yaffs_Object *obj); +-int yaffs_GetObjectInode(yaffs_Object *obj); +-unsigned yaffs_GetObjectType(yaffs_Object *obj); +-int yaffs_GetObjectLinkCount(yaffs_Object *obj); ++int yaffs_get_obj_name(yaffs_obj_t *obj, YCHAR *name, int buffer_size); ++int yaffs_get_obj_length(yaffs_obj_t *obj); ++int yaffs_get_obj_inode(yaffs_obj_t *obj); ++unsigned yaffs_get_obj_type(yaffs_obj_t *obj); ++int yaffs_get_obj_link_count(yaffs_obj_t *obj); + +-int yaffs_SetAttributes(yaffs_Object *obj, struct iattr *attr); +-int yaffs_GetAttributes(yaffs_Object *obj, struct iattr *attr); ++int yaffs_set_attribs(yaffs_obj_t *obj, struct iattr *attr); ++int yaffs_get_attribs(yaffs_obj_t *obj, struct iattr *attr); + + /* File operations */ +-int yaffs_ReadDataFromFile(yaffs_Object *obj, __u8 *buffer, loff_t offset, +- int nBytes); +-int yaffs_WriteDataToFile(yaffs_Object *obj, const __u8 *buffer, loff_t offset, +- int nBytes, int writeThrough); +-int yaffs_ResizeFile(yaffs_Object *obj, loff_t newSize); ++int yaffs_file_rd(yaffs_obj_t *obj, __u8 *buffer, loff_t offset, ++ int n_bytes); ++int yaffs_wr_file(yaffs_obj_t *obj, const __u8 *buffer, loff_t offset, ++ int n_bytes, int write_trhrough); ++int yaffs_resize_file(yaffs_obj_t *obj, loff_t new_size); + +-yaffs_Object *yaffs_MknodFile(yaffs_Object *parent, const YCHAR *name, ++yaffs_obj_t *yaffs_create_file(yaffs_obj_t *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); ++int yaffs_flush_file(yaffs_obj_t *obj, int update_time, int data_sync); /* Flushing and checkpointing */ - void yaffs_FlushEntireDeviceCache(yaffs_Device *dev); -@@ -873,6 +895,12 @@ YCHAR *yaffs_GetSymlinkAlias(yaffs_Objec - yaffs_Object *yaffs_MknodSpecial(yaffs_Object *parent, const YCHAR *name, +-void yaffs_FlushEntireDeviceCache(yaffs_Device *dev); ++void yaffs_flush_whole_cache(yaffs_dev_t *dev); + +-int yaffs_CheckpointSave(yaffs_Device *dev); +-int yaffs_CheckpointRestore(yaffs_Device *dev); ++int yaffs_checkpoint_save(yaffs_dev_t *dev); ++int yaffs_checkpoint_restore(yaffs_dev_t *dev); + + /* Directory operations */ +-yaffs_Object *yaffs_MknodDirectory(yaffs_Object *parent, const YCHAR *name, ++yaffs_obj_t *yaffs_create_dir(yaffs_obj_t *parent, const YCHAR *name, + __u32 mode, __u32 uid, __u32 gid); +-yaffs_Object *yaffs_FindObjectByName(yaffs_Object *theDir, const YCHAR *name); +-int yaffs_ApplyToDirectoryChildren(yaffs_Object *theDir, +- int (*fn) (yaffs_Object *)); ++yaffs_obj_t *yaffs_find_by_name(yaffs_obj_t *the_dir, const YCHAR *name); ++int yaffs_ApplyToDirectoryChildren(yaffs_obj_t *the_dir, ++ int (*fn) (yaffs_obj_t *)); + +-yaffs_Object *yaffs_FindObjectByNumber(yaffs_Device *dev, __u32 number); ++yaffs_obj_t *yaffs_find_by_number(yaffs_dev_t *dev, __u32 number); + + /* Link operations */ +-yaffs_Object *yaffs_Link(yaffs_Object *parent, const YCHAR *name, +- yaffs_Object *equivalentObject); ++yaffs_obj_t *yaffs_link_obj(yaffs_obj_t *parent, const YCHAR *name, ++ yaffs_obj_t *equiv_obj); + +-yaffs_Object *yaffs_GetEquivalentObject(yaffs_Object *obj); ++yaffs_obj_t *yaffs_get_equivalent_obj(yaffs_obj_t *obj); + + /* Symlink operations */ +-yaffs_Object *yaffs_MknodSymLink(yaffs_Object *parent, const YCHAR *name, ++yaffs_obj_t *yaffs_create_symlink(yaffs_obj_t *parent, const YCHAR *name, + __u32 mode, __u32 uid, __u32 gid, + const YCHAR *alias); +-YCHAR *yaffs_GetSymlinkAlias(yaffs_Object *obj); ++YCHAR *yaffs_get_symlink_alias(yaffs_obj_t *obj); + + /* Special inodes (fifos, sockets and devices) */ +-yaffs_Object *yaffs_MknodSpecial(yaffs_Object *parent, const YCHAR *name, ++yaffs_obj_t *yaffs_create_special(yaffs_obj_t *parent, const YCHAR *name, __u32 mode, __u32 uid, __u32 gid, __u32 rdev); + -+int yaffs_SetXAttribute(yaffs_Object *obj, const YCHAR *name, const void * value, int size, int flags); -+int yaffs_GetXAttribute(yaffs_Object *obj, const YCHAR *name, void *value, int size); -+int yaffs_ListXAttributes(yaffs_Object *obj, char *buffer, int size); -+int yaffs_RemoveXAttribute(yaffs_Object *obj, const YCHAR *name); ++int yaffs_set_xattrib(yaffs_obj_t *obj, const YCHAR *name, const void * value, int size, int flags); ++int yaffs_get_xattrib(yaffs_obj_t *obj, const YCHAR *name, void *value, int size); ++int yaffs_list_xattrib(yaffs_obj_t *obj, char *buffer, int size); ++int yaffs_remove_xattrib(yaffs_obj_t *obj, const YCHAR *name); + /* Special directories */ - yaffs_Object *yaffs_Root(yaffs_Device *dev); - yaffs_Object *yaffs_LostNFound(yaffs_Device *dev); -@@ -882,18 +910,18 @@ yaffs_Object *yaffs_LostNFound(yaffs_Dev - void yfsd_WinFileTimeNow(__u32 target[2]); +-yaffs_Object *yaffs_Root(yaffs_Device *dev); +-yaffs_Object *yaffs_LostNFound(yaffs_Device *dev); ++yaffs_obj_t *yaffs_root(yaffs_dev_t *dev); ++yaffs_obj_t *yaffs_lost_n_found(yaffs_dev_t *dev); + + #ifdef CONFIG_YAFFS_WINCE + /* CONFIG_YAFFS_WINCE special stuff */ +-void yfsd_WinFileTimeNow(__u32 target[2]); ++void yfsd_win_file_time_now(__u32 target[2]); #endif -#ifdef __KERNEL__ -- - void yaffs_HandleDeferedFree(yaffs_Object *obj); ++void yaffs_handle_defered_free(yaffs_obj_t *obj); + +-void yaffs_HandleDeferedFree(yaffs_Object *obj); -#endif ++void yaffs_update_dirty_dirs(yaffs_dev_t *dev); + -+void yaffs_UpdateDirtyDirectories(yaffs_Device *dev); -+ -+int yaffs_BackgroundGarbageCollect(yaffs_Device *dev, unsigned urgency); ++int yaffs_bg_gc(yaffs_dev_t *dev, unsigned urgency); /* Debug dump */ - int yaffs_DumpObject(yaffs_Object *obj); +-int yaffs_DumpObject(yaffs_Object *obj); ++int yaffs_dump_obj(yaffs_obj_t *obj); - void yaffs_GutsTest(yaffs_Device *dev); +-void yaffs_GutsTest(yaffs_Device *dev); ++void yaffs_guts_test(yaffs_dev_t *dev); -/* A few useful functions */ -void yaffs_InitialiseTags(yaffs_ExtendedTags *tags); +-void yaffs_DeleteChunk(yaffs_Device *dev, int chunkId, int markNAND, int lyn); +-int yaffs_CheckFF(__u8 *buffer, int nBytes); +-void yaffs_HandleChunkError(yaffs_Device *dev, yaffs_BlockInfo *bi); +/* A few useful functions to be used within the core files*/ - void yaffs_DeleteChunk(yaffs_Device *dev, int chunkId, int markNAND, int lyn); - int yaffs_CheckFF(__u8 *buffer, int nBytes); - void yaffs_HandleChunkError(yaffs_Device *dev, yaffs_BlockInfo *bi); -@@ -901,4 +929,41 @@ void yaffs_HandleChunkError(yaffs_Device - __u8 *yaffs_GetTempBuffer(yaffs_Device *dev, int lineNo); - void yaffs_ReleaseTempBuffer(yaffs_Device *dev, __u8 *buffer, int lineNo); - -+yaffs_Object *yaffs_FindOrCreateObjectByNumber(yaffs_Device *dev, ++void yaffs_chunk_del(yaffs_dev_t *dev, int chunk_id, int mark_flash, int lyn); ++int yaffs_check_ff(__u8 *buffer, int n_bytes); ++void yaffs_handle_chunk_error(yaffs_dev_t *dev, yaffs_block_info_t *bi); ++ ++__u8 *yaffs_get_temp_buffer(yaffs_dev_t *dev, int line_no); ++void yaffs_release_temp_buffer(yaffs_dev_t *dev, __u8 *buffer, int line_no); ++ ++yaffs_obj_t *yaffs_find_or_create_by_number(yaffs_dev_t *dev, + int number, -+ yaffs_ObjectType type); -+int yaffs_PutChunkIntoFile(yaffs_Object *in, int chunkInInode, -+ int chunkInNAND, int inScan); -+void yaffs_SetObjectName(yaffs_Object *obj, const YCHAR *name); -+void yaffs_SetObjectNameFromOH(yaffs_Object *obj, const yaffs_ObjectHeader *oh); -+void yaffs_AddObjectToDirectory(yaffs_Object *directory, -+ yaffs_Object *obj); -+YCHAR *yaffs_CloneString(const YCHAR *str); -+void yaffs_HardlinkFixup(yaffs_Device *dev, yaffs_Object *hardList); -+void yaffs_BlockBecameDirty(yaffs_Device *dev, int blockNo); -+int yaffs_UpdateObjectHeader(yaffs_Object *in, const YCHAR *name, -+ int force, int isShrink, int shadows, -+ yaffs_XAttrMod *xop); -+void yaffs_HandleShadowedObject(yaffs_Device *dev, int objId, -+ int backwardScanning); -+int yaffs_CheckSpaceForAllocation(yaffs_Device *dev, int nChunks); -+yaffs_Tnode *yaffs_GetTnode(yaffs_Device *dev); -+yaffs_Tnode *yaffs_AddOrFindLevel0Tnode(yaffs_Device *dev, -+ yaffs_FileStructure *fStruct, -+ __u32 chunkId, -+ yaffs_Tnode *passedTn); ++ yaffs_obj_type type); ++int yaffs_put_chunk_in_file(yaffs_obj_t *in, int inode_chunk, ++ int nand_chunk, int in_scan); ++void yaffs_set_obj_name(yaffs_obj_t *obj, const YCHAR *name); ++void yaffs_set_obj_name_from_oh(yaffs_obj_t *obj, const yaffs_obj_header *oh); ++void yaffs_add_obj_to_dir(yaffs_obj_t *directory, ++ yaffs_obj_t *obj); ++YCHAR *yaffs_clone_str(const YCHAR *str); ++void yaffs_link_fixup(yaffs_dev_t *dev, yaffs_obj_t *hard_list); ++void yaffs_block_became_dirty(yaffs_dev_t *dev, int block_no); ++int yaffs_update_oh(yaffs_obj_t *in, const YCHAR *name, ++ int force, int is_shrink, int shadows, ++ yaffs_xattr_mod *xop); ++void yaffs_handle_shadowed_obj(yaffs_dev_t *dev, int obj_id, ++ int backward_scanning); ++int yaffs_check_alloc_available(yaffs_dev_t *dev, int n_chunks); ++yaffs_tnode_t *yaffs_get_tnode(yaffs_dev_t *dev); ++yaffs_tnode_t *yaffs_add_find_tnode_0(yaffs_dev_t *dev, ++ yaffs_file_s *file_struct, ++ __u32 chunk_id, ++ yaffs_tnode_t *passed_tn); + -+int yaffs_DoWriteDataToFile(yaffs_Object *in, const __u8 *buffer, loff_t offset, -+ int nBytes, int writeThrough); -+void yaffs_ResizeDown( yaffs_Object *obj, loff_t newSize); -+void yaffs_SkipRestOfBlock(yaffs_Device *dev); ++int yaffs_do_file_wr(yaffs_obj_t *in, const __u8 *buffer, loff_t offset, ++ int n_bytes, int write_trhrough); ++void yaffs_resize_file_down( yaffs_obj_t *obj, loff_t new_size); ++void yaffs_skip_rest_of_block(yaffs_dev_t *dev); + -+int yaffs_CountFreeChunks(yaffs_Device *dev); -+ -+yaffs_Tnode *yaffs_FindLevel0Tnode(yaffs_Device *dev, -+ yaffs_FileStructure *fStruct, -+ __u32 chunkId); -+ -+__u32 yaffs_GetChunkGroupBase(yaffs_Device *dev, yaffs_Tnode *tn, unsigned pos); ++int yaffs_count_free_chunks(yaffs_dev_t *dev); + ++yaffs_tnode_t *yaffs_find_tnode_0(yaffs_dev_t *dev, ++ yaffs_file_s *file_struct, ++ __u32 chunk_id); + +-__u8 *yaffs_GetTempBuffer(yaffs_Device *dev, int lineNo); +-void yaffs_ReleaseTempBuffer(yaffs_Device *dev, __u8 *buffer, int lineNo); ++__u32 yaffs_get_group_base(yaffs_dev_t *dev, yaffs_tnode_t *tn, unsigned pos); + #endif ---- a/fs/yaffs2/yaffsinterface.h -+++ b/fs/yaffs2/yaffsinterface.h +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffsinterface.h linux-2.6.36-rc8.new/fs/yaffs2/yaffsinterface.h +--- linux-2.6.36-rc8/fs/yaffs2/yaffsinterface.h 2010-10-20 13:17:58.955000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffsinterface.h 2010-10-20 13:28:16.061000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet another Flash File System . A NAND-flash specific file system. @@ -14978,8 +16834,17 @@ * for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning ---- /dev/null -+++ b/fs/yaffs2/yaffs_linux_allocator.c +@@ -16,6 +16,6 @@ + #ifndef __YAFFSINTERFACE_H__ + #define __YAFFSINTERFACE_H__ + +-int yaffs_Initialise(unsigned nBlocks); ++int yaffs_initialise(unsigned nBlocks); + + #endif +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_linux_allocator.c linux-2.6.36-rc8.new/fs/yaffs2/yaffs_linux_allocator.c +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_linux_allocator.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_linux_allocator.c 2010-10-20 13:28:16.028000294 +0300 @@ -0,0 +1,200 @@ +/* + * YAFFS: Yet another Flash File System . A NAND-flash specific file system. @@ -15023,7 +16888,7 @@ + +int mount_id; + -+void yaffs_DeinitialiseRawTnodesAndObjects(yaffs_Device *dev) ++void yaffs_deinit_raw_tnodes_and_objs(yaffs_dev_t *dev) +{ + yaffs_Allocator *allocator = (yaffs_Allocator *)dev->allocator; + @@ -15083,10 +16948,10 @@ + fake_ctor9, +}; + -+void yaffs_InitialiseRawTnodesAndObjects(yaffs_Device *dev) ++void yaffs_init_raw_tnodes_and_objs(yaffs_dev_t *dev) +{ + yaffs_Allocator *allocator; -+ unsigned mount_id = yaffs_DeviceToLC(dev)->mount_id; ++ unsigned mount_id = yaffs_dev_to_lc(dev)->mount_id; + + T(YAFFS_TRACE_ALLOCATE,(TSTR("Initialising yaffs allocator\n"))); + @@ -15112,7 +16977,7 @@ + + allocator->tnode_cache = + kmem_cache_create(allocator->tnode_name, -+ dev->tnodeSize, ++ dev->tnode_size, + 0, 0, + fake_ctor_list[mount_id]); + if(allocator->tnode_cache) @@ -15128,7 +16993,7 @@ + + allocator->object_cache = + kmem_cache_create(allocator->object_name, -+ sizeof(yaffs_Object), ++ sizeof(yaffs_obj_t), + 0, 0, + fake_ctor_list[mount_id]); + @@ -15146,7 +17011,7 @@ +} + + -+yaffs_Tnode *yaffs_AllocateRawTnode(yaffs_Device *dev) ++yaffs_tnode_t *yaffs_alloc_raw_tnode(yaffs_dev_t *dev) +{ + yaffs_Allocator *allocator = dev->allocator; + if(!allocator || !allocator->tnode_cache){ @@ -15156,13 +17021,13 @@ + return kmem_cache_alloc(allocator->tnode_cache, GFP_NOFS); +} + -+void yaffs_FreeRawTnode(yaffs_Device *dev, yaffs_Tnode *tn) ++void yaffs_free_raw_tnode(yaffs_dev_t *dev, yaffs_tnode_t *tn) +{ + yaffs_Allocator *allocator = dev->allocator; + kmem_cache_free(allocator->tnode_cache,tn); +} + -+yaffs_Object *yaffs_AllocateRawObject(yaffs_Device *dev) ++yaffs_obj_t *yaffs_alloc_raw_obj(yaffs_dev_t *dev) +{ + yaffs_Allocator *allocator = dev->allocator; + if(!allocator){ @@ -15176,13 +17041,14 @@ + return kmem_cache_alloc(allocator->object_cache, GFP_NOFS); +} + -+void yaffs_FreeRawObject(yaffs_Device *dev, yaffs_Object *obj) ++void yaffs_free_raw_obj(yaffs_dev_t *dev, yaffs_obj_t *obj) +{ + yaffs_Allocator *allocator = dev->allocator; + kmem_cache_free(allocator->object_cache,obj); +} ---- /dev/null -+++ b/fs/yaffs2/yaffs_linux.h +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_linux.h linux-2.6.36-rc8.new/fs/yaffs2/yaffs_linux.h +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_linux.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_linux.h 2010-10-20 13:28:16.061000294 +0300 @@ -0,0 +1,43 @@ +/* + * YAFFS: Yet another Flash File System . A NAND-flash specific file system. @@ -15207,7 +17073,7 @@ + +struct yaffs_LinuxContext { + struct ylist_head contextList; /* List of these we have mounted */ -+ struct yaffs_DeviceStruct *dev; ++ struct yaffs_dev_s *dev; + struct super_block * superBlock; + struct task_struct *bgThread; /* Background thread for this device */ + int bgRunning; @@ -15222,13 +17088,14 @@ + unsigned mount_id; +}; + -+#define yaffs_DeviceToLC(dev) ((struct yaffs_LinuxContext *)((dev)->osContext)) -+#define yaffs_DeviceToMtd(dev) ((struct mtd_info *)((dev)->driverContext)) ++#define yaffs_dev_to_lc(dev) ((struct yaffs_LinuxContext *)((dev)->os_context)) ++#define yaffs_dev_to_mtd(dev) ((struct mtd_info *)((dev)->driver_context)) + +#endif + ---- /dev/null -+++ b/fs/yaffs2/yaffs_list.h +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_list.h linux-2.6.36-rc8.new/fs/yaffs2/yaffs_list.h +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_list.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_list.h 2010-10-20 13:28:16.062000294 +0300 @@ -0,0 +1,127 @@ +/* + * YAFFS: Yet another Flash File System . A NAND-flash specific file system. @@ -15357,8 +17224,9 @@ + + +#endif ---- a/fs/yaffs2/yaffs_mtdif1.c -+++ b/fs/yaffs2/yaffs_mtdif1.c +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_mtdif1.c linux-2.6.36-rc8.new/fs/yaffs2/yaffs_mtdif1.c +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_mtdif1.c 2010-10-20 13:17:58.956000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_mtdif1.c 2010-10-20 13:28:16.028000294 +0300 @@ -2,7 +2,7 @@ * YAFFS: Yet another FFS. A NAND-flash specific file system. * yaffs_mtdif1.c NAND mtd interface functions for small-page NAND. @@ -15368,14 +17236,23 @@ * for Toby Churchill Ltd and Brightstar Engineering * * This program is free software; you can redistribute it and/or modify -@@ -24,9 +24,11 @@ +@@ -18,15 +18,17 @@ + * + * These functions are invoked via function pointers in yaffs_nand.c. + * This replaces functionality provided by functions in yaffs_mtdif.c +- * and the yaffs_TagsCompatability functions in yaffs_tagscompat.c that are ++ * and the yaffs_tags_tCompatability functions in yaffs_tagscompat.c that are + * called in yaffs_mtdif.c when the function pointers are NULL. +- * We assume the MTD layer is performing ECC (useNANDECC is true). ++ * We assume the MTD layer is performing ECC (use_nand_ecc is true). */ #include "yportenv.h" +#include "yaffs_trace.h" #include "yaffs_guts.h" #include "yaffs_packedtags1.h" - #include "yaffs_tagscompat.h" /* for yaffs_CalcTagsECC */ +-#include "yaffs_tagscompat.h" /* for yaffs_CalcTagsECC */ ++#include "yaffs_tagscompat.h" /* for yaffs_calc_tags_ecc */ +#include "yaffs_linux.h" #include "linux/kernel.h" @@ -15389,25 +17266,78 @@ #ifndef CONFIG_YAFFS_9BYTE_TAGS # define YTAG1_SIZE 8 #else -@@ -91,7 +91,7 @@ static struct nand_ecclayout nand_oob_16 - int nandmtd1_WriteChunkWithTagsToNAND(yaffs_Device *dev, - int chunkInNAND, const __u8 *data, const yaffs_ExtendedTags *etags) +@@ -51,12 +51,12 @@ const char *yaffs_mtdif1_c_version = "$I + * adjust 'oobfree' to match your existing Yaffs data. + * + * This nand_ecclayout scatters/gathers to/from the old-yaffs layout with the +- * pageStatus byte (at NAND spare offset 4) scattered/gathered from/to ++ * page_status byte (at NAND spare offset 4) scattered/gathered from/to + * the 9th byte. + * + * Old-style on-NAND format: T0,T1,T2,T3,P,B,T4,T5,E0,E1,E2,T6,T7,E3,E4,E5 +- * We have/need PackedTags1 plus pageStatus: T0,T1,T2,T3,T4,T5,T6,T7,P +- * where Tn are the tag bytes, En are MTD's ECC bytes, P is the pageStatus ++ * We have/need PackedTags1 plus page_status: T0,T1,T2,T3,T4,T5,T6,T7,P ++ * where Tn are the tag bytes, En are MTD's ECC bytes, P is the page_status + * byte and B is the small-page bad-block indicator byte. + */ + static struct nand_ecclayout nand_oob_16 = { +@@ -88,42 +88,40 @@ static struct nand_ecclayout nand_oob_16 + * Any underlying MTD error results in YAFFS_FAIL. + * Returns YAFFS_OK or YAFFS_FAIL. + */ +-int nandmtd1_WriteChunkWithTagsToNAND(yaffs_Device *dev, +- int chunkInNAND, const __u8 *data, const yaffs_ExtendedTags *etags) ++int nandmtd1_WriteChunkWithTagsToNAND(yaffs_dev_t *dev, ++ int nand_chunk, const __u8 *data, const yaffs_ext_tags *etags) { - struct mtd_info *mtd = dev->genericDevice; -+ struct mtd_info *mtd = yaffs_DeviceToMtd(dev); - int chunkBytes = dev->nDataBytesPerChunk; - loff_t addr = ((loff_t)chunkInNAND) * chunkBytes; +- int chunkBytes = dev->nDataBytesPerChunk; +- loff_t addr = ((loff_t)chunkInNAND) * chunkBytes; ++ struct mtd_info *mtd = yaffs_dev_to_mtd(dev); ++ int chunkBytes = dev->data_bytes_per_chunk; ++ loff_t addr = ((loff_t)nand_chunk) * chunkBytes; struct mtd_oob_ops ops; -@@ -102,8 +102,6 @@ int nandmtd1_WriteChunkWithTagsToNAND(ya + yaffs_PackedTags1 pt1; + int retval; + +- /* we assume that PackedTags1 and yaffs_Tags are compatible */ ++ /* we assume that PackedTags1 and yaffs_tags_t are compatible */ compile_time_assertion(sizeof(yaffs_PackedTags1) == 12); - compile_time_assertion(sizeof(yaffs_Tags) == 8); - -- dev->nPageWrites++; +- compile_time_assertion(sizeof(yaffs_Tags) == 8); - - yaffs_PackTags1(&pt1, etags); - yaffs_CalcTagsECC((yaffs_Tags *)&pt1); +- dev->nPageWrites++; ++ compile_time_assertion(sizeof(yaffs_tags_t) == 8); -@@ -137,9 +135,9 @@ int nandmtd1_WriteChunkWithTagsToNAND(ya + yaffs_PackTags1(&pt1, etags); +- yaffs_CalcTagsECC((yaffs_Tags *)&pt1); ++ yaffs_calc_tags_ecc((yaffs_tags_t *)&pt1); + + /* When deleting a chunk, the upper layer provides only skeletal +- * etags, one with chunkDeleted set. However, we need to update the ++ * etags, one with is_deleted set. However, we need to update the + * tags, not erase them completely. So we use the NAND write property + * that only zeroed-bits stick and set tag bytes to all-ones and + * zero just the (not) deleted bit. + */ + #ifndef CONFIG_YAFFS_9BYTE_TAGS +- if (etags->chunkDeleted) { ++ if (etags->is_deleted) { + memset(&pt1, 0xff, 8); + /* clear delete status bit to indicate deleted */ + pt1.deleted = 0; + } + #else + ((__u8 *)&pt1)[8] = 0xff; +- if (etags->chunkDeleted) { ++ if (etags->is_deleted) { + memset(&pt1, 0xff, 8); +- /* zero pageStatus byte to indicate deleted */ ++ /* zero page_status byte to indicate deleted */ + ((__u8 *)&pt1)[8] = 0; + } + #endif +@@ -137,20 +135,20 @@ int nandmtd1_WriteChunkWithTagsToNAND(ya retval = mtd->write_oob(mtd, addr, &ops); if (retval) { @@ -15416,20 +17346,54 @@ - chunkInNAND, retval); + T(YAFFS_TRACE_MTD, + (TSTR("write_oob failed, chunk %d, mtd error %d"TENDSTR), -+ chunkInNAND, retval)); ++ nand_chunk, retval)); } return retval ? YAFFS_FAIL : YAFFS_OK; } -@@ -171,7 +169,7 @@ static int rettags(yaffs_ExtendedTags *e - int nandmtd1_ReadChunkWithTagsFromNAND(yaffs_Device *dev, - int chunkInNAND, __u8 *data, yaffs_ExtendedTags *etags) + +-/* Return with empty ExtendedTags but add eccResult. ++/* Return with empty ExtendedTags but add ecc_result. + */ +-static int rettags(yaffs_ExtendedTags *etags, int eccResult, int retval) ++static int rettags(yaffs_ext_tags *etags, int ecc_result, int retval) + { + if (etags) { + memset(etags, 0, sizeof(*etags)); +- etags->eccResult = eccResult; ++ etags->ecc_result = ecc_result; + } + return retval; + } +@@ -158,30 +156,28 @@ static int rettags(yaffs_ExtendedTags *e + /* Read a chunk (page) from NAND. + * + * Caller expects ExtendedTags data to be usable even on error; that is, +- * all members except eccResult and blockBad are zeroed. ++ * all members except ecc_result and block_bad are zeroed. + * + * - Check ECC results for data (if applicable) + * - Check for blank/erased block (return empty ExtendedTags if blank) + * - Check the PackedTags1 mini-ECC (correct if necessary/possible) + * - Convert PackedTags1 to ExtendedTags +- * - Update eccResult and blockBad members to refect state. ++ * - Update ecc_result and block_bad members to refect state. + * + * Returns YAFFS_OK or YAFFS_FAIL. + */ +-int nandmtd1_ReadChunkWithTagsFromNAND(yaffs_Device *dev, +- int chunkInNAND, __u8 *data, yaffs_ExtendedTags *etags) ++int nandmtd1_ReadChunkWithTagsFromNAND(yaffs_dev_t *dev, ++ int nand_chunk, __u8 *data, yaffs_ext_tags *etags) { - struct mtd_info *mtd = dev->genericDevice; -+ struct mtd_info *mtd = yaffs_DeviceToMtd(dev); - int chunkBytes = dev->nDataBytesPerChunk; - loff_t addr = ((loff_t)chunkInNAND) * chunkBytes; +- int chunkBytes = dev->nDataBytesPerChunk; +- loff_t addr = ((loff_t)chunkInNAND) * chunkBytes; ++ struct mtd_info *mtd = yaffs_dev_to_mtd(dev); ++ int chunkBytes = dev->data_bytes_per_chunk; ++ loff_t addr = ((loff_t)nand_chunk) * chunkBytes; int eccres = YAFFS_ECC_RESULT_NO_ERROR; -@@ -180,8 +178,6 @@ int nandmtd1_ReadChunkWithTagsFromNAND(y + struct mtd_oob_ops ops; + yaffs_PackedTags1 pt1; int retval; int deleted; @@ -15447,25 +17411,106 @@ - chunkInNAND, retval); + T(YAFFS_TRACE_MTD, + (TSTR("read_oob failed, chunk %d, mtd error %d"TENDSTR), -+ chunkInNAND, retval)); ++ nand_chunk, retval)); } switch (retval) { -@@ -284,11 +280,11 @@ int nandmtd1_ReadChunkWithTagsFromNAND(y +@@ -213,23 +209,23 @@ int nandmtd1_ReadChunkWithTagsFromNAND(y + case -EUCLEAN: + /* MTD's ECC fixed the data */ + eccres = YAFFS_ECC_RESULT_FIXED; +- dev->eccFixed++; ++ dev->n_ecc_fixed++; + break; + + case -EBADMSG: + /* MTD's ECC could not fix the data */ +- dev->eccUnfixed++; ++ dev->n_ecc_unfixed++; + /* fall into... */ + default: + rettags(etags, YAFFS_ECC_RESULT_UNFIXED, 0); +- etags->blockBad = (mtd->block_isbad)(mtd, addr); ++ etags->block_bad = (mtd->block_isbad)(mtd, addr); + return YAFFS_FAIL; + } + + /* Check for a blank/erased chunk. + */ +- if (yaffs_CheckFF((__u8 *)&pt1, 8)) { +- /* when blank, upper layers want eccResult to be <= NO_ERROR */ ++ if (yaffs_check_ff((__u8 *)&pt1, 8)) { ++ /* when blank, upper layers want ecc_result to be <= NO_ERROR */ + return rettags(etags, YAFFS_ECC_RESULT_NO_ERROR, YAFFS_OK); + } + +@@ -241,37 +237,37 @@ int nandmtd1_ReadChunkWithTagsFromNAND(y + deleted = !pt1.deleted; + pt1.deleted = 1; + #else +- deleted = (yaffs_CountBits(((__u8 *)&pt1)[8]) < 7); ++ deleted = (yaffs_count_bits(((__u8 *)&pt1)[8]) < 7); + #endif + + /* Check the packed tags mini-ECC and correct if necessary/possible. + */ +- retval = yaffs_CheckECCOnTags((yaffs_Tags *)&pt1); ++ retval = yaffs_check_tags_ecc((yaffs_tags_t *)&pt1); + switch (retval) { + case 0: + /* no tags error, use MTD result */ + break; + case 1: + /* recovered tags-ECC error */ +- dev->tagsEccFixed++; ++ dev->n_tags_ecc_fixed++; + if (eccres == YAFFS_ECC_RESULT_NO_ERROR) + eccres = YAFFS_ECC_RESULT_FIXED; + break; + default: + /* unrecovered tags-ECC error */ +- dev->tagsEccUnfixed++; ++ dev->n_tags_ecc_unfixed++; + return rettags(etags, YAFFS_ECC_RESULT_UNFIXED, YAFFS_FAIL); + } + + /* Unpack the tags to extended form and set ECC result. +- * [set shouldBeFF just to keep yaffs_UnpackTags1 happy] ++ * [set shouldBeFF just to keep yaffs_unpack_tags1 happy] + */ + pt1.shouldBeFF = 0xFFFFFFFF; +- yaffs_UnpackTags1(etags, &pt1); +- etags->eccResult = eccres; ++ yaffs_unpack_tags1(etags, &pt1); ++ etags->ecc_result = eccres; + + /* Set deleted state */ +- etags->chunkDeleted = deleted; ++ etags->is_deleted = deleted; + return YAFFS_OK; + } + +@@ -282,15 +278,15 @@ int nandmtd1_ReadChunkWithTagsFromNAND(y + * + * Returns YAFFS_OK or YAFFS_FAIL. */ - int nandmtd1_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo) +-int nandmtd1_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo) ++int nandmtd1_MarkNANDBlockBad(struct yaffs_dev_s *dev, int block_no) { - struct mtd_info *mtd = dev->genericDevice; - int blocksize = dev->nChunksPerBlock * dev->nDataBytesPerChunk; -+ struct mtd_info *mtd = yaffs_DeviceToMtd(dev); -+ int blocksize = dev->param.nChunksPerBlock * dev->nDataBytesPerChunk; ++ struct mtd_info *mtd = yaffs_dev_to_mtd(dev); ++ int blocksize = dev->param.chunks_per_block * dev->data_bytes_per_chunk; int retval; - yaffs_trace(YAFFS_TRACE_BAD_BLOCKS, "marking block %d bad\n", blockNo); -+ T(YAFFS_TRACE_BAD_BLOCKS,(TSTR("marking block %d bad"TENDSTR), blockNo)); ++ T(YAFFS_TRACE_BAD_BLOCKS,(TSTR("marking block %d bad"TENDSTR), block_no)); - retval = mtd->block_markbad(mtd, (loff_t)blocksize * blockNo); +- retval = mtd->block_markbad(mtd, (loff_t)blocksize * blockNo); ++ retval = mtd->block_markbad(mtd, (loff_t)blocksize * block_no); return (retval) ? YAFFS_FAIL : YAFFS_OK; + } + @@ -305,9 +301,9 @@ static int nandmtd1_TestPrerequists(stru int oobavail = mtd->ecclayout->oobavail; @@ -15479,30 +17524,54 @@ return YAFFS_FAIL; } return YAFFS_OK; -@@ -325,8 +321,8 @@ static int nandmtd1_TestPrerequists(stru - int nandmtd1_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo, - yaffs_BlockState *pState, __u32 *pSequenceNumber) +@@ -322,13 +318,13 @@ static int nandmtd1_TestPrerequists(stru + * + * Always returns YAFFS_OK. + */ +-int nandmtd1_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo, +- yaffs_BlockState *pState, __u32 *pSequenceNumber) ++int nandmtd1_QueryNANDBlock(struct yaffs_dev_s *dev, int block_no, ++ yaffs_block_state_t *pState, __u32 *pSequenceNumber) { - struct mtd_info *mtd = dev->genericDevice; - int chunkNo = blockNo * dev->nChunksPerBlock; -+ struct mtd_info *mtd = yaffs_DeviceToMtd(dev); -+ int chunkNo = blockNo * dev->param.nChunksPerBlock; - loff_t addr = (loff_t)chunkNo * dev->nDataBytesPerChunk; - yaffs_ExtendedTags etags; +- loff_t addr = (loff_t)chunkNo * dev->nDataBytesPerChunk; +- yaffs_ExtendedTags etags; ++ struct mtd_info *mtd = yaffs_dev_to_mtd(dev); ++ int chunkNo = block_no * dev->param.chunks_per_block; ++ loff_t addr = (loff_t)chunkNo * dev->data_bytes_per_chunk; ++ yaffs_ext_tags etags; int state = YAFFS_BLOCK_STATE_DEAD; -@@ -342,8 +338,8 @@ int nandmtd1_QueryNANDBlock(struct yaffs + int seqnum = 0; + int retval; +@@ -340,17 +336,17 @@ int nandmtd1_QueryNANDBlock(struct yaffs + return YAFFS_FAIL; + retval = nandmtd1_ReadChunkWithTagsFromNAND(dev, chunkNo, NULL, &etags); - etags.blockBad = (mtd->block_isbad)(mtd, addr); - if (etags.blockBad) { +- etags.blockBad = (mtd->block_isbad)(mtd, addr); +- if (etags.blockBad) { - yaffs_trace(YAFFS_TRACE_BAD_BLOCKS, - "block %d is marked bad\n", blockNo); ++ etags.block_bad = (mtd->block_isbad)(mtd, addr); ++ if (etags.block_bad) { + T(YAFFS_TRACE_BAD_BLOCKS, -+ (TSTR("block %d is marked bad"TENDSTR), blockNo)); ++ (TSTR("block %d is marked bad"TENDSTR), block_no)); state = YAFFS_BLOCK_STATE_DEAD; - } else if (etags.eccResult != YAFFS_ECC_RESULT_NO_ERROR) { +- } else if (etags.eccResult != YAFFS_ECC_RESULT_NO_ERROR) { ++ } else if (etags.ecc_result != YAFFS_ECC_RESULT_NO_ERROR) { /* bad tags, need to look more closely */ ---- a/fs/yaffs2/yaffs_mtdif1-compat.c -+++ /dev/null + state = YAFFS_BLOCK_STATE_NEEDS_SCANNING; +- } else if (etags.chunkUsed) { ++ } else if (etags.chunk_used) { + state = YAFFS_BLOCK_STATE_NEEDS_SCANNING; +- seqnum = etags.sequenceNumber; ++ seqnum = etags.seq_number; + } else { + state = YAFFS_BLOCK_STATE_EMPTY; + } +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_mtdif1-compat.c linux-2.6.36-rc8.new/fs/yaffs2/yaffs_mtdif1-compat.c +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_mtdif1-compat.c 2010-10-20 13:17:58.956000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_mtdif1-compat.c 1970-01-01 02:00:00.000000000 +0200 @@ -1,434 +0,0 @@ -From ian@brightstareng.com Fri May 18 15:06:49 2007 -From ian@brightstareng.com Fri May 18 15:08:21 2007 @@ -15938,8 +18007,9 @@ - - - ---- a/fs/yaffs2/yaffs_mtdif1.h -+++ b/fs/yaffs2/yaffs_mtdif1.h +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_mtdif1.h linux-2.6.36-rc8.new/fs/yaffs2/yaffs_mtdif1.h +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_mtdif1.h 2010-10-20 13:17:58.957000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_mtdif1.h 2010-10-20 13:28:16.062000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet another Flash File System. A NAND-flash specific file system. @@ -15949,8 +18019,32 @@ * for Toby Churchill Ltd and Brightstar Engineering * * This program is free software; you can redistribute it and/or modify ---- a/fs/yaffs2/yaffs_mtdif2.c -+++ b/fs/yaffs2/yaffs_mtdif2.c +@@ -14,15 +14,15 @@ + #ifndef __YAFFS_MTDIF1_H__ + #define __YAFFS_MTDIF1_H__ + +-int nandmtd1_WriteChunkWithTagsToNAND(yaffs_Device *dev, int chunkInNAND, +- const __u8 *data, const yaffs_ExtendedTags *tags); ++int nandmtd1_WriteChunkWithTagsToNAND(yaffs_dev_t *dev, int nand_chunk, ++ const __u8 *data, const yaffs_ext_tags *tags); + +-int nandmtd1_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND, +- __u8 *data, yaffs_ExtendedTags *tags); ++int nandmtd1_ReadChunkWithTagsFromNAND(yaffs_dev_t *dev, int nand_chunk, ++ __u8 *data, yaffs_ext_tags *tags); + +-int nandmtd1_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo); ++int nandmtd1_MarkNANDBlockBad(struct yaffs_dev_s *dev, int block_no); + +-int nandmtd1_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo, +- yaffs_BlockState *state, __u32 *sequenceNumber); ++int nandmtd1_QueryNANDBlock(struct yaffs_dev_s *dev, int block_no, ++ yaffs_block_state_t *state, __u32 *seq_number); + + #endif +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_mtdif2.c linux-2.6.36-rc8.new/fs/yaffs2/yaffs_mtdif2.c +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_mtdif2.c 2010-10-20 13:17:58.957000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_mtdif2.c 2010-10-20 13:28:16.028000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. @@ -15973,7 +18067,7 @@ #include "yaffs_mtdif2.h" -@@ -27,6 +24,8 @@ const char *yaffs_mtdif2_c_version = +@@ -27,15 +24,17 @@ const char *yaffs_mtdif2_c_version = #include "yaffs_packedtags2.h" @@ -15982,12 +18076,15 @@ /* NB For use with inband tags.... * We assume that the data buffer is of size totalBytersPerChunk so that we can also * use it to load the tags. -@@ -35,7 +34,7 @@ int nandmtd2_WriteChunkWithTagsToNAND(ya + */ +-int nandmtd2_WriteChunkWithTagsToNAND(yaffs_Device *dev, int chunkInNAND, ++int nandmtd2_WriteChunkWithTagsToNAND(yaffs_dev_t *dev, int nand_chunk, const __u8 *data, - const yaffs_ExtendedTags *tags) +- const yaffs_ExtendedTags *tags) ++ const yaffs_ext_tags *tags) { - struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice); -+ struct mtd_info *mtd = yaffs_DeviceToMtd(dev); ++ struct mtd_info *mtd = yaffs_dev_to_mtd(dev); #if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17)) struct mtd_oob_ops ops; #else @@ -15995,17 +18092,18 @@ yaffs_PackedTags2 pt; -+ int packed_tags_size = dev->param.noTagsECC ? sizeof(pt.t) : sizeof(pt); -+ void * packed_tags_ptr = dev->param.noTagsECC ? (void *) &pt.t : (void *)&pt; ++ int packed_tags_size = dev->param.no_tags_ecc ? sizeof(pt.t) : sizeof(pt); ++ void * packed_tags_ptr = dev->param.no_tags_ecc ? (void *) &pt.t : (void *)&pt; + T(YAFFS_TRACE_MTD, (TSTR ("nandmtd2_WriteChunkWithTagsToNAND chunk %d data %p tags %p" - TENDSTR), chunkInNAND, data, tags)); +- TENDSTR), chunkInNAND, data, tags)); ++ TENDSTR), nand_chunk, data, tags)); - addr = ((loff_t) chunkInNAND) * dev->totalBytesPerChunk; -+ addr = ((loff_t) chunkInNAND) * dev->param.totalBytesPerChunk; ++ addr = ((loff_t) nand_chunk) * dev->param.total_bytes_per_chunk; /* For yaffs2 writing there must be both data and tags. * If we're using inband tags, then the tags are stuffed into @@ -16014,191 +18112,244 @@ if (!data || !tags) BUG(); - else if (dev->inbandTags) { -+ else if (dev->param.inbandTags) { ++ else if (dev->param.inband_tags) { yaffs_PackedTags2TagsPart *pt2tp; - pt2tp = (yaffs_PackedTags2TagsPart *)(data + dev->nDataBytesPerChunk); +- pt2tp = (yaffs_PackedTags2TagsPart *)(data + dev->nDataBytesPerChunk); ++ pt2tp = (yaffs_PackedTags2TagsPart *)(data + dev->data_bytes_per_chunk); yaffs_PackTags2TagsPart(pt2tp, tags); } else - yaffs_PackTags2(&pt, tags); -+ yaffs_PackTags2(&pt, tags, !dev->param.noTagsECC); ++ yaffs_PackTags2(&pt, tags, !dev->param.no_tags_ecc); #if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17)) ops.mode = MTD_OOB_AUTO; - ops.ooblen = (dev->inbandTags) ? 0 : sizeof(pt); - ops.len = dev->totalBytesPerChunk; -+ ops.ooblen = (dev->param.inbandTags) ? 0 : packed_tags_size; -+ ops.len = dev->param.totalBytesPerChunk; ++ ops.ooblen = (dev->param.inband_tags) ? 0 : packed_tags_size; ++ ops.len = dev->param.total_bytes_per_chunk; ops.ooboffs = 0; ops.datbuf = (__u8 *)data; - ops.oobbuf = (dev->inbandTags) ? NULL : (void *)&pt; -+ ops.oobbuf = (dev->param.inbandTags) ? NULL : packed_tags_ptr; ++ ops.oobbuf = (dev->param.inband_tags) ? NULL : packed_tags_ptr; retval = mtd->write_oob(mtd, addr, &ops); #else - if (!dev->inbandTags) { -+ if (!dev->param.inbandTags) { ++ if (!dev->param.inband_tags) { retval = - mtd->write_ecc(mtd, addr, dev->nDataBytesPerChunk, +- mtd->write_ecc(mtd, addr, dev->nDataBytesPerChunk, - &dummy, data, (__u8 *) &pt, NULL); ++ mtd->write_ecc(mtd, addr, dev->data_bytes_per_chunk, + &dummy, data, (__u8 *) packed_tags_ptr, NULL); } else { retval = - mtd->write(mtd, addr, dev->totalBytesPerChunk, &dummy, -+ mtd->write(mtd, addr, dev->param.totalBytesPerChunk, &dummy, ++ mtd->write(mtd, addr, dev->param.total_bytes_per_chunk, &dummy, data); } #endif -@@ -98,7 +100,7 @@ int nandmtd2_WriteChunkWithTagsToNAND(ya - int nandmtd2_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND, - __u8 *data, yaffs_ExtendedTags *tags) +@@ -95,10 +97,10 @@ int nandmtd2_WriteChunkWithTagsToNAND(ya + return YAFFS_FAIL; + } + +-int nandmtd2_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND, +- __u8 *data, yaffs_ExtendedTags *tags) ++int nandmtd2_ReadChunkWithTagsFromNAND(yaffs_dev_t *dev, int nand_chunk, ++ __u8 *data, yaffs_ext_tags *tags) { - struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice); -+ struct mtd_info *mtd = yaffs_DeviceToMtd(dev); ++ struct mtd_info *mtd = yaffs_dev_to_mtd(dev); #if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17)) struct mtd_oob_ops ops; #endif -@@ -106,16 +108,19 @@ int nandmtd2_ReadChunkWithTagsFromNAND(y +@@ -106,20 +108,23 @@ int nandmtd2_ReadChunkWithTagsFromNAND(y int retval = 0; int localData = 0; - loff_t addr = ((loff_t) chunkInNAND) * dev->totalBytesPerChunk; -+ loff_t addr = ((loff_t) chunkInNAND) * dev->param.totalBytesPerChunk; ++ loff_t addr = ((loff_t) nand_chunk) * dev->param.total_bytes_per_chunk; yaffs_PackedTags2 pt; -+ int packed_tags_size = dev->param.noTagsECC ? sizeof(pt.t) : sizeof(pt); -+ void * packed_tags_ptr = dev->param.noTagsECC ? (void *) &pt.t: (void *)&pt; ++ int packed_tags_size = dev->param.no_tags_ecc ? sizeof(pt.t) : sizeof(pt); ++ void * packed_tags_ptr = dev->param.no_tags_ecc ? (void *) &pt.t: (void *)&pt; + T(YAFFS_TRACE_MTD, (TSTR ("nandmtd2_ReadChunkWithTagsFromNAND chunk %d data %p tags %p" - TENDSTR), chunkInNAND, data, tags)); +- TENDSTR), chunkInNAND, data, tags)); ++ TENDSTR), nand_chunk, data, tags)); - if (dev->inbandTags) { -+ if (dev->param.inbandTags) { ++ if (dev->param.inband_tags) { if (!data) { localData = 1; -@@ -127,20 +132,20 @@ int nandmtd2_ReadChunkWithTagsFromNAND(y +- data = yaffs_GetTempBuffer(dev, __LINE__); ++ data = yaffs_get_temp_buffer(dev, __LINE__); + } + + +@@ -127,30 +132,30 @@ int nandmtd2_ReadChunkWithTagsFromNAND(y #if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17)) - if (dev->inbandTags || (data && !tags)) - retval = mtd->read(mtd, addr, dev->totalBytesPerChunk, -+ if (dev->param.inbandTags || (data && !tags)) -+ retval = mtd->read(mtd, addr, dev->param.totalBytesPerChunk, ++ if (dev->param.inband_tags || (data && !tags)) ++ retval = mtd->read(mtd, addr, dev->param.total_bytes_per_chunk, &dummy, data); else if (tags) { ops.mode = MTD_OOB_AUTO; - ops.ooblen = sizeof(pt); - ops.len = data ? dev->nDataBytesPerChunk : sizeof(pt); + ops.ooblen = packed_tags_size; -+ ops.len = data ? dev->nDataBytesPerChunk : packed_tags_size; ++ ops.len = data ? dev->data_bytes_per_chunk : packed_tags_size; ops.ooboffs = 0; ops.datbuf = data; - ops.oobbuf = dev->spareBuffer; -+ ops.oobbuf = yaffs_DeviceToLC(dev)->spareBuffer; ++ ops.oobbuf = yaffs_dev_to_lc(dev)->spareBuffer; retval = mtd->read_oob(mtd, addr, &ops); } #else - if (!dev->inbandTags && data && tags) { -+ if (!dev->param.inbandTags && data && tags) { ++ if (!dev->param.inband_tags && data && tags) { - retval = mtd->read_ecc(mtd, addr, dev->nDataBytesPerChunk, +- retval = mtd->read_ecc(mtd, addr, dev->nDataBytesPerChunk, ++ retval = mtd->read_ecc(mtd, addr, dev->data_bytes_per_chunk, &dummy, data, dev->spareBuffer, -@@ -150,7 +155,7 @@ int nandmtd2_ReadChunkWithTagsFromNAND(y + NULL); + } else { + if (data) retval = - mtd->read(mtd, addr, dev->nDataBytesPerChunk, &dummy, +- mtd->read(mtd, addr, dev->nDataBytesPerChunk, &dummy, ++ mtd->read(mtd, addr, dev->data_bytes_per_chunk, &dummy, data); - if (!dev->inbandTags && tags) -+ if (!dev->param.inbandTags && tags) ++ if (!dev->param.inband_tags && tags) retval = mtd->read_oob(mtd, addr, mtd->oobsize, &dummy, dev->spareBuffer); -@@ -158,7 +163,7 @@ int nandmtd2_ReadChunkWithTagsFromNAND(y +@@ -158,41 +163,47 @@ int nandmtd2_ReadChunkWithTagsFromNAND(y #endif - if (dev->inbandTags) { -+ if (dev->param.inbandTags) { ++ if (dev->param.inband_tags) { if (tags) { yaffs_PackedTags2TagsPart *pt2tp; - pt2tp = (yaffs_PackedTags2TagsPart *)&data[dev->nDataBytesPerChunk]; -@@ -166,16 +171,22 @@ int nandmtd2_ReadChunkWithTagsFromNAND(y +- pt2tp = (yaffs_PackedTags2TagsPart *)&data[dev->nDataBytesPerChunk]; +- yaffs_UnpackTags2TagsPart(tags, pt2tp); ++ pt2tp = (yaffs_PackedTags2TagsPart *)&data[dev->data_bytes_per_chunk]; ++ yaffs_unpack_tags2tags_part(tags, pt2tp); } } else { if (tags) { - memcpy(&pt, dev->spareBuffer, sizeof(pt)); - yaffs_UnpackTags2(tags, &pt); -+ memcpy(packed_tags_ptr, yaffs_DeviceToLC(dev)->spareBuffer, packed_tags_size); -+ yaffs_UnpackTags2(tags, &pt, !dev->param.noTagsECC); ++ memcpy(packed_tags_ptr, yaffs_dev_to_lc(dev)->spareBuffer, packed_tags_size); ++ yaffs_unpack_tags2(tags, &pt, !dev->param.no_tags_ecc); } } if (localData) - yaffs_ReleaseTempBuffer(dev, data, __LINE__); +- yaffs_ReleaseTempBuffer(dev, data, __LINE__); ++ yaffs_release_temp_buffer(dev, data, __LINE__); - if (tags && retval == -EBADMSG && tags->eccResult == YAFFS_ECC_RESULT_NO_ERROR) -+ if (tags && retval == -EBADMSG && tags->eccResult == YAFFS_ECC_RESULT_NO_ERROR) { - tags->eccResult = YAFFS_ECC_RESULT_UNFIXED; -+ dev->eccUnfixed++; +- tags->eccResult = YAFFS_ECC_RESULT_UNFIXED; ++ if (tags && retval == -EBADMSG && tags->ecc_result == YAFFS_ECC_RESULT_NO_ERROR) { ++ tags->ecc_result = YAFFS_ECC_RESULT_UNFIXED; ++ dev->n_ecc_unfixed++; + } -+ if(tags && retval == -EUCLEAN && tags->eccResult == YAFFS_ECC_RESULT_NO_ERROR) { -+ tags->eccResult = YAFFS_ECC_RESULT_FIXED; -+ dev->eccFixed++; ++ if(tags && retval == -EUCLEAN && tags->ecc_result == YAFFS_ECC_RESULT_NO_ERROR) { ++ tags->ecc_result = YAFFS_ECC_RESULT_FIXED; ++ dev->n_ecc_fixed++; + } if (retval == 0) return YAFFS_OK; else -@@ -184,15 +195,15 @@ int nandmtd2_ReadChunkWithTagsFromNAND(y + return YAFFS_FAIL; + } - int nandmtd2_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo) +-int nandmtd2_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo) ++int nandmtd2_MarkNANDBlockBad(struct yaffs_dev_s *dev, int block_no) { - struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice); -+ struct mtd_info *mtd = yaffs_DeviceToMtd(dev); ++ struct mtd_info *mtd = yaffs_dev_to_mtd(dev); int retval; T(YAFFS_TRACE_MTD, - (TSTR("nandmtd2_MarkNANDBlockBad %d" TENDSTR), blockNo)); +- (TSTR("nandmtd2_MarkNANDBlockBad %d" TENDSTR), blockNo)); ++ (TSTR("nandmtd2_MarkNANDBlockBad %d" TENDSTR), block_no)); retval = mtd->block_markbad(mtd, - blockNo * dev->nChunksPerBlock * - dev->totalBytesPerChunk); -+ blockNo * dev->param.nChunksPerBlock * -+ dev->param.totalBytesPerChunk); ++ block_no * dev->param.chunks_per_block * ++ dev->param.total_bytes_per_chunk); if (retval == 0) return YAFFS_OK; -@@ -204,15 +215,15 @@ int nandmtd2_MarkNANDBlockBad(struct yaf - int nandmtd2_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo, - yaffs_BlockState *state, __u32 *sequenceNumber) +@@ -201,41 +212,41 @@ int nandmtd2_MarkNANDBlockBad(struct yaf + + } + +-int nandmtd2_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo, +- yaffs_BlockState *state, __u32 *sequenceNumber) ++int nandmtd2_QueryNANDBlock(struct yaffs_dev_s *dev, int block_no, ++ yaffs_block_state_t *state, __u32 *seq_number) { - struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice); -+ struct mtd_info *mtd = yaffs_DeviceToMtd(dev); ++ struct mtd_info *mtd = yaffs_dev_to_mtd(dev); int retval; T(YAFFS_TRACE_MTD, - (TSTR("nandmtd2_QueryNANDBlock %d" TENDSTR), blockNo)); +- (TSTR("nandmtd2_QueryNANDBlock %d" TENDSTR), blockNo)); ++ (TSTR("nandmtd2_QueryNANDBlock %d" TENDSTR), block_no)); retval = mtd->block_isbad(mtd, - blockNo * dev->nChunksPerBlock * - dev->totalBytesPerChunk); -+ blockNo * dev->param.nChunksPerBlock * -+ dev->param.totalBytesPerChunk); ++ block_no * dev->param.chunks_per_block * ++ dev->param.total_bytes_per_chunk); if (retval) { T(YAFFS_TRACE_MTD, (TSTR("block is bad" TENDSTR))); -@@ -223,7 +234,7 @@ int nandmtd2_QueryNANDBlock(struct yaffs - yaffs_ExtendedTags t; + + *state = YAFFS_BLOCK_STATE_DEAD; +- *sequenceNumber = 0; ++ *seq_number = 0; + } else { +- yaffs_ExtendedTags t; ++ yaffs_ext_tags t; nandmtd2_ReadChunkWithTagsFromNAND(dev, - blockNo * +- blockNo * - dev->nChunksPerBlock, NULL, -+ dev->param.nChunksPerBlock, NULL, ++ block_no * ++ dev->param.chunks_per_block, NULL, &t); - if (t.chunkUsed) { ---- a/fs/yaffs2/yaffs_mtdif2.h -+++ b/fs/yaffs2/yaffs_mtdif2.h +- if (t.chunkUsed) { +- *sequenceNumber = t.sequenceNumber; ++ if (t.chunk_used) { ++ *seq_number = t.seq_number; + *state = YAFFS_BLOCK_STATE_NEEDS_SCANNING; + } else { +- *sequenceNumber = 0; ++ *seq_number = 0; + *state = YAFFS_BLOCK_STATE_EMPTY; + } + } + T(YAFFS_TRACE_MTD, +- (TSTR("block is bad seq %d state %d" TENDSTR), *sequenceNumber, ++ (TSTR("block is bad seq %d state %d" TENDSTR), *seq_number, + *state)); + + if (retval == 0) +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_mtdif2.h linux-2.6.36-rc8.new/fs/yaffs2/yaffs_mtdif2.h +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_mtdif2.h 2010-10-20 13:17:58.957000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_mtdif2.h 2010-10-20 13:28:16.062000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet another Flash File System . A NAND-flash specific file system. @@ -16208,8 +18359,30 @@ * for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning ---- a/fs/yaffs2/yaffs_mtdif.c -+++ b/fs/yaffs2/yaffs_mtdif.c +@@ -17,13 +17,13 @@ + #define __YAFFS_MTDIF2_H__ + + #include "yaffs_guts.h" +-int nandmtd2_WriteChunkWithTagsToNAND(yaffs_Device *dev, int chunkInNAND, ++int nandmtd2_WriteChunkWithTagsToNAND(yaffs_dev_t *dev, int nand_chunk, + const __u8 *data, +- const yaffs_ExtendedTags *tags); +-int nandmtd2_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND, +- __u8 *data, yaffs_ExtendedTags *tags); +-int nandmtd2_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo); +-int nandmtd2_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo, +- yaffs_BlockState *state, __u32 *sequenceNumber); ++ const yaffs_ext_tags *tags); ++int nandmtd2_ReadChunkWithTagsFromNAND(yaffs_dev_t *dev, int nand_chunk, ++ __u8 *data, yaffs_ext_tags *tags); ++int nandmtd2_MarkNANDBlockBad(struct yaffs_dev_s *dev, int block_no); ++int nandmtd2_QueryNANDBlock(struct yaffs_dev_s *dev, int block_no, ++ yaffs_block_state_t *state, __u32 *seq_number); + + #endif +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_mtdif.c linux-2.6.36-rc8.new/fs/yaffs2/yaffs_mtdif.c +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_mtdif.c 2010-10-20 13:17:58.958000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_mtdif.c 2010-10-20 13:28:16.029000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. @@ -16353,7 +18526,8 @@ -#endif - size_t dummy; - int retval = 0; -- ++#include "yaffs_linux.h" + - loff_t addr = ((loff_t) chunkInNAND) * dev->nDataBytesPerChunk; -#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17)) - __u8 spareAsBytes[8]; /* OOB */ @@ -16413,17 +18587,17 @@ - else - return YAFFS_FAIL; -} -+#include "yaffs_linux.h" - - int nandmtd_EraseBlockInNAND(yaffs_Device *dev, int blockNumber) +- +-int nandmtd_EraseBlockInNAND(yaffs_Device *dev, int blockNumber) ++int nandmtd_EraseBlockInNAND(yaffs_dev_t *dev, int blockNumber) { - struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice); -+ struct mtd_info *mtd = yaffs_DeviceToMtd(dev); ++ struct mtd_info *mtd = yaffs_dev_to_mtd(dev); __u32 addr = - ((loff_t) blockNumber) * dev->nDataBytesPerChunk - * dev->nChunksPerBlock; -+ ((loff_t) blockNumber) * dev->param.totalBytesPerChunk -+ * dev->param.nChunksPerBlock; ++ ((loff_t) blockNumber) * dev->param.total_bytes_per_chunk ++ * dev->param.chunks_per_block; struct erase_info ei; + int retval = 0; @@ -16431,7 +18605,7 @@ ei.mtd = mtd; ei.addr = addr; - ei.len = dev->nDataBytesPerChunk * dev->nChunksPerBlock; -+ ei.len = dev->param.totalBytesPerChunk * dev->param.nChunksPerBlock; ++ ei.len = dev->param.total_bytes_per_chunk * dev->param.chunks_per_block; ei.time = 1000; ei.retries = 2; ei.callback = NULL; @@ -16444,8 +18618,18 @@ retval = mtd->erase(mtd, &ei); if (retval == 0) ---- a/fs/yaffs2/yaffs_mtdif.h -+++ b/fs/yaffs2/yaffs_mtdif.h +@@ -234,7 +49,7 @@ int nandmtd_EraseBlockInNAND(yaffs_Devic + return YAFFS_FAIL; + } + +-int nandmtd_InitialiseNAND(yaffs_Device *dev) ++int nandmtd_InitialiseNAND(yaffs_dev_t *dev) + { + return YAFFS_OK; + } +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_mtdif.h linux-2.6.36-rc8.new/fs/yaffs2/yaffs_mtdif.h +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_mtdif.h 2010-10-20 13:17:58.958000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_mtdif.h 2010-10-20 13:28:16.062000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet another Flash File System . A NAND-flash specific file system. @@ -16464,11 +18648,14 @@ - const __u8 *data, const yaffs_Spare *spare); -int nandmtd_ReadChunkFromNAND(yaffs_Device *dev, int chunkInNAND, __u8 *data, - yaffs_Spare *spare); - int nandmtd_EraseBlockInNAND(yaffs_Device *dev, int blockNumber); - int nandmtd_InitialiseNAND(yaffs_Device *dev); +-int nandmtd_EraseBlockInNAND(yaffs_Device *dev, int blockNumber); +-int nandmtd_InitialiseNAND(yaffs_Device *dev); ++int nandmtd_EraseBlockInNAND(yaffs_dev_t *dev, int blockNumber); ++int nandmtd_InitialiseNAND(yaffs_dev_t *dev); #endif ---- /dev/null -+++ b/fs/yaffs2/yaffs_nameval.c +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_nameval.c linux-2.6.36-rc8.new/fs/yaffs2/yaffs_nameval.c +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_nameval.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_nameval.c 2010-10-20 13:28:16.029000294 +0300 @@ -0,0 +1,197 @@ +/* + * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. @@ -16667,8 +18854,9 @@ +{ + return nval_used(xb, xb_size) > 0; +} ---- /dev/null -+++ b/fs/yaffs2/yaffs_nameval.h +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_nameval.h linux-2.6.36-rc8.new/fs/yaffs2/yaffs_nameval.h +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_nameval.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_nameval.h 2010-10-20 13:28:16.062000294 +0300 @@ -0,0 +1,25 @@ +/* + * YAFFS: Yet another Flash File System . A NAND-flash specific file system. @@ -16695,8 +18883,9 @@ +int nval_list(const char *xb, int xb_size, char *buf, int bsize); +int nval_hasvalues(const char *xb, int xb_size); +#endif ---- a/fs/yaffs2/yaffs_nand.c -+++ b/fs/yaffs2/yaffs_nand.c +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_nand.c linux-2.6.36-rc8.new/fs/yaffs2/yaffs_nand.c +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_nand.c 2010-10-20 13:17:58.959000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_nand.c 2010-10-20 13:28:16.029000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. @@ -16706,7 +18895,7 @@ * for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning -@@ -11,9 +11,6 @@ +@@ -11,124 +11,129 @@ * published by the Free Software Foundation. */ @@ -16716,102 +18905,177 @@ #include "yaffs_nand.h" #include "yaffs_tagscompat.h" #include "yaffs_tagsvalidity.h" -@@ -29,12 +26,14 @@ int yaffs_ReadChunkWithTagsFromNAND(yaff - int realignedChunkInNAND = chunkInNAND - dev->chunkOffset; + #include "yaffs_getblockinfo.h" -+ dev->nPageReads++; +-int yaffs_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND, ++int yaffs_rd_chunk_tags_nand(yaffs_dev_t *dev, int nand_chunk, + __u8 *buffer, +- yaffs_ExtendedTags *tags) ++ yaffs_ext_tags *tags) + { + int result; +- yaffs_ExtendedTags localTags; ++ yaffs_ext_tags localTags; + ++ int realignedChunkInNAND = nand_chunk - dev->chunk_offset; + +- int realignedChunkInNAND = chunkInNAND - dev->chunkOffset; ++ dev->n_page_reads++; + /* If there are no tags provided, use local tags to get prioritised gc working */ if (!tags) tags = &localTags; - if (dev->readChunkWithTagsFromNAND) - result = dev->readChunkWithTagsFromNAND(dev, realignedChunkInNAND, buffer, -+ if (dev->param.readChunkWithTagsFromNAND) -+ result = dev->param.readChunkWithTagsFromNAND(dev, realignedChunkInNAND, buffer, ++ if (dev->param.read_chunk_tags_fn) ++ result = dev->param.read_chunk_tags_fn(dev, realignedChunkInNAND, buffer, tags); else - result = yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(dev, -@@ -44,7 +43,8 @@ int yaffs_ReadChunkWithTagsFromNAND(yaff +- result = yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(dev, ++ result = yaffs_tags_compat_rd(dev, + realignedChunkInNAND, + buffer, + tags); if (tags && - tags->eccResult > YAFFS_ECC_RESULT_NO_ERROR) { +- tags->eccResult > YAFFS_ECC_RESULT_NO_ERROR) { ++ tags->ecc_result > YAFFS_ECC_RESULT_NO_ERROR) { - yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, chunkInNAND/dev->nChunksPerBlock); -+ yaffs_BlockInfo *bi; -+ bi = yaffs_GetBlockInfo(dev, chunkInNAND/dev->param.nChunksPerBlock); - yaffs_HandleChunkError(dev, bi); +- yaffs_HandleChunkError(dev, bi); ++ yaffs_block_info_t *bi; ++ bi = yaffs_get_block_info(dev, nand_chunk/dev->param.chunks_per_block); ++ yaffs_handle_chunk_error(dev, bi); } -@@ -56,6 +56,9 @@ int yaffs_WriteChunkWithTagsToNAND(yaffs + return result; + } + +-int yaffs_WriteChunkWithTagsToNAND(yaffs_Device *dev, +- int chunkInNAND, ++int yaffs_wr_chunk_tags_nand(yaffs_dev_t *dev, ++ int nand_chunk, const __u8 *buffer, - yaffs_ExtendedTags *tags) +- yaffs_ExtendedTags *tags) ++ yaffs_ext_tags *tags) { +- chunkInNAND -= dev->chunkOffset; + -+ dev->nPageWrites++; ++ dev->n_page_writes++; + - chunkInNAND -= dev->chunkOffset; ++ nand_chunk -= dev->chunk_offset; -@@ -75,8 +78,8 @@ int yaffs_WriteChunkWithTagsToNAND(yaffs + if (tags) { +- tags->sequenceNumber = dev->sequenceNumber; +- tags->chunkUsed = 1; +- if (!yaffs_ValidateTags(tags)) { ++ tags->seq_number = dev->seq_number; ++ tags->chunk_used = 1; ++ if (!yaffs_validate_tags(tags)) { + T(YAFFS_TRACE_ERROR, + (TSTR("Writing uninitialised tags" TENDSTR))); + YBUG(); + } + T(YAFFS_TRACE_WRITE, +- (TSTR("Writing chunk %d tags %d %d" TENDSTR), chunkInNAND, +- tags->objectId, tags->chunkId)); ++ (TSTR("Writing chunk %d tags %d %d" TENDSTR), nand_chunk, ++ tags->obj_id, tags->chunk_id)); + } else { + T(YAFFS_TRACE_ERROR, (TSTR("Writing with no tags" TENDSTR))); YBUG(); } - if (dev->writeChunkWithTagsToNAND) - return dev->writeChunkWithTagsToNAND(dev, chunkInNAND, buffer, -+ if (dev->param.writeChunkWithTagsToNAND) -+ return dev->param.writeChunkWithTagsToNAND(dev, chunkInNAND, buffer, ++ if (dev->param.write_chunk_tags_fn) ++ return dev->param.write_chunk_tags_fn(dev, nand_chunk, buffer, tags); else - return yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(dev, -@@ -89,9 +92,9 @@ int yaffs_MarkBlockBad(yaffs_Device *dev +- return yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(dev, +- chunkInNAND, ++ return yaffs_tags_compat_wr(dev, ++ nand_chunk, + buffer, + tags); + } + +-int yaffs_MarkBlockBad(yaffs_Device *dev, int blockNo) ++int yaffs_mark_bad(yaffs_dev_t *dev, int block_no) { - blockNo -= dev->blockOffset; +- blockNo -= dev->blockOffset; ++ block_no -= dev->block_offset; ++ -; - if (dev->markNANDBlockBad) - return dev->markNANDBlockBad(dev, blockNo); -+ -+ if (dev->param.markNANDBlockBad) -+ return dev->param.markNANDBlockBad(dev, blockNo); ++ if (dev->param.bad_block_fn) ++ return dev->param.bad_block_fn(dev, block_no); else - return yaffs_TagsCompatabilityMarkNANDBlockBad(dev, blockNo); +- return yaffs_TagsCompatabilityMarkNANDBlockBad(dev, blockNo); ++ return yaffs_tags_compat_mark_bad(dev, block_no); } -@@ -103,8 +106,8 @@ int yaffs_QueryInitialBlockState(yaffs_D + +-int yaffs_QueryInitialBlockState(yaffs_Device *dev, +- int blockNo, +- yaffs_BlockState *state, +- __u32 *sequenceNumber) ++int yaffs_query_init_block_state(yaffs_dev_t *dev, ++ int block_no, ++ yaffs_block_state_t *state, ++ __u32 *seq_number) { - blockNo -= dev->blockOffset; +- blockNo -= dev->blockOffset; ++ block_no -= dev->block_offset; - if (dev->queryNANDBlock) - return dev->queryNANDBlock(dev, blockNo, state, sequenceNumber); -+ if (dev->param.queryNANDBlock) -+ return dev->param.queryNANDBlock(dev, blockNo, state, sequenceNumber); ++ if (dev->param.query_block_fn) ++ return dev->param.query_block_fn(dev, block_no, state, seq_number); else - return yaffs_TagsCompatabilityQueryNANDBlock(dev, blockNo, +- return yaffs_TagsCompatabilityQueryNANDBlock(dev, blockNo, ++ return yaffs_tags_compat_query_block(dev, block_no, state, -@@ -119,16 +122,18 @@ int yaffs_EraseBlockInNAND(struct yaffs_ +- sequenceNumber); ++ seq_number); + } - blockInNAND -= dev->blockOffset; -- - dev->nBlockErasures++; +-int yaffs_EraseBlockInNAND(struct yaffs_DeviceStruct *dev, +- int blockInNAND) ++int yaffs_erase_block(struct yaffs_dev_s *dev, ++ int flash_block) + { + int result; + +- blockInNAND -= dev->blockOffset; ++ flash_block -= dev->block_offset; + ++ dev->n_erasures++; + +- dev->nBlockErasures++; - result = dev->eraseBlockInNAND(dev, blockInNAND); -+ -+ result = dev->param.eraseBlockInNAND(dev, blockInNAND); ++ result = dev->param.erase_fn(dev, flash_block); return result; } - int yaffs_InitialiseNAND(struct yaffs_DeviceStruct *dev) +-int yaffs_InitialiseNAND(struct yaffs_DeviceStruct *dev) ++int yaffs_init_nand(struct yaffs_dev_s *dev) { - return dev->initialiseNAND(dev); -+ if(dev->param.initialiseNAND) -+ return dev->param.initialiseNAND(dev); ++ if(dev->param.initialise_flash_fn) ++ return dev->param.initialise_flash_fn(dev); + return YAFFS_OK; } ---- a/fs/yaffs2/yaffs_nandemul2k.h -+++ b/fs/yaffs2/yaffs_nandemul2k.h +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_nandemul2k.h linux-2.6.36-rc8.new/fs/yaffs2/yaffs_nandemul2k.h +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_nandemul2k.h 2010-10-20 13:17:58.959000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_nandemul2k.h 2010-10-20 13:28:16.063000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet another Flash File System . A NAND-flash specific file system. @@ -16821,8 +19085,40 @@ * for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning ---- a/fs/yaffs2/yaffs_nand.h -+++ b/fs/yaffs2/yaffs_nand.h +@@ -20,18 +20,18 @@ + + #include "yaffs_guts.h" + +-int nandemul2k_WriteChunkWithTagsToNAND(struct yaffs_DeviceStruct *dev, +- int chunkInNAND, const __u8 *data, +- const yaffs_ExtendedTags *tags); +-int nandemul2k_ReadChunkWithTagsFromNAND(struct yaffs_DeviceStruct *dev, +- int chunkInNAND, __u8 *data, +- yaffs_ExtendedTags *tags); +-int nandemul2k_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo); +-int nandemul2k_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo, +- yaffs_BlockState *state, __u32 *sequenceNumber); +-int nandemul2k_EraseBlockInNAND(struct yaffs_DeviceStruct *dev, +- int blockInNAND); +-int nandemul2k_InitialiseNAND(struct yaffs_DeviceStruct *dev); ++int nandemul2k_WriteChunkWithTagsToNAND(struct yaffs_dev_s *dev, ++ int nand_chunk, const __u8 *data, ++ const yaffs_ext_tags *tags); ++int nandemul2k_ReadChunkWithTagsFromNAND(struct yaffs_dev_s *dev, ++ int nand_chunk, __u8 *data, ++ yaffs_ext_tags *tags); ++int nandemul2k_MarkNANDBlockBad(struct yaffs_dev_s *dev, int block_no); ++int nandemul2k_QueryNANDBlock(struct yaffs_dev_s *dev, int block_no, ++ yaffs_block_state_t *state, __u32 *seq_number); ++int nandemul2k_EraseBlockInNAND(struct yaffs_dev_s *dev, ++ int flash_block); ++int nandemul2k_InitialiseNAND(struct yaffs_dev_s *dev); + int nandemul2k_GetBytesPerChunk(void); + int nandemul2k_GetChunksPerBlock(void); + int nandemul2k_GetNumberOfBlocks(void); +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_nand.h linux-2.6.36-rc8.new/fs/yaffs2/yaffs_nand.h +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_nand.h 2010-10-20 13:17:58.959000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_nand.h 2010-10-20 13:28:16.063000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet another Flash File System . A NAND-flash specific file system. @@ -16832,8 +19128,49 @@ * for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning ---- a/fs/yaffs2/yaffs_packedtags1.c -+++ b/fs/yaffs2/yaffs_packedtags1.c +@@ -19,26 +19,26 @@ + + + +-int yaffs_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND, ++int yaffs_rd_chunk_tags_nand(yaffs_dev_t *dev, int nand_chunk, + __u8 *buffer, +- yaffs_ExtendedTags *tags); ++ yaffs_ext_tags *tags); + +-int yaffs_WriteChunkWithTagsToNAND(yaffs_Device *dev, +- int chunkInNAND, ++int yaffs_wr_chunk_tags_nand(yaffs_dev_t *dev, ++ int nand_chunk, + const __u8 *buffer, +- yaffs_ExtendedTags *tags); ++ yaffs_ext_tags *tags); + +-int yaffs_MarkBlockBad(yaffs_Device *dev, int blockNo); ++int yaffs_mark_bad(yaffs_dev_t *dev, int block_no); + +-int yaffs_QueryInitialBlockState(yaffs_Device *dev, +- int blockNo, +- yaffs_BlockState *state, +- unsigned *sequenceNumber); ++int yaffs_query_init_block_state(yaffs_dev_t *dev, ++ int block_no, ++ yaffs_block_state_t *state, ++ unsigned *seq_number); + +-int yaffs_EraseBlockInNAND(struct yaffs_DeviceStruct *dev, +- int blockInNAND); ++int yaffs_erase_block(struct yaffs_dev_s *dev, ++ int flash_block); + +-int yaffs_InitialiseNAND(struct yaffs_DeviceStruct *dev); ++int yaffs_init_nand(struct yaffs_dev_s *dev); + + #endif + +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_packedtags1.c linux-2.6.36-rc8.new/fs/yaffs2/yaffs_packedtags1.c +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_packedtags1.c 2010-10-20 13:17:58.959000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_packedtags1.c 2010-10-20 13:28:16.029000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. @@ -16843,8 +19180,64 @@ * for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning ---- a/fs/yaffs2/yaffs_packedtags1.h -+++ b/fs/yaffs2/yaffs_packedtags1.h +@@ -14,37 +14,37 @@ + #include "yaffs_packedtags1.h" + #include "yportenv.h" + +-void yaffs_PackTags1(yaffs_PackedTags1 *pt, const yaffs_ExtendedTags *t) ++void yaffs_PackTags1(yaffs_PackedTags1 *pt, const yaffs_ext_tags *t) + { +- pt->chunkId = t->chunkId; +- pt->serialNumber = t->serialNumber; +- pt->byteCount = t->byteCount; +- pt->objectId = t->objectId; ++ pt->chunk_id = t->chunk_id; ++ pt->serial_number = t->serial_number; ++ pt->n_bytes = t->n_bytes; ++ pt->obj_id = t->obj_id; + pt->ecc = 0; +- pt->deleted = (t->chunkDeleted) ? 0 : 1; ++ pt->deleted = (t->is_deleted) ? 0 : 1; + pt->unusedStuff = 0; + pt->shouldBeFF = 0xFFFFFFFF; + + } + +-void yaffs_UnpackTags1(yaffs_ExtendedTags *t, const yaffs_PackedTags1 *pt) ++void yaffs_unpack_tags1(yaffs_ext_tags *t, const yaffs_PackedTags1 *pt) + { + static const __u8 allFF[] = + { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff }; + + if (memcmp(allFF, pt, sizeof(yaffs_PackedTags1))) { +- t->blockBad = 0; ++ t->block_bad = 0; + if (pt->shouldBeFF != 0xFFFFFFFF) +- t->blockBad = 1; +- t->chunkUsed = 1; +- t->objectId = pt->objectId; +- t->chunkId = pt->chunkId; +- t->byteCount = pt->byteCount; +- t->eccResult = YAFFS_ECC_RESULT_NO_ERROR; +- t->chunkDeleted = (pt->deleted) ? 0 : 1; +- t->serialNumber = pt->serialNumber; ++ t->block_bad = 1; ++ t->chunk_used = 1; ++ t->obj_id = pt->obj_id; ++ t->chunk_id = pt->chunk_id; ++ t->n_bytes = pt->n_bytes; ++ t->ecc_result = YAFFS_ECC_RESULT_NO_ERROR; ++ t->is_deleted = (pt->deleted) ? 0 : 1; ++ t->serial_number = pt->serial_number; + } else { +- memset(t, 0, sizeof(yaffs_ExtendedTags)); ++ memset(t, 0, sizeof(yaffs_ext_tags)); + } + } +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_packedtags1.h linux-2.6.36-rc8.new/fs/yaffs2/yaffs_packedtags1.h +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_packedtags1.h 2010-10-20 13:17:58.960000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_packedtags1.h 2010-10-20 13:28:16.063000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet another Flash File System . A NAND-flash specific file system. @@ -16854,8 +19247,33 @@ * for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning ---- a/fs/yaffs2/yaffs_packedtags2.c -+++ b/fs/yaffs2/yaffs_packedtags2.c +@@ -21,10 +21,10 @@ + #include "yaffs_guts.h" + + typedef struct { +- unsigned chunkId:20; +- unsigned serialNumber:2; +- unsigned byteCount:10; +- unsigned objectId:18; ++ unsigned chunk_id:20; ++ unsigned serial_number:2; ++ unsigned n_bytes:10; ++ unsigned obj_id:18; + unsigned ecc:12; + unsigned deleted:1; + unsigned unusedStuff:1; +@@ -32,6 +32,6 @@ typedef struct { + + } yaffs_PackedTags1; + +-void yaffs_PackTags1(yaffs_PackedTags1 *pt, const yaffs_ExtendedTags *t); +-void yaffs_UnpackTags1(yaffs_ExtendedTags *t, const yaffs_PackedTags1 *pt); ++void yaffs_PackTags1(yaffs_PackedTags1 *pt, const yaffs_ext_tags *t); ++void yaffs_unpack_tags1(yaffs_ext_tags *t, const yaffs_PackedTags1 *pt); + #endif +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_packedtags2.c linux-2.6.36-rc8.new/fs/yaffs2/yaffs_packedtags2.c +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_packedtags2.c 2010-10-20 13:17:58.960000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_packedtags2.c 2010-10-20 13:28:16.029000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. @@ -16873,19 +19291,112 @@ #include "yaffs_tagsvalidity.h" /* This code packs a set of extended tags into a binary structure for -@@ -96,17 +97,14 @@ void yaffs_PackTags2TagsPart(yaffs_Packe +@@ -24,7 +25,7 @@ + * This is defined by having the EXTRA_HEADER_INFO_FLAG set. + */ + +-/* Extra flags applied to chunkId */ ++/* Extra flags applied to chunk_id */ + + #define EXTRA_HEADER_INFO_FLAG 0x80000000 + #define EXTRA_SHRINK_FLAG 0x40000000 +@@ -42,53 +43,53 @@ static void yaffs_DumpPackedTags2TagsPar + { + T(YAFFS_TRACE_MTD, + (TSTR("packed tags obj %d chunk %d byte %d seq %d" TENDSTR), +- ptt->objectId, ptt->chunkId, ptt->byteCount, +- ptt->sequenceNumber)); ++ ptt->obj_id, ptt->chunk_id, ptt->n_bytes, ++ ptt->seq_number)); + } + static void yaffs_DumpPackedTags2(const yaffs_PackedTags2 *pt) + { + yaffs_DumpPackedTags2TagsPart(&pt->t); + } + +-static void yaffs_DumpTags2(const yaffs_ExtendedTags *t) ++static void yaffs_DumpTags2(const yaffs_ext_tags *t) + { + T(YAFFS_TRACE_MTD, + (TSTR + ("ext.tags eccres %d blkbad %d chused %d obj %d chunk%d byte %d del %d ser %d seq %d" +- TENDSTR), t->eccResult, t->blockBad, t->chunkUsed, t->objectId, +- t->chunkId, t->byteCount, t->chunkDeleted, t->serialNumber, +- t->sequenceNumber)); ++ TENDSTR), t->ecc_result, t->block_bad, t->chunk_used, t->obj_id, ++ t->chunk_id, t->n_bytes, t->is_deleted, t->serial_number, ++ t->seq_number)); + + } + + void yaffs_PackTags2TagsPart(yaffs_PackedTags2TagsPart *ptt, +- const yaffs_ExtendedTags *t) ++ const yaffs_ext_tags *t) + { +- ptt->chunkId = t->chunkId; +- ptt->sequenceNumber = t->sequenceNumber; +- ptt->byteCount = t->byteCount; +- ptt->objectId = t->objectId; ++ ptt->chunk_id = t->chunk_id; ++ ptt->seq_number = t->seq_number; ++ ptt->n_bytes = t->n_bytes; ++ ptt->obj_id = t->obj_id; + +- if (t->chunkId == 0 && t->extraHeaderInfoAvailable) { ++ if (t->chunk_id == 0 && t->extra_available) { + /* Store the extra header info instead */ +- /* We save the parent object in the chunkId */ +- ptt->chunkId = EXTRA_HEADER_INFO_FLAG +- | t->extraParentObjectId; +- if (t->extraIsShrinkHeader) +- ptt->chunkId |= EXTRA_SHRINK_FLAG; +- if (t->extraShadows) +- ptt->chunkId |= EXTRA_SHADOWS_FLAG; +- +- ptt->objectId &= ~EXTRA_OBJECT_TYPE_MASK; +- ptt->objectId |= +- (t->extraObjectType << EXTRA_OBJECT_TYPE_SHIFT); +- +- if (t->extraObjectType == YAFFS_OBJECT_TYPE_HARDLINK) +- ptt->byteCount = t->extraEquivalentObjectId; +- else if (t->extraObjectType == YAFFS_OBJECT_TYPE_FILE) +- ptt->byteCount = t->extraFileLength; ++ /* We save the parent object in the chunk_id */ ++ ptt->chunk_id = EXTRA_HEADER_INFO_FLAG ++ | t->extra_parent_id; ++ if (t->extra_is_shrink) ++ ptt->chunk_id |= EXTRA_SHRINK_FLAG; ++ if (t->extra_shadows) ++ ptt->chunk_id |= EXTRA_SHADOWS_FLAG; ++ ++ ptt->obj_id &= ~EXTRA_OBJECT_TYPE_MASK; ++ ptt->obj_id |= ++ (t->extra_obj_type << EXTRA_OBJECT_TYPE_SHIFT); ++ ++ if (t->extra_obj_type == YAFFS_OBJECT_TYPE_HARDLINK) ++ ptt->n_bytes = t->extra_equiv_id; ++ else if (t->extra_obj_type == YAFFS_OBJECT_TYPE_FILE) ++ ptt->n_bytes = t->extra_length; + else +- ptt->byteCount = 0; ++ ptt->n_bytes = 0; + } + + yaffs_DumpPackedTags2TagsPart(ptt); +@@ -96,59 +97,56 @@ void yaffs_PackTags2TagsPart(yaffs_Packe } -void yaffs_PackTags2(yaffs_PackedTags2 *pt, const yaffs_ExtendedTags *t) -+void yaffs_PackTags2(yaffs_PackedTags2 *pt, const yaffs_ExtendedTags *t, int tagsECC) ++void yaffs_PackTags2(yaffs_PackedTags2 *pt, const yaffs_ext_tags *t, int tagsECC) { yaffs_PackTags2TagsPart(&pt->t, t); -#ifndef YAFFS_IGNORE_TAGS_ECC - { +- yaffs_ECCCalculateOther((unsigned char *)&pt->t, + if(tagsECC) - yaffs_ECCCalculateOther((unsigned char *)&pt->t, ++ yaffs_ecc_calc_other((unsigned char *)&pt->t, sizeof(yaffs_PackedTags2TagsPart), &pt->ecc); - } @@ -16893,15 +19404,87 @@ } -@@ -158,27 +156,24 @@ void yaffs_UnpackTags2TagsPart(yaffs_Ext +-void yaffs_UnpackTags2TagsPart(yaffs_ExtendedTags *t, ++void yaffs_unpack_tags2tags_part(yaffs_ext_tags *t, + yaffs_PackedTags2TagsPart *ptt) + { + +- memset(t, 0, sizeof(yaffs_ExtendedTags)); ++ memset(t, 0, sizeof(yaffs_ext_tags)); + +- yaffs_InitialiseTags(t); ++ yaffs_init_tags(t); + +- if (ptt->sequenceNumber != 0xFFFFFFFF) { +- t->blockBad = 0; +- t->chunkUsed = 1; +- t->objectId = ptt->objectId; +- t->chunkId = ptt->chunkId; +- t->byteCount = ptt->byteCount; +- t->chunkDeleted = 0; +- t->serialNumber = 0; +- t->sequenceNumber = ptt->sequenceNumber; ++ if (ptt->seq_number != 0xFFFFFFFF) { ++ t->block_bad = 0; ++ t->chunk_used = 1; ++ t->obj_id = ptt->obj_id; ++ t->chunk_id = ptt->chunk_id; ++ t->n_bytes = ptt->n_bytes; ++ t->is_deleted = 0; ++ t->serial_number = 0; ++ t->seq_number = ptt->seq_number; + + /* Do extra header info stuff */ + +- if (ptt->chunkId & EXTRA_HEADER_INFO_FLAG) { +- t->chunkId = 0; +- t->byteCount = 0; +- +- t->extraHeaderInfoAvailable = 1; +- t->extraParentObjectId = +- ptt->chunkId & (~(ALL_EXTRA_FLAGS)); +- t->extraIsShrinkHeader = +- (ptt->chunkId & EXTRA_SHRINK_FLAG) ? 1 : 0; +- t->extraShadows = +- (ptt->chunkId & EXTRA_SHADOWS_FLAG) ? 1 : 0; +- t->extraObjectType = +- ptt->objectId >> EXTRA_OBJECT_TYPE_SHIFT; +- t->objectId &= ~EXTRA_OBJECT_TYPE_MASK; ++ if (ptt->chunk_id & EXTRA_HEADER_INFO_FLAG) { ++ t->chunk_id = 0; ++ t->n_bytes = 0; ++ ++ t->extra_available = 1; ++ t->extra_parent_id = ++ ptt->chunk_id & (~(ALL_EXTRA_FLAGS)); ++ t->extra_is_shrink = ++ (ptt->chunk_id & EXTRA_SHRINK_FLAG) ? 1 : 0; ++ t->extra_shadows = ++ (ptt->chunk_id & EXTRA_SHADOWS_FLAG) ? 1 : 0; ++ t->extra_obj_type = ++ ptt->obj_id >> EXTRA_OBJECT_TYPE_SHIFT; ++ t->obj_id &= ~EXTRA_OBJECT_TYPE_MASK; + +- if (t->extraObjectType == YAFFS_OBJECT_TYPE_HARDLINK) +- t->extraEquivalentObjectId = ptt->byteCount; ++ if (t->extra_obj_type == YAFFS_OBJECT_TYPE_HARDLINK) ++ t->extra_equiv_id = ptt->n_bytes; + else +- t->extraFileLength = ptt->byteCount; ++ t->extra_length = ptt->n_bytes; + } + } + +@@ -158,49 +156,43 @@ void yaffs_UnpackTags2TagsPart(yaffs_Ext } -void yaffs_UnpackTags2(yaffs_ExtendedTags *t, yaffs_PackedTags2 *pt) -+void yaffs_UnpackTags2(yaffs_ExtendedTags *t, yaffs_PackedTags2 *pt, int tagsECC) ++void yaffs_unpack_tags2(yaffs_ext_tags *t, yaffs_PackedTags2 *pt, int tagsECC) { - yaffs_ECCResult eccResult = YAFFS_ECC_RESULT_NO_ERROR; +- yaffs_ECCResult eccResult = YAFFS_ECC_RESULT_NO_ERROR; ++ yaffs_ecc_result ecc_result = YAFFS_ECC_RESULT_NO_ERROR; - if (pt->t.sequenceNumber != 0xFFFFFFFF) { - /* Page is in use */ @@ -16919,41 +19502,53 @@ - (yaffs_PackedTags2TagsPart), - &pt->ecc, &ecc); - switch (result) { -+ if (pt->t.sequenceNumber != 0xFFFFFFFF && ++ if (pt->t.seq_number != 0xFFFFFFFF && + tagsECC){ + /* Chunk is in use and we need to do ECC */ + + yaffs_ECCOther ecc; + int result; -+ yaffs_ECCCalculateOther((unsigned char *)&pt->t, ++ yaffs_ecc_calc_other((unsigned char *)&pt->t, + sizeof(yaffs_PackedTags2TagsPart), + &ecc); -+ result = yaffs_ECCCorrectOther((unsigned char *)&pt->t, ++ result = yaffs_ecc_correct_other((unsigned char *)&pt->t, + sizeof(yaffs_PackedTags2TagsPart), + &pt->ecc, &ecc); + switch (result) { case 0: - eccResult = YAFFS_ECC_RESULT_NO_ERROR; +- eccResult = YAFFS_ECC_RESULT_NO_ERROR; ++ ecc_result = YAFFS_ECC_RESULT_NO_ERROR; break; -@@ -190,9 +185,7 @@ void yaffs_UnpackTags2(yaffs_ExtendedTag + case 1: +- eccResult = YAFFS_ECC_RESULT_FIXED; ++ ecc_result = YAFFS_ECC_RESULT_FIXED; + break; + case -1: +- eccResult = YAFFS_ECC_RESULT_UNFIXED; ++ ecc_result = YAFFS_ECC_RESULT_UNFIXED; break; default: - eccResult = YAFFS_ECC_RESULT_UNKNOWN; +- eccResult = YAFFS_ECC_RESULT_UNKNOWN; - } ++ ecc_result = YAFFS_ECC_RESULT_UNKNOWN; } -#endif } - yaffs_UnpackTags2TagsPart(t, &pt->t); -@@ -201,6 +194,5 @@ void yaffs_UnpackTags2(yaffs_ExtendedTag +- yaffs_UnpackTags2TagsPart(t, &pt->t); ++ yaffs_unpack_tags2tags_part(t, &pt->t); + +- t->eccResult = eccResult; ++ t->ecc_result = ecc_result; yaffs_DumpPackedTags2(pt); yaffs_DumpTags2(t); - } ---- a/fs/yaffs2/yaffs_packedtags2.h -+++ b/fs/yaffs2/yaffs_packedtags2.h +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_packedtags2.h linux-2.6.36-rc8.new/fs/yaffs2/yaffs_packedtags2.h +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_packedtags2.h 2010-10-20 13:17:58.960000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_packedtags2.h 2010-10-20 13:28:16.063000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet another Flash File System . A NAND-flash specific file system. @@ -16963,19 +19558,39 @@ * for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning -@@ -34,8 +34,8 @@ typedef struct { +@@ -22,10 +22,10 @@ + #include "yaffs_ecc.h" + + typedef struct { +- unsigned sequenceNumber; +- unsigned objectId; +- unsigned chunkId; +- unsigned byteCount; ++ unsigned seq_number; ++ unsigned obj_id; ++ unsigned chunk_id; ++ unsigned n_bytes; + } yaffs_PackedTags2TagsPart; + + typedef struct { +@@ -34,10 +34,10 @@ typedef struct { } yaffs_PackedTags2; /* Full packed tags with ECC, used for oob tags */ -void yaffs_PackTags2(yaffs_PackedTags2 *pt, const yaffs_ExtendedTags *t); -void yaffs_UnpackTags2(yaffs_ExtendedTags *t, yaffs_PackedTags2 *pt); -+void yaffs_PackTags2(yaffs_PackedTags2 *pt, const yaffs_ExtendedTags *t, int tagsECC); -+void yaffs_UnpackTags2(yaffs_ExtendedTags *t, yaffs_PackedTags2 *pt, int tagsECC); ++void yaffs_PackTags2(yaffs_PackedTags2 *pt, const yaffs_ext_tags *t, int tagsECC); ++void yaffs_unpack_tags2(yaffs_ext_tags *t, yaffs_PackedTags2 *pt, int tagsECC); /* Only the tags part (no ECC for use with inband tags */ - void yaffs_PackTags2TagsPart(yaffs_PackedTags2TagsPart *pt, const yaffs_ExtendedTags *t); ---- a/fs/yaffs2/yaffs_qsort.h -+++ b/fs/yaffs2/yaffs_qsort.h +-void yaffs_PackTags2TagsPart(yaffs_PackedTags2TagsPart *pt, const yaffs_ExtendedTags *t); +-void yaffs_UnpackTags2TagsPart(yaffs_ExtendedTags *t, yaffs_PackedTags2TagsPart *pt); ++void yaffs_PackTags2TagsPart(yaffs_PackedTags2TagsPart *pt, const yaffs_ext_tags *t); ++void yaffs_unpack_tags2tags_part(yaffs_ext_tags *t, yaffs_PackedTags2TagsPart *pt); + #endif +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_qsort.h linux-2.6.36-rc8.new/fs/yaffs2/yaffs_qsort.h +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_qsort.h 2010-10-20 13:17:58.961000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_qsort.h 2010-10-20 13:28:16.063000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet another Flash File System . A NAND-flash specific file system. @@ -17004,8 +19619,9 @@ #endif +#endif ---- a/fs/yaffs2/yaffs_tagscompat.c -+++ b/fs/yaffs2/yaffs_tagscompat.c +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_tagscompat.c linux-2.6.36-rc8.new/fs/yaffs2/yaffs_tagscompat.c +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_tagscompat.c 2010-10-20 13:17:58.961000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_tagscompat.c 2010-10-20 13:28:16.030000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. @@ -17015,126 +19631,668 @@ * for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning -@@ -15,6 +15,7 @@ +@@ -15,19 +15,20 @@ #include "yaffs_tagscompat.h" #include "yaffs_ecc.h" #include "yaffs_getblockinfo.h" +#include "yaffs_trace.h" - static void yaffs_HandleReadDataError(yaffs_Device *dev, int chunkInNAND); +-static void yaffs_HandleReadDataError(yaffs_Device *dev, int chunkInNAND); ++static void yaffs_handle_rd_data_error(yaffs_dev_t *dev, int nand_chunk); #ifdef NOTYET -@@ -163,15 +164,14 @@ static int yaffs_WriteChunkToNAND(struct - int chunkInNAND, const __u8 *data, - yaffs_Spare *spare) +-static void yaffs_CheckWrittenBlock(yaffs_Device *dev, int chunkInNAND); +-static void yaffs_HandleWriteChunkOk(yaffs_Device *dev, int chunkInNAND, ++static void yaffs_check_written_block(yaffs_dev_t *dev, int nand_chunk); ++static void yaffs_handle_chunk_wr_ok(yaffs_dev_t *dev, int nand_chunk, + const __u8 *data, +- const yaffs_Spare *spare); +-static void yaffs_HandleUpdateChunk(yaffs_Device *dev, int chunkInNAND, +- const yaffs_Spare *spare); +-static void yaffs_HandleWriteChunkError(yaffs_Device *dev, int chunkInNAND); ++ const yaffs_spare *spare); ++static void yaffs_handle_chunk_update(yaffs_dev_t *dev, int nand_chunk, ++ const yaffs_spare *spare); ++static void yaffs_handle_chunk_wr_error(yaffs_dev_t *dev, int nand_chunk); + #endif + +-static const char yaffs_countBitsTable[256] = { ++static const char yaffs_count_bits_table[256] = { + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, +@@ -46,26 +47,26 @@ static const char yaffs_countBitsTable[2 + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 + }; + +-int yaffs_CountBits(__u8 x) ++int yaffs_count_bits(__u8 x) + { + int retVal; +- retVal = yaffs_countBitsTable[x]; ++ retVal = yaffs_count_bits_table[x]; + return retVal; + } + + /********** Tags ECC calculations *********/ + +-void yaffs_CalcECC(const __u8 *data, yaffs_Spare *spare) ++void yaffs_calc_ecc(const __u8 *data, yaffs_spare *spare) + { +- yaffs_ECCCalculate(data, spare->ecc1); +- yaffs_ECCCalculate(&data[256], spare->ecc2); ++ yaffs_ecc_cacl(data, spare->ecc1); ++ yaffs_ecc_cacl(&data[256], spare->ecc2); + } + +-void yaffs_CalcTagsECC(yaffs_Tags *tags) ++void yaffs_calc_tags_ecc(yaffs_tags_t *tags) + { + /* Calculate an ecc */ + +- unsigned char *b = ((yaffs_TagsUnion *) tags)->asBytes; ++ unsigned char *b = ((yaffs_tags_union_t *) tags)->as_bytes; + unsigned i, j; + unsigned ecc = 0; + unsigned bit = 0; +@@ -84,24 +85,24 @@ void yaffs_CalcTagsECC(yaffs_Tags *tags) + + } + +-int yaffs_CheckECCOnTags(yaffs_Tags *tags) ++int yaffs_check_tags_ecc(yaffs_tags_t *tags) + { + unsigned ecc = tags->ecc; + +- yaffs_CalcTagsECC(tags); ++ yaffs_calc_tags_ecc(tags); + + ecc ^= tags->ecc; + + if (ecc && ecc <= 64) { + /* TODO: Handle the failure better. Retire? */ +- unsigned char *b = ((yaffs_TagsUnion *) tags)->asBytes; ++ unsigned char *b = ((yaffs_tags_union_t *) tags)->as_bytes; + + ecc--; + + b[ecc / 8] ^= (1 << (ecc & 7)); + + /* Now recvalc the ecc */ +- yaffs_CalcTagsECC(tags); ++ yaffs_calc_tags_ecc(tags); + + return 1; /* recovered error */ + } else if (ecc) { +@@ -115,76 +116,73 @@ int yaffs_CheckECCOnTags(yaffs_Tags *tag + + /********** Tags **********/ + +-static void yaffs_LoadTagsIntoSpare(yaffs_Spare *sparePtr, +- yaffs_Tags *tagsPtr) ++static void yaffs_load_tags_to_spare(yaffs_spare *sparePtr, ++ yaffs_tags_t *tagsPtr) + { +- yaffs_TagsUnion *tu = (yaffs_TagsUnion *) tagsPtr; ++ yaffs_tags_union_t *tu = (yaffs_tags_union_t *) tagsPtr; + +- yaffs_CalcTagsECC(tagsPtr); ++ yaffs_calc_tags_ecc(tagsPtr); + +- sparePtr->tagByte0 = tu->asBytes[0]; +- sparePtr->tagByte1 = tu->asBytes[1]; +- sparePtr->tagByte2 = tu->asBytes[2]; +- sparePtr->tagByte3 = tu->asBytes[3]; +- sparePtr->tagByte4 = tu->asBytes[4]; +- sparePtr->tagByte5 = tu->asBytes[5]; +- sparePtr->tagByte6 = tu->asBytes[6]; +- sparePtr->tagByte7 = tu->asBytes[7]; ++ sparePtr->tb0 = tu->as_bytes[0]; ++ sparePtr->tb1 = tu->as_bytes[1]; ++ sparePtr->tb2 = tu->as_bytes[2]; ++ sparePtr->tb3 = tu->as_bytes[3]; ++ sparePtr->tb4 = tu->as_bytes[4]; ++ sparePtr->tb5 = tu->as_bytes[5]; ++ sparePtr->tb6 = tu->as_bytes[6]; ++ sparePtr->tb7 = tu->as_bytes[7]; + } + +-static void yaffs_GetTagsFromSpare(yaffs_Device *dev, yaffs_Spare *sparePtr, +- yaffs_Tags *tagsPtr) ++static void yaffs_get_tags_from_spare(yaffs_dev_t *dev, yaffs_spare *sparePtr, ++ yaffs_tags_t *tagsPtr) + { +- yaffs_TagsUnion *tu = (yaffs_TagsUnion *) tagsPtr; ++ yaffs_tags_union_t *tu = (yaffs_tags_union_t *) tagsPtr; + int result; + +- tu->asBytes[0] = sparePtr->tagByte0; +- tu->asBytes[1] = sparePtr->tagByte1; +- tu->asBytes[2] = sparePtr->tagByte2; +- tu->asBytes[3] = sparePtr->tagByte3; +- tu->asBytes[4] = sparePtr->tagByte4; +- tu->asBytes[5] = sparePtr->tagByte5; +- tu->asBytes[6] = sparePtr->tagByte6; +- tu->asBytes[7] = sparePtr->tagByte7; ++ tu->as_bytes[0] = sparePtr->tb0; ++ tu->as_bytes[1] = sparePtr->tb1; ++ tu->as_bytes[2] = sparePtr->tb2; ++ tu->as_bytes[3] = sparePtr->tb3; ++ tu->as_bytes[4] = sparePtr->tb4; ++ tu->as_bytes[5] = sparePtr->tb5; ++ tu->as_bytes[6] = sparePtr->tb6; ++ tu->as_bytes[7] = sparePtr->tb7; + +- result = yaffs_CheckECCOnTags(tagsPtr); ++ result = yaffs_check_tags_ecc(tagsPtr); + if (result > 0) +- dev->tagsEccFixed++; ++ dev->n_tags_ecc_fixed++; + else if (result < 0) +- dev->tagsEccUnfixed++; ++ dev->n_tags_ecc_unfixed++; + } + +-static void yaffs_SpareInitialise(yaffs_Spare *spare) ++static void yaffs_spare_init(yaffs_spare *spare) + { +- memset(spare, 0xFF, sizeof(yaffs_Spare)); ++ memset(spare, 0xFF, sizeof(yaffs_spare)); + } + +-static int yaffs_WriteChunkToNAND(struct yaffs_DeviceStruct *dev, +- int chunkInNAND, const __u8 *data, +- yaffs_Spare *spare) ++static int yaffs_wr_nand(struct yaffs_dev_s *dev, ++ int nand_chunk, const __u8 *data, ++ yaffs_spare *spare) { - if (chunkInNAND < dev->startBlock * dev->nChunksPerBlock) { -+ if (chunkInNAND < dev->param.startBlock * dev->param.nChunksPerBlock) { ++ if (nand_chunk < dev->param.start_block * dev->param.chunks_per_block) { T(YAFFS_TRACE_ERROR, (TSTR("**>> yaffs chunk %d is not valid" TENDSTR), - chunkInNAND)); +- chunkInNAND)); ++ nand_chunk)); return YAFFS_FAIL; } - dev->nPageWrites++; - return dev->writeChunkToNAND(dev, chunkInNAND, data, spare); -+ return dev->param.writeChunkToNAND(dev, chunkInNAND, data, spare); ++ return dev->param.write_chunk_fn(dev, nand_chunk, data, spare); } - static int yaffs_ReadChunkFromNAND(struct yaffs_DeviceStruct *dev, -@@ -184,16 +184,14 @@ static int yaffs_ReadChunkFromNAND(struc +-static int yaffs_ReadChunkFromNAND(struct yaffs_DeviceStruct *dev, +- int chunkInNAND, ++static int yaffs_rd_chunk_nand(struct yaffs_dev_s *dev, ++ int nand_chunk, + __u8 *data, +- yaffs_Spare *spare, +- yaffs_ECCResult *eccResult, ++ yaffs_spare *spare, ++ yaffs_ecc_result *ecc_result, + int doErrorCorrection) + { int retVal; - yaffs_Spare localSpare; - -- dev->nPageReads++; +- yaffs_Spare localSpare; - +- dev->nPageReads++; ++ yaffs_spare localSpare; + 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 */ +@@ -192,107 +190,107 @@ static int yaffs_ReadChunkFromNAND(struc spare = &localSpare; } - if (!dev->useNANDECC) { - retVal = dev->readChunkFromNAND(dev, chunkInNAND, data, spare); -+ if (!dev->param.useNANDECC) { -+ retVal = dev->param.readChunkFromNAND(dev, chunkInNAND, data, spare); ++ if (!dev->param.use_nand_ecc) { ++ retVal = dev->param.read_chunk_fn(dev, nand_chunk, data, spare); if (data && doErrorCorrection) { /* Do ECC correction */ /* Todo handle any errors */ -@@ -254,7 +252,7 @@ static int yaffs_ReadChunkFromNAND(struc +- int eccResult1, eccResult2; ++ int ecc_result1, ecc_result2; + __u8 calcEcc[3]; + +- yaffs_ECCCalculate(data, calcEcc); +- eccResult1 = +- yaffs_ECCCorrect(data, spare->ecc1, calcEcc); +- yaffs_ECCCalculate(&data[256], calcEcc); +- eccResult2 = +- yaffs_ECCCorrect(&data[256], spare->ecc2, calcEcc); ++ yaffs_ecc_cacl(data, calcEcc); ++ ecc_result1 = ++ yaffs_ecc_correct(data, spare->ecc1, calcEcc); ++ yaffs_ecc_cacl(&data[256], calcEcc); ++ ecc_result2 = ++ yaffs_ecc_correct(&data[256], spare->ecc2, calcEcc); + +- if (eccResult1 > 0) { ++ if (ecc_result1 > 0) { + T(YAFFS_TRACE_ERROR, + (TSTR + ("**>>yaffs ecc error fix performed on chunk %d:0" +- TENDSTR), chunkInNAND)); +- dev->eccFixed++; +- } else if (eccResult1 < 0) { ++ TENDSTR), nand_chunk)); ++ dev->n_ecc_fixed++; ++ } else if (ecc_result1 < 0) { + T(YAFFS_TRACE_ERROR, + (TSTR + ("**>>yaffs ecc error unfixed on chunk %d:0" +- TENDSTR), chunkInNAND)); +- dev->eccUnfixed++; ++ TENDSTR), nand_chunk)); ++ dev->n_ecc_unfixed++; + } + +- if (eccResult2 > 0) { ++ if (ecc_result2 > 0) { + T(YAFFS_TRACE_ERROR, + (TSTR + ("**>>yaffs ecc error fix performed on chunk %d:1" +- TENDSTR), chunkInNAND)); +- dev->eccFixed++; +- } else if (eccResult2 < 0) { ++ TENDSTR), nand_chunk)); ++ dev->n_ecc_fixed++; ++ } else if (ecc_result2 < 0) { + T(YAFFS_TRACE_ERROR, + (TSTR + ("**>>yaffs ecc error unfixed on chunk %d:1" +- TENDSTR), chunkInNAND)); +- dev->eccUnfixed++; ++ TENDSTR), nand_chunk)); ++ dev->n_ecc_unfixed++; + } + +- if (eccResult1 || eccResult2) { ++ if (ecc_result1 || ecc_result2) { + /* We had a data problem on this page */ +- yaffs_HandleReadDataError(dev, chunkInNAND); ++ yaffs_handle_rd_data_error(dev, nand_chunk); + } + +- if (eccResult1 < 0 || eccResult2 < 0) +- *eccResult = YAFFS_ECC_RESULT_UNFIXED; +- else if (eccResult1 > 0 || eccResult2 > 0) +- *eccResult = YAFFS_ECC_RESULT_FIXED; ++ if (ecc_result1 < 0 || ecc_result2 < 0) ++ *ecc_result = YAFFS_ECC_RESULT_UNFIXED; ++ else if (ecc_result1 > 0 || ecc_result2 > 0) ++ *ecc_result = YAFFS_ECC_RESULT_FIXED; + else +- *eccResult = YAFFS_ECC_RESULT_NO_ERROR; ++ *ecc_result = YAFFS_ECC_RESULT_NO_ERROR; + } + } else { + /* Must allocate enough memory for spare+2*sizeof(int) */ + /* for ecc results from device. */ +- struct yaffs_NANDSpare nspare; ++ struct yaffs_nand_spare nspare; memset(&nspare, 0, sizeof(nspare)); - retVal = dev->readChunkFromNAND(dev, chunkInNAND, data, -+ retVal = dev->param.readChunkFromNAND(dev, chunkInNAND, data, - (yaffs_Spare *) &nspare); - memcpy(spare, &nspare, sizeof(yaffs_Spare)); +- (yaffs_Spare *) &nspare); +- memcpy(spare, &nspare, sizeof(yaffs_Spare)); ++ retVal = dev->param.read_chunk_fn(dev, nand_chunk, data, ++ (yaffs_spare *) &nspare); ++ memcpy(spare, &nspare, sizeof(yaffs_spare)); if (data && doErrorCorrection) { -@@ -307,10 +305,10 @@ static int yaffs_CheckChunkErased(struct + if (nspare.eccres1 > 0) { + T(YAFFS_TRACE_ERROR, + (TSTR + ("**>>mtd ecc error fix performed on chunk %d:0" +- TENDSTR), chunkInNAND)); ++ TENDSTR), nand_chunk)); + } else if (nspare.eccres1 < 0) { + T(YAFFS_TRACE_ERROR, + (TSTR + ("**>>mtd ecc error unfixed on chunk %d:0" +- TENDSTR), chunkInNAND)); ++ TENDSTR), nand_chunk)); + } + + if (nspare.eccres2 > 0) { + T(YAFFS_TRACE_ERROR, + (TSTR + ("**>>mtd ecc error fix performed on chunk %d:1" +- TENDSTR), chunkInNAND)); ++ TENDSTR), nand_chunk)); + } else if (nspare.eccres2 < 0) { + T(YAFFS_TRACE_ERROR, + (TSTR + ("**>>mtd ecc error unfixed on chunk %d:1" +- TENDSTR), chunkInNAND)); ++ TENDSTR), nand_chunk)); + } + + if (nspare.eccres1 || nspare.eccres2) { + /* We had a data problem on this page */ +- yaffs_HandleReadDataError(dev, chunkInNAND); ++ yaffs_handle_rd_data_error(dev, nand_chunk); + } + + if (nspare.eccres1 < 0 || nspare.eccres2 < 0) +- *eccResult = YAFFS_ECC_RESULT_UNFIXED; ++ *ecc_result = YAFFS_ECC_RESULT_UNFIXED; + else if (nspare.eccres1 > 0 || nspare.eccres2 > 0) +- *eccResult = YAFFS_ECC_RESULT_FIXED; ++ *ecc_result = YAFFS_ECC_RESULT_FIXED; + else +- *eccResult = YAFFS_ECC_RESULT_NO_ERROR; ++ *ecc_result = YAFFS_ECC_RESULT_NO_ERROR; + + } + } +@@ -300,17 +298,17 @@ static int yaffs_ReadChunkFromNAND(struc + } + + #ifdef NOTYET +-static int yaffs_CheckChunkErased(struct yaffs_DeviceStruct *dev, +- int chunkInNAND) ++static int yaffs_check_chunk_erased(struct yaffs_dev_s *dev, ++ int nand_chunk) + { + static int init; static __u8 cmpbuf[YAFFS_BYTES_PER_CHUNK]; static __u8 data[YAFFS_BYTES_PER_CHUNK]; /* Might as well always allocate the larger size for */ - /* dev->useNANDECC == true; */ -+ /* dev->param.useNANDECC == true; */ - static __u8 spare[sizeof(struct yaffs_NANDSpare)]; +- static __u8 spare[sizeof(struct yaffs_NANDSpare)]; ++ /* dev->param.use_nand_ecc == true; */ ++ static __u8 spare[sizeof(struct yaffs_nand_spare)]; - dev->readChunkFromNAND(dev, chunkInNAND, data, (yaffs_Spare *) spare); -+ dev->param.readChunkFromNAND(dev, chunkInNAND, data, (yaffs_Spare *) spare); ++ dev->param.read_chunk_fn(dev, nand_chunk, data, (yaffs_spare *) spare); if (!init) { memset(cmpbuf, 0xff, YAFFS_BYTES_PER_CHUNK); -@@ -333,7 +331,7 @@ static int yaffs_CheckChunkErased(struct +@@ -331,14 +329,14 @@ static int yaffs_CheckChunkErased(struct + * Functions for robustisizing + */ - static void yaffs_HandleReadDataError(yaffs_Device *dev, int chunkInNAND) +-static void yaffs_HandleReadDataError(yaffs_Device *dev, int chunkInNAND) ++static void yaffs_handle_rd_data_error(yaffs_dev_t *dev, int nand_chunk) { - int blockInNAND = chunkInNAND / dev->nChunksPerBlock; -+ int blockInNAND = chunkInNAND / dev->param.nChunksPerBlock; ++ int flash_block = nand_chunk / dev->param.chunks_per_block; /* Mark the block for retirement */ - yaffs_GetBlockInfo(dev, blockInNAND + dev->blockOffset)->needsRetiring = 1; -@@ -365,7 +363,7 @@ static void yaffs_HandleUpdateChunk(yaff +- yaffs_GetBlockInfo(dev, blockInNAND + dev->blockOffset)->needsRetiring = 1; ++ yaffs_get_block_info(dev, flash_block + dev->block_offset)->needs_retiring = 1; + T(YAFFS_TRACE_ERROR | YAFFS_TRACE_BAD_BLOCKS, +- (TSTR("**>>Block %d marked for retirement" TENDSTR), blockInNAND)); ++ (TSTR("**>>Block %d marked for retirement" TENDSTR), flash_block)); - static void yaffs_HandleWriteChunkError(yaffs_Device *dev, int chunkInNAND) + /* TODO: + * Just do a garbage collection on the affected block +@@ -348,44 +346,44 @@ static void yaffs_HandleReadDataError(ya + } + + #ifdef NOTYET +-static void yaffs_CheckWrittenBlock(yaffs_Device *dev, int chunkInNAND) ++static void yaffs_check_written_block(yaffs_dev_t *dev, int nand_chunk) + { + } + +-static void yaffs_HandleWriteChunkOk(yaffs_Device *dev, int chunkInNAND, ++static void yaffs_handle_chunk_wr_ok(yaffs_dev_t *dev, int nand_chunk, + const __u8 *data, +- const yaffs_Spare *spare) ++ const yaffs_spare *spare) + { + } + +-static void yaffs_HandleUpdateChunk(yaffs_Device *dev, int chunkInNAND, +- const yaffs_Spare *spare) ++static void yaffs_handle_chunk_update(yaffs_dev_t *dev, int nand_chunk, ++ const yaffs_spare *spare) + { + } + +-static void yaffs_HandleWriteChunkError(yaffs_Device *dev, int chunkInNAND) ++static void yaffs_handle_chunk_wr_error(yaffs_dev_t *dev, int nand_chunk) { - int blockInNAND = chunkInNAND / dev->nChunksPerBlock; -+ int blockInNAND = chunkInNAND / dev->param.nChunksPerBlock; ++ int flash_block = nand_chunk / dev->param.chunks_per_block; /* Mark the block for retirement */ - yaffs_GetBlockInfo(dev, blockInNAND)->needsRetiring = 1; -@@ -424,7 +422,7 @@ int yaffs_TagsCompatabilityWriteChunkWit +- yaffs_GetBlockInfo(dev, blockInNAND)->needsRetiring = 1; ++ yaffs_get_block_info(dev, flash_block)->needs_retiring = 1; + /* Delete the chunk */ +- yaffs_DeleteChunk(dev, chunkInNAND, 1, __LINE__); ++ yaffs_chunk_del(dev, nand_chunk, 1, __LINE__); + } - tags.serialNumber = eTags->serialNumber; +-static int yaffs_VerifyCompare(const __u8 *d0, const __u8 *d1, +- const yaffs_Spare *s0, const yaffs_Spare *s1) ++static int yaffs_verify_cmp(const __u8 *d0, const __u8 *d1, ++ const yaffs_spare *s0, const yaffs_spare *s1) + { + + if (memcmp(d0, d1, YAFFS_BYTES_PER_CHUNK) != 0 || +- s0->tagByte0 != s1->tagByte0 || +- s0->tagByte1 != s1->tagByte1 || +- s0->tagByte2 != s1->tagByte2 || +- s0->tagByte3 != s1->tagByte3 || +- s0->tagByte4 != s1->tagByte4 || +- s0->tagByte5 != s1->tagByte5 || +- s0->tagByte6 != s1->tagByte6 || +- s0->tagByte7 != s1->tagByte7 || ++ s0->tb0 != s1->tb0 || ++ s0->tb1 != s1->tb1 || ++ s0->tb2 != s1->tb2 || ++ s0->tb3 != s1->tb3 || ++ s0->tb4 != s1->tb4 || ++ s0->tb5 != s1->tb5 || ++ s0->tb6 != s1->tb6 || ++ s0->tb7 != s1->tb7 || + s0->ecc1[0] != s1->ecc1[0] || + s0->ecc1[1] != s1->ecc1[1] || + s0->ecc1[2] != s1->ecc1[2] || +@@ -398,53 +396,53 @@ static int yaffs_VerifyCompare(const __u + } + #endif /* NOTYET */ + +-int yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(yaffs_Device *dev, +- int chunkInNAND, ++int yaffs_tags_compat_wr(yaffs_dev_t *dev, ++ int nand_chunk, + const __u8 *data, +- const yaffs_ExtendedTags *eTags) ++ const yaffs_ext_tags *eTags) + { +- yaffs_Spare spare; +- yaffs_Tags tags; ++ yaffs_spare spare; ++ yaffs_tags_t tags; + +- yaffs_SpareInitialise(&spare); ++ yaffs_spare_init(&spare); + +- if (eTags->chunkDeleted) +- spare.pageStatus = 0; ++ if (eTags->is_deleted) ++ spare.page_status = 0; + else { +- tags.objectId = eTags->objectId; +- tags.chunkId = eTags->chunkId; ++ tags.obj_id = eTags->obj_id; ++ tags.chunk_id = eTags->chunk_id; + +- tags.byteCountLSB = eTags->byteCount & 0x3ff; ++ tags.n_bytes_lsb = eTags->n_bytes & 0x3ff; + +- if (dev->nDataBytesPerChunk >= 1024) +- tags.byteCountMSB = (eTags->byteCount >> 10) & 3; ++ if (dev->data_bytes_per_chunk >= 1024) ++ tags.n_bytes_msb = (eTags->n_bytes >> 10) & 3; + else +- tags.byteCountMSB = 3; ++ tags.n_bytes_msb = 3; + + +- tags.serialNumber = eTags->serialNumber; ++ tags.serial_number = eTags->serial_number; - if (!dev->useNANDECC && data) -+ if (!dev->param.useNANDECC && data) - yaffs_CalcECC(data, &spare); +- yaffs_CalcECC(data, &spare); ++ if (!dev->param.use_nand_ecc && data) ++ yaffs_calc_ecc(data, &spare); - yaffs_LoadTagsIntoSpare(&spare, &tags); -@@ -498,9 +496,9 @@ int yaffs_TagsCompatabilityMarkNANDBlock +- yaffs_LoadTagsIntoSpare(&spare, &tags); ++ yaffs_load_tags_to_spare(&spare, &tags); - spare.blockStatus = 'Y'; + } + +- return yaffs_WriteChunkToNAND(dev, chunkInNAND, data, &spare); ++ return yaffs_wr_nand(dev, nand_chunk, data, &spare); + } + +-int yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(yaffs_Device *dev, +- int chunkInNAND, ++int yaffs_tags_compat_rd(yaffs_dev_t *dev, ++ int nand_chunk, + __u8 *data, +- yaffs_ExtendedTags *eTags) ++ yaffs_ext_tags *eTags) + { + +- yaffs_Spare spare; +- yaffs_Tags tags; +- yaffs_ECCResult eccResult = YAFFS_ECC_RESULT_UNKNOWN; ++ yaffs_spare spare; ++ yaffs_tags_t tags; ++ yaffs_ecc_result ecc_result = YAFFS_ECC_RESULT_UNKNOWN; + +- static yaffs_Spare spareFF; ++ static yaffs_spare spareFF; + static int init; + + if (!init) { +@@ -452,33 +450,33 @@ int yaffs_TagsCompatabilityReadChunkWith + init = 1; + } + +- if (yaffs_ReadChunkFromNAND +- (dev, chunkInNAND, data, &spare, &eccResult, 1)) { ++ if (yaffs_rd_chunk_nand ++ (dev, nand_chunk, data, &spare, &ecc_result, 1)) { + /* eTags may be NULL */ + if (eTags) { + + int deleted = +- (yaffs_CountBits(spare.pageStatus) < 7) ? 1 : 0; ++ (yaffs_count_bits(spare.page_status) < 7) ? 1 : 0; + +- eTags->chunkDeleted = deleted; +- eTags->eccResult = eccResult; +- eTags->blockBad = 0; /* We're reading it */ ++ eTags->is_deleted = deleted; ++ eTags->ecc_result = ecc_result; ++ eTags->block_bad = 0; /* We're reading it */ + /* therefore it is not a bad block */ +- eTags->chunkUsed = ++ eTags->chunk_used = + (memcmp(&spareFF, &spare, sizeof(spareFF)) != + 0) ? 1 : 0; + +- if (eTags->chunkUsed) { +- yaffs_GetTagsFromSpare(dev, &spare, &tags); ++ if (eTags->chunk_used) { ++ yaffs_get_tags_from_spare(dev, &spare, &tags); + +- eTags->objectId = tags.objectId; +- eTags->chunkId = tags.chunkId; +- eTags->byteCount = tags.byteCountLSB; ++ eTags->obj_id = tags.obj_id; ++ eTags->chunk_id = tags.chunk_id; ++ eTags->n_bytes = tags.n_bytes_lsb; + +- if (dev->nDataBytesPerChunk >= 1024) +- eTags->byteCount |= (((unsigned) tags.byteCountMSB) << 10); ++ if (dev->data_bytes_per_chunk >= 1024) ++ eTags->n_bytes |= (((unsigned) tags.n_bytes_msb) << 10); + +- eTags->serialNumber = tags.serialNumber; ++ eTags->serial_number = tags.serial_number; + } + } + +@@ -488,49 +486,49 @@ int yaffs_TagsCompatabilityReadChunkWith + } + } + +-int yaffs_TagsCompatabilityMarkNANDBlockBad(struct yaffs_DeviceStruct *dev, +- int blockInNAND) ++int yaffs_tags_compat_mark_bad(struct yaffs_dev_s *dev, ++ int flash_block) + { + +- yaffs_Spare spare; ++ yaffs_spare spare; + +- memset(&spare, 0xff, sizeof(yaffs_Spare)); ++ memset(&spare, 0xff, sizeof(yaffs_spare)); + +- spare.blockStatus = 'Y'; ++ spare.block_status = 'Y'; - yaffs_WriteChunkToNAND(dev, blockInNAND * dev->nChunksPerBlock, NULL, -+ yaffs_WriteChunkToNAND(dev, blockInNAND * dev->param.nChunksPerBlock, NULL, ++ yaffs_wr_nand(dev, flash_block * dev->param.chunks_per_block, NULL, &spare); - yaffs_WriteChunkToNAND(dev, blockInNAND * dev->nChunksPerBlock + 1, -+ yaffs_WriteChunkToNAND(dev, blockInNAND * dev->param.nChunksPerBlock + 1, ++ yaffs_wr_nand(dev, flash_block * dev->param.chunks_per_block + 1, NULL, &spare); return YAFFS_OK; -@@ -525,9 +523,9 @@ int yaffs_TagsCompatabilityQueryNANDBloc - *sequenceNumber = 0; + } + +-int yaffs_TagsCompatabilityQueryNANDBlock(struct yaffs_DeviceStruct *dev, +- int blockNo, +- yaffs_BlockState *state, +- __u32 *sequenceNumber) ++int yaffs_tags_compat_query_block(struct yaffs_dev_s *dev, ++ int block_no, ++ yaffs_block_state_t *state, ++ __u32 *seq_number) + { + +- yaffs_Spare spare0, spare1; +- static yaffs_Spare spareFF; ++ yaffs_spare spare0, spare1; ++ static yaffs_spare spareFF; + static int init; +- yaffs_ECCResult dummy; ++ yaffs_ecc_result dummy; + + if (!init) { + memset(&spareFF, 0xFF, sizeof(spareFF)); + init = 1; + } + +- *sequenceNumber = 0; ++ *seq_number = 0; - yaffs_ReadChunkFromNAND(dev, blockNo * dev->nChunksPerBlock, NULL, -+ yaffs_ReadChunkFromNAND(dev, blockNo * dev->param.nChunksPerBlock, NULL, ++ yaffs_rd_chunk_nand(dev, block_no * dev->param.chunks_per_block, NULL, &spare0, &dummy, 1); - yaffs_ReadChunkFromNAND(dev, blockNo * dev->nChunksPerBlock + 1, NULL, -+ yaffs_ReadChunkFromNAND(dev, blockNo * dev->param.nChunksPerBlock + 1, NULL, ++ yaffs_rd_chunk_nand(dev, block_no * dev->param.chunks_per_block + 1, NULL, &spare1, &dummy, 1); - if (yaffs_CountBits(spare0.blockStatus & spare1.blockStatus) < 7) ---- a/fs/yaffs2/yaffs_tagscompat.h -+++ b/fs/yaffs2/yaffs_tagscompat.h +- if (yaffs_CountBits(spare0.blockStatus & spare1.blockStatus) < 7) ++ if (yaffs_count_bits(spare0.block_status & spare1.block_status) < 7) + *state = YAFFS_BLOCK_STATE_DEAD; + else if (memcmp(&spareFF, &spare0, sizeof(spareFF)) == 0) + *state = YAFFS_BLOCK_STATE_EMPTY; +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_tagscompat.h linux-2.6.36-rc8.new/fs/yaffs2/yaffs_tagscompat.h +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_tagscompat.h 2010-10-20 13:17:58.961000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_tagscompat.h 2010-10-20 13:28:16.064000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet another Flash File System . A NAND-flash specific file system. @@ -17144,8 +20302,48 @@ * for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning ---- a/fs/yaffs2/yaffs_tagsvalidity.c -+++ b/fs/yaffs2/yaffs_tagsvalidity.c +@@ -17,23 +17,23 @@ + #define __YAFFS_TAGSCOMPAT_H__ + + #include "yaffs_guts.h" +-int yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(yaffs_Device *dev, +- int chunkInNAND, ++int yaffs_tags_compat_wr(yaffs_dev_t *dev, ++ int nand_chunk, + const __u8 *data, +- const yaffs_ExtendedTags *tags); +-int yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(yaffs_Device *dev, +- int chunkInNAND, ++ const yaffs_ext_tags *tags); ++int yaffs_tags_compat_rd(yaffs_dev_t *dev, ++ int nand_chunk, + __u8 *data, +- yaffs_ExtendedTags *tags); +-int yaffs_TagsCompatabilityMarkNANDBlockBad(struct yaffs_DeviceStruct *dev, +- int blockNo); +-int yaffs_TagsCompatabilityQueryNANDBlock(struct yaffs_DeviceStruct *dev, +- int blockNo, +- yaffs_BlockState *state, +- __u32 *sequenceNumber); ++ yaffs_ext_tags *tags); ++int yaffs_tags_compat_mark_bad(struct yaffs_dev_s *dev, ++ int block_no); ++int yaffs_tags_compat_query_block(struct yaffs_dev_s *dev, ++ int block_no, ++ yaffs_block_state_t *state, ++ __u32 *seq_number); + +-void yaffs_CalcTagsECC(yaffs_Tags *tags); +-int yaffs_CheckECCOnTags(yaffs_Tags *tags); +-int yaffs_CountBits(__u8 byte); ++void yaffs_calc_tags_ecc(yaffs_tags_t *tags); ++int yaffs_check_tags_ecc(yaffs_tags_t *tags); ++int yaffs_count_bits(__u8 byte); + + #endif +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_tagsvalidity.c linux-2.6.36-rc8.new/fs/yaffs2/yaffs_tagsvalidity.c +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_tagsvalidity.c 2010-10-20 13:17:58.962000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_tagsvalidity.c 2010-10-20 13:28:16.030000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. @@ -17155,8 +20353,33 @@ * for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning ---- a/fs/yaffs2/yaffs_tagsvalidity.h -+++ b/fs/yaffs2/yaffs_tagsvalidity.h +@@ -13,16 +13,16 @@ + + #include "yaffs_tagsvalidity.h" + +-void yaffs_InitialiseTags(yaffs_ExtendedTags *tags) ++void yaffs_init_tags(yaffs_ext_tags *tags) + { +- memset(tags, 0, sizeof(yaffs_ExtendedTags)); +- tags->validMarker0 = 0xAAAAAAAA; +- tags->validMarker1 = 0x55555555; ++ memset(tags, 0, sizeof(yaffs_ext_tags)); ++ tags->validity1 = 0xAAAAAAAA; ++ tags->validty1 = 0x55555555; + } + +-int yaffs_ValidateTags(yaffs_ExtendedTags *tags) ++int yaffs_validate_tags(yaffs_ext_tags *tags) + { +- return (tags->validMarker0 == 0xAAAAAAAA && +- tags->validMarker1 == 0x55555555); ++ return (tags->validity1 == 0xAAAAAAAA && ++ tags->validty1 == 0x55555555); + + } +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_tagsvalidity.h linux-2.6.36-rc8.new/fs/yaffs2/yaffs_tagsvalidity.h +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_tagsvalidity.h 2010-10-20 13:17:58.962000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_tagsvalidity.h 2010-10-20 13:28:16.064000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet another Flash File System . A NAND-flash specific file system. @@ -17166,8 +20389,18 @@ * for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning ---- /dev/null -+++ b/fs/yaffs2/yaffs_trace.h +@@ -19,6 +19,6 @@ + + #include "yaffs_guts.h" + +-void yaffs_InitialiseTags(yaffs_ExtendedTags *tags); +-int yaffs_ValidateTags(yaffs_ExtendedTags *tags); ++void yaffs_init_tags(yaffs_ext_tags *tags); ++int yaffs_validate_tags(yaffs_ext_tags *tags); + #endif +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_trace.h linux-2.6.36-rc8.new/fs/yaffs2/yaffs_trace.h +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_trace.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_trace.h 2010-10-20 13:28:16.064000294 +0300 @@ -0,0 +1,60 @@ +/* + * YAFFS: Yet another Flash File System . A NAND-flash specific file system. @@ -17188,7 +20421,7 @@ +#ifndef __YTRACE_H__ +#define __YTRACE_H__ + -+extern unsigned int yaffs_traceMask; ++extern unsigned int yaffs_trace_mask; +extern unsigned int yaffs_wr_attempts; + +/* @@ -17226,11 +20459,12 @@ +#define YAFFS_TRACE_ALWAYS 0xF0000000 + + -+#define T(mask, p) do { if ((mask) & (yaffs_traceMask | YAFFS_TRACE_ALWAYS)) TOUT(p); } while (0) ++#define T(mask, p) do { if ((mask) & (yaffs_trace_mask | YAFFS_TRACE_ALWAYS)) TOUT(p); } while (0) + +#endif ---- /dev/null -+++ b/fs/yaffs2/yaffs_verify.c +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_verify.c linux-2.6.36-rc8.new/fs/yaffs2/yaffs_verify.c +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_verify.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_verify.c 2010-10-20 13:28:16.031000294 +0300 @@ -0,0 +1,626 @@ +/* + * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. @@ -17252,26 +20486,26 @@ +#include "yaffs_getblockinfo.h" +#include "yaffs_nand.h" + -+int yaffs_SkipVerification(yaffs_Device *dev) ++int yaffs_skip_verification(yaffs_dev_t *dev) +{ + dev=dev; -+ return !(yaffs_traceMask & (YAFFS_TRACE_VERIFY | YAFFS_TRACE_VERIFY_FULL)); ++ return !(yaffs_trace_mask & (YAFFS_TRACE_VERIFY | YAFFS_TRACE_VERIFY_FULL)); +} + -+static int yaffs_SkipFullVerification(yaffs_Device *dev) ++static int yaffs_skip_full_verification(yaffs_dev_t *dev) +{ + dev=dev; -+ return !(yaffs_traceMask & (YAFFS_TRACE_VERIFY_FULL)); ++ return !(yaffs_trace_mask & (YAFFS_TRACE_VERIFY_FULL)); +} + -+static int yaffs_SkipNANDVerification(yaffs_Device *dev) ++static int yaffs_skip_nand_verification(yaffs_dev_t *dev) +{ + dev=dev; -+ return !(yaffs_traceMask & (YAFFS_TRACE_VERIFY_NAND)); ++ return !(yaffs_trace_mask & (YAFFS_TRACE_VERIFY_NAND)); +} + + -+static const char *blockStateName[] = { ++static const char *block_stateName[] = { +"Unknown", +"Needs scanning", +"Scanning", @@ -17285,77 +20519,77 @@ +}; + + -+void yaffs_VerifyBlock(yaffs_Device *dev, yaffs_BlockInfo *bi, int n) ++void yaffs_verify_blk(yaffs_dev_t *dev, yaffs_block_info_t *bi, int n) +{ + int actuallyUsed; + int inUse; + -+ if (yaffs_SkipVerification(dev)) ++ if (yaffs_skip_verification(dev)) + return; + + /* Report illegal runtime states */ -+ if (bi->blockState >= YAFFS_NUMBER_OF_BLOCK_STATES) -+ T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has undefined state %d"TENDSTR), n, bi->blockState)); ++ if (bi->block_state >= YAFFS_NUMBER_OF_BLOCK_STATES) ++ T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has undefined state %d"TENDSTR), n, bi->block_state)); + -+ switch (bi->blockState) { ++ switch (bi->block_state) { + case YAFFS_BLOCK_STATE_UNKNOWN: + case YAFFS_BLOCK_STATE_SCANNING: + case YAFFS_BLOCK_STATE_NEEDS_SCANNING: + T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has bad run-state %s"TENDSTR), -+ n, blockStateName[bi->blockState])); ++ n, block_stateName[bi->block_state])); + } + + /* Check pages in use and soft deletions are legal */ + -+ actuallyUsed = bi->pagesInUse - bi->softDeletions; ++ actuallyUsed = bi->pages_in_use - bi->soft_del_pages; + -+ if (bi->pagesInUse < 0 || bi->pagesInUse > dev->param.nChunksPerBlock || -+ bi->softDeletions < 0 || bi->softDeletions > dev->param.nChunksPerBlock || -+ actuallyUsed < 0 || actuallyUsed > dev->param.nChunksPerBlock) -+ T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has illegal values pagesInUsed %d softDeletions %d"TENDSTR), -+ n, bi->pagesInUse, bi->softDeletions)); ++ if (bi->pages_in_use < 0 || bi->pages_in_use > dev->param.chunks_per_block || ++ bi->soft_del_pages < 0 || bi->soft_del_pages > dev->param.chunks_per_block || ++ actuallyUsed < 0 || actuallyUsed > dev->param.chunks_per_block) ++ T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has illegal values pages_in_used %d soft_del_pages %d"TENDSTR), ++ n, bi->pages_in_use, bi->soft_del_pages)); + + + /* Check chunk bitmap legal */ -+ inUse = yaffs_CountChunkBits(dev, n); -+ if (inUse != bi->pagesInUse) -+ T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has inconsistent values pagesInUse %d counted chunk bits %d"TENDSTR), -+ n, bi->pagesInUse, inUse)); ++ inUse = yaffs_count_chunk_bits(dev, n); ++ if (inUse != bi->pages_in_use) ++ T(YAFFS_TRACE_VERIFY, (TSTR("Block %d has inconsistent values pages_in_use %d counted chunk bits %d"TENDSTR), ++ n, bi->pages_in_use, inUse)); + +} + + + -+void yaffs_VerifyCollectedBlock(yaffs_Device *dev, yaffs_BlockInfo *bi, int n) ++void yaffs_verify_collected_blk(yaffs_dev_t *dev, yaffs_block_info_t *bi, int n) +{ -+ yaffs_VerifyBlock(dev, bi, n); ++ yaffs_verify_blk(dev, bi, n); + + /* After collection the block should be in the erased state */ + -+ if (bi->blockState != YAFFS_BLOCK_STATE_COLLECTING && -+ bi->blockState != YAFFS_BLOCK_STATE_EMPTY) { ++ if (bi->block_state != YAFFS_BLOCK_STATE_COLLECTING && ++ bi->block_state != YAFFS_BLOCK_STATE_EMPTY) { + T(YAFFS_TRACE_ERROR, (TSTR("Block %d is in state %d after gc, should be erased"TENDSTR), -+ n, bi->blockState)); ++ n, bi->block_state)); + } +} + -+void yaffs_VerifyBlocks(yaffs_Device *dev) ++void yaffs_verify_blocks(yaffs_dev_t *dev) +{ + int i; + int nBlocksPerState[YAFFS_NUMBER_OF_BLOCK_STATES]; + int nIllegalBlockStates = 0; + -+ if (yaffs_SkipVerification(dev)) ++ if (yaffs_skip_verification(dev)) + return; + + memset(nBlocksPerState, 0, sizeof(nBlocksPerState)); + -+ for (i = dev->internalStartBlock; i <= dev->internalEndBlock; i++) { -+ yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, i); -+ yaffs_VerifyBlock(dev, bi, i); ++ for (i = dev->internal_start_block; i <= dev->internal_end_block; i++) { ++ yaffs_block_info_t *bi = yaffs_get_block_info(dev, i); ++ yaffs_verify_blk(dev, bi, i); + -+ if (bi->blockState < YAFFS_NUMBER_OF_BLOCK_STATES) -+ nBlocksPerState[bi->blockState]++; ++ if (bi->block_state < YAFFS_NUMBER_OF_BLOCK_STATES) ++ nBlocksPerState[bi->block_state]++; + else + nIllegalBlockStates++; + } @@ -17370,17 +20604,17 @@ + for (i = 0; i < YAFFS_NUMBER_OF_BLOCK_STATES; i++) + T(YAFFS_TRACE_VERIFY, + (TSTR("%s %d blocks"TENDSTR), -+ blockStateName[i], nBlocksPerState[i])); ++ block_stateName[i], nBlocksPerState[i])); + -+ if (dev->blocksInCheckpoint != nBlocksPerState[YAFFS_BLOCK_STATE_CHECKPOINT]) ++ if (dev->blocks_in_checkpt != nBlocksPerState[YAFFS_BLOCK_STATE_CHECKPOINT]) + T(YAFFS_TRACE_VERIFY, + (TSTR("Checkpoint block count wrong dev %d count %d"TENDSTR), -+ dev->blocksInCheckpoint, nBlocksPerState[YAFFS_BLOCK_STATE_CHECKPOINT])); ++ dev->blocks_in_checkpt, nBlocksPerState[YAFFS_BLOCK_STATE_CHECKPOINT])); + -+ if (dev->nErasedBlocks != nBlocksPerState[YAFFS_BLOCK_STATE_EMPTY]) ++ if (dev->n_erased_blocks != nBlocksPerState[YAFFS_BLOCK_STATE_EMPTY]) + T(YAFFS_TRACE_VERIFY, + (TSTR("Erased block count wrong dev %d count %d"TENDSTR), -+ dev->nErasedBlocks, nBlocksPerState[YAFFS_BLOCK_STATE_EMPTY])); ++ dev->n_erased_blocks, nBlocksPerState[YAFFS_BLOCK_STATE_EMPTY])); + + if (nBlocksPerState[YAFFS_BLOCK_STATE_COLLECTING] > 1) + T(YAFFS_TRACE_VERIFY, @@ -17395,9 +20629,9 @@ + * Verify the object header. oh must be valid, but obj and tags may be NULL in which + * case those tests will not be performed. + */ -+void yaffs_VerifyObjectHeader(yaffs_Object *obj, yaffs_ObjectHeader *oh, yaffs_ExtendedTags *tags, int parentCheck) ++void yaffs_verify_oh(yaffs_obj_t *obj, yaffs_obj_header *oh, yaffs_ext_tags *tags, int parentCheck) +{ -+ if (obj && yaffs_SkipVerification(obj->myDev)) ++ if (obj && yaffs_skip_verification(obj->my_dev)) + return; + + if (!(tags && obj && oh)) { @@ -17411,12 +20645,12 @@ + oh->type > YAFFS_OBJECT_TYPE_MAX) + T(YAFFS_TRACE_VERIFY, + (TSTR("Obj %d header type is illegal value 0x%x"TENDSTR), -+ tags->objectId, oh->type)); ++ tags->obj_id, oh->type)); + -+ if (tags->objectId != obj->objectId) ++ if (tags->obj_id != obj->obj_id) + T(YAFFS_TRACE_VERIFY, -+ (TSTR("Obj %d header mismatch objectId %d"TENDSTR), -+ tags->objectId, obj->objectId)); ++ (TSTR("Obj %d header mismatch obj_id %d"TENDSTR), ++ tags->obj_id, obj->obj_id)); + + + /* @@ -17425,38 +20659,38 @@ + * Tests do not apply to the root object. + */ + -+ if (parentCheck && tags->objectId > 1 && !obj->parent) ++ if (parentCheck && tags->obj_id > 1 && !obj->parent) + T(YAFFS_TRACE_VERIFY, -+ (TSTR("Obj %d header mismatch parentId %d obj->parent is NULL"TENDSTR), -+ tags->objectId, oh->parentObjectId)); ++ (TSTR("Obj %d header mismatch parent_id %d obj->parent is NULL"TENDSTR), ++ tags->obj_id, oh->parent_obj_id)); + + if (parentCheck && obj->parent && -+ oh->parentObjectId != obj->parent->objectId && -+ (oh->parentObjectId != YAFFS_OBJECTID_UNLINKED || -+ obj->parent->objectId != YAFFS_OBJECTID_DELETED)) ++ oh->parent_obj_id != obj->parent->obj_id && ++ (oh->parent_obj_id != YAFFS_OBJECTID_UNLINKED || ++ obj->parent->obj_id != YAFFS_OBJECTID_DELETED)) + T(YAFFS_TRACE_VERIFY, -+ (TSTR("Obj %d header mismatch parentId %d parentObjectId %d"TENDSTR), -+ tags->objectId, oh->parentObjectId, obj->parent->objectId)); ++ (TSTR("Obj %d header mismatch parent_id %d parent_obj_id %d"TENDSTR), ++ tags->obj_id, oh->parent_obj_id, obj->parent->obj_id)); + -+ if (tags->objectId > 1 && oh->name[0] == 0) /* Null name */ ++ if (tags->obj_id > 1 && oh->name[0] == 0) /* Null name */ + T(YAFFS_TRACE_VERIFY, + (TSTR("Obj %d header name is NULL"TENDSTR), -+ obj->objectId)); ++ obj->obj_id)); + -+ if (tags->objectId > 1 && ((__u8)(oh->name[0])) == 0xff) /* Trashed name */ ++ if (tags->obj_id > 1 && ((__u8)(oh->name[0])) == 0xff) /* Trashed name */ + T(YAFFS_TRACE_VERIFY, + (TSTR("Obj %d header name is 0xFF"TENDSTR), -+ obj->objectId)); ++ obj->obj_id)); +} + + +#if 0 +/* Not being used, but don't want to throw away yet */ -+int yaffs_VerifyTnodeWorker(yaffs_Object *obj, yaffs_Tnode *tn, -+ __u32 level, int chunkOffset) ++int yaffs_verify_tnode_worker(yaffs_obj_t *obj, yaffs_tnode_t *tn, ++ __u32 level, int chunk_offset) +{ + int i; -+ yaffs_Device *dev = obj->myDev; ++ yaffs_dev_t *dev = obj->my_dev; + int ok = 1; + + if (tn) { @@ -17464,31 +20698,31 @@ + + for (i = 0; i < YAFFS_NTNODES_INTERNAL && ok; i++) { + if (tn->internal[i]) { -+ ok = yaffs_VerifyTnodeWorker(obj, ++ ok = yaffs_verify_tnode_worker(obj, + tn->internal[i], + level - 1, -+ (chunkOffset<objectId; ++ yaffs_ext_tags tags; ++ __u32 obj_id = obj->obj_id; + -+ chunkOffset <<= YAFFS_TNODES_LEVEL0_BITS; ++ chunk_offset <<= YAFFS_TNODES_LEVEL0_BITS; + + for (i = 0; i < YAFFS_NTNODES_LEVEL0; i++) { -+ __u32 theChunk = yaffs_GetChunkGroupBase(dev, tn, i); ++ __u32 theChunk = yaffs_get_group_base(dev, tn, i); + + if (theChunk > 0) { -+ /* T(~0,(TSTR("verifying (%d:%d) %d"TENDSTR),tags.objectId,tags.chunkId,theChunk)); */ -+ yaffs_ReadChunkWithTagsFromNAND(dev, theChunk, NULL, &tags); -+ if (tags.objectId != objectId || tags.chunkId != chunkOffset) { -+ T(~0, (TSTR("Object %d chunkId %d NAND mismatch chunk %d tags (%d:%d)"TENDSTR), -+ objectId, chunkOffset, theChunk, -+ tags.objectId, tags.chunkId)); ++ /* T(~0,(TSTR("verifying (%d:%d) %d"TENDSTR),tags.obj_id,tags.chunk_id,theChunk)); */ ++ yaffs_rd_chunk_tags_nand(dev, theChunk, NULL, &tags); ++ if (tags.obj_id != obj_id || tags.chunk_id != chunk_offset) { ++ T(~0, (TSTR("Object %d chunk_id %d NAND mismatch chunk %d tags (%d:%d)"TENDSTR), ++ obj_id, chunk_offset, theChunk, ++ tags.obj_id, tags.chunk_id)); + } + } -+ chunkOffset++; ++ chunk_offset++; + } + } + } @@ -17499,29 +20733,29 @@ + +#endif + -+void yaffs_VerifyFile(yaffs_Object *obj) ++void yaffs_verify_file(yaffs_obj_t *obj) +{ + int requiredTallness; + int actualTallness; + __u32 lastChunk; + __u32 x; + __u32 i; -+ yaffs_Device *dev; -+ yaffs_ExtendedTags tags; -+ yaffs_Tnode *tn; -+ __u32 objectId; ++ yaffs_dev_t *dev; ++ yaffs_ext_tags tags; ++ yaffs_tnode_t *tn; ++ __u32 obj_id; + + if (!obj) + return; + -+ if (yaffs_SkipVerification(obj->myDev)) ++ if (yaffs_skip_verification(obj->my_dev)) + return; + -+ dev = obj->myDev; -+ objectId = obj->objectId; ++ dev = obj->my_dev; ++ obj_id = obj->obj_id; + + /* Check file size is consistent with tnode depth */ -+ lastChunk = obj->variant.fileVariant.fileSize / dev->nDataBytesPerChunk + 1; ++ lastChunk = obj->variant.file_variant.file_size / dev->data_bytes_per_chunk + 1; + x = lastChunk >> YAFFS_TNODES_LEVEL0_BITS; + requiredTallness = 0; + while (x > 0) { @@ -17529,28 +20763,28 @@ + requiredTallness++; + } + -+ actualTallness = obj->variant.fileVariant.topLevel; ++ actualTallness = obj->variant.file_variant.top_level; + + /* Check that the chunks in the tnode tree are all correct. + * We do this by scanning through the tnode tree and + * checking the tags for every chunk match. + */ + -+ if (yaffs_SkipNANDVerification(dev)) ++ if (yaffs_skip_nand_verification(dev)) + return; + + for (i = 1; i <= lastChunk; i++) { -+ tn = yaffs_FindLevel0Tnode(dev, &obj->variant.fileVariant, i); ++ tn = yaffs_find_tnode_0(dev, &obj->variant.file_variant, i); + + if (tn) { -+ __u32 theChunk = yaffs_GetChunkGroupBase(dev, tn, i); ++ __u32 theChunk = yaffs_get_group_base(dev, tn, i); + if (theChunk > 0) { -+ /* T(~0,(TSTR("verifying (%d:%d) %d"TENDSTR),objectId,i,theChunk)); */ -+ yaffs_ReadChunkWithTagsFromNAND(dev, theChunk, NULL, &tags); -+ if (tags.objectId != objectId || tags.chunkId != i) { -+ T(~0, (TSTR("Object %d chunkId %d NAND mismatch chunk %d tags (%d:%d)"TENDSTR), -+ objectId, i, theChunk, -+ tags.objectId, tags.chunkId)); ++ /* T(~0,(TSTR("verifying (%d:%d) %d"TENDSTR),obj_id,i,theChunk)); */ ++ yaffs_rd_chunk_tags_nand(dev, theChunk, NULL, &tags); ++ if (tags.obj_id != obj_id || tags.chunk_id != i) { ++ T(~0, (TSTR("Object %d chunk_id %d NAND mismatch chunk %d tags (%d:%d)"TENDSTR), ++ obj_id, i, theChunk, ++ tags.obj_id, tags.chunk_id)); + } + } + } @@ -17558,36 +20792,36 @@ +} + + -+void yaffs_VerifyHardLink(yaffs_Object *obj) ++void yaffs_verify_link(yaffs_obj_t *obj) +{ -+ if (obj && yaffs_SkipVerification(obj->myDev)) ++ if (obj && yaffs_skip_verification(obj->my_dev)) + return; + + /* Verify sane equivalent object */ +} + -+void yaffs_VerifySymlink(yaffs_Object *obj) ++void yaffs_verify_symlink(yaffs_obj_t *obj) +{ -+ if (obj && yaffs_SkipVerification(obj->myDev)) ++ if (obj && yaffs_skip_verification(obj->my_dev)) + return; + + /* Verify symlink string */ +} + -+void yaffs_VerifySpecial(yaffs_Object *obj) ++void yaffs_verify_special(yaffs_obj_t *obj) +{ -+ if (obj && yaffs_SkipVerification(obj->myDev)) ++ if (obj && yaffs_skip_verification(obj->my_dev)) + return; +} + -+void yaffs_VerifyObject(yaffs_Object *obj) ++void yaffs_verify_obj(yaffs_obj_t *obj) +{ -+ yaffs_Device *dev; ++ yaffs_dev_t *dev; + + __u32 chunkMin; + __u32 chunkMax; + -+ __u32 chunkIdOk; ++ __u32 chunk_idOk; + __u32 chunkInRange; + __u32 chunkShouldNotBeDeleted; + __u32 chunkValid; @@ -17595,117 +20829,117 @@ + if (!obj) + return; + -+ if (obj->beingCreated) ++ if (obj->being_created) + return; + -+ dev = obj->myDev; ++ dev = obj->my_dev; + -+ if (yaffs_SkipVerification(dev)) ++ if (yaffs_skip_verification(dev)) + return; + + /* Check sane object header chunk */ + -+ chunkMin = dev->internalStartBlock * dev->param.nChunksPerBlock; -+ chunkMax = (dev->internalEndBlock+1) * dev->param.nChunksPerBlock - 1; ++ chunkMin = dev->internal_start_block * dev->param.chunks_per_block; ++ chunkMax = (dev->internal_end_block+1) * dev->param.chunks_per_block - 1; + -+ chunkInRange = (((unsigned)(obj->hdrChunk)) >= chunkMin && ((unsigned)(obj->hdrChunk)) <= chunkMax); -+ chunkIdOk = chunkInRange || (obj->hdrChunk == 0); ++ chunkInRange = (((unsigned)(obj->hdr_chunk)) >= chunkMin && ((unsigned)(obj->hdr_chunk)) <= chunkMax); ++ chunk_idOk = chunkInRange || (obj->hdr_chunk == 0); + chunkValid = chunkInRange && -+ yaffs_CheckChunkBit(dev, -+ obj->hdrChunk / dev->param.nChunksPerBlock, -+ obj->hdrChunk % dev->param.nChunksPerBlock); ++ yaffs_check_chunk_bit(dev, ++ obj->hdr_chunk / dev->param.chunks_per_block, ++ obj->hdr_chunk % dev->param.chunks_per_block); + chunkShouldNotBeDeleted = chunkInRange && !chunkValid; + + if (!obj->fake && -+ (!chunkIdOk || chunkShouldNotBeDeleted)) { ++ (!chunk_idOk || chunkShouldNotBeDeleted)) { + T(YAFFS_TRACE_VERIFY, -+ (TSTR("Obj %d has chunkId %d %s %s"TENDSTR), -+ obj->objectId, obj->hdrChunk, -+ chunkIdOk ? "" : ",out of range", ++ (TSTR("Obj %d has chunk_id %d %s %s"TENDSTR), ++ obj->obj_id, obj->hdr_chunk, ++ chunk_idOk ? "" : ",out of range", + chunkShouldNotBeDeleted ? ",marked as deleted" : "")); + } + -+ if (chunkValid && !yaffs_SkipNANDVerification(dev)) { -+ yaffs_ExtendedTags tags; -+ yaffs_ObjectHeader *oh; -+ __u8 *buffer = yaffs_GetTempBuffer(dev, __LINE__); ++ if (chunkValid && !yaffs_skip_nand_verification(dev)) { ++ yaffs_ext_tags tags; ++ yaffs_obj_header *oh; ++ __u8 *buffer = yaffs_get_temp_buffer(dev, __LINE__); + -+ oh = (yaffs_ObjectHeader *)buffer; ++ oh = (yaffs_obj_header *)buffer; + -+ yaffs_ReadChunkWithTagsFromNAND(dev, obj->hdrChunk, buffer, ++ yaffs_rd_chunk_tags_nand(dev, obj->hdr_chunk, buffer, + &tags); + -+ yaffs_VerifyObjectHeader(obj, oh, &tags, 1); ++ yaffs_verify_oh(obj, oh, &tags, 1); + -+ yaffs_ReleaseTempBuffer(dev, buffer, __LINE__); ++ yaffs_release_temp_buffer(dev, buffer, __LINE__); + } + + /* Verify it has a parent */ + if (obj && !obj->fake && -+ (!obj->parent || obj->parent->myDev != dev)) { ++ (!obj->parent || obj->parent->my_dev != dev)) { + T(YAFFS_TRACE_VERIFY, + (TSTR("Obj %d has parent pointer %p which does not look like an object"TENDSTR), -+ obj->objectId, obj->parent)); ++ obj->obj_id, obj->parent)); + } + + /* Verify parent is a directory */ -+ if (obj->parent && obj->parent->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) { ++ if (obj->parent && obj->parent->variant_type != YAFFS_OBJECT_TYPE_DIRECTORY) { + T(YAFFS_TRACE_VERIFY, + (TSTR("Obj %d's parent is not a directory (type %d)"TENDSTR), -+ obj->objectId, obj->parent->variantType)); ++ obj->obj_id, obj->parent->variant_type)); + } + -+ switch (obj->variantType) { ++ switch (obj->variant_type) { + case YAFFS_OBJECT_TYPE_FILE: -+ yaffs_VerifyFile(obj); ++ yaffs_verify_file(obj); + break; + case YAFFS_OBJECT_TYPE_SYMLINK: -+ yaffs_VerifySymlink(obj); ++ yaffs_verify_symlink(obj); + break; + case YAFFS_OBJECT_TYPE_DIRECTORY: -+ yaffs_VerifyDirectory(obj); ++ yaffs_verify_dir(obj); + break; + case YAFFS_OBJECT_TYPE_HARDLINK: -+ yaffs_VerifyHardLink(obj); ++ yaffs_verify_link(obj); + break; + case YAFFS_OBJECT_TYPE_SPECIAL: -+ yaffs_VerifySpecial(obj); ++ yaffs_verify_special(obj); + break; + case YAFFS_OBJECT_TYPE_UNKNOWN: + default: + T(YAFFS_TRACE_VERIFY, + (TSTR("Obj %d has illegaltype %d"TENDSTR), -+ obj->objectId, obj->variantType)); ++ obj->obj_id, obj->variant_type)); + break; + } +} + -+void yaffs_VerifyObjects(yaffs_Device *dev) ++void yaffs_verify_objects(yaffs_dev_t *dev) +{ -+ yaffs_Object *obj; ++ yaffs_obj_t *obj; + int i; + struct ylist_head *lh; + -+ if (yaffs_SkipVerification(dev)) ++ if (yaffs_skip_verification(dev)) + return; + + /* Iterate through the objects in each hash entry */ + + for (i = 0; i < YAFFS_NOBJECT_BUCKETS; i++) { -+ ylist_for_each(lh, &dev->objectBucket[i].list) { ++ ylist_for_each(lh, &dev->obj_bucket[i].list) { + if (lh) { -+ obj = ylist_entry(lh, yaffs_Object, hashLink); -+ yaffs_VerifyObject(obj); ++ obj = ylist_entry(lh, yaffs_obj_t, hash_link); ++ yaffs_verify_obj(obj); + } + } + } +} + + -+void yaffs_VerifyObjectInDirectory(yaffs_Object *obj) ++void yaffs_verify_obj_in_dir(yaffs_obj_t *obj) +{ + struct ylist_head *lh; -+ yaffs_Object *listObj; ++ yaffs_obj_t *listObj; + + int count = 0; + @@ -17715,7 +20949,7 @@ + return; + } + -+ if (yaffs_SkipVerification(obj->myDev)) ++ if (yaffs_skip_verification(obj->my_dev)) + return; + + if (!obj->parent) { @@ -17724,17 +20958,17 @@ + return; + } + -+ if (obj->parent->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) { ++ if (obj->parent->variant_type != YAFFS_OBJECT_TYPE_DIRECTORY) { + T(YAFFS_TRACE_ALWAYS, (TSTR("Parent is not directory" TENDSTR))); + YBUG(); + } + + /* Iterate through the objects in each hash entry */ + -+ ylist_for_each(lh, &obj->parent->variant.directoryVariant.children) { ++ ylist_for_each(lh, &obj->parent->variant.dir_variant.children) { + if (lh) { -+ listObj = ylist_entry(lh, yaffs_Object, siblings); -+ yaffs_VerifyObject(listObj); ++ listObj = ylist_entry(lh, yaffs_obj_t, siblings); ++ yaffs_verify_obj(listObj); + if (obj == listObj) + count++; + } @@ -17746,99 +20980,99 @@ + } +} + -+void yaffs_VerifyDirectory(yaffs_Object *directory) ++void yaffs_verify_dir(yaffs_obj_t *directory) +{ + struct ylist_head *lh; -+ yaffs_Object *listObj; ++ yaffs_obj_t *listObj; + + if (!directory) { + YBUG(); + return; + } + -+ if (yaffs_SkipFullVerification(directory->myDev)) ++ if (yaffs_skip_full_verification(directory->my_dev)) + return; + -+ if (directory->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) { -+ T(YAFFS_TRACE_ALWAYS, (TSTR("Directory has wrong type: %d" TENDSTR), directory->variantType)); ++ if (directory->variant_type != YAFFS_OBJECT_TYPE_DIRECTORY) { ++ T(YAFFS_TRACE_ALWAYS, (TSTR("Directory has wrong type: %d" TENDSTR), directory->variant_type)); + YBUG(); + } + + /* Iterate through the objects in each hash entry */ + -+ ylist_for_each(lh, &directory->variant.directoryVariant.children) { ++ ylist_for_each(lh, &directory->variant.dir_variant.children) { + if (lh) { -+ listObj = ylist_entry(lh, yaffs_Object, siblings); ++ listObj = ylist_entry(lh, yaffs_obj_t, siblings); + if (listObj->parent != directory) { + T(YAFFS_TRACE_ALWAYS, (TSTR("Object in directory list has wrong parent %p" TENDSTR), listObj->parent)); + YBUG(); + } -+ yaffs_VerifyObjectInDirectory(listObj); ++ yaffs_verify_obj_in_dir(listObj); + } + } +} + -+static int yaffs_freeVerificationFailures; ++static int yaffs_free_verification_failures; + -+void yaffs_VerifyFreeChunks(yaffs_Device *dev) ++void yaffs_verify_free_chunks(yaffs_dev_t *dev) +{ + int counted; + int difference; + -+ if (yaffs_SkipVerification(dev)) ++ if (yaffs_skip_verification(dev)) + return; + -+ counted = yaffs_CountFreeChunks(dev); ++ counted = yaffs_count_free_chunks(dev); + -+ difference = dev->nFreeChunks - counted; ++ difference = dev->n_free_chunks - counted; + + if (difference) { + T(YAFFS_TRACE_ALWAYS, + (TSTR("Freechunks verification failure %d %d %d" TENDSTR), -+ dev->nFreeChunks, counted, difference)); -+ yaffs_freeVerificationFailures++; ++ dev->n_free_chunks, counted, difference)); ++ yaffs_free_verification_failures++; + } +} + -+int yaffs_VerifyFileSanity(yaffs_Object *in) ++int yaffs_verify_file_sane(yaffs_obj_t *in) +{ +#if 0 + int chunk; -+ int nChunks; ++ int n_chunks; + int fSize; + int failed = 0; -+ int objId; -+ yaffs_Tnode *tn; -+ yaffs_Tags localTags; -+ yaffs_Tags *tags = &localTags; ++ int obj_id; ++ yaffs_tnode_t *tn; ++ yaffs_tags_t localTags; ++ yaffs_tags_t *tags = &localTags; + int theChunk; -+ int chunkDeleted; ++ int is_deleted; + -+ if (in->variantType != YAFFS_OBJECT_TYPE_FILE) ++ if (in->variant_type != YAFFS_OBJECT_TYPE_FILE) + return YAFFS_FAIL; + -+ objId = in->objectId; -+ fSize = in->variant.fileVariant.fileSize; -+ nChunks = -+ (fSize + in->myDev->nDataBytesPerChunk - 1) / in->myDev->nDataBytesPerChunk; ++ obj_id = in->obj_id; ++ fSize = in->variant.file_variant.file_size; ++ n_chunks = ++ (fSize + in->my_dev->data_bytes_per_chunk - 1) / in->my_dev->data_bytes_per_chunk; + -+ for (chunk = 1; chunk <= nChunks; chunk++) { -+ tn = yaffs_FindLevel0Tnode(in->myDev, &in->variant.fileVariant, ++ for (chunk = 1; chunk <= n_chunks; chunk++) { ++ tn = yaffs_find_tnode_0(in->my_dev, &in->variant.file_variant, + chunk); + + if (tn) { + -+ theChunk = yaffs_GetChunkGroupBase(dev, tn, chunk); ++ theChunk = yaffs_get_group_base(dev, tn, chunk); + -+ if (yaffs_CheckChunkBits -+ (dev, theChunk / dev->param.nChunksPerBlock, -+ theChunk % dev->param.nChunksPerBlock)) { ++ if (yaffs_check_chunk_bits ++ (dev, theChunk / dev->param.chunks_per_block, ++ theChunk % dev->param.chunks_per_block)) { + -+ yaffs_ReadChunkTagsFromNAND(in->myDev, theChunk, ++ yaffs_rd_chunk_tags_nand(in->my_dev, theChunk, + tags, -+ &chunkDeleted); -+ if (yaffs_TagsMatch -+ (tags, in->objectId, chunk, chunkDeleted)) { ++ &is_deleted); ++ if (yaffs_tags_match ++ (tags, in->obj_id, chunk, is_deleted)) { + /* found it; */ + + } @@ -17858,8 +21092,9 @@ + return YAFFS_OK; +#endif +} ---- /dev/null -+++ b/fs/yaffs2/yaffs_verify.h +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_verify.h linux-2.6.36-rc8.new/fs/yaffs2/yaffs_verify.h +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_verify.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_verify.h 2010-10-20 13:28:16.064000294 +0300 @@ -0,0 +1,39 @@ +/* + * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. @@ -17879,30 +21114,31 @@ + +#include "yaffs_guts.h" + -+void yaffs_VerifyBlock(yaffs_Device *dev, yaffs_BlockInfo *bi, int n); -+void yaffs_VerifyCollectedBlock(yaffs_Device *dev, yaffs_BlockInfo *bi, int n); -+void yaffs_VerifyBlocks(yaffs_Device *dev); ++void yaffs_verify_blk(yaffs_dev_t *dev, yaffs_block_info_t *bi, int n); ++void yaffs_verify_collected_blk(yaffs_dev_t *dev, yaffs_block_info_t *bi, int n); ++void yaffs_verify_blocks(yaffs_dev_t *dev); + -+void yaffs_VerifyObjectHeader(yaffs_Object *obj, yaffs_ObjectHeader *oh, yaffs_ExtendedTags *tags, int parentCheck); -+void yaffs_VerifyFile(yaffs_Object *obj); -+void yaffs_VerifyHardLink(yaffs_Object *obj); -+void yaffs_VerifySymlink(yaffs_Object *obj); -+void yaffs_VerifySpecial(yaffs_Object *obj); -+void yaffs_VerifyObject(yaffs_Object *obj); -+void yaffs_VerifyObjects(yaffs_Device *dev); -+void yaffs_VerifyObjectInDirectory(yaffs_Object *obj); -+void yaffs_VerifyDirectory(yaffs_Object *directory); -+void yaffs_VerifyFreeChunks(yaffs_Device *dev); ++void yaffs_verify_oh(yaffs_obj_t *obj, yaffs_obj_header *oh, yaffs_ext_tags *tags, int parentCheck); ++void yaffs_verify_file(yaffs_obj_t *obj); ++void yaffs_verify_link(yaffs_obj_t *obj); ++void yaffs_verify_symlink(yaffs_obj_t *obj); ++void yaffs_verify_special(yaffs_obj_t *obj); ++void yaffs_verify_obj(yaffs_obj_t *obj); ++void yaffs_verify_objects(yaffs_dev_t *dev); ++void yaffs_verify_obj_in_dir(yaffs_obj_t *obj); ++void yaffs_verify_dir(yaffs_obj_t *directory); ++void yaffs_verify_free_chunks(yaffs_dev_t *dev); + -+int yaffs_VerifyFileSanity(yaffs_Object *obj); ++int yaffs_verify_file_sane(yaffs_obj_t *obj); + -+int yaffs_SkipVerification(yaffs_Device *dev); ++int yaffs_skip_verification(yaffs_dev_t *dev); + +#endif + ---- /dev/null -+++ b/fs/yaffs2/yaffs_vfs_glue.c -@@ -0,0 +1,3577 @@ +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_vfs_glue.c linux-2.6.36-rc8.new/fs/yaffs2/yaffs_vfs_glue.c +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_vfs_glue.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_vfs_glue.c 2010-10-20 13:28:16.069000294 +0300 +@@ -0,0 +1,3576 @@ +/* + * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. + * @@ -17929,11 +21165,11 @@ + * the VFS. + * + * Special notes: -+ * >> 2.4: sb->u.generic_sbp points to the yaffs_Device associated with ++ * >> 2.4: sb->u.generic_sbp points to the yaffs_dev_t associated with + * this superblock -+ * >> 2.6: sb->s_fs_info points to the yaffs_Device associated with this ++ * >> 2.6: sb->s_fs_info points to the yaffs_dev_t associated with this + * superblock -+ * >> inode->u.generic_ip points to the associated yaffs_Object. ++ * >> inode->u.generic_ip points to the associated yaffs_obj_t. + */ + +/* @@ -18075,7 +21311,7 @@ +#include "yaffs_mtdif1.h" +#include "yaffs_mtdif2.h" + -+unsigned int yaffs_traceMask = YAFFS_TRACE_BAD_BLOCKS | YAFFS_TRACE_ALWAYS; ++unsigned int yaffs_trace_mask = YAFFS_TRACE_BAD_BLOCKS | YAFFS_TRACE_ALWAYS; +unsigned int yaffs_wr_attempts = YAFFS_WR_ATTEMPTS; +unsigned int yaffs_auto_checkpoint = 1; +unsigned int yaffs_gc_control = 1; @@ -18083,13 +21319,13 @@ + +/* Module Parameters */ +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) -+module_param(yaffs_traceMask, uint, 0644); ++module_param(yaffs_trace_mask, uint, 0644); +module_param(yaffs_wr_attempts, uint, 0644); +module_param(yaffs_auto_checkpoint, uint, 0644); +module_param(yaffs_gc_control, uint, 0644); +module_param(yaffs_bg_enable, uint, 0644); +#else -+MODULE_PARM(yaffs_traceMask, "i"); ++MODULE_PARM(yaffs_trace_mask, "i"); +MODULE_PARM(yaffs_wr_attempts, "i"); +MODULE_PARM(yaffs_auto_checkpoint, "i"); +MODULE_PARM(yaffs_gc_control, "i"); @@ -18114,13 +21350,13 @@ +#define yaffs_InodeToObjectLV(iptr) ((iptr)->u.generic_ip) +#endif + -+#define yaffs_InodeToObject(iptr) ((yaffs_Object *)(yaffs_InodeToObjectLV(iptr))) -+#define yaffs_DentryToObject(dptr) yaffs_InodeToObject((dptr)->d_inode) ++#define yaffs_InodeToObject(iptr) ((yaffs_obj_t *)(yaffs_InodeToObjectLV(iptr))) ++#define yaffs_dentry_to_obj(dptr) yaffs_InodeToObject((dptr)->d_inode) + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) -+#define yaffs_SuperToDevice(sb) ((yaffs_Device *)sb->s_fs_info) ++#define yaffs_SuperToDevice(sb) ((yaffs_dev_t *)sb->s_fs_info) +#else -+#define yaffs_SuperToDevice(sb) ((yaffs_Device *)sb->u.generic_sbp) ++#define yaffs_SuperToDevice(sb) ((yaffs_dev_t *)sb->u.generic_sbp) +#endif + + @@ -18245,7 +21481,7 @@ +static int yaffs_follow_link(struct dentry *dentry, struct nameidata *nd); +#endif + -+static void yaffs_MarkSuperBlockDirty(yaffs_Device *dev); ++static void yaffs_touch_super(yaffs_dev_t *dev); + +static loff_t yaffs_dir_llseek(struct file *file, loff_t offset, int origin); + @@ -18412,22 +21648,22 @@ + +} + -+static unsigned yaffs_gc_control_callback(yaffs_Device *dev) ++static unsigned yaffs_gc_control_callback(yaffs_dev_t *dev) +{ + return yaffs_gc_control; +} + -+static void yaffs_GrossLock(yaffs_Device *dev) ++static void yaffs_gross_lock(yaffs_dev_t *dev) +{ + T(YAFFS_TRACE_LOCK, (TSTR("yaffs locking %p\n"), current)); -+ down(&(yaffs_DeviceToLC(dev)->grossLock)); ++ down(&(yaffs_dev_to_lc(dev)->grossLock)); + T(YAFFS_TRACE_LOCK, (TSTR("yaffs locked %p\n"), current)); +} + -+static void yaffs_GrossUnlock(yaffs_Device *dev) ++static void yaffs_gross_unlock(yaffs_dev_t *dev) +{ + T(YAFFS_TRACE_LOCK, (TSTR("yaffs unlocking %p\n"), current)); -+ up(&(yaffs_DeviceToLC(dev)->grossLock)); ++ up(&(yaffs_dev_to_lc(dev)->grossLock)); +} + +#ifdef YAFFS_COMPILE_EXPORTFS @@ -18457,15 +21693,15 @@ + struct dentry *parent = ERR_PTR(-ENOENT); + struct inode *inode; + unsigned long parent_ino; -+ yaffs_Object *d_obj; -+ yaffs_Object *parent_obj; ++ yaffs_obj_t *d_obj; ++ yaffs_obj_t *parent_obj; + + d_obj = yaffs_InodeToObject(dentry->d_inode); + + if (d_obj) { + parent_obj = d_obj->parent; + if (parent_obj) { -+ parent_ino = yaffs_GetObjectInode(parent_obj); ++ parent_ino = yaffs_get_obj_inode(parent_obj); + inode = Y_IGET(sb, parent_ino); + + if (IS_ERR(inode)) { @@ -18504,11 +21740,11 @@ + * A search context iterates along a doubly linked list of siblings in the + * directory. If the iterating object is deleted then this would corrupt + * the list iteration, likely causing a crash. The search context avoids -+ * this by using the removeObjectCallback to move the search context to the ++ * this by using the remove_obj_fn to move the search context to the + * next object before the object is deleted. + * + * Many readdirs (and thus seach conexts) may be alive simulateously so -+ * each yaffs_Device has a list of these. ++ * each yaffs_dev_t has a list of these. + * + * A seach context lives for the duration of a readdir. + * @@ -18516,9 +21752,9 @@ + */ + +struct yaffs_SearchContext { -+ yaffs_Device *dev; -+ yaffs_Object *dirObj; -+ yaffs_Object *nextReturn; ++ yaffs_dev_t *dev; ++ yaffs_obj_t *dirObj; ++ yaffs_obj_t *nextReturn; + struct ylist_head others; +}; + @@ -18528,29 +21764,29 @@ + * + * Called at start of readdir. + */ -+static struct yaffs_SearchContext * yaffs_NewSearch(yaffs_Object *dir) ++static struct yaffs_SearchContext * yaffs_NewSearch(yaffs_obj_t *dir) +{ -+ yaffs_Device *dev = dir->myDev; ++ yaffs_dev_t *dev = dir->my_dev; + struct yaffs_SearchContext *sc = YMALLOC(sizeof(struct yaffs_SearchContext)); + if(sc){ + sc->dirObj = dir; + sc->dev = dev; -+ if( ylist_empty(&sc->dirObj->variant.directoryVariant.children)) ++ if( ylist_empty(&sc->dirObj->variant.dir_variant.children)) + sc->nextReturn = NULL; + else + sc->nextReturn = ylist_entry( -+ dir->variant.directoryVariant.children.next, -+ yaffs_Object,siblings); ++ dir->variant.dir_variant.children.next, ++ yaffs_obj_t,siblings); + YINIT_LIST_HEAD(&sc->others); -+ ylist_add(&sc->others,&(yaffs_DeviceToLC(dev)->searchContexts)); ++ ylist_add(&sc->others,&(yaffs_dev_to_lc(dev)->searchContexts)); + } + return sc; +} + +/* -+ * yaffs_EndSearch() disposes of a search context and cleans up. ++ * yaffs_search_end() disposes of a search context and cleans up. + */ -+static void yaffs_EndSearch(struct yaffs_SearchContext * sc) ++static void yaffs_search_end(struct yaffs_SearchContext * sc) +{ + if(sc){ + ylist_del(&sc->others); @@ -18559,39 +21795,39 @@ +} + +/* -+ * yaffs_SearchAdvance() moves a search context to the next object. ++ * yaffs_search_advance() moves a search context to the next object. + * Called when the search iterates or when an object removal causes + * the search context to be moved to the next object. + */ -+static void yaffs_SearchAdvance(struct yaffs_SearchContext *sc) ++static void yaffs_search_advance(struct yaffs_SearchContext *sc) +{ + if(!sc) + return; + + if( sc->nextReturn == NULL || -+ ylist_empty(&sc->dirObj->variant.directoryVariant.children)) ++ ylist_empty(&sc->dirObj->variant.dir_variant.children)) + sc->nextReturn = NULL; + else { + struct ylist_head *next = sc->nextReturn->siblings.next; + -+ if( next == &sc->dirObj->variant.directoryVariant.children) ++ if( next == &sc->dirObj->variant.dir_variant.children) + sc->nextReturn = NULL; /* end of list */ + else -+ sc->nextReturn = ylist_entry(next,yaffs_Object,siblings); ++ sc->nextReturn = ylist_entry(next,yaffs_obj_t,siblings); + } +} + +/* -+ * yaffs_RemoveObjectCallback() is called when an object is unlinked. ++ * yaffs_remove_obj_callback() is called when an object is unlinked. + * We check open search contexts and advance any which are currently + * on the object being iterated. + */ -+static void yaffs_RemoveObjectCallback(yaffs_Object *obj) ++static void yaffs_remove_obj_callback(yaffs_obj_t *obj) +{ + + struct ylist_head *i; + struct yaffs_SearchContext *sc; -+ struct ylist_head *search_contexts = &(yaffs_DeviceToLC(obj->myDev)->searchContexts); ++ struct ylist_head *search_contexts = &(yaffs_dev_to_lc(obj->my_dev)->searchContexts); + + + /* Iterate through the directory search contexts. @@ -18602,7 +21838,7 @@ + if (i) { + sc = ylist_entry(i, struct yaffs_SearchContext,others); + if(sc->nextReturn == obj) -+ yaffs_SearchAdvance(sc); ++ yaffs_search_advance(sc); + } + } + @@ -18617,13 +21853,13 @@ + unsigned char *alias; + int ret; + -+ yaffs_Device *dev = yaffs_DentryToObject(dentry)->myDev; ++ yaffs_dev_t *dev = yaffs_dentry_to_obj(dentry)->my_dev; + -+ yaffs_GrossLock(dev); ++ yaffs_gross_lock(dev); + -+ alias = yaffs_GetSymlinkAlias(yaffs_DentryToObject(dentry)); ++ alias = yaffs_get_symlink_alias(yaffs_dentry_to_obj(dentry)); + -+ yaffs_GrossUnlock(dev); ++ yaffs_gross_unlock(dev); + + if (!alias) + return -ENOMEM; @@ -18641,12 +21877,12 @@ +{ + unsigned char *alias; + int ret; -+ yaffs_Device *dev = yaffs_DentryToObject(dentry)->myDev; ++ yaffs_dev_t *dev = yaffs_dentry_to_obj(dentry)->my_dev; + -+ yaffs_GrossLock(dev); ++ yaffs_gross_lock(dev); + -+ alias = yaffs_GetSymlinkAlias(yaffs_DentryToObject(dentry)); -+ yaffs_GrossUnlock(dev); ++ alias = yaffs_get_symlink_alias(yaffs_dentry_to_obj(dentry)); ++ yaffs_gross_unlock(dev); + + if (!alias) { + ret = -ENOMEM; @@ -18673,7 +21909,7 @@ +#endif + +struct inode *yaffs_get_inode(struct super_block *sb, int mode, int dev, -+ yaffs_Object *obj); ++ yaffs_obj_t *obj); + +/* + * Lookup is used to find objects in the fs @@ -18686,30 +21922,30 @@ +static struct dentry *yaffs_lookup(struct inode *dir, struct dentry *dentry) +#endif +{ -+ yaffs_Object *obj; ++ yaffs_obj_t *obj; + struct inode *inode = NULL; /* NCB 2.5/2.6 needs NULL here */ + -+ yaffs_Device *dev = yaffs_InodeToObject(dir)->myDev; ++ yaffs_dev_t *dev = yaffs_InodeToObject(dir)->my_dev; + -+ if(current != yaffs_DeviceToLC(dev)->readdirProcess) -+ yaffs_GrossLock(dev); ++ if(current != yaffs_dev_to_lc(dev)->readdirProcess) ++ yaffs_gross_lock(dev); + + T(YAFFS_TRACE_OS, + (TSTR("yaffs_lookup for %d:%s\n"), -+ yaffs_InodeToObject(dir)->objectId, dentry->d_name.name)); ++ yaffs_InodeToObject(dir)->obj_id, dentry->d_name.name)); + -+ obj = yaffs_FindObjectByName(yaffs_InodeToObject(dir), ++ obj = yaffs_find_by_name(yaffs_InodeToObject(dir), + dentry->d_name.name); + -+ obj = yaffs_GetEquivalentObject(obj); /* in case it was a hardlink */ ++ obj = yaffs_get_equivalent_obj(obj); /* in case it was a hardlink */ + + /* Can't hold gross lock when calling yaffs_get_inode() */ -+ if(current != yaffs_DeviceToLC(dev)->readdirProcess) -+ yaffs_GrossUnlock(dev); ++ if(current != yaffs_dev_to_lc(dev)->readdirProcess) ++ yaffs_gross_unlock(dev); + + if (obj) { + T(YAFFS_TRACE_OS, -+ (TSTR("yaffs_lookup found %d\n"), obj->objectId)); ++ (TSTR("yaffs_lookup found %d\n"), obj->obj_id)); + + inode = yaffs_get_inode(dir->i_sb, obj->yst_mode, 0, obj); + @@ -18755,19 +21991,19 @@ +#endif + + -+static void yaffs_UnstitchObject(struct inode *inode, yaffs_Object *obj) ++static void yaffs_unstitch_obj(struct inode *inode, yaffs_obj_t *obj) +{ + /* Clear the association between the inode and -+ * the yaffs_Object. ++ * the yaffs_obj_t. + */ -+ obj->myInode = NULL; ++ obj->my_inode = NULL; + yaffs_InodeToObjectLV(inode) = NULL; + + /* If the object freeing was deferred, then the real + * free happens now. + * This should fix the inode inconsistency problem. + */ -+ yaffs_HandleDeferedFree(obj); ++ yaffs_handle_defered_free(obj); +} + +#ifdef YAFFS_HAS_EVICT_INODE @@ -18777,8 +22013,8 @@ + */ +static void yaffs_evict_inode( struct inode *inode) +{ -+ yaffs_Object *obj; -+ yaffs_Device *dev; ++ yaffs_obj_t *obj; ++ yaffs_dev_t *dev; + int deleteme = 0; + + obj = yaffs_InodeToObject(inode); @@ -18794,16 +22030,16 @@ + end_writeback(inode); + + if(deleteme && obj){ -+ dev = obj->myDev; -+ yaffs_GrossLock(dev); -+ yaffs_DeleteObject(obj); -+ yaffs_GrossUnlock(dev); ++ dev = obj->my_dev; ++ yaffs_gross_lock(dev); ++ yaffs_del_obj(obj); ++ yaffs_gross_unlock(dev); + } + if (obj) { -+ dev = obj->myDev; -+ yaffs_GrossLock(dev); -+ yaffs_UnstitchObject(inode,obj); -+ yaffs_GrossUnlock(dev); ++ dev = obj->my_dev; ++ yaffs_gross_lock(dev); ++ yaffs_unstitch_obj(inode,obj); ++ yaffs_gross_unlock(dev); + } + + @@ -18819,8 +22055,8 @@ + +static void yaffs_clear_inode(struct inode *inode) +{ -+ yaffs_Object *obj; -+ yaffs_Device *dev; ++ yaffs_obj_t *obj; ++ yaffs_dev_t *dev; + + obj = yaffs_InodeToObject(inode); + @@ -18830,10 +22066,10 @@ + obj ? "object exists" : "null object")); + + if (obj) { -+ dev = obj->myDev; -+ yaffs_GrossLock(dev); -+ yaffs_UnstitchObject(inode,obj); -+ yaffs_GrossUnlock(dev); ++ dev = obj->my_dev; ++ yaffs_gross_lock(dev); ++ yaffs_unstitch_obj(inode,obj); ++ yaffs_gross_unlock(dev); + } + +} @@ -18845,8 +22081,8 @@ + */ +static void yaffs_delete_inode(struct inode *inode) +{ -+ yaffs_Object *obj = yaffs_InodeToObject(inode); -+ yaffs_Device *dev; ++ yaffs_obj_t *obj = yaffs_InodeToObject(inode); ++ yaffs_dev_t *dev; + + T(YAFFS_TRACE_OS, + (TSTR("yaffs_delete_inode: ino %d, count %d %s\n"), (int)inode->i_ino, @@ -18854,10 +22090,10 @@ + obj ? "object exists" : "null object")); + + if (obj) { -+ dev = obj->myDev; -+ yaffs_GrossLock(dev); -+ yaffs_DeleteObject(obj); -+ yaffs_GrossUnlock(dev); ++ dev = obj->my_dev; ++ yaffs_gross_lock(dev); ++ yaffs_del_obj(obj); ++ yaffs_gross_unlock(dev); + } +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 13)) + truncate_inode_pages(&inode->i_data, 0); @@ -18873,19 +22109,19 @@ +static int yaffs_file_flush(struct file *file) +#endif +{ -+ yaffs_Object *obj = yaffs_DentryToObject(file->f_dentry); ++ yaffs_obj_t *obj = yaffs_dentry_to_obj(file->f_dentry); + -+ yaffs_Device *dev = obj->myDev; ++ yaffs_dev_t *dev = obj->my_dev; + + T(YAFFS_TRACE_OS, -+ (TSTR("yaffs_file_flush object %d (%s)\n"), obj->objectId, ++ (TSTR("yaffs_file_flush object %d (%s)\n"), obj->obj_id, + obj->dirty ? "dirty" : "clean")); + -+ yaffs_GrossLock(dev); ++ yaffs_gross_lock(dev); + -+ yaffs_FlushFile(obj, 1, 0); ++ yaffs_flush_file(obj, 1, 0); + -+ yaffs_GrossUnlock(dev); ++ yaffs_gross_unlock(dev); + + return 0; +} @@ -18894,20 +22130,20 @@ +{ + /* Lifted from jffs2 */ + -+ yaffs_Object *obj; ++ yaffs_obj_t *obj; + unsigned char *pg_buf; + int ret; + -+ yaffs_Device *dev; ++ yaffs_dev_t *dev; + + T(YAFFS_TRACE_OS, + (TSTR("yaffs_readpage_nolock at %08x, size %08x\n"), + (unsigned)(pg->index << PAGE_CACHE_SHIFT), + (unsigned)PAGE_CACHE_SIZE)); + -+ obj = yaffs_DentryToObject(f->f_dentry); ++ obj = yaffs_dentry_to_obj(f->f_dentry); + -+ dev = obj->myDev; ++ dev = obj->my_dev; + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) + BUG_ON(!PageLocked(pg)); @@ -18919,13 +22155,13 @@ + pg_buf = kmap(pg); + /* FIXME: Can kmap fail? */ + -+ yaffs_GrossLock(dev); ++ yaffs_gross_lock(dev); + -+ ret = yaffs_ReadDataFromFile(obj, pg_buf, ++ ret = yaffs_file_rd(obj, pg_buf, + pg->index << PAGE_CACHE_SHIFT, + PAGE_CACHE_SIZE); + -+ yaffs_GrossUnlock(dev); ++ yaffs_gross_unlock(dev); + + if (ret >= 0) + ret = 0; @@ -18970,14 +22206,14 @@ +static int yaffs_writepage(struct page *page) +#endif +{ -+ yaffs_Device *dev; ++ yaffs_dev_t *dev; + struct address_space *mapping = page->mapping; + struct inode *inode; + unsigned long end_index; + char *buffer; -+ yaffs_Object *obj; ++ yaffs_obj_t *obj; + int nWritten = 0; -+ unsigned nBytes; ++ unsigned n_bytes; + loff_t i_size; + + if (!mapping) @@ -18990,11 +22226,11 @@ + end_index = i_size >> PAGE_CACHE_SHIFT; + + if(page->index < end_index) -+ nBytes = PAGE_CACHE_SIZE; ++ n_bytes = PAGE_CACHE_SIZE; + else { -+ nBytes = i_size & (PAGE_CACHE_SIZE -1); ++ n_bytes = i_size & (PAGE_CACHE_SIZE -1); + -+ if (page->index > end_index || !nBytes) { ++ if (page->index > end_index || !n_bytes) { + T(YAFFS_TRACE_OS, + (TSTR("yaffs_writepage at %08x, inode size = %08x!!!\n"), + (unsigned)(page->index << PAGE_CACHE_SHIFT), @@ -19010,34 +22246,34 @@ + } + } + -+ if(nBytes != PAGE_CACHE_SIZE) -+ zero_user_segment(page,nBytes,PAGE_CACHE_SIZE); ++ if(n_bytes != PAGE_CACHE_SIZE) ++ zero_user_segment(page,n_bytes,PAGE_CACHE_SIZE); + + get_page(page); + + buffer = kmap(page); + + obj = yaffs_InodeToObject(inode); -+ dev = obj->myDev; -+ yaffs_GrossLock(dev); ++ dev = obj->my_dev; ++ yaffs_gross_lock(dev); + + T(YAFFS_TRACE_OS, + (TSTR("yaffs_writepage at %08x, size %08x\n"), -+ (unsigned)(page->index << PAGE_CACHE_SHIFT), nBytes)); ++ (unsigned)(page->index << PAGE_CACHE_SHIFT), n_bytes)); + T(YAFFS_TRACE_OS, + (TSTR("writepag0: obj = %05x, ino = %05x\n"), -+ (int)obj->variant.fileVariant.fileSize, (int)inode->i_size)); ++ (int)obj->variant.file_variant.file_size, (int)inode->i_size)); + -+ nWritten = yaffs_WriteDataToFile(obj, buffer, -+ page->index << PAGE_CACHE_SHIFT, nBytes, 0); ++ nWritten = yaffs_wr_file(obj, buffer, ++ page->index << PAGE_CACHE_SHIFT, n_bytes, 0); + -+ yaffs_MarkSuperBlockDirty(dev); ++ yaffs_touch_super(dev); + + T(YAFFS_TRACE_OS, + (TSTR("writepag1: obj = %05x, ino = %05x\n"), -+ (int)obj->variant.fileVariant.fileSize, (int)inode->i_size)); ++ (int)obj->variant.file_variant.file_size, (int)inode->i_size)); + -+ yaffs_GrossUnlock(dev); ++ yaffs_gross_unlock(dev); + + kunmap(page); + set_page_writeback(page); @@ -19045,7 +22281,7 @@ + end_page_writeback(page); + put_page(page); + -+ return (nWritten == nBytes) ? 0 : -ENOSPC; ++ return (nWritten == n_bytes) ? 0 : -ENOSPC; +} + + @@ -19135,7 +22371,7 @@ + addr = kva + offset_into_page; + + T(YAFFS_TRACE_OS, -+ ("yaffs_write_end addr %p pos %x nBytes %d\n", ++ ("yaffs_write_end addr %p pos %x n_bytes %d\n", + addr,(unsigned)pos, copied)); + + ret = yaffs_file_write(filp, addr, copied, &pos); @@ -19164,7 +22400,7 @@ + void *addr, *kva; + + loff_t pos = (((loff_t) pg->index) << PAGE_CACHE_SHIFT) + offset; -+ int nBytes = to - offset; ++ int n_bytes = to - offset; + int nWritten; + + unsigned spos = pos; @@ -19176,15 +22412,15 @@ + saddr = (unsigned) addr; + + T(YAFFS_TRACE_OS, -+ (TSTR("yaffs_commit_write addr %x pos %x nBytes %d\n"), -+ saddr, spos, nBytes)); ++ (TSTR("yaffs_commit_write addr %x pos %x n_bytes %d\n"), ++ saddr, spos, n_bytes)); + -+ nWritten = yaffs_file_write(f, addr, nBytes, &pos); ++ nWritten = yaffs_file_write(f, addr, n_bytes, &pos); + -+ if (nWritten != nBytes) { ++ if (nWritten != n_bytes) { + T(YAFFS_TRACE_OS, -+ (TSTR("yaffs_commit_write not same size nWritten %d nBytes %d\n"), -+ nWritten, nBytes)); ++ (TSTR("yaffs_commit_write not same size nWritten %d n_bytes %d\n"), ++ nWritten, n_bytes)); + SetPageError(pg); + } else { + /* Nothing */ @@ -19194,21 +22430,21 @@ + + T(YAFFS_TRACE_OS, + (TSTR("yaffs_commit_write returning %d\n"), -+ nWritten == nBytes ? 0 : nWritten)); ++ nWritten == n_bytes ? 0 : nWritten)); + -+ return nWritten == nBytes ? 0 : nWritten; ++ return nWritten == n_bytes ? 0 : nWritten; +} +#endif + + -+static void yaffs_FillInodeFromObject(struct inode *inode, yaffs_Object *obj) ++static void yaffs_fill_inode_from_obj(struct inode *inode, yaffs_obj_t *obj) +{ + if (inode && obj) { + + + /* Check mode against the variant type and attempt to repair if broken. */ + __u32 mode = obj->yst_mode; -+ switch (obj->variantType) { ++ switch (obj->variant_type) { + case YAFFS_OBJECT_TYPE_FILE: + if (!S_ISREG(mode)) { + obj->yst_mode &= ~S_IFMT; @@ -19240,7 +22476,7 @@ + + inode->i_flags |= S_NOATIME; + -+ inode->i_ino = obj->objectId; ++ inode->i_ino = obj->obj_id; + inode->i_mode = obj->yst_mode; + inode->i_uid = obj->yst_uid; + inode->i_gid = obj->yst_gid; @@ -19262,13 +22498,13 @@ + inode->i_mtime = obj->yst_mtime; + inode->i_ctime = obj->yst_ctime; +#endif -+ inode->i_size = yaffs_GetObjectFileLength(obj); ++ inode->i_size = yaffs_get_obj_length(obj); + inode->i_blocks = (inode->i_size + 511) >> 9; + -+ inode->i_nlink = yaffs_GetObjectLinkCount(obj); ++ inode->i_nlink = yaffs_get_obj_link_count(obj); + + T(YAFFS_TRACE_OS, -+ (TSTR("yaffs_FillInode mode %x uid %d gid %d size %d count %d\n"), ++ (TSTR("yaffs_fill_inode mode %x uid %d gid %d size %d count %d\n"), + inode->i_mode, inode->i_uid, inode->i_gid, + (int)inode->i_size, atomic_read(&inode->i_count))); + @@ -19299,7 +22535,7 @@ + + yaffs_InodeToObjectLV(inode) = obj; + -+ obj->myInode = inode; ++ obj->my_inode = inode; + + } else { + T(YAFFS_TRACE_OS, @@ -19309,7 +22545,7 @@ +} + +struct inode *yaffs_get_inode(struct super_block *sb, int mode, int dev, -+ yaffs_Object *obj) ++ yaffs_obj_t *obj) +{ + struct inode *inode; + @@ -19328,9 +22564,9 @@ + } + + T(YAFFS_TRACE_OS, -+ (TSTR("yaffs_get_inode for object %d\n"), obj->objectId)); ++ (TSTR("yaffs_get_inode for object %d\n"), obj->obj_id)); + -+ inode = Y_IGET(sb, obj->objectId); ++ inode = Y_IGET(sb, obj->obj_id); + if (IS_ERR(inode)) + return NULL; + @@ -19344,16 +22580,16 @@ +static ssize_t yaffs_file_write(struct file *f, const char *buf, size_t n, + loff_t *pos) +{ -+ yaffs_Object *obj; ++ yaffs_obj_t *obj; + int nWritten, ipos; + struct inode *inode; -+ yaffs_Device *dev; ++ yaffs_dev_t *dev; + -+ obj = yaffs_DentryToObject(f->f_dentry); ++ obj = yaffs_dentry_to_obj(f->f_dentry); + -+ dev = obj->myDev; ++ dev = obj->my_dev; + -+ yaffs_GrossLock(dev); ++ yaffs_gross_lock(dev); + + inode = f->f_dentry->d_inode; + @@ -19369,11 +22605,11 @@ + T(YAFFS_TRACE_OS, + (TSTR("yaffs_file_write about to write writing %u(%x) bytes" + "to object %d at %d(%x)\n"), -+ (unsigned) n, (unsigned) n, obj->objectId, ipos,ipos)); ++ (unsigned) n, (unsigned) n, obj->obj_id, ipos,ipos)); + -+ nWritten = yaffs_WriteDataToFile(obj, buf, ipos, n, 0); ++ nWritten = yaffs_wr_file(obj, buf, ipos, n, 0); + -+ yaffs_MarkSuperBlockDirty(dev); ++ yaffs_touch_super(dev); + + T(YAFFS_TRACE_OS, + (TSTR("yaffs_file_write: %d(%x) bytes written\n"), @@ -19393,7 +22629,7 @@ + } + + } -+ yaffs_GrossUnlock(dev); ++ yaffs_gross_unlock(dev); + return (nWritten == 0) && (n > 0) ? -ENOSPC : nWritten; +} + @@ -19403,39 +22639,39 @@ + +static ssize_t yaffs_hold_space(struct file *f) +{ -+ yaffs_Object *obj; -+ yaffs_Device *dev; ++ yaffs_obj_t *obj; ++ yaffs_dev_t *dev; + -+ int nFreeChunks; ++ int n_free_chunks; + + -+ obj = yaffs_DentryToObject(f->f_dentry); ++ obj = yaffs_dentry_to_obj(f->f_dentry); + -+ dev = obj->myDev; ++ dev = obj->my_dev; + -+ yaffs_GrossLock(dev); ++ yaffs_gross_lock(dev); + -+ nFreeChunks = yaffs_GetNumberOfFreeChunks(dev); ++ n_free_chunks = yaffs_get_n_free_chunks(dev); + -+ yaffs_GrossUnlock(dev); ++ yaffs_gross_unlock(dev); + -+ return (nFreeChunks > 20) ? 1 : 0; ++ return (n_free_chunks > 20) ? 1 : 0; +} + +static void yaffs_release_space(struct file *f) +{ -+ yaffs_Object *obj; -+ yaffs_Device *dev; ++ yaffs_obj_t *obj; ++ yaffs_dev_t *dev; + + -+ obj = yaffs_DentryToObject(f->f_dentry); ++ obj = yaffs_dentry_to_obj(f->f_dentry); + -+ dev = obj->myDev; ++ dev = obj->my_dev; + -+ yaffs_GrossLock(dev); ++ yaffs_gross_lock(dev); + + -+ yaffs_GrossUnlock(dev); ++ yaffs_gross_unlock(dev); +} + + @@ -19467,22 +22703,22 @@ + +static int yaffs_readdir(struct file *f, void *dirent, filldir_t filldir) +{ -+ yaffs_Object *obj; -+ yaffs_Device *dev; ++ yaffs_obj_t *obj; ++ yaffs_dev_t *dev; + struct yaffs_SearchContext *sc; + struct inode *inode = f->f_dentry->d_inode; + unsigned long offset, curoffs; -+ yaffs_Object *l; ++ yaffs_obj_t *l; + int retVal = 0; + + char name[YAFFS_MAX_NAME_LENGTH + 1]; + -+ obj = yaffs_DentryToObject(f->f_dentry); -+ dev = obj->myDev; ++ obj = yaffs_dentry_to_obj(f->f_dentry); ++ dev = obj->my_dev; + -+ yaffs_GrossLock(dev); ++ yaffs_gross_lock(dev); + -+ yaffs_DeviceToLC(dev)->readdirProcess = current; ++ yaffs_dev_to_lc(dev)->readdirProcess = current; + + offset = f->f_pos; + @@ -19498,12 +22734,12 @@ + T(YAFFS_TRACE_OS, + (TSTR("yaffs_readdir: entry . ino %d \n"), + (int)inode->i_ino)); -+ yaffs_GrossUnlock(dev); ++ yaffs_gross_unlock(dev); + if (filldir(dirent, ".", 1, offset, inode->i_ino, DT_DIR) < 0){ -+ yaffs_GrossLock(dev); ++ yaffs_gross_lock(dev); + goto out; + } -+ yaffs_GrossLock(dev); ++ yaffs_gross_lock(dev); + offset++; + f->f_pos++; + } @@ -19511,13 +22747,13 @@ + T(YAFFS_TRACE_OS, + (TSTR("yaffs_readdir: entry .. ino %d \n"), + (int)f->f_dentry->d_parent->d_inode->i_ino)); -+ yaffs_GrossUnlock(dev); ++ yaffs_gross_unlock(dev); + if (filldir(dirent, "..", 2, offset, + f->f_dentry->d_parent->d_inode->i_ino, DT_DIR) < 0){ -+ yaffs_GrossLock(dev); ++ yaffs_gross_lock(dev); + goto out; + } -+ yaffs_GrossLock(dev); ++ yaffs_gross_lock(dev); + offset++; + f->f_pos++; + } @@ -19536,16 +22772,16 @@ + curoffs++; + l = sc->nextReturn; + if (curoffs >= offset) { -+ int this_inode = yaffs_GetObjectInode(l); -+ int this_type = yaffs_GetObjectType(l); ++ int this_inode = yaffs_get_obj_inode(l); ++ int this_type = yaffs_get_obj_type(l); + -+ yaffs_GetObjectName(l, name, ++ yaffs_get_obj_name(l, name, + YAFFS_MAX_NAME_LENGTH + 1); + T(YAFFS_TRACE_OS, + (TSTR("yaffs_readdir: %s inode %d\n"), -+ name, yaffs_GetObjectInode(l))); ++ name, yaffs_get_obj_inode(l))); + -+ yaffs_GrossUnlock(dev); ++ yaffs_gross_unlock(dev); + + if (filldir(dirent, + name, @@ -19553,22 +22789,22 @@ + offset, + this_inode, + this_type) < 0){ -+ yaffs_GrossLock(dev); ++ yaffs_gross_lock(dev); + goto out; + } + -+ yaffs_GrossLock(dev); ++ yaffs_gross_lock(dev); + + offset++; + f->f_pos++; + } -+ yaffs_SearchAdvance(sc); ++ yaffs_search_advance(sc); + } + +out: -+ yaffs_EndSearch(sc); -+ yaffs_DeviceToLC(dev)->readdirProcess = NULL; -+ yaffs_GrossUnlock(dev); ++ yaffs_search_end(sc); ++ yaffs_dev_to_lc(dev)->readdirProcess = NULL; ++ yaffs_gross_unlock(dev); + + return retVal; +} @@ -19595,10 +22831,10 @@ +{ + struct inode *inode; + -+ yaffs_Object *obj = NULL; -+ yaffs_Device *dev; ++ yaffs_obj_t *obj = NULL; ++ yaffs_dev_t *dev; + -+ yaffs_Object *parent = yaffs_InodeToObject(dir); ++ yaffs_obj_t *parent = yaffs_InodeToObject(dir); + + int error = -ENOSPC; + uid_t uid = YCRED(current)->fsuid; @@ -19610,7 +22846,7 @@ + if (parent) { + T(YAFFS_TRACE_OS, + (TSTR("yaffs_mknod: parent object %d type %d\n"), -+ parent->objectId, parent->variantType)); ++ parent->obj_id, parent->variant_type)); + } else { + T(YAFFS_TRACE_OS, + (TSTR("yaffs_mknod: could not get parent object\n"))); @@ -19621,31 +22857,31 @@ + "mode %x dev %x\n"), + dentry->d_name.name, mode, rdev)); + -+ dev = parent->myDev; ++ dev = parent->my_dev; + -+ yaffs_GrossLock(dev); ++ yaffs_gross_lock(dev); + + switch (mode & S_IFMT) { + default: + /* Special (socket, fifo, device...) */ + T(YAFFS_TRACE_OS, (TSTR("yaffs_mknod: making special\n"))); +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) -+ obj = yaffs_MknodSpecial(parent, dentry->d_name.name, mode, uid, ++ obj = yaffs_create_special(parent, dentry->d_name.name, mode, uid, + gid, old_encode_dev(rdev)); +#else -+ obj = yaffs_MknodSpecial(parent, dentry->d_name.name, mode, uid, ++ obj = yaffs_create_special(parent, dentry->d_name.name, mode, uid, + gid, rdev); +#endif + break; + case S_IFREG: /* file */ + T(YAFFS_TRACE_OS, (TSTR("yaffs_mknod: making file\n"))); -+ obj = yaffs_MknodFile(parent, dentry->d_name.name, mode, uid, ++ obj = yaffs_create_file(parent, dentry->d_name.name, mode, uid, + gid); + break; + case S_IFDIR: /* directory */ + T(YAFFS_TRACE_OS, + (TSTR("yaffs_mknod: making directory\n"))); -+ obj = yaffs_MknodDirectory(parent, dentry->d_name.name, mode, ++ obj = yaffs_create_dir(parent, dentry->d_name.name, mode, + uid, gid); + break; + case S_IFLNK: /* symlink */ @@ -19655,7 +22891,7 @@ + } + + /* Can not call yaffs_get_inode() with gross lock held */ -+ yaffs_GrossUnlock(dev); ++ yaffs_gross_unlock(dev); + + if (obj) { + inode = yaffs_get_inode(dir->i_sb, mode, rdev, obj); @@ -19663,9 +22899,9 @@ + update_dir_time(dir); + T(YAFFS_TRACE_OS, + (TSTR("yaffs_mknod created object %d count = %d\n"), -+ obj->objectId, atomic_read(&inode->i_count))); ++ obj->obj_id, atomic_read(&inode->i_count))); + error = 0; -+ yaffs_FillInodeFromObject(dir,parent); ++ yaffs_fill_inode_from_obj(dir,parent); + } else { + T(YAFFS_TRACE_OS, + (TSTR("yaffs_mknod failed making object\n"))); @@ -19698,29 +22934,29 @@ +{ + int retVal; + -+ yaffs_Device *dev; -+ yaffs_Object *obj; ++ yaffs_dev_t *dev; ++ yaffs_obj_t *obj; + + T(YAFFS_TRACE_OS, + (TSTR("yaffs_unlink %d:%s\n"), + (int)(dir->i_ino), + dentry->d_name.name)); + obj = yaffs_InodeToObject(dir); -+ dev = obj->myDev; ++ dev = obj->my_dev; + -+ yaffs_GrossLock(dev); ++ yaffs_gross_lock(dev); + -+ retVal = yaffs_Unlink(obj, dentry->d_name.name); ++ retVal = yaffs_unlinker(obj, dentry->d_name.name); + + if (retVal == YAFFS_OK) { + dentry->d_inode->i_nlink--; + dir->i_version++; -+ yaffs_GrossUnlock(dev); ++ yaffs_gross_unlock(dev); + mark_inode_dirty(dentry->d_inode); + update_dir_time(dir); + return 0; + } -+ yaffs_GrossUnlock(dev); ++ yaffs_gross_unlock(dev); + return -ENOTEMPTY; +} + @@ -19731,23 +22967,23 @@ + struct dentry *dentry) +{ + struct inode *inode = old_dentry->d_inode; -+ yaffs_Object *obj = NULL; -+ yaffs_Object *link = NULL; -+ yaffs_Device *dev; ++ yaffs_obj_t *obj = NULL; ++ yaffs_obj_t *link = NULL; ++ yaffs_dev_t *dev; + + T(YAFFS_TRACE_OS, (TSTR("yaffs_link\n"))); + + obj = yaffs_InodeToObject(inode); -+ dev = obj->myDev; ++ dev = obj->my_dev; + -+ yaffs_GrossLock(dev); ++ yaffs_gross_lock(dev); + + if (!S_ISDIR(inode->i_mode)) /* Don't link directories */ -+ link = yaffs_Link(yaffs_InodeToObject(dir), dentry->d_name.name, ++ link = yaffs_link_obj(yaffs_InodeToObject(dir), dentry->d_name.name, + obj); + + if (link) { -+ old_dentry->d_inode->i_nlink = yaffs_GetObjectLinkCount(obj); ++ old_dentry->d_inode->i_nlink = yaffs_get_obj_link_count(obj); + d_instantiate(dentry, old_dentry->d_inode); + atomic_inc(&old_dentry->d_inode->i_count); + T(YAFFS_TRACE_OS, @@ -19756,7 +22992,7 @@ + atomic_read(&old_dentry->d_inode->i_count))); + } + -+ yaffs_GrossUnlock(dev); ++ yaffs_gross_unlock(dev); + + if (link){ + update_dir_time(dir); @@ -19769,18 +23005,18 @@ +static int yaffs_symlink(struct inode *dir, struct dentry *dentry, + const char *symname) +{ -+ yaffs_Object *obj; -+ yaffs_Device *dev; ++ yaffs_obj_t *obj; ++ yaffs_dev_t *dev; + uid_t uid = YCRED(current)->fsuid; + gid_t gid = (dir->i_mode & S_ISGID) ? dir->i_gid : YCRED(current)->fsgid; + + T(YAFFS_TRACE_OS, (TSTR("yaffs_symlink\n"))); + -+ dev = yaffs_InodeToObject(dir)->myDev; -+ yaffs_GrossLock(dev); -+ obj = yaffs_MknodSymLink(yaffs_InodeToObject(dir), dentry->d_name.name, ++ dev = yaffs_InodeToObject(dir)->my_dev; ++ yaffs_gross_lock(dev); ++ obj = yaffs_create_symlink(yaffs_InodeToObject(dir), dentry->d_name.name, + S_IFLNK | S_IRWXUGO, uid, gid, symname); -+ yaffs_GrossUnlock(dev); ++ yaffs_gross_unlock(dev); + + if (obj) { + struct inode *inode; @@ -19805,21 +23041,21 @@ +#endif +{ + -+ yaffs_Object *obj; -+ yaffs_Device *dev; ++ yaffs_obj_t *obj; ++ yaffs_dev_t *dev; +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 34)) + struct dentry *dentry = file->f_path.dentry; +#endif + -+ obj = yaffs_DentryToObject(dentry); ++ obj = yaffs_dentry_to_obj(dentry); + -+ dev = obj->myDev; ++ dev = obj->my_dev; + + T(YAFFS_TRACE_OS | YAFFS_TRACE_SYNC, + (TSTR("yaffs_sync_object\n"))); -+ yaffs_GrossLock(dev); -+ yaffs_FlushFile(obj, 1, datasync); -+ yaffs_GrossUnlock(dev); ++ yaffs_gross_lock(dev); ++ yaffs_flush_file(obj, 1, datasync); ++ yaffs_gross_unlock(dev); + return 0; +} + @@ -19831,37 +23067,37 @@ +static int yaffs_rename(struct inode *old_dir, struct dentry *old_dentry, + struct inode *new_dir, struct dentry *new_dentry) +{ -+ yaffs_Device *dev; ++ yaffs_dev_t *dev; + int retVal = YAFFS_FAIL; -+ yaffs_Object *target; ++ yaffs_obj_t *target; + + T(YAFFS_TRACE_OS, (TSTR("yaffs_rename\n"))); -+ dev = yaffs_InodeToObject(old_dir)->myDev; ++ dev = yaffs_InodeToObject(old_dir)->my_dev; + -+ yaffs_GrossLock(dev); ++ yaffs_gross_lock(dev); + + /* Check if the target is an existing directory that is not empty. */ -+ target = yaffs_FindObjectByName(yaffs_InodeToObject(new_dir), ++ target = yaffs_find_by_name(yaffs_InodeToObject(new_dir), + new_dentry->d_name.name); + + + -+ if (target && target->variantType == YAFFS_OBJECT_TYPE_DIRECTORY && -+ !ylist_empty(&target->variant.directoryVariant.children)) { ++ if (target && target->variant_type == YAFFS_OBJECT_TYPE_DIRECTORY && ++ !ylist_empty(&target->variant.dir_variant.children)) { + + T(YAFFS_TRACE_OS, (TSTR("target is non-empty dir\n"))); + + retVal = YAFFS_FAIL; + } else { + /* Now does unlinking internally using shadowing mechanism */ -+ T(YAFFS_TRACE_OS, (TSTR("calling yaffs_RenameObject\n"))); ++ T(YAFFS_TRACE_OS, (TSTR("calling yaffs_rename_obj\n"))); + -+ retVal = yaffs_RenameObject(yaffs_InodeToObject(old_dir), ++ retVal = yaffs_rename_obj(yaffs_InodeToObject(old_dir), + old_dentry->d_name.name, + yaffs_InodeToObject(new_dir), + new_dentry->d_name.name); + } -+ yaffs_GrossUnlock(dev); ++ yaffs_gross_unlock(dev); + + if (retVal == YAFFS_OK) { + if (target) { @@ -19882,11 +23118,11 @@ +{ + struct inode *inode = dentry->d_inode; + int error = 0; -+ yaffs_Device *dev; ++ yaffs_dev_t *dev; + + T(YAFFS_TRACE_OS, + (TSTR("yaffs_setattr of object %d\n"), -+ yaffs_InodeToObject(inode)->objectId)); ++ yaffs_InodeToObject(inode)->obj_id)); + + /* Fail if a requested resize >= 2GB */ + if (attr->ia_valid & ATTR_SIZE && @@ -19905,19 +23141,19 @@ + inode->i_blocks = (inode->i_size + 511) >> 9; + } + } -+ dev = yaffs_InodeToObject(inode)->myDev; ++ dev = yaffs_InodeToObject(inode)->my_dev; + if (attr->ia_valid & ATTR_SIZE){ + T(YAFFS_TRACE_OS,(TSTR("resize to %d(%x)\n"), + (int)(attr->ia_size),(int)(attr->ia_size))); + } -+ yaffs_GrossLock(dev); -+ result = yaffs_SetAttributes(yaffs_InodeToObject(inode), attr); ++ yaffs_gross_lock(dev); ++ result = yaffs_set_attribs(yaffs_InodeToObject(inode), attr); + if(result == YAFFS_OK) { + error = 0; + } else { + error = -EPERM; + } -+ yaffs_GrossUnlock(dev); ++ yaffs_gross_unlock(dev); + + } + @@ -19933,24 +23169,24 @@ +{ + struct inode *inode = dentry->d_inode; + int error = 0; -+ yaffs_Device *dev; -+ yaffs_Object *obj = yaffs_InodeToObject(inode); ++ yaffs_dev_t *dev; ++ yaffs_obj_t *obj = yaffs_InodeToObject(inode); + + T(YAFFS_TRACE_OS, + (TSTR("yaffs_setxattr of object %d\n"), -+ obj->objectId)); ++ obj->obj_id)); + + + if (error == 0) { + int result; -+ dev = obj->myDev; -+ yaffs_GrossLock(dev); -+ result = yaffs_SetXAttribute(obj, name, value, size, flags); ++ dev = obj->my_dev; ++ yaffs_gross_lock(dev); ++ result = yaffs_set_xattrib(obj, name, value, size, flags); + if(result == YAFFS_OK) + error = 0; + else if(result < 0) + error = result; -+ yaffs_GrossUnlock(dev); ++ yaffs_gross_unlock(dev); + + } + T(YAFFS_TRACE_OS, @@ -19965,18 +23201,18 @@ +{ + struct inode *inode = dentry->d_inode; + int error = 0; -+ yaffs_Device *dev; -+ yaffs_Object *obj = yaffs_InodeToObject(inode); ++ yaffs_dev_t *dev; ++ yaffs_obj_t *obj = yaffs_InodeToObject(inode); + + T(YAFFS_TRACE_OS, + (TSTR("yaffs_getxattr \"%s\" from object %d\n"), -+ name, obj->objectId)); ++ name, obj->obj_id)); + + if (error == 0) { -+ dev = obj->myDev; -+ yaffs_GrossLock(dev); -+ error = yaffs_GetXAttribute(obj, name, buff, size); -+ yaffs_GrossUnlock(dev); ++ dev = obj->my_dev; ++ yaffs_gross_lock(dev); ++ error = yaffs_get_xattrib(obj, name, buff, size); ++ yaffs_gross_unlock(dev); + + } + T(YAFFS_TRACE_OS, @@ -19989,24 +23225,24 @@ +{ + struct inode *inode = dentry->d_inode; + int error = 0; -+ yaffs_Device *dev; -+ yaffs_Object *obj = yaffs_InodeToObject(inode); ++ yaffs_dev_t *dev; ++ yaffs_obj_t *obj = yaffs_InodeToObject(inode); + + T(YAFFS_TRACE_OS, + (TSTR("yaffs_removexattr of object %d\n"), -+ obj->objectId)); ++ obj->obj_id)); + + + if (error == 0) { + int result; -+ dev = obj->myDev; -+ yaffs_GrossLock(dev); -+ result = yaffs_RemoveXAttribute(obj, name); ++ dev = obj->my_dev; ++ yaffs_gross_lock(dev); ++ result = yaffs_remove_xattrib(obj, name); + if(result == YAFFS_OK) + error = 0; + else if(result < 0) + error = result; -+ yaffs_GrossUnlock(dev); ++ yaffs_gross_unlock(dev); + + } + T(YAFFS_TRACE_OS, @@ -20019,19 +23255,19 @@ +{ + struct inode *inode = dentry->d_inode; + int error = 0; -+ yaffs_Device *dev; -+ yaffs_Object *obj = yaffs_InodeToObject(inode); ++ yaffs_dev_t *dev; ++ yaffs_obj_t *obj = yaffs_InodeToObject(inode); + + T(YAFFS_TRACE_OS, + (TSTR("yaffs_listxattr of object %d\n"), -+ obj->objectId)); ++ obj->obj_id)); + + + if (error == 0) { -+ dev = obj->myDev; -+ yaffs_GrossLock(dev); -+ error = yaffs_ListXAttributes(obj, buff, size); -+ yaffs_GrossUnlock(dev); ++ dev = obj->my_dev; ++ yaffs_gross_lock(dev); ++ error = yaffs_list_xattrib(obj, buff, size); ++ yaffs_gross_unlock(dev); + + } + T(YAFFS_TRACE_OS, @@ -20046,121 +23282,121 @@ +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17)) +static int yaffs_statfs(struct dentry *dentry, struct kstatfs *buf) +{ -+ yaffs_Device *dev = yaffs_DentryToObject(dentry)->myDev; ++ yaffs_dev_t *dev = yaffs_dentry_to_obj(dentry)->my_dev; + struct super_block *sb = dentry->d_sb; +#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) +static int yaffs_statfs(struct super_block *sb, struct kstatfs *buf) +{ -+ yaffs_Device *dev = yaffs_SuperToDevice(sb); ++ yaffs_dev_t *dev = yaffs_SuperToDevice(sb); +#else +static int yaffs_statfs(struct super_block *sb, struct statfs *buf) +{ -+ yaffs_Device *dev = yaffs_SuperToDevice(sb); ++ yaffs_dev_t *dev = yaffs_SuperToDevice(sb); +#endif + + T(YAFFS_TRACE_OS, (TSTR("yaffs_statfs\n"))); + -+ yaffs_GrossLock(dev); ++ yaffs_gross_lock(dev); + + buf->f_type = YAFFS_MAGIC; + buf->f_bsize = sb->s_blocksize; + buf->f_namelen = 255; + -+ if (dev->nDataBytesPerChunk & (dev->nDataBytesPerChunk - 1)) { ++ if (dev->data_bytes_per_chunk & (dev->data_bytes_per_chunk - 1)) { + /* Do this if chunk size is not a power of 2 */ + + uint64_t bytesInDev; + uint64_t bytesFree; + -+ bytesInDev = ((uint64_t)((dev->param.endBlock - dev->param.startBlock + 1))) * -+ ((uint64_t)(dev->param.nChunksPerBlock * dev->nDataBytesPerChunk)); ++ bytesInDev = ((uint64_t)((dev->param.end_block - dev->param.start_block + 1))) * ++ ((uint64_t)(dev->param.chunks_per_block * dev->data_bytes_per_chunk)); + + do_div(bytesInDev, sb->s_blocksize); /* bytesInDev becomes the number of blocks */ + buf->f_blocks = bytesInDev; + -+ bytesFree = ((uint64_t)(yaffs_GetNumberOfFreeChunks(dev))) * -+ ((uint64_t)(dev->nDataBytesPerChunk)); ++ bytesFree = ((uint64_t)(yaffs_get_n_free_chunks(dev))) * ++ ((uint64_t)(dev->data_bytes_per_chunk)); + + do_div(bytesFree, sb->s_blocksize); + + buf->f_bfree = bytesFree; + -+ } else if (sb->s_blocksize > dev->nDataBytesPerChunk) { ++ } else if (sb->s_blocksize > dev->data_bytes_per_chunk) { + + buf->f_blocks = -+ (dev->param.endBlock - dev->param.startBlock + 1) * -+ dev->param.nChunksPerBlock / -+ (sb->s_blocksize / dev->nDataBytesPerChunk); ++ (dev->param.end_block - dev->param.start_block + 1) * ++ dev->param.chunks_per_block / ++ (sb->s_blocksize / dev->data_bytes_per_chunk); + buf->f_bfree = -+ yaffs_GetNumberOfFreeChunks(dev) / -+ (sb->s_blocksize / dev->nDataBytesPerChunk); ++ yaffs_get_n_free_chunks(dev) / ++ (sb->s_blocksize / dev->data_bytes_per_chunk); + } else { + buf->f_blocks = -+ (dev->param.endBlock - dev->param.startBlock + 1) * -+ dev->param.nChunksPerBlock * -+ (dev->nDataBytesPerChunk / sb->s_blocksize); ++ (dev->param.end_block - dev->param.start_block + 1) * ++ dev->param.chunks_per_block * ++ (dev->data_bytes_per_chunk / sb->s_blocksize); + + buf->f_bfree = -+ yaffs_GetNumberOfFreeChunks(dev) * -+ (dev->nDataBytesPerChunk / sb->s_blocksize); ++ yaffs_get_n_free_chunks(dev) * ++ (dev->data_bytes_per_chunk / sb->s_blocksize); + } + + buf->f_files = 0; + buf->f_ffree = 0; + buf->f_bavail = buf->f_bfree; + -+ yaffs_GrossUnlock(dev); ++ yaffs_gross_unlock(dev); + return 0; +} + + + -+static void yaffs_FlushInodes(struct super_block *sb) ++static void yaffs_flush_inodes(struct super_block *sb) +{ + struct inode *iptr; -+ yaffs_Object *obj; ++ yaffs_obj_t *obj; + + list_for_each_entry(iptr,&sb->s_inodes, i_sb_list){ + obj = yaffs_InodeToObject(iptr); + if(obj){ + T(YAFFS_TRACE_OS, (TSTR("flushing obj %d\n"), -+ obj->objectId)); -+ yaffs_FlushFile(obj,1,0); ++ obj->obj_id)); ++ yaffs_flush_file(obj,1,0); + } + } +} + + -+static void yaffs_FlushSuperBlock(struct super_block *sb, int do_checkpoint) ++static void yaffs_flush_super(struct super_block *sb, int do_checkpoint) +{ -+ yaffs_Device *dev = yaffs_SuperToDevice(sb); ++ yaffs_dev_t *dev = yaffs_SuperToDevice(sb); + if(!dev) + return; + -+ yaffs_FlushInodes(sb); -+ yaffs_UpdateDirtyDirectories(dev); -+ yaffs_FlushEntireDeviceCache(dev); ++ yaffs_flush_inodes(sb); ++ yaffs_update_dirty_dirs(dev); ++ yaffs_flush_whole_cache(dev); + if(do_checkpoint) -+ yaffs_CheckpointSave(dev); ++ yaffs_checkpoint_save(dev); +} + + -+static unsigned yaffs_bg_gc_urgency(yaffs_Device *dev) ++static unsigned yaffs_bg_gc_urgency(yaffs_dev_t *dev) +{ -+ unsigned erasedChunks = dev->nErasedBlocks * dev->param.nChunksPerBlock; -+ struct yaffs_LinuxContext *context = yaffs_DeviceToLC(dev); ++ unsigned erasedChunks = dev->n_erased_blocks * dev->param.chunks_per_block; ++ struct yaffs_LinuxContext *context = yaffs_dev_to_lc(dev); + unsigned scatteredFree = 0; /* Free chunks not in an erased block */ + -+ if(erasedChunks < dev->nFreeChunks) -+ scatteredFree = (dev->nFreeChunks - erasedChunks); ++ if(erasedChunks < dev->n_free_chunks) ++ scatteredFree = (dev->n_free_chunks - erasedChunks); + + if(!context->bgRunning) + return 0; -+ else if(scatteredFree < (dev->param.nChunksPerBlock * 2)) ++ else if(scatteredFree < (dev->param.chunks_per_block * 2)) + return 0; -+ else if(erasedChunks > dev->nFreeChunks/2) ++ else if(erasedChunks > dev->n_free_chunks/2) + return 0; -+ else if(erasedChunks > dev->nFreeChunks/4) ++ else if(erasedChunks > dev->n_free_chunks/4) + return 1; + else + return 2; @@ -20170,7 +23406,7 @@ + int request_checkpoint) +{ + -+ yaffs_Device *dev = yaffs_SuperToDevice(sb); ++ yaffs_dev_t *dev = yaffs_SuperToDevice(sb); + unsigned int oneshot_checkpoint = (yaffs_auto_checkpoint & 4); + unsigned gc_urgent = yaffs_bg_gc_urgency(dev); + int do_checkpoint; @@ -20182,27 +23418,27 @@ + request_checkpoint ? "checkpoint requested" : "no checkpoint", + oneshot_checkpoint ? " one-shot" : "" )); + -+ yaffs_GrossLock(dev); ++ yaffs_gross_lock(dev); + do_checkpoint = ((request_checkpoint && !gc_urgent) || + oneshot_checkpoint) && -+ !dev->isCheckpointed; ++ !dev->is_checkpointed; + + if (sb->s_dirt || do_checkpoint) { -+ yaffs_FlushSuperBlock(sb, !dev->isCheckpointed && do_checkpoint); ++ yaffs_flush_super(sb, !dev->is_checkpointed && do_checkpoint); + sb->s_dirt = 0; + if(oneshot_checkpoint) + yaffs_auto_checkpoint &= ~4; + } -+ yaffs_GrossUnlock(dev); ++ yaffs_gross_unlock(dev); + + return 0; +} + +/* + * yaffs background thread functions . -+ * yaffs_BackgroundThread() the thread function -+ * yaffs_BackgroundStart() launches the background thread. -+ * yaffs_BackgroundStop() cleans up the background thread. ++ * yaffs_bg_thread_fn() the thread function ++ * yaffs_bg_start() launches the background thread. ++ * yaffs_bg_stop() cleans up the background thread. + * + * NB: + * The thread should only run after the yaffs is initialised @@ -20217,10 +23453,10 @@ + wake_up_process((struct task_struct *)data); +} + -+static int yaffs_BackgroundThread(void *data) ++static int yaffs_bg_thread_fn(void *data) +{ -+ yaffs_Device *dev = (yaffs_Device *)data; -+ struct yaffs_LinuxContext *context = yaffs_DeviceToLC(dev); ++ yaffs_dev_t *dev = (yaffs_dev_t *)data; ++ struct yaffs_LinuxContext *context = yaffs_dev_to_lc(dev); + unsigned long now = jiffies; + unsigned long next_dir_update = now; + unsigned long next_gc = now; @@ -20248,19 +23484,19 @@ + if(try_to_freeze()) + continue; +#endif -+ yaffs_GrossLock(dev); ++ yaffs_gross_lock(dev); + + now = jiffies; + + if(time_after(now, next_dir_update) && yaffs_bg_enable){ -+ yaffs_UpdateDirtyDirectories(dev); ++ yaffs_update_dirty_dirs(dev); + next_dir_update = now + HZ; + } + + if(time_after(now,next_gc) && yaffs_bg_enable){ -+ if(!dev->isCheckpointed){ ++ if(!dev->is_checkpointed){ + urgency = yaffs_bg_gc_urgency(dev); -+ gcResult = yaffs_BackgroundGarbageCollect(dev, urgency); ++ gcResult = yaffs_bg_gc(dev, urgency); + if(urgency > 1) + next_gc = now + HZ/20+1; + else if(urgency > 0) @@ -20273,7 +23509,7 @@ + */ + next_gc = next_dir_update; + } -+ yaffs_GrossUnlock(dev); ++ yaffs_gross_unlock(dev); +#if 1 + expires = next_dir_update; + if (time_before(next_gc,expires)) @@ -20298,17 +23534,17 @@ + return 0; +} + -+static int yaffs_BackgroundStart(yaffs_Device *dev) ++static int yaffs_bg_start(yaffs_dev_t *dev) +{ + int retval = 0; -+ struct yaffs_LinuxContext *context = yaffs_DeviceToLC(dev); ++ struct yaffs_LinuxContext *context = yaffs_dev_to_lc(dev); + -+ if(dev->readOnly) ++ if(dev->read_only) + return -1; + + context->bgRunning = 1; + -+ context->bgThread = kthread_run(yaffs_BackgroundThread, ++ context->bgThread = kthread_run(yaffs_bg_thread_fn, + (void *)dev,"yaffs-bg-%d",context->mount_id); + + if(IS_ERR(context->bgThread)){ @@ -20319,9 +23555,9 @@ + return retval; +} + -+static void yaffs_BackgroundStop(yaffs_Device *dev) ++static void yaffs_bg_stop(yaffs_dev_t *dev) +{ -+ struct yaffs_LinuxContext *ctxt = yaffs_DeviceToLC(dev); ++ struct yaffs_LinuxContext *ctxt = yaffs_dev_to_lc(dev); + + ctxt->bgRunning = 0; + @@ -20331,17 +23567,17 @@ + } +} +#else -+static int yaffs_BackgroundThread(void *data) ++static int yaffs_bg_thread_fn(void *data) +{ + return 0; +} + -+static int yaffs_BackgroundStart(yaffs_Device *dev) ++static int yaffs_bg_start(yaffs_dev_t *dev) +{ + return 0; +} + -+static void yaffs_BackgroundStop(yaffs_Device *dev) ++static void yaffs_bg_stop(yaffs_dev_t *dev) +{ +} +#endif @@ -20389,8 +23625,8 @@ +static struct inode *yaffs_iget(struct super_block *sb, unsigned long ino) +{ + struct inode *inode; -+ yaffs_Object *obj; -+ yaffs_Device *dev = yaffs_SuperToDevice(sb); ++ yaffs_obj_t *obj; ++ yaffs_dev_t *dev = yaffs_SuperToDevice(sb); + + T(YAFFS_TRACE_OS, + (TSTR("yaffs_iget for %lu\n"), ino)); @@ -20406,13 +23642,13 @@ + * need to lock again. + */ + -+ yaffs_GrossLock(dev); ++ yaffs_gross_lock(dev); + -+ obj = yaffs_FindObjectByNumber(dev, inode->i_ino); ++ obj = yaffs_find_by_number(dev, inode->i_ino); + -+ yaffs_FillInodeFromObject(inode, obj); ++ yaffs_fill_inode_from_obj(inode, obj); + -+ yaffs_GrossUnlock(dev); ++ yaffs_gross_unlock(dev); + + unlock_new_inode(inode); + return inode; @@ -20427,21 +23663,21 @@ + * need to lock again. + */ + -+ yaffs_Object *obj; -+ yaffs_Device *dev = yaffs_SuperToDevice(inode->i_sb); ++ yaffs_obj_t *obj; ++ yaffs_dev_t *dev = yaffs_SuperToDevice(inode->i_sb); + + T(YAFFS_TRACE_OS, + (TSTR("yaffs_read_inode for %d\n"), (int)inode->i_ino)); + -+ if(current != yaffs_DeviceToLC(dev)->readdirProcess) -+ yaffs_GrossLock(dev); ++ if(current != yaffs_dev_to_lc(dev)->readdirProcess) ++ yaffs_gross_lock(dev); + -+ obj = yaffs_FindObjectByNumber(dev, inode->i_ino); ++ obj = yaffs_find_by_number(dev, inode->i_ino); + -+ yaffs_FillInodeFromObject(inode, obj); ++ yaffs_fill_inode_from_obj(inode, obj); + -+ if(current != yaffs_DeviceToLC(dev)->readdirProcess) -+ yaffs_GrossUnlock(dev); ++ if(current != yaffs_dev_to_lc(dev)->readdirProcess) ++ yaffs_gross_unlock(dev); +} + +#endif @@ -20451,35 +23687,35 @@ + +static void yaffs_put_super(struct super_block *sb) +{ -+ yaffs_Device *dev = yaffs_SuperToDevice(sb); ++ yaffs_dev_t *dev = yaffs_SuperToDevice(sb); + + T(YAFFS_TRACE_OS, (TSTR("yaffs_put_super\n"))); + + T(YAFFS_TRACE_OS | YAFFS_TRACE_BACKGROUND, + (TSTR("Shutting down yaffs background thread\n"))); -+ yaffs_BackgroundStop(dev); ++ yaffs_bg_stop(dev); + T(YAFFS_TRACE_OS | YAFFS_TRACE_BACKGROUND, + (TSTR("yaffs background thread shut down\n"))); + -+ yaffs_GrossLock(dev); ++ yaffs_gross_lock(dev); + -+ yaffs_FlushSuperBlock(sb,1); ++ yaffs_flush_super(sb,1); + -+ if (yaffs_DeviceToLC(dev)->putSuperFunc) -+ yaffs_DeviceToLC(dev)->putSuperFunc(sb); ++ if (yaffs_dev_to_lc(dev)->putSuperFunc) ++ yaffs_dev_to_lc(dev)->putSuperFunc(sb); + + -+ yaffs_Deinitialise(dev); ++ yaffs_deinitialise(dev); + -+ yaffs_GrossUnlock(dev); ++ yaffs_gross_unlock(dev); + + down(&yaffs_context_lock); -+ ylist_del_init(&(yaffs_DeviceToLC(dev)->contextList)); ++ ylist_del_init(&(yaffs_dev_to_lc(dev)->contextList)); + up(&yaffs_context_lock); + -+ if (yaffs_DeviceToLC(dev)->spareBuffer) { -+ YFREE(yaffs_DeviceToLC(dev)->spareBuffer); -+ yaffs_DeviceToLC(dev)->spareBuffer = NULL; ++ if (yaffs_dev_to_lc(dev)->spareBuffer) { ++ YFREE(yaffs_dev_to_lc(dev)->spareBuffer); ++ yaffs_dev_to_lc(dev)->spareBuffer = NULL; + } + + kfree(dev); @@ -20488,7 +23724,7 @@ + +static void yaffs_MTDPutSuper(struct super_block *sb) +{ -+ struct mtd_info *mtd = yaffs_DeviceToMtd(yaffs_SuperToDevice(sb)); ++ struct mtd_info *mtd = yaffs_dev_to_mtd(yaffs_SuperToDevice(sb)); + + if (mtd->sync) + mtd->sync(mtd); @@ -20497,11 +23733,11 @@ +} + + -+static void yaffs_MarkSuperBlockDirty(yaffs_Device *dev) ++static void yaffs_touch_super(yaffs_dev_t *dev) +{ -+ struct super_block *sb = yaffs_DeviceToLC(dev)->superBlock; ++ struct super_block *sb = yaffs_dev_to_lc(dev)->superBlock; + -+ T(YAFFS_TRACE_OS, (TSTR("yaffs_MarkSuperBlockDirty() sb = %p\n"), sb)); ++ T(YAFFS_TRACE_OS, (TSTR("yaffs_touch_super() sb = %p\n"), sb)); + if (sb) + sb->s_dirt = 1; +} @@ -20582,22 +23818,22 @@ + return error; +} + -+static struct super_block *yaffs_internal_read_super(int yaffsVersion, ++static struct super_block *yaffs_internal_read_super(int yaffs_version, + struct super_block *sb, + void *data, int silent) +{ + int nBlocks; + struct inode *inode = NULL; + struct dentry *root; -+ yaffs_Device *dev = 0; ++ yaffs_dev_t *dev = 0; + char devname_buf[BDEVNAME_SIZE + 1]; + struct mtd_info *mtd; + int err; + char *data_str = (char *)data; + struct yaffs_LinuxContext *context = NULL; -+ yaffs_DeviceParam *param; ++ yaffs_param_t *param; + -+ int readOnly = 0; ++ int read_only = 0; + + yaffs_options options; + @@ -20610,7 +23846,7 @@ + sb->s_op = &yaffs_super_ops; + sb->s_flags |= MS_NOATIME; + -+ readOnly =((sb->s_flags & MS_RDONLY) != 0); ++ read_only =((sb->s_flags & MS_RDONLY) != 0); + + +#ifdef YAFFS_COMPILE_EXPORTFS @@ -20627,7 +23863,7 @@ + printk(KERN_INFO "yaffs: dev is %d name is \"%s\" %s\n", + sb->s_dev, + yaffs_devname(sb, devname_buf), -+ readOnly ? "ro" : "rw"); ++ read_only ? "ro" : "rw"); + + if (!data_str) + data_str = ""; @@ -20646,7 +23882,7 @@ + sb->s_blocksize_bits = PAGE_CACHE_SHIFT; + + T(YAFFS_TRACE_OS, -+ (TSTR("yaffs_read_super: Using yaffs%d\n"), yaffsVersion)); ++ (TSTR("yaffs_read_super: Using yaffs%d\n"), yaffs_version)); + T(YAFFS_TRACE_OS, + (TSTR("yaffs_read_super: block size %d\n"), + (int)(sb->s_blocksize))); @@ -20694,22 +23930,22 @@ + +#ifdef CONFIG_YAFFS_AUTO_YAFFS2 + -+ if (yaffsVersion == 1 && WRITE_SIZE(mtd) >= 2048) { ++ if (yaffs_version == 1 && WRITE_SIZE(mtd) >= 2048) { + T(YAFFS_TRACE_ALWAYS, + (TSTR("yaffs: auto selecting yaffs2\n"))); -+ yaffsVersion = 2; ++ yaffs_version = 2; + } + + /* Added NCB 26/5/2006 for completeness */ -+ if (yaffsVersion == 2 && !options.inband_tags && WRITE_SIZE(mtd) == 512) { ++ if (yaffs_version == 2 && !options.inband_tags && WRITE_SIZE(mtd) == 512) { + T(YAFFS_TRACE_ALWAYS, + (TSTR("yaffs: auto selecting yaffs1\n"))); -+ yaffsVersion = 1; ++ yaffs_version = 1; + } + +#endif + -+ if (yaffsVersion == 2) { ++ if (yaffs_version == 2) { + /* Check for version 2 style functions */ + if (!mtd->erase || + !mtd->block_isbad || @@ -20764,16 +24000,16 @@ + + /* OK, so if we got here, we have an MTD that's NAND and looks + * like it has the right capabilities -+ * Set the yaffs_Device up for mtd ++ * Set the yaffs_dev_t up for mtd + */ + -+ if (!readOnly && !(mtd->flags & MTD_WRITEABLE)){ -+ readOnly = 1; ++ if (!read_only && !(mtd->flags & MTD_WRITEABLE)){ ++ read_only = 1; + printk(KERN_INFO "yaffs: mtd is read only, setting superblock read only"); + sb->s_flags |= MS_RDONLY; + } + -+ dev = kmalloc(sizeof(yaffs_Device), GFP_KERNEL); ++ dev = kmalloc(sizeof(yaffs_dev_t), GFP_KERNEL); + context = kmalloc(sizeof(struct yaffs_LinuxContext),GFP_KERNEL); + + if(!dev || !context ){ @@ -20789,19 +24025,19 @@ + /* Deep shit could not allocate device structure */ + T(YAFFS_TRACE_ALWAYS, + (TSTR("yaffs_read_super: Failed trying to allocate " -+ "yaffs_Device. \n"))); ++ "yaffs_dev_t. \n"))); + return NULL; + } -+ memset(dev, 0, sizeof(yaffs_Device)); ++ memset(dev, 0, sizeof(yaffs_dev_t)); + param = &(dev->param); + + memset(context,0,sizeof(struct yaffs_LinuxContext)); -+ dev->osContext = context; ++ dev->os_context = context; + YINIT_LIST_HEAD(&(context->contextList)); + context->dev = dev; + context->superBlock = sb; + -+ dev->readOnly = readOnly; ++ dev->read_only = read_only; + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) + sb->s_fs_info = dev; @@ -20809,117 +24045,117 @@ + sb->u.generic_sbp = dev; +#endif + -+ dev->driverContext = mtd; ++ dev->driver_context = mtd; + param->name = mtd->name; + + /* Set up the memory size parameters.... */ + + nBlocks = YCALCBLOCKS(mtd->size, (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK)); + -+ param->startBlock = 0; -+ param->endBlock = nBlocks - 1; -+ param->nChunksPerBlock = YAFFS_CHUNKS_PER_BLOCK; -+ param->totalBytesPerChunk = YAFFS_BYTES_PER_CHUNK; -+ param->nReservedBlocks = 5; -+ param->nShortOpCaches = (options.no_cache) ? 0 : 10; -+ param->inbandTags = options.inband_tags; ++ param->start_block = 0; ++ param->end_block = nBlocks - 1; ++ param->chunks_per_block = YAFFS_CHUNKS_PER_BLOCK; ++ param->total_bytes_per_chunk = YAFFS_BYTES_PER_CHUNK; ++ param->n_reserved_blocks = 5; ++ param->n_caches = (options.no_cache) ? 0 : 10; ++ param->inband_tags = options.inband_tags; + +#ifdef CONFIG_YAFFS_DISABLE_LAZY_LOAD -+ param->disableLazyLoad = 1; ++ param->disable_lazy_load = 1; +#endif +#ifdef CONFIG_YAFFS_XATTR -+ param->enableXattr = 1; ++ param->enable_xattr = 1; +#endif + if(options.lazy_loading_overridden) -+ param->disableLazyLoad = !options.lazy_loading_enabled; ++ param->disable_lazy_load = !options.lazy_loading_enabled; + +#ifdef CONFIG_YAFFS_DISABLE_TAGS_ECC -+ param->noTagsECC = 1; ++ param->no_tags_ecc = 1; +#endif + +#ifdef CONFIG_YAFFS_DISABLE_BACKGROUND +#else -+ param->deferDirectoryUpdate = 1; ++ param->defered_dir_update = 1; +#endif + + if(options.tags_ecc_overridden) -+ param->noTagsECC = !options.tags_ecc_on; ++ param->no_tags_ecc = !options.tags_ecc_on; + +#ifdef CONFIG_YAFFS_EMPTY_LOST_AND_FOUND -+ param->emptyLostAndFound = 1; ++ param->empty_lost_n_found = 1; +#endif + +#ifdef CONFIG_YAFFS_DISABLE_BLOCK_REFRESHING -+ param->refreshPeriod = 0; ++ param->refresh_period = 0; +#else -+ param->refreshPeriod = 500; ++ param->refresh_period = 500; +#endif + +#ifdef CONFIG_YAFFS__ALWAYS_CHECK_CHUNK_ERASED -+ param->alwaysCheckErased = 1; ++ param->always_check_erased = 1; +#endif + + if(options.empty_lost_and_found_overridden) -+ param->emptyLostAndFound = options.empty_lost_and_found; ++ param->empty_lost_n_found = options.empty_lost_and_found; + + /* ... and the functions. */ -+ if (yaffsVersion == 2) { -+ param->writeChunkWithTagsToNAND = ++ if (yaffs_version == 2) { ++ param->write_chunk_tags_fn = + nandmtd2_WriteChunkWithTagsToNAND; -+ param->readChunkWithTagsFromNAND = ++ param->read_chunk_tags_fn = + nandmtd2_ReadChunkWithTagsFromNAND; -+ param->markNANDBlockBad = nandmtd2_MarkNANDBlockBad; -+ param->queryNANDBlock = nandmtd2_QueryNANDBlock; -+ yaffs_DeviceToLC(dev)->spareBuffer = YMALLOC(mtd->oobsize); -+ param->isYaffs2 = 1; ++ param->bad_block_fn = nandmtd2_MarkNANDBlockBad; ++ param->query_block_fn = nandmtd2_QueryNANDBlock; ++ yaffs_dev_to_lc(dev)->spareBuffer = YMALLOC(mtd->oobsize); ++ param->is_yaffs2 = 1; +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17)) -+ param->totalBytesPerChunk = mtd->writesize; -+ param->nChunksPerBlock = mtd->erasesize / mtd->writesize; ++ param->total_bytes_per_chunk = mtd->writesize; ++ param->chunks_per_block = mtd->erasesize / mtd->writesize; +#else -+ param->totalBytesPerChunk = mtd->oobblock; -+ param->nChunksPerBlock = mtd->erasesize / mtd->oobblock; ++ param->total_bytes_per_chunk = mtd->oobblock; ++ param->chunks_per_block = mtd->erasesize / mtd->oobblock; +#endif + nBlocks = YCALCBLOCKS(mtd->size, mtd->erasesize); + -+ param->startBlock = 0; -+ param->endBlock = nBlocks - 1; ++ param->start_block = 0; ++ param->end_block = nBlocks - 1; + } else { +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17)) + /* use the MTD interface in yaffs_mtdif1.c */ -+ param->writeChunkWithTagsToNAND = ++ param->write_chunk_tags_fn = + nandmtd1_WriteChunkWithTagsToNAND; -+ param->readChunkWithTagsFromNAND = ++ param->read_chunk_tags_fn = + nandmtd1_ReadChunkWithTagsFromNAND; -+ param->markNANDBlockBad = nandmtd1_MarkNANDBlockBad; -+ param->queryNANDBlock = nandmtd1_QueryNANDBlock; ++ param->bad_block_fn = nandmtd1_MarkNANDBlockBad; ++ param->query_block_fn = nandmtd1_QueryNANDBlock; +#else -+ param->writeChunkToNAND = nandmtd_WriteChunkToNAND; -+ param->readChunkFromNAND = nandmtd_ReadChunkFromNAND; ++ param->write_chunk_fn = nandmtd_WriteChunkToNAND; ++ param->read_chunk_fn = nandmtd_ReadChunkFromNAND; +#endif -+ param->isYaffs2 = 0; ++ param->is_yaffs2 = 0; + } + /* ... and common functions */ -+ param->eraseBlockInNAND = nandmtd_EraseBlockInNAND; -+ param->initialiseNAND = nandmtd_InitialiseNAND; ++ param->erase_fn = nandmtd_EraseBlockInNAND; ++ param->initialise_flash_fn = nandmtd_InitialiseNAND; + -+ yaffs_DeviceToLC(dev)->putSuperFunc = yaffs_MTDPutSuper; ++ yaffs_dev_to_lc(dev)->putSuperFunc = yaffs_MTDPutSuper; + -+ param->markSuperBlockDirty = yaffs_MarkSuperBlockDirty; -+ param->gcControl = yaffs_gc_control_callback; ++ param->sb_dirty_fn = yaffs_touch_super; ++ param->gc_control = yaffs_gc_control_callback; + -+ yaffs_DeviceToLC(dev)->superBlock= sb; ++ yaffs_dev_to_lc(dev)->superBlock= sb; + + +#ifndef CONFIG_YAFFS_DOES_ECC -+ param->useNANDECC = 1; ++ param->use_nand_ecc = 1; +#endif + +#ifdef CONFIG_YAFFS_DISABLE_WIDE_TNODES -+ param->wideTnodesDisabled = 1; ++ param->wide_tnodes_disabled = 1; +#endif + -+ param->skipCheckpointRead = options.skip_checkpoint_read; -+ param->skipCheckpointWrite = options.skip_checkpoint_write; ++ param->skip_checkpt_rd = options.skip_checkpoint_read; ++ param->skip_checkpt_wr = options.skip_checkpoint_write; + + down(&yaffs_context_lock); + /* Get a mount id */ @@ -20934,37 +24170,37 @@ + } + context->mount_id = mount_id; + -+ ylist_add_tail(&(yaffs_DeviceToLC(dev)->contextList), &yaffs_context_list); ++ ylist_add_tail(&(yaffs_dev_to_lc(dev)->contextList), &yaffs_context_list); + up(&yaffs_context_lock); + + /* Directory search handling...*/ -+ YINIT_LIST_HEAD(&(yaffs_DeviceToLC(dev)->searchContexts)); -+ param->removeObjectCallback = yaffs_RemoveObjectCallback; ++ YINIT_LIST_HEAD(&(yaffs_dev_to_lc(dev)->searchContexts)); ++ param->remove_obj_fn = yaffs_remove_obj_callback; + -+ init_MUTEX(&(yaffs_DeviceToLC(dev)->grossLock)); ++ init_MUTEX(&(yaffs_dev_to_lc(dev)->grossLock)); + -+ yaffs_GrossLock(dev); ++ yaffs_gross_lock(dev); + -+ err = yaffs_GutsInitialise(dev); ++ err = yaffs_guts_initialise(dev); + + T(YAFFS_TRACE_OS, + (TSTR("yaffs_read_super: guts initialised %s\n"), + (err == YAFFS_OK) ? "OK" : "FAILED")); + + if(err == YAFFS_OK) -+ yaffs_BackgroundStart(dev); ++ yaffs_bg_start(dev); + + if(!context->bgThread) -+ param->deferDirectoryUpdate = 0; ++ param->defered_dir_update = 0; + + + /* Release lock before yaffs_get_inode() */ -+ yaffs_GrossUnlock(dev); ++ yaffs_gross_unlock(dev); + + /* Create root inode */ + if (err == YAFFS_OK) + inode = yaffs_get_inode(sb, S_IFDIR | 0755, 0, -+ yaffs_Root(dev)); ++ yaffs_root(dev)); + + if (!inode) + return NULL; @@ -20983,10 +24219,10 @@ + return NULL; + } + sb->s_root = root; -+ sb->s_dirt = !dev->isCheckpointed; ++ sb->s_dirt = !dev->is_checkpointed; + T(YAFFS_TRACE_ALWAYS, -+ (TSTR("yaffs_read_super: isCheckpointed %d\n"), -+ dev->isCheckpointed)); ++ (TSTR("yaffs_read_super: is_checkpointed %d\n"), ++ dev->is_checkpointed)); + + T(YAFFS_TRACE_OS, (TSTR("yaffs_read_super: done\n"))); + return sb; @@ -21090,21 +24326,21 @@ +static struct proc_dir_entry *my_proc_entry; +static struct proc_dir_entry *debug_proc_entry; + -+static char *yaffs_dump_dev_part0(char *buf, yaffs_Device * dev) ++static char *yaffs_dump_dev_part0(char *buf, yaffs_dev_t * dev) +{ -+ buf += sprintf(buf, "startBlock......... %d\n", dev->param.startBlock); -+ buf += sprintf(buf, "endBlock........... %d\n", dev->param.endBlock); -+ buf += sprintf(buf, "totalBytesPerChunk. %d\n", dev->param.totalBytesPerChunk); -+ buf += sprintf(buf, "useNANDECC......... %d\n", dev->param.useNANDECC); -+ buf += sprintf(buf, "noTagsECC.......... %d\n", dev->param.noTagsECC); -+ buf += sprintf(buf, "isYaffs2........... %d\n", dev->param.isYaffs2); -+ buf += sprintf(buf, "inbandTags......... %d\n", dev->param.inbandTags); -+ buf += sprintf(buf, "emptyLostAndFound.. %d\n", dev->param.emptyLostAndFound); -+ buf += sprintf(buf, "disableLazyLoad.... %d\n", dev->param.disableLazyLoad); -+ buf += sprintf(buf, "refreshPeriod...... %d\n", dev->param.refreshPeriod); -+ buf += sprintf(buf, "nShortOpCaches..... %d\n", dev->param.nShortOpCaches); -+ buf += sprintf(buf, "nReservedBlocks.... %d\n", dev->param.nReservedBlocks); -+ buf += sprintf(buf, "alwaysCheckErased.. %d\n", dev->param.alwaysCheckErased); ++ buf += sprintf(buf, "start_block.......... %d\n", dev->param.start_block); ++ buf += sprintf(buf, "end_block............ %d\n", dev->param.end_block); ++ buf += sprintf(buf, "total_bytes_per_chunk %d\n", dev->param.total_bytes_per_chunk); ++ buf += sprintf(buf, "use_nand_ecc......... %d\n", dev->param.use_nand_ecc); ++ buf += sprintf(buf, "no_tags_ecc.......... %d\n", dev->param.no_tags_ecc); ++ buf += sprintf(buf, "is_yaffs2............ %d\n", dev->param.is_yaffs2); ++ buf += sprintf(buf, "inband_tags.......... %d\n", dev->param.inband_tags); ++ buf += sprintf(buf, "empty_lost_n_found... %d\n", dev->param.empty_lost_n_found); ++ buf += sprintf(buf, "disable_lazy_load.... %d\n", dev->param.disable_lazy_load); ++ buf += sprintf(buf, "refresh_period....... %d\n", dev->param.refresh_period); ++ buf += sprintf(buf, "n_caches............. %d\n", dev->param.n_caches); ++ buf += sprintf(buf, "n_reserved_blocks.... %d\n", dev->param.n_reserved_blocks); ++ buf += sprintf(buf, "always_check_erased.. %d\n", dev->param.always_check_erased); + + buf += sprintf(buf, "\n"); + @@ -21112,39 +24348,38 @@ +} + + -+static char *yaffs_dump_dev_part1(char *buf, yaffs_Device * dev) ++static char *yaffs_dump_dev_part1(char *buf, yaffs_dev_t * dev) +{ -+ buf += sprintf(buf, "nDataBytesPerChunk. %d\n", dev->nDataBytesPerChunk); -+ buf += sprintf(buf, "chunkGroupBits..... %d\n", dev->chunkGroupBits); -+ buf += sprintf(buf, "chunkGroupSize..... %d\n", dev->chunkGroupSize); -+ buf += sprintf(buf, "nErasedBlocks...... %d\n", dev->nErasedBlocks); -+ buf += sprintf(buf, "blocksInCheckpoint. %d\n", dev->blocksInCheckpoint); ++ buf += sprintf(buf, "data_bytes_per_chunk. %d\n", dev->data_bytes_per_chunk); ++ buf += sprintf(buf, "chunk_grp_bits....... %d\n", dev->chunk_grp_bits); ++ buf += sprintf(buf, "chunk_grp_size....... %d\n", dev->chunk_grp_size); ++ buf += sprintf(buf, "n_erased_blocks...... %d\n", dev->n_erased_blocks); ++ buf += sprintf(buf, "blocks_in_checkpt.... %d\n", dev->blocks_in_checkpt); + buf += sprintf(buf, "\n"); -+ buf += sprintf(buf, "nTnodes............ %d\n", dev->nTnodes); -+ buf += sprintf(buf, "nObjects........... %d\n", dev->nObjects); -+ buf += sprintf(buf, "nFreeChunks........ %d\n", dev->nFreeChunks); ++ buf += sprintf(buf, "n_tnodes............. %d\n", dev->n_tnodes); ++ buf += sprintf(buf, "n_obj................ %d\n", dev->n_obj); ++ buf += sprintf(buf, "n_free_chunks........ %d\n", dev->n_free_chunks); + buf += sprintf(buf, "\n"); -+ buf += sprintf(buf, "nPageWrites........ %u\n", dev->nPageWrites); -+ buf += sprintf(buf, "nPageReads......... %u\n", dev->nPageReads); -+ buf += sprintf(buf, "nBlockErasures..... %u\n", dev->nBlockErasures); -+ buf += sprintf(buf, "nGCCopies.......... %u\n", dev->nGCCopies); -+ buf += sprintf(buf, "allGCs............. %u\n", dev->allGCs); -+ buf += sprintf(buf, "passiveGCs......... %u\n", dev->passiveGCs); -+ buf += sprintf(buf, "oldestDirtyGCs..... %u\n", dev->oldestDirtyGCs); -+ buf += sprintf(buf, "nGCBlocks.......... %u\n", dev->nGCBlocks); -+ buf += sprintf(buf, "backgroundGCs...... %u\n", dev->backgroundGCs); -+ buf += sprintf(buf, "nRetriedWrites..... %u\n", dev->nRetriedWrites); -+ buf += sprintf(buf, "nRetireBlocks...... %u\n", dev->nRetiredBlocks); -+ buf += sprintf(buf, "eccFixed........... %u\n", dev->eccFixed); -+ buf += sprintf(buf, "eccUnfixed......... %u\n", dev->eccUnfixed); -+ buf += sprintf(buf, "tagsEccFixed....... %u\n", dev->tagsEccFixed); -+ buf += sprintf(buf, "tagsEccUnfixed..... %u\n", dev->tagsEccUnfixed); -+ buf += sprintf(buf, "cacheHits.......... %u\n", dev->cacheHits); -+ buf += sprintf(buf, "nDeletedFiles...... %u\n", dev->nDeletedFiles); -+ buf += sprintf(buf, "nUnlinkedFiles..... %u\n", dev->nUnlinkedFiles); -+ buf += sprintf(buf, "refreshCount....... %u\n", dev->refreshCount); -+ buf += -+ sprintf(buf, "nBackgroudDeletions %u\n", dev->nBackgroundDeletions); ++ buf += sprintf(buf, "n_page_writes........ %u\n", dev->n_page_writes); ++ buf += sprintf(buf, "n_page_reads......... %u\n", dev->n_page_reads); ++ buf += sprintf(buf, "n_erasures........... %u\n", dev->n_erasures); ++ buf += sprintf(buf, "n_gc_copies.......... %u\n", dev->n_gc_copies); ++ buf += sprintf(buf, "all_gcs.............. %u\n", dev->all_gcs); ++ buf += sprintf(buf, "passive_gc_count..... %u\n", dev->passive_gc_count); ++ buf += sprintf(buf, "oldest_dirty_gc_count %u\n", dev->oldest_dirty_gc_count); ++ buf += sprintf(buf, "n_gc_blocks.......... %u\n", dev->n_gc_blocks); ++ buf += sprintf(buf, "bg_gcs............... %u\n", dev->bg_gcs); ++ buf += sprintf(buf, "n_retired_writes..... %u\n", dev->n_retired_writes); ++ buf += sprintf(buf, "nRetireBlocks........ %u\n", dev->n_retired_blocks); ++ buf += sprintf(buf, "n_ecc_fixed.......... %u\n", dev->n_ecc_fixed); ++ buf += sprintf(buf, "n_ecc_unfixed........ %u\n", dev->n_ecc_unfixed); ++ buf += sprintf(buf, "n_tags_ecc_fixed..... %u\n", dev->n_tags_ecc_fixed); ++ buf += sprintf(buf, "n_tags_ecc_unfixed... %u\n", dev->n_tags_ecc_unfixed); ++ buf += sprintf(buf, "cache_hits........... %u\n", dev->cache_hits); ++ buf += sprintf(buf, "n_deleted_files...... %u\n", dev->n_deleted_files); ++ buf += sprintf(buf, "n_unlinked_files..... %u\n", dev->n_unlinked_files); ++ buf += sprintf(buf, "refresh_count........ %u\n", dev->refresh_count); ++ buf += sprintf(buf, "n_bg_deletions....... %u\n", dev->n_bg_deletions); + + return buf; +} @@ -21159,7 +24394,7 @@ + int n = 0; + + /* Get proc_file_read() to step 'offset' by one on each sucessive call. -+ * We use 'offset' (*ppos) to indicate where we are in devList. ++ * We use 'offset' (*ppos) to indicate where we are in dev_list. + * This also assumes the user has posted a read buffer large + * enough to hold the complete output; but that's life in /proc. + */ @@ -21179,7 +24414,7 @@ + /* Locate and print the Nth entry. Order N-squared but N is small. */ + ylist_for_each(item, &yaffs_context_list) { + struct yaffs_LinuxContext *dc = ylist_entry(item, struct yaffs_LinuxContext, contextList); -+ yaffs_Device *dev = dc->dev; ++ yaffs_dev_t *dev = dc->dev; + + if (n < (step & ~1)) { + n+=2; @@ -21212,16 +24447,16 @@ + /* Locate and print the Nth entry. Order N-squared but N is small. */ + ylist_for_each(item, &yaffs_context_list) { + struct yaffs_LinuxContext *dc = ylist_entry(item, struct yaffs_LinuxContext, contextList); -+ yaffs_Device *dev = dc->dev; ++ yaffs_dev_t *dev = dc->dev; + + int erasedChunks; + -+ erasedChunks = dev->nErasedBlocks * dev->param.nChunksPerBlock; ++ erasedChunks = dev->n_erased_blocks * dev->param.chunks_per_block; + + buf += sprintf(buf,"%d, %d, %d, %u, %u, %u, %u\n", -+ n, dev->nFreeChunks, erasedChunks, -+ dev->backgroundGCs, dev->oldestDirtyGCs, -+ dev->nObjects, dev->nTnodes); ++ n, dev->n_free_chunks, erasedChunks, ++ dev->bg_gcs, dev->oldest_dirty_gc_count, ++ dev->n_obj, dev->n_tnodes); + } + up(&yaffs_context_lock); + @@ -21285,7 +24520,7 @@ + int add, len = 0; + int pos = 0; + -+ rg = yaffs_traceMask; ++ rg = yaffs_trace_mask; + + while (!done && (pos < count)) { + done = 1; @@ -21349,9 +24584,9 @@ + } + } + -+ yaffs_traceMask = rg | YAFFS_TRACE_ALWAYS; ++ yaffs_trace_mask = rg | YAFFS_TRACE_ALWAYS; + -+ printk(KERN_DEBUG "new trace = 0x%08X\n", yaffs_traceMask); ++ printk(KERN_DEBUG "new trace = 0x%08X\n", yaffs_trace_mask); + + if (rg & YAFFS_TRACE_ALWAYS) { + for (i = 0; mask_flags[i].mask_name != NULL; i++) { @@ -21480,8 +24715,9 @@ +MODULE_DESCRIPTION("YAFFS2 - a NAND specific flash file system"); +MODULE_AUTHOR("Charles Manning, Aleph One Ltd., 2002-2010"); +MODULE_LICENSE("GPL"); ---- /dev/null -+++ b/fs/yaffs2/yaffs_yaffs1.c +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_yaffs1.c linux-2.6.36-rc8.new/fs/yaffs2/yaffs_yaffs1.c +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_yaffs1.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_yaffs1.c 2010-10-20 13:28:16.039000295 +0300 @@ -0,0 +1,465 @@ +/* + * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. @@ -21503,9 +24739,9 @@ +#include "yaffs_nand.h" + + -+int yaffs1_Scan(yaffs_Device *dev) ++int yaffs1_scan(yaffs_dev_t *dev) +{ -+ yaffs_ExtendedTags tags; ++ yaffs_ext_tags tags; + int blk; + int blockIterator; + int startIterator; @@ -21515,17 +24751,17 @@ + int chunk; + int c; + int deleted; -+ yaffs_BlockState state; -+ yaffs_Object *hardList = NULL; -+ yaffs_BlockInfo *bi; -+ __u32 sequenceNumber; -+ yaffs_ObjectHeader *oh; -+ yaffs_Object *in; -+ yaffs_Object *parent; ++ yaffs_block_state_t state; ++ yaffs_obj_t *hard_list = NULL; ++ yaffs_block_info_t *bi; ++ __u32 seq_number; ++ yaffs_obj_header *oh; ++ yaffs_obj_t *in; ++ yaffs_obj_t *parent; + + int alloc_failed = 0; + -+ struct yaffs_ShadowFixerStruct *shadowFixerList = NULL; ++ struct yaffs_shadow_fixer_s *shadowFixerList = NULL; + + + __u8 *chunkData; @@ -21533,31 +24769,31 @@ + + + T(YAFFS_TRACE_SCAN, -+ (TSTR("yaffs1_Scan starts intstartblk %d intendblk %d..." TENDSTR), -+ dev->internalStartBlock, dev->internalEndBlock)); ++ (TSTR("yaffs1_scan starts intstartblk %d intendblk %d..." TENDSTR), ++ dev->internal_start_block, dev->internal_end_block)); + -+ chunkData = yaffs_GetTempBuffer(dev, __LINE__); ++ chunkData = yaffs_get_temp_buffer(dev, __LINE__); + -+ dev->sequenceNumber = YAFFS_LOWEST_SEQUENCE_NUMBER; ++ dev->seq_number = YAFFS_LOWEST_SEQUENCE_NUMBER; + + /* Scan all the blocks to determine their state */ -+ bi = dev->blockInfo; -+ for (blk = dev->internalStartBlock; blk <= dev->internalEndBlock; blk++) { -+ yaffs_ClearChunkBits(dev, blk); -+ bi->pagesInUse = 0; -+ bi->softDeletions = 0; ++ bi = dev->block_info; ++ for (blk = dev->internal_start_block; blk <= dev->internal_end_block; blk++) { ++ yaffs_clear_chunk_bits(dev, blk); ++ bi->pages_in_use = 0; ++ bi->soft_del_pages = 0; + -+ yaffs_QueryInitialBlockState(dev, blk, &state, &sequenceNumber); ++ yaffs_query_init_block_state(dev, blk, &state, &seq_number); + -+ bi->blockState = state; -+ bi->sequenceNumber = sequenceNumber; ++ bi->block_state = state; ++ bi->seq_number = seq_number; + -+ if (bi->sequenceNumber == YAFFS_SEQUENCE_BAD_BLOCK) -+ bi->blockState = state = YAFFS_BLOCK_STATE_DEAD; ++ if (bi->seq_number == YAFFS_SEQUENCE_BAD_BLOCK) ++ bi->block_state = state = YAFFS_BLOCK_STATE_DEAD; + + T(YAFFS_TRACE_SCAN_DEBUG, + (TSTR("Block scanning block %d state %d seq %d" TENDSTR), blk, -+ state, sequenceNumber)); ++ state, seq_number)); + + if (state == YAFFS_BLOCK_STATE_DEAD) { + T(YAFFS_TRACE_BAD_BLOCKS, @@ -21565,14 +24801,14 @@ + } else if (state == YAFFS_BLOCK_STATE_EMPTY) { + T(YAFFS_TRACE_SCAN_DEBUG, + (TSTR("Block empty " TENDSTR))); -+ dev->nErasedBlocks++; -+ dev->nFreeChunks += dev->param.nChunksPerBlock; ++ dev->n_erased_blocks++; ++ dev->n_free_chunks += dev->param.chunks_per_block; + } + bi++; + } + -+ startIterator = dev->internalStartBlock; -+ endIterator = dev->internalEndBlock; ++ startIterator = dev->internal_start_block; ++ endIterator = dev->internal_end_block; + + /* For each block.... */ + for (blockIterator = startIterator; !alloc_failed && blockIterator <= endIterator; @@ -21584,30 +24820,30 @@ + + blk = blockIterator; + -+ bi = yaffs_GetBlockInfo(dev, blk); -+ state = bi->blockState; ++ bi = yaffs_get_block_info(dev, blk); ++ state = bi->block_state; + + deleted = 0; + + /* For each chunk in each block that needs scanning....*/ -+ for (c = 0; !alloc_failed && c < dev->param.nChunksPerBlock && ++ for (c = 0; !alloc_failed && c < dev->param.chunks_per_block && + state == YAFFS_BLOCK_STATE_NEEDS_SCANNING; c++) { + /* Read the tags and decide what to do */ -+ chunk = blk * dev->param.nChunksPerBlock + c; ++ chunk = blk * dev->param.chunks_per_block + c; + -+ result = yaffs_ReadChunkWithTagsFromNAND(dev, chunk, NULL, ++ result = yaffs_rd_chunk_tags_nand(dev, chunk, NULL, + &tags); + + /* Let's have a good look at this chunk... */ + -+ if (tags.eccResult == YAFFS_ECC_RESULT_UNFIXED || tags.chunkDeleted) { ++ if (tags.ecc_result == YAFFS_ECC_RESULT_UNFIXED || tags.is_deleted) { + /* YAFFS1 only... + * A deleted chunk + */ + deleted++; -+ dev->nFreeChunks++; ++ dev->n_free_chunks++; + /*T((" %d %d deleted\n",blk,c)); */ -+ } else if (!tags.chunkUsed) { ++ } else if (!tags.chunk_used) { + /* An unassigned chunk in the block + * This means that either the block is empty or + * this is the one being allocated from @@ -21616,7 +24852,7 @@ + if (c == 0) { + /* We're looking at the first chunk in the block so the block is unused */ + state = YAFFS_BLOCK_STATE_EMPTY; -+ dev->nErasedBlocks++; ++ dev->n_erased_blocks++; + } else { + /* this is the block being allocated from */ + T(YAFFS_TRACE_SCAN, @@ -21624,102 +24860,102 @@ + (" Allocating from %d %d" TENDSTR), + blk, c)); + state = YAFFS_BLOCK_STATE_ALLOCATING; -+ dev->allocationBlock = blk; -+ dev->allocationPage = c; -+ dev->allocationBlockFinder = blk; ++ dev->alloc_block = blk; ++ dev->alloc_page = c; ++ dev->alloc_block_finder = blk; + /* Set block finder here to encourage the allocator to go forth from here. */ + + } + -+ dev->nFreeChunks += (dev->param.nChunksPerBlock - c); -+ } else if (tags.chunkId > 0) { -+ /* chunkId > 0 so it is a data chunk... */ ++ dev->n_free_chunks += (dev->param.chunks_per_block - c); ++ } else if (tags.chunk_id > 0) { ++ /* chunk_id > 0 so it is a data chunk... */ + unsigned int endpos; + -+ yaffs_SetChunkBit(dev, blk, c); -+ bi->pagesInUse++; ++ yaffs_set_chunk_bit(dev, blk, c); ++ bi->pages_in_use++; + -+ in = yaffs_FindOrCreateObjectByNumber(dev, ++ in = yaffs_find_or_create_by_number(dev, + tags. -+ objectId, ++ obj_id, + YAFFS_OBJECT_TYPE_FILE); + /* PutChunkIntoFile checks for a clash (two data chunks with -+ * the same chunkId). ++ * the same chunk_id). + */ + + if (!in) + alloc_failed = 1; + + if (in) { -+ if (!yaffs_PutChunkIntoFile(in, tags.chunkId, chunk, 1)) ++ if (!yaffs_put_chunk_in_file(in, tags.chunk_id, chunk, 1)) + alloc_failed = 1; + } + + endpos = -+ (tags.chunkId - 1) * dev->nDataBytesPerChunk + -+ tags.byteCount; ++ (tags.chunk_id - 1) * dev->data_bytes_per_chunk + ++ tags.n_bytes; + if (in && -+ in->variantType == YAFFS_OBJECT_TYPE_FILE -+ && in->variant.fileVariant.scannedFileSize < ++ in->variant_type == YAFFS_OBJECT_TYPE_FILE ++ && in->variant.file_variant.scanned_size < + endpos) { -+ in->variant.fileVariant. -+ scannedFileSize = endpos; -+ if (!dev->param.useHeaderFileSize) { -+ in->variant.fileVariant. -+ fileSize = -+ in->variant.fileVariant. -+ scannedFileSize; ++ in->variant.file_variant. ++ scanned_size = endpos; ++ if (!dev->param.use_header_file_size) { ++ in->variant.file_variant. ++ file_size = ++ in->variant.file_variant. ++ scanned_size; + } + + } -+ /* T((" %d %d data %d %d\n",blk,c,tags.objectId,tags.chunkId)); */ ++ /* T((" %d %d data %d %d\n",blk,c,tags.obj_id,tags.chunk_id)); */ + } else { -+ /* chunkId == 0, so it is an ObjectHeader. ++ /* chunk_id == 0, so it is an ObjectHeader. + * Thus, we read in the object header and make the object + */ -+ yaffs_SetChunkBit(dev, blk, c); -+ bi->pagesInUse++; ++ yaffs_set_chunk_bit(dev, blk, c); ++ bi->pages_in_use++; + -+ result = yaffs_ReadChunkWithTagsFromNAND(dev, chunk, ++ result = yaffs_rd_chunk_tags_nand(dev, chunk, + chunkData, + NULL); + -+ oh = (yaffs_ObjectHeader *) chunkData; ++ oh = (yaffs_obj_header *) chunkData; + -+ in = yaffs_FindObjectByNumber(dev, -+ tags.objectId); -+ if (in && in->variantType != oh->type) { ++ in = yaffs_find_by_number(dev, ++ tags.obj_id); ++ if (in && in->variant_type != oh->type) { + /* This should not happen, but somehow -+ * Wev'e ended up with an objectId that has been reused but not yet ++ * Wev'e ended up with an obj_id that has been reused but not yet + * deleted, and worse still it has changed type. Delete the old object. + */ + -+ yaffs_DeleteObject(in); ++ yaffs_del_obj(in); + + in = 0; + } + -+ in = yaffs_FindOrCreateObjectByNumber(dev, ++ in = yaffs_find_or_create_by_number(dev, + tags. -+ objectId, ++ obj_id, + oh->type); + + if (!in) + alloc_failed = 1; + -+ if (in && oh->shadowsObject > 0) { ++ if (in && oh->shadows_obj > 0) { + -+ struct yaffs_ShadowFixerStruct *fixer; -+ fixer = YMALLOC(sizeof(struct yaffs_ShadowFixerStruct)); ++ struct yaffs_shadow_fixer_s *fixer; ++ fixer = YMALLOC(sizeof(struct yaffs_shadow_fixer_s)); + if (fixer) { + fixer->next = shadowFixerList; + shadowFixerList = fixer; -+ fixer->objectId = tags.objectId; -+ fixer->shadowedId = oh->shadowsObject; ++ fixer->obj_id = tags.obj_id; ++ fixer->shadowed_id = oh->shadows_obj; + T(YAFFS_TRACE_SCAN, + (TSTR + (" Shadow fixer: %d shadows %d" TENDSTR), -+ fixer->objectId, fixer->shadowedId)); ++ fixer->obj_id, fixer->shadowed_id)); + + } + @@ -21729,27 +24965,27 @@ + /* We have already filled this one. We have a duplicate and need to resolve it. */ + + unsigned existingSerial = in->serial; -+ unsigned newSerial = tags.serialNumber; ++ unsigned newSerial = tags.serial_number; + + if (((existingSerial + 1) & 3) == newSerial) { + /* Use new one - destroy the exisiting one */ -+ yaffs_DeleteChunk(dev, -+ in->hdrChunk, ++ yaffs_chunk_del(dev, ++ in->hdr_chunk, + 1, __LINE__); + in->valid = 0; + } else { + /* Use existing - destroy this one. */ -+ yaffs_DeleteChunk(dev, chunk, 1, ++ yaffs_chunk_del(dev, chunk, 1, + __LINE__); + } + } + + if (in && !in->valid && -+ (tags.objectId == YAFFS_OBJECTID_ROOT || -+ tags.objectId == YAFFS_OBJECTID_LOSTNFOUND)) { ++ (tags.obj_id == YAFFS_OBJECTID_ROOT || ++ tags.obj_id == YAFFS_OBJECTID_LOSTNFOUND)) { + /* We only load some info, don't fiddle with directory structure */ + in->valid = 1; -+ in->variantType = oh->type; ++ in->variant_type = oh->type; + + in->yst_mode = oh->yst_mode; +#ifdef CONFIG_YAFFS_WINCE @@ -21767,14 +25003,14 @@ + in->yst_ctime = oh->yst_ctime; + in->yst_rdev = oh->yst_rdev; +#endif -+ in->hdrChunk = chunk; -+ in->serial = tags.serialNumber; ++ in->hdr_chunk = chunk; ++ in->serial = tags.serial_number; + + } else if (in && !in->valid) { + /* we need to load this info */ + + in->valid = 1; -+ in->variantType = oh->type; ++ in->variant_type = oh->type; + + in->yst_mode = oh->yst_mode; +#ifdef CONFIG_YAFFS_WINCE @@ -21792,10 +25028,10 @@ + in->yst_ctime = oh->yst_ctime; + in->yst_rdev = oh->yst_rdev; +#endif -+ in->hdrChunk = chunk; -+ in->serial = tags.serialNumber; ++ in->hdr_chunk = chunk; ++ in->serial = tags.serial_number; + -+ yaffs_SetObjectNameFromOH(in, oh); ++ yaffs_set_obj_name_from_oh(in, oh); + in->dirty = 0; + + /* directory stuff... @@ -21803,20 +25039,20 @@ + */ + + parent = -+ yaffs_FindOrCreateObjectByNumber -+ (dev, oh->parentObjectId, ++ yaffs_find_or_create_by_number ++ (dev, oh->parent_obj_id, + YAFFS_OBJECT_TYPE_DIRECTORY); + if (!parent) + alloc_failed = 1; -+ if (parent && parent->variantType == ++ if (parent && parent->variant_type == + YAFFS_OBJECT_TYPE_UNKNOWN) { + /* Set up as a directory */ -+ parent->variantType = ++ parent->variant_type = + YAFFS_OBJECT_TYPE_DIRECTORY; + YINIT_LIST_HEAD(&parent->variant. -+ directoryVariant. ++ dir_variant. + children); -+ } else if (!parent || parent->variantType != ++ } else if (!parent || parent->variant_type != + YAFFS_OBJECT_TYPE_DIRECTORY) { + /* Hoosterman, another problem.... + * We're trying to use a non-directory as a directory @@ -21826,15 +25062,15 @@ + (TSTR + ("yaffs tragedy: attempting to use non-directory as a directory in scan. Put in lost+found." + TENDSTR))); -+ parent = dev->lostNFoundDir; ++ parent = dev->lost_n_found; + } + -+ yaffs_AddObjectToDirectory(parent, in); ++ yaffs_add_obj_to_dir(parent, in); + -+ if (0 && (parent == dev->deletedDir || -+ parent == dev->unlinkedDir)) { ++ if (0 && (parent == dev->del_dir || ++ parent == dev->unlinked_dir)) { + in->deleted = 1; /* If it is unlinked at start up then it wants deleting */ -+ dev->nDeletedFiles++; ++ dev->n_deleted_files++; + } + /* Note re hardlinks. + * Since we might scan a hardlink before its equivalent object is scanned @@ -21843,26 +25079,26 @@ + * list and fix up all the chains. + */ + -+ switch (in->variantType) { ++ switch (in->variant_type) { + case YAFFS_OBJECT_TYPE_UNKNOWN: + /* Todo got a problem */ + break; + case YAFFS_OBJECT_TYPE_FILE: -+ if (dev->param.useHeaderFileSize) ++ if (dev->param.use_header_file_size) + -+ in->variant.fileVariant. -+ fileSize = -+ oh->fileSize; ++ in->variant.file_variant. ++ file_size = ++ oh->file_size; + + break; + case YAFFS_OBJECT_TYPE_HARDLINK: -+ in->variant.hardLinkVariant. -+ equivalentObjectId = -+ oh->equivalentObjectId; -+ in->hardLinks.next = ++ in->variant.hardlink_variant. ++ equiv_id = ++ oh->equiv_id; ++ in->hard_links.next = + (struct ylist_head *) -+ hardList; -+ hardList = in; ++ hard_list; ++ hard_list = in; + break; + case YAFFS_OBJECT_TYPE_DIRECTORY: + /* Do nothing */ @@ -21871,9 +25107,9 @@ + /* Do nothing */ + break; + case YAFFS_OBJECT_TYPE_SYMLINK: -+ in->variant.symLinkVariant.alias = -+ yaffs_CloneString(oh->alias); -+ if (!in->variant.symLinkVariant.alias) ++ in->variant.symlink_variant.alias = ++ yaffs_clone_str(oh->alias); ++ if (!in->variant.symlink_variant.alias) + alloc_failed = 1; + break; + } @@ -21890,16 +25126,16 @@ + if (state == YAFFS_BLOCK_STATE_ALLOCATING) { + /* If the block was partially allocated then treat it as fully allocated.*/ + state = YAFFS_BLOCK_STATE_FULL; -+ dev->allocationBlock = -1; ++ dev->alloc_block = -1; + } + -+ bi->blockState = state; ++ bi->block_state = state; + + /* Now let's see if it was dirty */ -+ if (bi->pagesInUse == 0 && -+ !bi->hasShrinkHeader && -+ bi->blockState == YAFFS_BLOCK_STATE_FULL) { -+ yaffs_BlockBecameDirty(dev, blk); ++ if (bi->pages_in_use == 0 && ++ !bi->has_shrink_hdr && ++ bi->block_state == YAFFS_BLOCK_STATE_FULL) { ++ yaffs_block_became_dirty(dev, blk); + } + + } @@ -21911,12 +25147,12 @@ + * hardlinks. + */ + -+ yaffs_HardlinkFixup(dev, hardList); ++ yaffs_link_fixup(dev, hard_list); + + /* Fix up any shadowed objects */ + { -+ struct yaffs_ShadowFixerStruct *fixer; -+ yaffs_Object *obj; ++ struct yaffs_shadow_fixer_s *fixer; ++ yaffs_obj_t *obj; + + while (shadowFixerList) { + fixer = shadowFixerList; @@ -21924,32 +25160,33 @@ + /* Complete the rename transaction by deleting the shadowed object + * then setting the object header to unshadowed. + */ -+ obj = yaffs_FindObjectByNumber(dev, fixer->shadowedId); ++ obj = yaffs_find_by_number(dev, fixer->shadowed_id); + if (obj) -+ yaffs_DeleteObject(obj); ++ yaffs_del_obj(obj); + -+ obj = yaffs_FindObjectByNumber(dev, fixer->objectId); ++ obj = yaffs_find_by_number(dev, fixer->obj_id); + + if (obj) -+ yaffs_UpdateObjectHeader(obj, NULL, 1, 0, 0, NULL); ++ yaffs_update_oh(obj, NULL, 1, 0, 0, NULL); + + YFREE(fixer); + } + } + -+ yaffs_ReleaseTempBuffer(dev, chunkData, __LINE__); ++ yaffs_release_temp_buffer(dev, chunkData, __LINE__); + + if (alloc_failed) + return YAFFS_FAIL; + -+ T(YAFFS_TRACE_SCAN, (TSTR("yaffs1_Scan ends" TENDSTR))); ++ T(YAFFS_TRACE_SCAN, (TSTR("yaffs1_scan ends" TENDSTR))); + + + return YAFFS_OK; +} + ---- /dev/null -+++ b/fs/yaffs2/yaffs_yaffs1.h +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_yaffs1.h linux-2.6.36-rc8.new/fs/yaffs2/yaffs_yaffs1.h +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_yaffs1.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_yaffs1.h 2010-10-20 13:28:16.064000294 +0300 @@ -0,0 +1,22 @@ +/* + * YAFFS: Yet another Flash File System . A NAND-flash specific file system. @@ -21970,11 +25207,12 @@ +#define __YAFFS_YAFFS1_H__ + +#include "yaffs_guts.h" -+int yaffs1_Scan(yaffs_Device *dev); ++int yaffs1_scan(yaffs_dev_t *dev); + +#endif ---- /dev/null -+++ b/fs/yaffs2/yaffs_yaffs2.c +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_yaffs2.c linux-2.6.36-rc8.new/fs/yaffs2/yaffs_yaffs2.c +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_yaffs2.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_yaffs2.c 2010-10-20 13:28:16.050000294 +0300 @@ -0,0 +1,1540 @@ +/* + * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. @@ -22015,134 +25253,134 @@ + * Oldest Dirty Sequence Number handling. + */ + -+/* yaffs2_CalcOldestDirtySequence() -+ * yaffs2_FindOldestDirtySequence() ++/* yaffs_calc_oldest_dirty_seq() ++ * yaffs2_find_oldest_dirty_seq() + * Calculate the oldest dirty sequence number if we don't know it. + */ -+void yaffs2_CalcOldestDirtySequence(yaffs_Device *dev) ++void yaffs_calc_oldest_dirty_seq(yaffs_dev_t *dev) +{ + int i; + unsigned seq; -+ unsigned blockNo = 0; -+ yaffs_BlockInfo *b; ++ unsigned block_no = 0; ++ yaffs_block_info_t *b; + -+ if(!dev->param.isYaffs2) ++ if(!dev->param.is_yaffs2) + return; + + /* Find the oldest dirty sequence number. */ -+ seq = dev->sequenceNumber + 1; -+ b = dev->blockInfo; -+ for (i = dev->internalStartBlock; i <= dev->internalEndBlock; i++) { -+ if (b->blockState == YAFFS_BLOCK_STATE_FULL && -+ (b->pagesInUse - b->softDeletions) < dev->param.nChunksPerBlock && -+ b->sequenceNumber < seq) { -+ seq = b->sequenceNumber; -+ blockNo = i; ++ seq = dev->seq_number + 1; ++ b = dev->block_info; ++ for (i = dev->internal_start_block; i <= dev->internal_end_block; i++) { ++ if (b->block_state == YAFFS_BLOCK_STATE_FULL && ++ (b->pages_in_use - b->soft_del_pages) < dev->param.chunks_per_block && ++ b->seq_number < seq) { ++ seq = b->seq_number; ++ block_no = i; + } + b++; + } + -+ if(blockNo){ -+ dev->oldestDirtySequence = seq; -+ dev->oldestDirtyBlock = blockNo; ++ if(block_no){ ++ dev->oldest_dirty_seq = seq; ++ dev->oldest_dirty_block = block_no; + } + +} + + -+void yaffs2_FindOldestDirtySequence(yaffs_Device *dev) ++void yaffs2_find_oldest_dirty_seq(yaffs_dev_t *dev) +{ -+ if(!dev->param.isYaffs2) ++ if(!dev->param.is_yaffs2) + return; + -+ if(!dev->oldestDirtySequence) -+ yaffs2_CalcOldestDirtySequence(dev); ++ if(!dev->oldest_dirty_seq) ++ yaffs_calc_oldest_dirty_seq(dev); +} + +/* -+ * yaffs_ClearOldestDirtySequence() -+ * Called when a block is erased or marked bad. (ie. when its sequenceNumber ++ * yaffs_clear_oldest_dirty_seq() ++ * Called when a block is erased or marked bad. (ie. when its seq_number + * becomes invalid). If the value matches the oldest then we clear -+ * dev->oldestDirtySequence to force its recomputation. ++ * dev->oldest_dirty_seq to force its recomputation. + */ -+void yaffs2_ClearOldestDirtySequence(yaffs_Device *dev, yaffs_BlockInfo *bi) ++void yaffs2_clear_oldest_dirty_seq(yaffs_dev_t *dev, yaffs_block_info_t *bi) +{ + -+ if(!dev->param.isYaffs2) ++ if(!dev->param.is_yaffs2) + return; + -+ if(!bi || bi->sequenceNumber == dev->oldestDirtySequence){ -+ dev->oldestDirtySequence = 0; -+ dev->oldestDirtyBlock = 0; ++ if(!bi || bi->seq_number == dev->oldest_dirty_seq){ ++ dev->oldest_dirty_seq = 0; ++ dev->oldest_dirty_block = 0; + } +} + +/* -+ * yaffs2_UpdateOldestDirtySequence() ++ * yaffs2_update_oldest_dirty_seq() + * Update the oldest dirty sequence number whenever we dirty a block. -+ * Only do this if the oldestDirtySequence is actually being tracked. ++ * Only do this if the oldest_dirty_seq is actually being tracked. + */ -+void yaffs2_UpdateOldestDirtySequence(yaffs_Device *dev, unsigned blockNo, yaffs_BlockInfo *bi) ++void yaffs2_update_oldest_dirty_seq(yaffs_dev_t *dev, unsigned block_no, yaffs_block_info_t *bi) +{ -+ if(!dev->param.isYaffs2) ++ if(!dev->param.is_yaffs2) + return; + -+ if(dev->oldestDirtySequence){ -+ if(dev->oldestDirtySequence > bi->sequenceNumber){ -+ dev->oldestDirtySequence = bi->sequenceNumber; -+ dev->oldestDirtyBlock = blockNo; ++ if(dev->oldest_dirty_seq){ ++ if(dev->oldest_dirty_seq > bi->seq_number){ ++ dev->oldest_dirty_seq = bi->seq_number; ++ dev->oldest_dirty_block = block_no; + } + } +} + -+int yaffs2_BlockNotDisqualifiedFromGC(yaffs_Device *dev, -+ yaffs_BlockInfo *bi) ++int yaffs_block_ok_for_gc(yaffs_dev_t *dev, ++ yaffs_block_info_t *bi) +{ + -+ if (!dev->param.isYaffs2) ++ if (!dev->param.is_yaffs2) + return 1; /* disqualification only applies to yaffs2. */ + -+ if (!bi->hasShrinkHeader) ++ if (!bi->has_shrink_hdr) + return 1; /* can gc */ + -+ yaffs2_FindOldestDirtySequence(dev); ++ yaffs2_find_oldest_dirty_seq(dev); + + /* Can't do gc of this block if there are any blocks older than this one that have + * discarded pages. + */ -+ return (bi->sequenceNumber <= dev->oldestDirtySequence); ++ return (bi->seq_number <= dev->oldest_dirty_seq); +} + +/* -+ * yaffs2_FindRefreshBlock() ++ * yaffs2_find_refresh_block() + * periodically finds the oldest full block by sequence number for refreshing. + * Only for yaffs2. + */ -+__u32 yaffs2_FindRefreshBlock(yaffs_Device *dev) ++__u32 yaffs2_find_refresh_block(yaffs_dev_t *dev) +{ + __u32 b ; + + __u32 oldest = 0; + __u32 oldestSequence = 0; + -+ yaffs_BlockInfo *bi; ++ yaffs_block_info_t *bi; + -+ if(!dev->param.isYaffs2) ++ if(!dev->param.is_yaffs2) + return oldest; + + /* + * If refresh period < 10 then refreshing is disabled. + */ -+ if(dev->param.refreshPeriod < 10) ++ if(dev->param.refresh_period < 10) + return oldest; + + /* + * Fix broken values. + */ -+ if(dev->refreshSkip > dev->param.refreshPeriod) -+ dev->refreshSkip = dev->param.refreshPeriod; ++ if(dev->refresh_skip > dev->param.refresh_period) ++ dev->refresh_skip = dev->param.refresh_period; + -+ if(dev->refreshSkip > 0) ++ if(dev->refresh_skip > 0) + return oldest; + + /* @@ -22150,17 +25388,17 @@ + * We'll do a refresh this time around.... + * Update the refresh skip and find the oldest block. + */ -+ dev->refreshSkip = dev->param.refreshPeriod; -+ dev->refreshCount++; -+ bi = dev->blockInfo; -+ for (b = dev->internalStartBlock; b <=dev->internalEndBlock; b++){ ++ dev->refresh_skip = dev->param.refresh_period; ++ dev->refresh_count++; ++ bi = dev->block_info; ++ for (b = dev->internal_start_block; b <=dev->internal_end_block; b++){ + -+ if (bi->blockState == YAFFS_BLOCK_STATE_FULL){ ++ if (bi->block_state == YAFFS_BLOCK_STATE_FULL){ + + if(oldest < 1 || -+ bi->sequenceNumber < oldestSequence){ ++ bi->seq_number < oldestSequence){ + oldest = b; -+ oldestSequence = bi->sequenceNumber; ++ oldestSequence = bi->seq_number; + } + } + bi++; @@ -22168,58 +25406,58 @@ + + if (oldest > 0) { + T(YAFFS_TRACE_GC, -+ (TSTR("GC refresh count %d selected block %d with sequenceNumber %d" TENDSTR), -+ dev->refreshCount, oldest, oldestSequence)); ++ (TSTR("GC refresh count %d selected block %d with seq_number %d" TENDSTR), ++ dev->refresh_count, oldest, oldestSequence)); + } + + return oldest; +} + -+int yaffs2_CheckpointRequired(yaffs_Device *dev) ++int yaffs2_checkpt_required(yaffs_dev_t *dev) +{ + int nblocks; + -+ if(!dev->param.isYaffs2) ++ if(!dev->param.is_yaffs2) + return 0; + -+ nblocks = dev->internalEndBlock - dev->internalStartBlock + 1 ; ++ nblocks = dev->internal_end_block - dev->internal_start_block + 1 ; + -+ return !dev->param.skipCheckpointWrite && -+ !dev->readOnly && ++ return !dev->param.skip_checkpt_wr && ++ !dev->read_only && + (nblocks >= YAFFS_CHECKPOINT_MIN_BLOCKS); +} + -+int yaffs2_CalcCheckpointBlocksRequired(yaffs_Device *dev) ++int yaffs_calc_checkpt_blocks_required(yaffs_dev_t *dev) +{ + int retval; + -+ if(!dev->param.isYaffs2) ++ if(!dev->param.is_yaffs2) + return 0; + -+ if (!dev->nCheckpointBlocksRequired && -+ yaffs2_CheckpointRequired(dev)){ ++ if (!dev->checkpoint_blocks_required && ++ yaffs2_checkpt_required(dev)){ + /* Not a valid value so recalculate */ -+ int nBytes = 0; ++ int n_bytes = 0; + int nBlocks; -+ int devBlocks = (dev->param.endBlock - dev->param.startBlock + 1); ++ int devBlocks = (dev->param.end_block - dev->param.start_block + 1); + -+ nBytes += sizeof(yaffs_CheckpointValidity); -+ nBytes += sizeof(yaffs_CheckpointDevice); -+ nBytes += devBlocks * sizeof(yaffs_BlockInfo); -+ nBytes += devBlocks * dev->chunkBitmapStride; -+ nBytes += (sizeof(yaffs_CheckpointObject) + sizeof(__u32)) * (dev->nObjects); -+ nBytes += (dev->tnodeSize + sizeof(__u32)) * (dev->nTnodes); -+ nBytes += sizeof(yaffs_CheckpointValidity); -+ nBytes += sizeof(__u32); /* checksum*/ ++ n_bytes += sizeof(yaffs_checkpt_validty_t); ++ n_bytes += sizeof(yaffs_checkpt_dev_t); ++ n_bytes += devBlocks * sizeof(yaffs_block_info_t); ++ n_bytes += devBlocks * dev->chunk_bit_stride; ++ n_bytes += (sizeof(yaffs_checkpt_obj_t) + sizeof(__u32)) * (dev->n_obj); ++ n_bytes += (dev->tnode_size + sizeof(__u32)) * (dev->n_tnodes); ++ n_bytes += sizeof(yaffs_checkpt_validty_t); ++ n_bytes += sizeof(__u32); /* checksum*/ + + /* Round up and add 2 blocks to allow for some bad blocks, so add 3 */ + -+ nBlocks = (nBytes/(dev->nDataBytesPerChunk * dev->param.nChunksPerBlock)) + 3; ++ nBlocks = (n_bytes/(dev->data_bytes_per_chunk * dev->param.chunks_per_block)) + 3; + -+ dev->nCheckpointBlocksRequired = nBlocks; ++ dev->checkpoint_blocks_required = nBlocks; + } + -+ retval = dev->nCheckpointBlocksRequired - dev->blocksInCheckpoint; ++ retval = dev->checkpoint_blocks_required - dev->blocks_in_checkpt; + if(retval < 0) + retval = 0; + return retval; @@ -22228,212 +25466,212 @@ +/*--------------------- Checkpointing --------------------*/ + + -+static int yaffs2_WriteCheckpointValidityMarker(yaffs_Device *dev, int head) ++static int yaffs2_wr_checkpt_validity_marker(yaffs_dev_t *dev, int head) +{ -+ yaffs_CheckpointValidity cp; ++ yaffs_checkpt_validty_t cp; + + memset(&cp, 0, sizeof(cp)); + -+ cp.structType = sizeof(cp); ++ cp.struct_type = sizeof(cp); + cp.magic = YAFFS_MAGIC; + cp.version = YAFFS_CHECKPOINT_VERSION; + cp.head = (head) ? 1 : 0; + -+ return (yaffs2_CheckpointWrite(dev, &cp, sizeof(cp)) == sizeof(cp)) ? ++ return (yaffs2_checkpt_wr(dev, &cp, sizeof(cp)) == sizeof(cp)) ? + 1 : 0; +} + -+static int yaffs2_ReadCheckpointValidityMarker(yaffs_Device *dev, int head) ++static int yaffs2_rd_checkpt_validty_marker(yaffs_dev_t *dev, int head) +{ -+ yaffs_CheckpointValidity cp; ++ yaffs_checkpt_validty_t cp; + int ok; + -+ ok = (yaffs2_CheckpointRead(dev, &cp, sizeof(cp)) == sizeof(cp)); ++ ok = (yaffs2_checkpt_rd(dev, &cp, sizeof(cp)) == sizeof(cp)); + + if (ok) -+ ok = (cp.structType == sizeof(cp)) && ++ ok = (cp.struct_type == sizeof(cp)) && + (cp.magic == YAFFS_MAGIC) && + (cp.version == YAFFS_CHECKPOINT_VERSION) && + (cp.head == ((head) ? 1 : 0)); + return ok ? 1 : 0; +} + -+static void yaffs2_DeviceToCheckpointDevice(yaffs_CheckpointDevice *cp, -+ yaffs_Device *dev) ++static void yaffs2_dev_to_checkpt_dev(yaffs_checkpt_dev_t *cp, ++ yaffs_dev_t *dev) +{ -+ cp->nErasedBlocks = dev->nErasedBlocks; -+ cp->allocationBlock = dev->allocationBlock; -+ cp->allocationPage = dev->allocationPage; -+ cp->nFreeChunks = dev->nFreeChunks; ++ cp->n_erased_blocks = dev->n_erased_blocks; ++ cp->alloc_block = dev->alloc_block; ++ cp->alloc_page = dev->alloc_page; ++ cp->n_free_chunks = dev->n_free_chunks; + -+ cp->nDeletedFiles = dev->nDeletedFiles; -+ cp->nUnlinkedFiles = dev->nUnlinkedFiles; -+ cp->nBackgroundDeletions = dev->nBackgroundDeletions; -+ cp->sequenceNumber = dev->sequenceNumber; ++ cp->n_deleted_files = dev->n_deleted_files; ++ cp->n_unlinked_files = dev->n_unlinked_files; ++ cp->n_bg_deletions = dev->n_bg_deletions; ++ cp->seq_number = dev->seq_number; + +} + -+static void yaffs2_CheckpointDeviceToDevice(yaffs_Device *dev, -+ yaffs_CheckpointDevice *cp) ++static void yaffs_checkpt_dev_to_dev(yaffs_dev_t *dev, ++ yaffs_checkpt_dev_t *cp) +{ -+ dev->nErasedBlocks = cp->nErasedBlocks; -+ dev->allocationBlock = cp->allocationBlock; -+ dev->allocationPage = cp->allocationPage; -+ dev->nFreeChunks = cp->nFreeChunks; ++ dev->n_erased_blocks = cp->n_erased_blocks; ++ dev->alloc_block = cp->alloc_block; ++ dev->alloc_page = cp->alloc_page; ++ dev->n_free_chunks = cp->n_free_chunks; + -+ dev->nDeletedFiles = cp->nDeletedFiles; -+ dev->nUnlinkedFiles = cp->nUnlinkedFiles; -+ dev->nBackgroundDeletions = cp->nBackgroundDeletions; -+ dev->sequenceNumber = cp->sequenceNumber; ++ dev->n_deleted_files = cp->n_deleted_files; ++ dev->n_unlinked_files = cp->n_unlinked_files; ++ dev->n_bg_deletions = cp->n_bg_deletions; ++ dev->seq_number = cp->seq_number; +} + + -+static int yaffs2_WriteCheckpointDevice(yaffs_Device *dev) ++static int yaffs2_wr_checkpt_dev(yaffs_dev_t *dev) +{ -+ yaffs_CheckpointDevice cp; -+ __u32 nBytes; -+ __u32 nBlocks = (dev->internalEndBlock - dev->internalStartBlock + 1); ++ yaffs_checkpt_dev_t cp; ++ __u32 n_bytes; ++ __u32 nBlocks = (dev->internal_end_block - dev->internal_start_block + 1); + + int ok; + + /* Write device runtime values*/ -+ yaffs2_DeviceToCheckpointDevice(&cp, dev); -+ cp.structType = sizeof(cp); ++ yaffs2_dev_to_checkpt_dev(&cp, dev); ++ cp.struct_type = sizeof(cp); + -+ ok = (yaffs2_CheckpointWrite(dev, &cp, sizeof(cp)) == sizeof(cp)); ++ ok = (yaffs2_checkpt_wr(dev, &cp, sizeof(cp)) == sizeof(cp)); + + /* Write block info */ + if (ok) { -+ nBytes = nBlocks * sizeof(yaffs_BlockInfo); -+ ok = (yaffs2_CheckpointWrite(dev, dev->blockInfo, nBytes) == nBytes); ++ n_bytes = nBlocks * sizeof(yaffs_block_info_t); ++ ok = (yaffs2_checkpt_wr(dev, dev->block_info, n_bytes) == n_bytes); + } + + /* Write chunk bits */ + if (ok) { -+ nBytes = nBlocks * dev->chunkBitmapStride; -+ ok = (yaffs2_CheckpointWrite(dev, dev->chunkBits, nBytes) == nBytes); ++ n_bytes = nBlocks * dev->chunk_bit_stride; ++ ok = (yaffs2_checkpt_wr(dev, dev->chunk_bits, n_bytes) == n_bytes); + } + return ok ? 1 : 0; + +} + -+static int yaffs2_ReadCheckpointDevice(yaffs_Device *dev) ++static int yaffs2_rd_checkpt_dev(yaffs_dev_t *dev) +{ -+ yaffs_CheckpointDevice cp; -+ __u32 nBytes; -+ __u32 nBlocks = (dev->internalEndBlock - dev->internalStartBlock + 1); ++ yaffs_checkpt_dev_t cp; ++ __u32 n_bytes; ++ __u32 nBlocks = (dev->internal_end_block - dev->internal_start_block + 1); + + int ok; + -+ ok = (yaffs2_CheckpointRead(dev, &cp, sizeof(cp)) == sizeof(cp)); ++ ok = (yaffs2_checkpt_rd(dev, &cp, sizeof(cp)) == sizeof(cp)); + if (!ok) + return 0; + -+ if (cp.structType != sizeof(cp)) ++ if (cp.struct_type != sizeof(cp)) + return 0; + + -+ yaffs2_CheckpointDeviceToDevice(dev, &cp); ++ yaffs_checkpt_dev_to_dev(dev, &cp); + -+ nBytes = nBlocks * sizeof(yaffs_BlockInfo); ++ n_bytes = nBlocks * sizeof(yaffs_block_info_t); + -+ ok = (yaffs2_CheckpointRead(dev, dev->blockInfo, nBytes) == nBytes); ++ ok = (yaffs2_checkpt_rd(dev, dev->block_info, n_bytes) == n_bytes); + + if (!ok) + return 0; -+ nBytes = nBlocks * dev->chunkBitmapStride; ++ n_bytes = nBlocks * dev->chunk_bit_stride; + -+ ok = (yaffs2_CheckpointRead(dev, dev->chunkBits, nBytes) == nBytes); ++ ok = (yaffs2_checkpt_rd(dev, dev->chunk_bits, n_bytes) == n_bytes); + + return ok ? 1 : 0; +} + -+static void yaffs2_ObjectToCheckpointObject(yaffs_CheckpointObject *cp, -+ yaffs_Object *obj) ++static void yaffs2_obj_checkpt_obj(yaffs_checkpt_obj_t *cp, ++ yaffs_obj_t *obj) +{ + -+ cp->objectId = obj->objectId; -+ cp->parentId = (obj->parent) ? obj->parent->objectId : 0; -+ cp->hdrChunk = obj->hdrChunk; -+ cp->variantType = obj->variantType; ++ cp->obj_id = obj->obj_id; ++ cp->parent_id = (obj->parent) ? obj->parent->obj_id : 0; ++ cp->hdr_chunk = obj->hdr_chunk; ++ cp->variant_type = obj->variant_type; + cp->deleted = obj->deleted; -+ cp->softDeleted = obj->softDeleted; ++ cp->soft_del = obj->soft_del; + cp->unlinked = obj->unlinked; + cp->fake = obj->fake; -+ cp->renameAllowed = obj->renameAllowed; -+ cp->unlinkAllowed = obj->unlinkAllowed; ++ cp->rename_allowed = obj->rename_allowed; ++ cp->unlink_allowed = obj->unlink_allowed; + cp->serial = obj->serial; -+ cp->nDataChunks = obj->nDataChunks; ++ cp->n_data_chunks = obj->n_data_chunks; + -+ if (obj->variantType == YAFFS_OBJECT_TYPE_FILE) -+ cp->fileSizeOrEquivalentObjectId = obj->variant.fileVariant.fileSize; -+ else if (obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK) -+ cp->fileSizeOrEquivalentObjectId = obj->variant.hardLinkVariant.equivalentObjectId; ++ if (obj->variant_type == YAFFS_OBJECT_TYPE_FILE) ++ cp->size_or_equiv_obj = obj->variant.file_variant.file_size; ++ else if (obj->variant_type == YAFFS_OBJECT_TYPE_HARDLINK) ++ cp->size_or_equiv_obj = obj->variant.hardlink_variant.equiv_id; +} + -+static int yaffs2_CheckpointObjectToObject(yaffs_Object *obj, yaffs_CheckpointObject *cp) ++static int taffs2_checkpt_obj_to_obj(yaffs_obj_t *obj, yaffs_checkpt_obj_t *cp) +{ + -+ yaffs_Object *parent; ++ yaffs_obj_t *parent; + -+ if (obj->variantType != cp->variantType) { ++ if (obj->variant_type != cp->variant_type) { + T(YAFFS_TRACE_ERROR, (TSTR("Checkpoint read object %d type %d " + TCONT("chunk %d does not match existing object type %d") -+ TENDSTR), cp->objectId, cp->variantType, cp->hdrChunk, -+ obj->variantType)); ++ TENDSTR), cp->obj_id, cp->variant_type, cp->hdr_chunk, ++ obj->variant_type)); + return 0; + } + -+ obj->objectId = cp->objectId; ++ obj->obj_id = cp->obj_id; + -+ if (cp->parentId) -+ parent = yaffs_FindOrCreateObjectByNumber( -+ obj->myDev, -+ cp->parentId, ++ if (cp->parent_id) ++ parent = yaffs_find_or_create_by_number( ++ obj->my_dev, ++ cp->parent_id, + YAFFS_OBJECT_TYPE_DIRECTORY); + else + parent = NULL; + + if (parent) { -+ if (parent->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) { ++ if (parent->variant_type != YAFFS_OBJECT_TYPE_DIRECTORY) { + T(YAFFS_TRACE_ALWAYS, (TSTR("Checkpoint read object %d parent %d type %d" + TCONT(" chunk %d Parent type, %d, not directory") + TENDSTR), -+ cp->objectId, cp->parentId, cp->variantType, -+ cp->hdrChunk, parent->variantType)); ++ cp->obj_id, cp->parent_id, cp->variant_type, ++ cp->hdr_chunk, parent->variant_type)); + return 0; + } -+ yaffs_AddObjectToDirectory(parent, obj); ++ yaffs_add_obj_to_dir(parent, obj); + } + -+ obj->hdrChunk = cp->hdrChunk; -+ obj->variantType = cp->variantType; ++ obj->hdr_chunk = cp->hdr_chunk; ++ obj->variant_type = cp->variant_type; + obj->deleted = cp->deleted; -+ obj->softDeleted = cp->softDeleted; ++ obj->soft_del = cp->soft_del; + obj->unlinked = cp->unlinked; + obj->fake = cp->fake; -+ obj->renameAllowed = cp->renameAllowed; -+ obj->unlinkAllowed = cp->unlinkAllowed; ++ obj->rename_allowed = cp->rename_allowed; ++ obj->unlink_allowed = cp->unlink_allowed; + obj->serial = cp->serial; -+ obj->nDataChunks = cp->nDataChunks; ++ obj->n_data_chunks = cp->n_data_chunks; + -+ if (obj->variantType == YAFFS_OBJECT_TYPE_FILE) -+ obj->variant.fileVariant.fileSize = cp->fileSizeOrEquivalentObjectId; -+ else if (obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK) -+ obj->variant.hardLinkVariant.equivalentObjectId = cp->fileSizeOrEquivalentObjectId; ++ if (obj->variant_type == YAFFS_OBJECT_TYPE_FILE) ++ obj->variant.file_variant.file_size = cp->size_or_equiv_obj; ++ else if (obj->variant_type == YAFFS_OBJECT_TYPE_HARDLINK) ++ obj->variant.hardlink_variant.equiv_id = cp->size_or_equiv_obj; + -+ if (obj->hdrChunk > 0) -+ obj->lazyLoaded = 1; ++ if (obj->hdr_chunk > 0) ++ obj->lazy_loaded = 1; + return 1; +} + + + -+static int yaffs2_CheckpointTnodeWorker(yaffs_Object *in, yaffs_Tnode *tn, -+ __u32 level, int chunkOffset) ++static int yaffs2_checkpt_tnode_worker(yaffs_obj_t *in, yaffs_tnode_t *tn, ++ __u32 level, int chunk_offset) +{ + int i; -+ yaffs_Device *dev = in->myDev; ++ yaffs_dev_t *dev = in->my_dev; + int ok = 1; + + if (tn) { @@ -22441,17 +25679,17 @@ + + for (i = 0; i < YAFFS_NTNODES_INTERNAL && ok; i++) { + if (tn->internal[i]) { -+ ok = yaffs2_CheckpointTnodeWorker(in, ++ ok = yaffs2_checkpt_tnode_worker(in, + tn->internal[i], + level - 1, -+ (chunkOffset<tnodeSize) == dev->tnodeSize); ++ ok = (yaffs2_checkpt_wr(dev, tn, dev->tnode_size) == dev->tnode_size); + } + } + @@ -22459,54 +25697,54 @@ + +} + -+static int yaffs2_WriteCheckpointTnodes(yaffs_Object *obj) ++static int yaffs2_wr_checkpt_tnodes(yaffs_obj_t *obj) +{ + __u32 endMarker = ~0; + int ok = 1; + -+ if (obj->variantType == YAFFS_OBJECT_TYPE_FILE) { -+ ok = yaffs2_CheckpointTnodeWorker(obj, -+ obj->variant.fileVariant.top, -+ obj->variant.fileVariant.topLevel, ++ if (obj->variant_type == YAFFS_OBJECT_TYPE_FILE) { ++ ok = yaffs2_checkpt_tnode_worker(obj, ++ obj->variant.file_variant.top, ++ obj->variant.file_variant.top_level, + 0); + if (ok) -+ ok = (yaffs2_CheckpointWrite(obj->myDev, &endMarker, sizeof(endMarker)) == ++ ok = (yaffs2_checkpt_wr(obj->my_dev, &endMarker, sizeof(endMarker)) == + sizeof(endMarker)); + } + + return ok ? 1 : 0; +} + -+static int yaffs2_ReadCheckpointTnodes(yaffs_Object *obj) ++static int yaffs2_rd_checkpt_tnodes(yaffs_obj_t *obj) +{ + __u32 baseChunk; + int ok = 1; -+ yaffs_Device *dev = obj->myDev; -+ yaffs_FileStructure *fileStructPtr = &obj->variant.fileVariant; -+ yaffs_Tnode *tn; ++ yaffs_dev_t *dev = obj->my_dev; ++ yaffs_file_s *fileStructPtr = &obj->variant.file_variant; ++ yaffs_tnode_t *tn; + int nread = 0; + -+ ok = (yaffs2_CheckpointRead(dev, &baseChunk, sizeof(baseChunk)) == sizeof(baseChunk)); ++ ok = (yaffs2_checkpt_rd(dev, &baseChunk, sizeof(baseChunk)) == sizeof(baseChunk)); + + while (ok && (~baseChunk)) { + nread++; + /* Read level 0 tnode */ + + -+ tn = yaffs_GetTnode(dev); ++ tn = yaffs_get_tnode(dev); + if (tn){ -+ ok = (yaffs2_CheckpointRead(dev, tn, dev->tnodeSize) == dev->tnodeSize); ++ ok = (yaffs2_checkpt_rd(dev, tn, dev->tnode_size) == dev->tnode_size); + } else + ok = 0; + + if (tn && ok) -+ ok = yaffs_AddOrFindLevel0Tnode(dev, ++ ok = yaffs_add_find_tnode_0(dev, + fileStructPtr, + baseChunk, + tn) ? 1 : 0; + + if (ok) -+ ok = (yaffs2_CheckpointRead(dev, &baseChunk, sizeof(baseChunk)) == sizeof(baseChunk)); ++ ok = (yaffs2_checkpt_rd(dev, &baseChunk, sizeof(baseChunk)) == sizeof(baseChunk)); + + } + @@ -22518,10 +25756,10 @@ +} + + -+static int yaffs2_WriteCheckpointObjects(yaffs_Device *dev) ++static int yaffs2_wr_checkpt_objs(yaffs_dev_t *dev) +{ -+ yaffs_Object *obj; -+ yaffs_CheckpointObject cp; ++ yaffs_obj_t *obj; ++ yaffs_checkpt_obj_t cp; + int i; + int ok = 1; + struct ylist_head *lh; @@ -22532,69 +25770,69 @@ + */ + + for (i = 0; ok && i < YAFFS_NOBJECT_BUCKETS; i++) { -+ ylist_for_each(lh, &dev->objectBucket[i].list) { ++ ylist_for_each(lh, &dev->obj_bucket[i].list) { + if (lh) { -+ obj = ylist_entry(lh, yaffs_Object, hashLink); -+ if (!obj->deferedFree) { -+ yaffs2_ObjectToCheckpointObject(&cp, obj); -+ cp.structType = sizeof(cp); ++ obj = ylist_entry(lh, yaffs_obj_t, hash_link); ++ if (!obj->defered_free) { ++ yaffs2_obj_checkpt_obj(&cp, obj); ++ cp.struct_type = sizeof(cp); + + T(YAFFS_TRACE_CHECKPOINT, ( + TSTR("Checkpoint write object %d parent %d type %d chunk %d obj addr %p" TENDSTR), -+ cp.objectId, cp.parentId, cp.variantType, cp.hdrChunk, obj)); ++ cp.obj_id, cp.parent_id, cp.variant_type, cp.hdr_chunk, obj)); + -+ ok = (yaffs2_CheckpointWrite(dev, &cp, sizeof(cp)) == sizeof(cp)); ++ ok = (yaffs2_checkpt_wr(dev, &cp, sizeof(cp)) == sizeof(cp)); + -+ if (ok && obj->variantType == YAFFS_OBJECT_TYPE_FILE) -+ ok = yaffs2_WriteCheckpointTnodes(obj); ++ if (ok && obj->variant_type == YAFFS_OBJECT_TYPE_FILE) ++ ok = yaffs2_wr_checkpt_tnodes(obj); + } + } + } + } + + /* Dump end of list */ -+ memset(&cp, 0xFF, sizeof(yaffs_CheckpointObject)); -+ cp.structType = sizeof(cp); ++ memset(&cp, 0xFF, sizeof(yaffs_checkpt_obj_t)); ++ cp.struct_type = sizeof(cp); + + if (ok) -+ ok = (yaffs2_CheckpointWrite(dev, &cp, sizeof(cp)) == sizeof(cp)); ++ ok = (yaffs2_checkpt_wr(dev, &cp, sizeof(cp)) == sizeof(cp)); + + return ok ? 1 : 0; +} + -+static int yaffs2_ReadCheckpointObjects(yaffs_Device *dev) ++static int yaffs2_rd_checkpt_objs(yaffs_dev_t *dev) +{ -+ yaffs_Object *obj; -+ yaffs_CheckpointObject cp; ++ yaffs_obj_t *obj; ++ yaffs_checkpt_obj_t cp; + int ok = 1; + int done = 0; -+ yaffs_Object *hardList = NULL; ++ yaffs_obj_t *hard_list = NULL; + + while (ok && !done) { -+ ok = (yaffs2_CheckpointRead(dev, &cp, sizeof(cp)) == sizeof(cp)); -+ if (cp.structType != sizeof(cp)) { ++ ok = (yaffs2_checkpt_rd(dev, &cp, sizeof(cp)) == sizeof(cp)); ++ if (cp.struct_type != sizeof(cp)) { + T(YAFFS_TRACE_CHECKPOINT, (TSTR("struct size %d instead of %d ok %d"TENDSTR), -+ cp.structType, (int)sizeof(cp), ok)); ++ cp.struct_type, (int)sizeof(cp), ok)); + ok = 0; + } + + T(YAFFS_TRACE_CHECKPOINT, (TSTR("Checkpoint read object %d parent %d type %d chunk %d " TENDSTR), -+ cp.objectId, cp.parentId, cp.variantType, cp.hdrChunk)); ++ cp.obj_id, cp.parent_id, cp.variant_type, cp.hdr_chunk)); + -+ if (ok && cp.objectId == ~0) ++ if (ok && cp.obj_id == ~0) + done = 1; + else if (ok) { -+ obj = yaffs_FindOrCreateObjectByNumber(dev, cp.objectId, cp.variantType); ++ obj = yaffs_find_or_create_by_number(dev, cp.obj_id, cp.variant_type); + if (obj) { -+ ok = yaffs2_CheckpointObjectToObject(obj, &cp); ++ ok = taffs2_checkpt_obj_to_obj(obj, &cp); + if (!ok) + break; -+ if (obj->variantType == YAFFS_OBJECT_TYPE_FILE) { -+ ok = yaffs2_ReadCheckpointTnodes(obj); -+ } else if (obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK) { -+ obj->hardLinks.next = -+ (struct ylist_head *) hardList; -+ hardList = obj; ++ if (obj->variant_type == YAFFS_OBJECT_TYPE_FILE) { ++ ok = yaffs2_rd_checkpt_tnodes(obj); ++ } else if (obj->variant_type == YAFFS_OBJECT_TYPE_HARDLINK) { ++ obj->hard_links.next = ++ (struct ylist_head *) hard_list; ++ hard_list = obj; + } + } else + ok = 0; @@ -22602,19 +25840,19 @@ + } + + if (ok) -+ yaffs_HardlinkFixup(dev, hardList); ++ yaffs_link_fixup(dev, hard_list); + + return ok ? 1 : 0; +} + -+static int yaffs2_WriteCheckpointSum(yaffs_Device *dev) ++static int yaffs2_wr_checkpt_sum(yaffs_dev_t *dev) +{ -+ __u32 checkpointSum; ++ __u32 checkpt_sum; + int ok; + -+ yaffs2_GetCheckpointSum(dev, &checkpointSum); ++ yaffs2_get_checkpt_sum(dev, &checkpt_sum); + -+ ok = (yaffs2_CheckpointWrite(dev, &checkpointSum, sizeof(checkpointSum)) == sizeof(checkpointSum)); ++ ok = (yaffs2_checkpt_wr(dev, &checkpt_sum, sizeof(checkpt_sum)) == sizeof(checkpt_sum)); + + if (!ok) + return 0; @@ -22622,168 +25860,168 @@ + return 1; +} + -+static int yaffs2_ReadCheckpointSum(yaffs_Device *dev) ++static int yaffs2_rd_checkpt_sum(yaffs_dev_t *dev) +{ -+ __u32 checkpointSum0; -+ __u32 checkpointSum1; ++ __u32 checkpt_sum0; ++ __u32 checkpt_sum1; + int ok; + -+ yaffs2_GetCheckpointSum(dev, &checkpointSum0); ++ yaffs2_get_checkpt_sum(dev, &checkpt_sum0); + -+ ok = (yaffs2_CheckpointRead(dev, &checkpointSum1, sizeof(checkpointSum1)) == sizeof(checkpointSum1)); ++ ok = (yaffs2_checkpt_rd(dev, &checkpt_sum1, sizeof(checkpt_sum1)) == sizeof(checkpt_sum1)); + + if (!ok) + return 0; + -+ if (checkpointSum0 != checkpointSum1) ++ if (checkpt_sum0 != checkpt_sum1) + return 0; + + return 1; +} + + -+static int yaffs2_WriteCheckpointData(yaffs_Device *dev) ++static int yaffs2_wr_checkpt_data(yaffs_dev_t *dev) +{ + int ok = 1; + -+ if (!yaffs2_CheckpointRequired(dev)) { ++ if (!yaffs2_checkpt_required(dev)) { + T(YAFFS_TRACE_CHECKPOINT, (TSTR("skipping checkpoint write" TENDSTR))); + ok = 0; + } + + if (ok) -+ ok = yaffs2_CheckpointOpen(dev, 1); ++ ok = yaffs2_checkpt_open(dev, 1); + + if (ok) { + T(YAFFS_TRACE_CHECKPOINT, (TSTR("write checkpoint validity" TENDSTR))); -+ ok = yaffs2_WriteCheckpointValidityMarker(dev, 1); ++ ok = yaffs2_wr_checkpt_validity_marker(dev, 1); + } + if (ok) { + T(YAFFS_TRACE_CHECKPOINT, (TSTR("write checkpoint device" TENDSTR))); -+ ok = yaffs2_WriteCheckpointDevice(dev); ++ ok = yaffs2_wr_checkpt_dev(dev); + } + if (ok) { + T(YAFFS_TRACE_CHECKPOINT, (TSTR("write checkpoint objects" TENDSTR))); -+ ok = yaffs2_WriteCheckpointObjects(dev); ++ ok = yaffs2_wr_checkpt_objs(dev); + } + if (ok) { + T(YAFFS_TRACE_CHECKPOINT, (TSTR("write checkpoint validity" TENDSTR))); -+ ok = yaffs2_WriteCheckpointValidityMarker(dev, 0); ++ ok = yaffs2_wr_checkpt_validity_marker(dev, 0); + } + + if (ok) -+ ok = yaffs2_WriteCheckpointSum(dev); ++ ok = yaffs2_wr_checkpt_sum(dev); + -+ if (!yaffs2_CheckpointClose(dev)) ++ if (!yaffs_checkpt_close(dev)) + ok = 0; + + if (ok) -+ dev->isCheckpointed = 1; ++ dev->is_checkpointed = 1; + else -+ dev->isCheckpointed = 0; ++ dev->is_checkpointed = 0; + -+ return dev->isCheckpointed; ++ return dev->is_checkpointed; +} + -+static int yaffs2_ReadCheckpointData(yaffs_Device *dev) ++static int yaffs2_rd_checkpt_data(yaffs_dev_t *dev) +{ + int ok = 1; + -+ if(!dev->param.isYaffs2) ++ if(!dev->param.is_yaffs2) + ok = 0; + -+ if (ok && dev->param.skipCheckpointRead) { ++ if (ok && dev->param.skip_checkpt_rd) { + T(YAFFS_TRACE_CHECKPOINT, (TSTR("skipping checkpoint read" TENDSTR))); + ok = 0; + } + + if (ok) -+ ok = yaffs2_CheckpointOpen(dev, 0); /* open for read */ ++ ok = yaffs2_checkpt_open(dev, 0); /* open for read */ + + if (ok) { + T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint validity" TENDSTR))); -+ ok = yaffs2_ReadCheckpointValidityMarker(dev, 1); ++ ok = yaffs2_rd_checkpt_validty_marker(dev, 1); + } + if (ok) { + T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint device" TENDSTR))); -+ ok = yaffs2_ReadCheckpointDevice(dev); ++ ok = yaffs2_rd_checkpt_dev(dev); + } + if (ok) { + T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint objects" TENDSTR))); -+ ok = yaffs2_ReadCheckpointObjects(dev); ++ ok = yaffs2_rd_checkpt_objs(dev); + } + if (ok) { + T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint validity" TENDSTR))); -+ ok = yaffs2_ReadCheckpointValidityMarker(dev, 0); ++ ok = yaffs2_rd_checkpt_validty_marker(dev, 0); + } + + if (ok) { -+ ok = yaffs2_ReadCheckpointSum(dev); ++ ok = yaffs2_rd_checkpt_sum(dev); + T(YAFFS_TRACE_CHECKPOINT, (TSTR("read checkpoint checksum %d" TENDSTR), ok)); + } + -+ if (!yaffs2_CheckpointClose(dev)) ++ if (!yaffs_checkpt_close(dev)) + ok = 0; + + if (ok) -+ dev->isCheckpointed = 1; ++ dev->is_checkpointed = 1; + else -+ dev->isCheckpointed = 0; ++ dev->is_checkpointed = 0; + + return ok ? 1 : 0; + +} + -+void yaffs2_InvalidateCheckpoint(yaffs_Device *dev) ++void yaffs2_checkpt_invalidate(yaffs_dev_t *dev) +{ -+ if (dev->isCheckpointed || -+ dev->blocksInCheckpoint > 0) { -+ dev->isCheckpointed = 0; -+ yaffs2_CheckpointInvalidateStream(dev); ++ if (dev->is_checkpointed || ++ dev->blocks_in_checkpt > 0) { ++ dev->is_checkpointed = 0; ++ yaffs2_checkpt_invalidate_stream(dev); + } -+ if (dev->param.markSuperBlockDirty) -+ dev->param.markSuperBlockDirty(dev); ++ if (dev->param.sb_dirty_fn) ++ dev->param.sb_dirty_fn(dev); +} + + -+int yaffs_CheckpointSave(yaffs_Device *dev) ++int yaffs_checkpoint_save(yaffs_dev_t *dev) +{ + -+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("save entry: isCheckpointed %d"TENDSTR), dev->isCheckpointed)); ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("save entry: is_checkpointed %d"TENDSTR), dev->is_checkpointed)); + -+ yaffs_VerifyObjects(dev); -+ yaffs_VerifyBlocks(dev); -+ yaffs_VerifyFreeChunks(dev); ++ yaffs_verify_objects(dev); ++ yaffs_verify_blocks(dev); ++ yaffs_verify_free_chunks(dev); + -+ if (!dev->isCheckpointed) { -+ yaffs2_InvalidateCheckpoint(dev); -+ yaffs2_WriteCheckpointData(dev); ++ if (!dev->is_checkpointed) { ++ yaffs2_checkpt_invalidate(dev); ++ yaffs2_wr_checkpt_data(dev); + } + -+ T(YAFFS_TRACE_ALWAYS, (TSTR("save exit: isCheckpointed %d"TENDSTR), dev->isCheckpointed)); ++ T(YAFFS_TRACE_ALWAYS, (TSTR("save exit: is_checkpointed %d"TENDSTR), dev->is_checkpointed)); + -+ return dev->isCheckpointed; ++ return dev->is_checkpointed; +} + -+int yaffs2_CheckpointRestore(yaffs_Device *dev) ++int yaffs2_checkpt_restore(yaffs_dev_t *dev) +{ + int retval; -+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("restore entry: isCheckpointed %d"TENDSTR), dev->isCheckpointed)); ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("restore entry: is_checkpointed %d"TENDSTR), dev->is_checkpointed)); + -+ retval = yaffs2_ReadCheckpointData(dev); ++ retval = yaffs2_rd_checkpt_data(dev); + -+ if (dev->isCheckpointed) { -+ yaffs_VerifyObjects(dev); -+ yaffs_VerifyBlocks(dev); -+ yaffs_VerifyFreeChunks(dev); ++ if (dev->is_checkpointed) { ++ yaffs_verify_objects(dev); ++ yaffs_verify_blocks(dev); ++ yaffs_verify_free_chunks(dev); + } + -+ T(YAFFS_TRACE_CHECKPOINT, (TSTR("restore exit: isCheckpointed %d"TENDSTR), dev->isCheckpointed)); ++ T(YAFFS_TRACE_CHECKPOINT, (TSTR("restore exit: is_checkpointed %d"TENDSTR), dev->is_checkpointed)); + + return retval; +} + -+int yaffs2_HandleHole(yaffs_Object *obj, loff_t newSize) ++int yaffs2_handle_hole(yaffs_obj_t *obj, loff_t new_size) +{ + /* if newsSize > oldFileSize. + * We're going to be writing a hole. @@ -22795,7 +26033,7 @@ + int increase; + int smallHole ; + int result = YAFFS_OK; -+ yaffs_Device *dev = NULL; ++ yaffs_dev_t *dev = NULL; + + __u8 *localBuffer = NULL; + @@ -22804,44 +26042,44 @@ + if(!obj) + return YAFFS_FAIL; + -+ if(obj->variantType != YAFFS_OBJECT_TYPE_FILE) ++ if(obj->variant_type != YAFFS_OBJECT_TYPE_FILE) + return YAFFS_FAIL; + -+ dev = obj->myDev; ++ dev = obj->my_dev; + + /* Bail out if not yaffs2 mode */ -+ if(!dev->param.isYaffs2) ++ if(!dev->param.is_yaffs2) + return YAFFS_OK; + -+ oldFileSize = obj->variant.fileVariant.fileSize; ++ oldFileSize = obj->variant.file_variant.file_size; + -+ if (newSize <= oldFileSize) ++ if (new_size <= oldFileSize) + return YAFFS_OK; + -+ increase = newSize - oldFileSize; ++ increase = new_size - oldFileSize; + -+ if(increase < YAFFS_SMALL_HOLE_THRESHOLD * dev->nDataBytesPerChunk && -+ yaffs_CheckSpaceForAllocation(dev, YAFFS_SMALL_HOLE_THRESHOLD + 1)) ++ if(increase < YAFFS_SMALL_HOLE_THRESHOLD * dev->data_bytes_per_chunk && ++ yaffs_check_alloc_available(dev, YAFFS_SMALL_HOLE_THRESHOLD + 1)) + smallHole = 1; + else + smallHole = 0; + + if(smallHole) -+ localBuffer= yaffs_GetTempBuffer(dev, __LINE__); ++ localBuffer= yaffs_get_temp_buffer(dev, __LINE__); + + if(localBuffer){ + /* fill hole with zero bytes */ + int pos = oldFileSize; + int thisWrite; + int written; -+ memset(localBuffer,0,dev->nDataBytesPerChunk); ++ memset(localBuffer,0,dev->data_bytes_per_chunk); + smallIncreaseOk = 1; + + while(increase > 0 && smallIncreaseOk){ + thisWrite = increase; -+ if(thisWrite > dev->nDataBytesPerChunk) -+ thisWrite = dev->nDataBytesPerChunk; -+ written = yaffs_DoWriteDataToFile(obj,localBuffer,pos,thisWrite,0); ++ if(thisWrite > dev->data_bytes_per_chunk) ++ thisWrite = dev->data_bytes_per_chunk; ++ written = yaffs_do_file_wr(obj,localBuffer,pos,thisWrite,0); + if(written == thisWrite){ + pos += thisWrite; + increase -= thisWrite; @@ -22849,19 +26087,19 @@ + smallIncreaseOk = 0; + } + -+ yaffs_ReleaseTempBuffer(dev,localBuffer,__LINE__); ++ yaffs_release_temp_buffer(dev,localBuffer,__LINE__); + + /* If we were out of space then reverse any chunks we've added */ + if(!smallIncreaseOk) -+ yaffs_ResizeDown(obj, oldFileSize); ++ yaffs_resize_file_down(obj, oldFileSize); + } + + if (!smallIncreaseOk && + obj->parent && -+ obj->parent->objectId != YAFFS_OBJECTID_UNLINKED && -+ obj->parent->objectId != YAFFS_OBJECTID_DELETED){ ++ obj->parent->obj_id != YAFFS_OBJECTID_UNLINKED && ++ obj->parent->obj_id != YAFFS_OBJECTID_DELETED){ + /* Write a hole start header with the old file size */ -+ yaffs_UpdateObjectHeader(obj, NULL, 0, 1, 0, NULL); ++ yaffs_update_oh(obj, NULL, 0, 1, 0, NULL); + } + + return result; @@ -22887,9 +26125,9 @@ + return aseq - bseq; +} + -+int yaffs2_ScanBackwards(yaffs_Device *dev) ++int yaffs2_scan_backwards(yaffs_dev_t *dev) +{ -+ yaffs_ExtendedTags tags; ++ yaffs_ext_tags tags; + int blk; + int blockIterator; + int startIterator; @@ -22900,21 +26138,21 @@ + int result; + int c; + int deleted; -+ yaffs_BlockState state; -+ yaffs_Object *hardList = NULL; -+ yaffs_BlockInfo *bi; -+ __u32 sequenceNumber; -+ yaffs_ObjectHeader *oh; -+ yaffs_Object *in; -+ yaffs_Object *parent; -+ int nBlocks = dev->internalEndBlock - dev->internalStartBlock + 1; ++ yaffs_block_state_t state; ++ yaffs_obj_t *hard_list = NULL; ++ yaffs_block_info_t *bi; ++ __u32 seq_number; ++ yaffs_obj_header *oh; ++ yaffs_obj_t *in; ++ yaffs_obj_t *parent; ++ int nBlocks = dev->internal_end_block - dev->internal_start_block + 1; + int itsUnlinked; + __u8 *chunkData; + -+ int fileSize; -+ int isShrink; ++ int file_size; ++ int is_shrink; + int foundChunksInBlock; -+ int equivalentObjectId; ++ int equiv_id; + int alloc_failed = 0; + + @@ -22923,11 +26161,11 @@ + + T(YAFFS_TRACE_SCAN, + (TSTR -+ ("yaffs2_ScanBackwards starts intstartblk %d intendblk %d..." -+ TENDSTR), dev->internalStartBlock, dev->internalEndBlock)); ++ ("yaffs2_scan_backwards starts intstartblk %d intendblk %d..." ++ TENDSTR), dev->internal_start_block, dev->internal_end_block)); + + -+ dev->sequenceNumber = YAFFS_LOWEST_SEQUENCE_NUMBER; ++ dev->seq_number = YAFFS_LOWEST_SEQUENCE_NUMBER; + + blockIndex = YMALLOC(nBlocks * sizeof(yaffs_BlockIndex)); + @@ -22938,38 +26176,38 @@ + + if (!blockIndex) { + T(YAFFS_TRACE_SCAN, -+ (TSTR("yaffs2_ScanBackwards() could not allocate block index!" TENDSTR))); ++ (TSTR("yaffs2_scan_backwards() could not allocate block index!" TENDSTR))); + return YAFFS_FAIL; + } + -+ dev->blocksInCheckpoint = 0; ++ dev->blocks_in_checkpt = 0; + -+ chunkData = yaffs_GetTempBuffer(dev, __LINE__); ++ chunkData = yaffs_get_temp_buffer(dev, __LINE__); + + /* Scan all the blocks to determine their state */ -+ bi = dev->blockInfo; -+ for (blk = dev->internalStartBlock; blk <= dev->internalEndBlock; blk++) { -+ yaffs_ClearChunkBits(dev, blk); -+ bi->pagesInUse = 0; -+ bi->softDeletions = 0; ++ bi = dev->block_info; ++ for (blk = dev->internal_start_block; blk <= dev->internal_end_block; blk++) { ++ yaffs_clear_chunk_bits(dev, blk); ++ bi->pages_in_use = 0; ++ bi->soft_del_pages = 0; + -+ yaffs_QueryInitialBlockState(dev, blk, &state, &sequenceNumber); ++ yaffs_query_init_block_state(dev, blk, &state, &seq_number); + -+ bi->blockState = state; -+ bi->sequenceNumber = sequenceNumber; ++ bi->block_state = state; ++ bi->seq_number = seq_number; + -+ if (bi->sequenceNumber == YAFFS_SEQUENCE_CHECKPOINT_DATA) -+ bi->blockState = state = YAFFS_BLOCK_STATE_CHECKPOINT; -+ if (bi->sequenceNumber == YAFFS_SEQUENCE_BAD_BLOCK) -+ bi->blockState = state = YAFFS_BLOCK_STATE_DEAD; ++ if (bi->seq_number == YAFFS_SEQUENCE_CHECKPOINT_DATA) ++ bi->block_state = state = YAFFS_BLOCK_STATE_CHECKPOINT; ++ if (bi->seq_number == YAFFS_SEQUENCE_BAD_BLOCK) ++ bi->block_state = state = YAFFS_BLOCK_STATE_DEAD; + + T(YAFFS_TRACE_SCAN_DEBUG, + (TSTR("Block scanning block %d state %d seq %d" TENDSTR), blk, -+ state, sequenceNumber)); ++ state, seq_number)); + + + if (state == YAFFS_BLOCK_STATE_CHECKPOINT) { -+ dev->blocksInCheckpoint++; ++ dev->blocks_in_checkpt++; + + } else if (state == YAFFS_BLOCK_STATE_DEAD) { + T(YAFFS_TRACE_BAD_BLOCKS, @@ -22977,27 +26215,27 @@ + } else if (state == YAFFS_BLOCK_STATE_EMPTY) { + T(YAFFS_TRACE_SCAN_DEBUG, + (TSTR("Block empty " TENDSTR))); -+ dev->nErasedBlocks++; -+ dev->nFreeChunks += dev->param.nChunksPerBlock; ++ dev->n_erased_blocks++; ++ dev->n_free_chunks += dev->param.chunks_per_block; + } else if (state == YAFFS_BLOCK_STATE_NEEDS_SCANNING) { + + /* Determine the highest sequence number */ -+ if (sequenceNumber >= YAFFS_LOWEST_SEQUENCE_NUMBER && -+ sequenceNumber < YAFFS_HIGHEST_SEQUENCE_NUMBER) { ++ if (seq_number >= YAFFS_LOWEST_SEQUENCE_NUMBER && ++ seq_number < YAFFS_HIGHEST_SEQUENCE_NUMBER) { + -+ blockIndex[nBlocksToScan].seq = sequenceNumber; ++ blockIndex[nBlocksToScan].seq = seq_number; + blockIndex[nBlocksToScan].block = blk; + + nBlocksToScan++; + -+ if (sequenceNumber >= dev->sequenceNumber) -+ dev->sequenceNumber = sequenceNumber; ++ if (seq_number >= dev->seq_number) ++ dev->seq_number = seq_number; + } else { + /* TODO: Nasty sequence number! */ + T(YAFFS_TRACE_SCAN, + (TSTR + ("Block scanning block %d has bad sequence number %d" -+ TENDSTR), blk, sequenceNumber)); ++ TENDSTR), blk, seq_number)); + + } + } @@ -23034,16 +26272,16 @@ + /* get the block to scan in the correct order */ + blk = blockIndex[blockIterator].block; + -+ bi = yaffs_GetBlockInfo(dev, blk); ++ bi = yaffs_get_block_info(dev, blk); + + -+ state = bi->blockState; ++ state = bi->block_state; + + deleted = 0; + + /* For each chunk in each block that needs scanning.... */ + foundChunksInBlock = 0; -+ for (c = dev->param.nChunksPerBlock - 1; ++ for (c = dev->param.chunks_per_block - 1; + !alloc_failed && c >= 0 && + (state == YAFFS_BLOCK_STATE_NEEDS_SCANNING || + state == YAFFS_BLOCK_STATE_ALLOCATING); c--) { @@ -23051,14 +26289,14 @@ + * Read the tags and decide what to do + */ + -+ chunk = blk * dev->param.nChunksPerBlock + c; ++ chunk = blk * dev->param.chunks_per_block + c; + -+ result = yaffs_ReadChunkWithTagsFromNAND(dev, chunk, NULL, ++ result = yaffs_rd_chunk_tags_nand(dev, chunk, NULL, + &tags); + + /* Let's have a good look at this chunk... */ + -+ if (!tags.chunkUsed) { ++ if (!tags.chunk_used) { + /* An unassigned chunk in the block. + * If there are used chunks after this one, then + * it is a chunk that was skipped due to failing the erased @@ -23073,11 +26311,11 @@ + } else if (c == 0) { + /* We're looking at the first chunk in the block so the block is unused */ + state = YAFFS_BLOCK_STATE_EMPTY; -+ dev->nErasedBlocks++; ++ dev->n_erased_blocks++; + } else { + if (state == YAFFS_BLOCK_STATE_NEEDS_SCANNING || + state == YAFFS_BLOCK_STATE_ALLOCATING) { -+ if (dev->sequenceNumber == bi->sequenceNumber) { ++ if (dev->seq_number == bi->seq_number) { + /* this is the block being allocated from */ + + T(YAFFS_TRACE_SCAN, @@ -23086,9 +26324,9 @@ + TENDSTR), blk, c)); + + state = YAFFS_BLOCK_STATE_ALLOCATING; -+ dev->allocationBlock = blk; -+ dev->allocationPage = c; -+ dev->allocationBlockFinder = blk; ++ dev->alloc_block = blk; ++ dev->alloc_page = c; ++ dev->alloc_block_finder = blk; + } else { + /* This is a partially written block that is not + * the current allocation block. @@ -23101,40 +26339,40 @@ + } + } + -+ dev->nFreeChunks++; ++ dev->n_free_chunks++; + -+ } else if (tags.eccResult == YAFFS_ECC_RESULT_UNFIXED) { ++ } else if (tags.ecc_result == YAFFS_ECC_RESULT_UNFIXED) { + T(YAFFS_TRACE_SCAN, + (TSTR(" Unfixed ECC in chunk(%d:%d), chunk ignored"TENDSTR), + blk, c)); + -+ dev->nFreeChunks++; ++ dev->n_free_chunks++; + -+ } else if (tags.objectId > YAFFS_MAX_OBJECT_ID || -+ tags.chunkId > YAFFS_MAX_CHUNK_ID || -+ (tags.chunkId > 0 && tags.byteCount > dev->nDataBytesPerChunk) || -+ tags.sequenceNumber != bi->sequenceNumber ) { ++ } else if (tags.obj_id > YAFFS_MAX_OBJECT_ID || ++ tags.chunk_id > YAFFS_MAX_CHUNK_ID || ++ (tags.chunk_id > 0 && tags.n_bytes > dev->data_bytes_per_chunk) || ++ tags.seq_number != bi->seq_number ) { + T(YAFFS_TRACE_SCAN, -+ (TSTR("Chunk (%d:%d) with bad tags:obj = %d, chunkId = %d, byteCount = %d, ignored"TENDSTR), -+ blk, c,tags.objectId, tags.chunkId, tags.byteCount)); ++ (TSTR("Chunk (%d:%d) with bad tags:obj = %d, chunk_id = %d, n_bytes = %d, ignored"TENDSTR), ++ blk, c,tags.obj_id, tags.chunk_id, tags.n_bytes)); + -+ dev->nFreeChunks++; ++ dev->n_free_chunks++; + -+ } else if (tags.chunkId > 0) { -+ /* chunkId > 0 so it is a data chunk... */ ++ } else if (tags.chunk_id > 0) { ++ /* chunk_id > 0 so it is a data chunk... */ + unsigned int endpos; + __u32 chunkBase = -+ (tags.chunkId - 1) * dev->nDataBytesPerChunk; ++ (tags.chunk_id - 1) * dev->data_bytes_per_chunk; + + foundChunksInBlock = 1; + + -+ yaffs_SetChunkBit(dev, blk, c); -+ bi->pagesInUse++; ++ yaffs_set_chunk_bit(dev, blk, c); ++ bi->pages_in_use++; + -+ in = yaffs_FindOrCreateObjectByNumber(dev, ++ in = yaffs_find_or_create_by_number(dev, + tags. -+ objectId, ++ obj_id, + YAFFS_OBJECT_TYPE_FILE); + if (!in) { + /* Out of memory */ @@ -23142,77 +26380,77 @@ + } + + if (in && -+ in->variantType == YAFFS_OBJECT_TYPE_FILE -+ && chunkBase < in->variant.fileVariant.shrinkSize) { ++ in->variant_type == YAFFS_OBJECT_TYPE_FILE ++ && chunkBase < in->variant.file_variant.shrink_size) { + /* This has not been invalidated by a resize */ -+ if (!yaffs_PutChunkIntoFile(in, tags.chunkId, chunk, -1)) { ++ if (!yaffs_put_chunk_in_file(in, tags.chunk_id, chunk, -1)) { + alloc_failed = 1; + } + + /* File size is calculated by looking at the data chunks if we have not + * seen an object header yet. Stop this practice once we find an object header. + */ -+ endpos = chunkBase + tags.byteCount; ++ endpos = chunkBase + tags.n_bytes; + + if (!in->valid && /* have not got an object header yet */ -+ in->variant.fileVariant.scannedFileSize < endpos) { -+ in->variant.fileVariant.scannedFileSize = endpos; -+ in->variant.fileVariant.fileSize = endpos; ++ in->variant.file_variant.scanned_size < endpos) { ++ in->variant.file_variant.scanned_size = endpos; ++ in->variant.file_variant.file_size = endpos; + } + + } else if (in) { + /* This chunk has been invalidated by a resize, or a past file deletion + * so delete the chunk*/ -+ yaffs_DeleteChunk(dev, chunk, 1, __LINE__); ++ yaffs_chunk_del(dev, chunk, 1, __LINE__); + + } + } else { -+ /* chunkId == 0, so it is an ObjectHeader. ++ /* chunk_id == 0, so it is an ObjectHeader. + * Thus, we read in the object header and make the object + */ + foundChunksInBlock = 1; + -+ yaffs_SetChunkBit(dev, blk, c); -+ bi->pagesInUse++; ++ yaffs_set_chunk_bit(dev, blk, c); ++ bi->pages_in_use++; + + oh = NULL; + in = NULL; + -+ if (tags.extraHeaderInfoAvailable) { -+ in = yaffs_FindOrCreateObjectByNumber(dev, -+ tags.objectId, -+ tags.extraObjectType); ++ if (tags.extra_available) { ++ in = yaffs_find_or_create_by_number(dev, ++ tags.obj_id, ++ tags.extra_obj_type); + if (!in) + alloc_failed = 1; + } + + if (!in || -+ (!in->valid && dev->param.disableLazyLoad) || -+ tags.extraShadows || ++ (!in->valid && dev->param.disable_lazy_load) || ++ tags.extra_shadows || + (!in->valid && -+ (tags.objectId == YAFFS_OBJECTID_ROOT || -+ tags.objectId == YAFFS_OBJECTID_LOSTNFOUND))) { ++ (tags.obj_id == YAFFS_OBJECTID_ROOT || ++ tags.obj_id == YAFFS_OBJECTID_LOSTNFOUND))) { + + /* If we don't have valid info then we need to read the chunk + * TODO In future we can probably defer reading the chunk and + * living with invalid data until needed. + */ + -+ result = yaffs_ReadChunkWithTagsFromNAND(dev, ++ result = yaffs_rd_chunk_tags_nand(dev, + chunk, + chunkData, + NULL); + -+ oh = (yaffs_ObjectHeader *) chunkData; ++ oh = (yaffs_obj_header *) chunkData; + -+ if (dev->param.inbandTags) { ++ if (dev->param.inband_tags) { + /* Fix up the header if they got corrupted by inband tags */ -+ oh->shadowsObject = oh->inbandShadowsObject; -+ oh->isShrink = oh->inbandIsShrink; ++ oh->shadows_obj = oh->inband_shadowed_obj_id; ++ oh->is_shrink = oh->inband_is_shrink; + } + + if (!in) { -+ in = yaffs_FindOrCreateObjectByNumber(dev, tags.objectId, oh->type); ++ in = yaffs_find_or_create_by_number(dev, tags.obj_id, oh->type); + if (!in) + alloc_failed = 1; + } @@ -23224,7 +26462,7 @@ + T(YAFFS_TRACE_ERROR, + (TSTR + ("yaffs tragedy: Could not make object for object %d at chunk %d during scan" -+ TENDSTR), tags.objectId, chunk)); ++ TENDSTR), tags.obj_id, chunk)); + continue; + } + @@ -23234,61 +26472,61 @@ + * we first have to suck out resize info if it is a file. + */ + -+ if ((in->variantType == YAFFS_OBJECT_TYPE_FILE) && ++ if ((in->variant_type == YAFFS_OBJECT_TYPE_FILE) && + ((oh && + oh->type == YAFFS_OBJECT_TYPE_FILE) || -+ (tags.extraHeaderInfoAvailable && -+ tags.extraObjectType == YAFFS_OBJECT_TYPE_FILE))) { ++ (tags.extra_available && ++ tags.extra_obj_type == YAFFS_OBJECT_TYPE_FILE))) { + __u32 thisSize = -+ (oh) ? oh->fileSize : tags. -+ extraFileLength; -+ __u32 parentObjectId = ++ (oh) ? oh->file_size : tags. ++ extra_length; ++ __u32 parent_obj_id = + (oh) ? oh-> -+ parentObjectId : tags. -+ extraParentObjectId; ++ parent_obj_id : tags. ++ extra_parent_id; + + -+ isShrink = -+ (oh) ? oh->isShrink : tags. -+ extraIsShrinkHeader; ++ is_shrink = ++ (oh) ? oh->is_shrink : tags. ++ extra_is_shrink; + + /* If it is deleted (unlinked at start also means deleted) + * we treat the file size as being zeroed at this point. + */ -+ if (parentObjectId == ++ if (parent_obj_id == + YAFFS_OBJECTID_DELETED -+ || parentObjectId == ++ || parent_obj_id == + YAFFS_OBJECTID_UNLINKED) { + thisSize = 0; -+ isShrink = 1; ++ is_shrink = 1; + } + -+ if (isShrink && in->variant.fileVariant.shrinkSize > thisSize) -+ in->variant.fileVariant.shrinkSize = thisSize; ++ if (is_shrink && in->variant.file_variant.shrink_size > thisSize) ++ in->variant.file_variant.shrink_size = thisSize; + -+ if (isShrink) -+ bi->hasShrinkHeader = 1; ++ if (is_shrink) ++ bi->has_shrink_hdr = 1; + + } + /* Use existing - destroy this one. */ -+ yaffs_DeleteChunk(dev, chunk, 1, __LINE__); ++ yaffs_chunk_del(dev, chunk, 1, __LINE__); + + } + -+ if (!in->valid && in->variantType != -+ (oh ? oh->type : tags.extraObjectType)) ++ if (!in->valid && in->variant_type != ++ (oh ? oh->type : tags.extra_obj_type)) + T(YAFFS_TRACE_ERROR, ( + TSTR("yaffs tragedy: Bad object type, " + TCONT("%d != %d, for object %d at chunk ") + TCONT("%d during scan") + TENDSTR), oh ? -+ oh->type : tags.extraObjectType, -+ in->variantType, tags.objectId, ++ oh->type : tags.extra_obj_type, ++ in->variant_type, tags.obj_id, + chunk)); + + if (!in->valid && -+ (tags.objectId == YAFFS_OBJECTID_ROOT || -+ tags.objectId == ++ (tags.obj_id == YAFFS_OBJECTID_ROOT || ++ tags.obj_id == + YAFFS_OBJECTID_LOSTNFOUND)) { + /* We only load some info, don't fiddle with directory structure */ + in->valid = 1; @@ -23311,22 +26549,22 @@ + in->yst_ctime = oh->yst_ctime; + in->yst_rdev = oh->yst_rdev; + -+ in->lazyLoaded = 0; ++ in->lazy_loaded = 0; + +#endif + } else -+ in->lazyLoaded = 1; ++ in->lazy_loaded = 1; + -+ in->hdrChunk = chunk; ++ in->hdr_chunk = chunk; + + } else if (!in->valid) { + /* we need to load this info */ + + in->valid = 1; -+ in->hdrChunk = chunk; ++ in->hdr_chunk = chunk; + + if (oh) { -+ in->variantType = oh->type; ++ in->variant_type = oh->type; + + in->yst_mode = oh->yst_mode; +#ifdef CONFIG_YAFFS_WINCE @@ -23345,34 +26583,34 @@ + in->yst_rdev = oh->yst_rdev; +#endif + -+ if (oh->shadowsObject > 0) -+ yaffs_HandleShadowedObject(dev, ++ if (oh->shadows_obj > 0) ++ yaffs_handle_shadowed_obj(dev, + oh-> -+ shadowsObject, ++ shadows_obj, + 1); + + + -+ yaffs_SetObjectNameFromOH(in, oh); ++ yaffs_set_obj_name_from_oh(in, oh); + parent = -+ yaffs_FindOrCreateObjectByNumber -+ (dev, oh->parentObjectId, ++ yaffs_find_or_create_by_number ++ (dev, oh->parent_obj_id, + YAFFS_OBJECT_TYPE_DIRECTORY); + -+ fileSize = oh->fileSize; -+ isShrink = oh->isShrink; -+ equivalentObjectId = oh->equivalentObjectId; ++ file_size = oh->file_size; ++ is_shrink = oh->is_shrink; ++ equiv_id = oh->equiv_id; + + } else { -+ in->variantType = tags.extraObjectType; ++ in->variant_type = tags.extra_obj_type; + parent = -+ yaffs_FindOrCreateObjectByNumber -+ (dev, tags.extraParentObjectId, ++ yaffs_find_or_create_by_number ++ (dev, tags.extra_parent_id, + YAFFS_OBJECT_TYPE_DIRECTORY); -+ fileSize = tags.extraFileLength; -+ isShrink = tags.extraIsShrinkHeader; -+ equivalentObjectId = tags.extraEquivalentObjectId; -+ in->lazyLoaded = 1; ++ file_size = tags.extra_length; ++ is_shrink = tags.extra_is_shrink; ++ equiv_id = tags.extra_equiv_id; ++ in->lazy_loaded = 1; + + } + in->dirty = 0; @@ -23384,15 +26622,15 @@ + * hook up to parent + */ + -+ if (parent && parent->variantType == ++ if (parent && parent->variant_type == + YAFFS_OBJECT_TYPE_UNKNOWN) { + /* Set up as a directory */ -+ parent->variantType = ++ parent->variant_type = + YAFFS_OBJECT_TYPE_DIRECTORY; + YINIT_LIST_HEAD(&parent->variant. -+ directoryVariant. ++ dir_variant. + children); -+ } else if (!parent || parent->variantType != ++ } else if (!parent || parent->variant_type != + YAFFS_OBJECT_TYPE_DIRECTORY) { + /* Hoosterman, another problem.... + * We're trying to use a non-directory as a directory @@ -23402,17 +26640,17 @@ + (TSTR + ("yaffs tragedy: attempting to use non-directory as a directory in scan. Put in lost+found." + TENDSTR))); -+ parent = dev->lostNFoundDir; ++ parent = dev->lost_n_found; + } + -+ yaffs_AddObjectToDirectory(parent, in); ++ yaffs_add_obj_to_dir(parent, in); + -+ itsUnlinked = (parent == dev->deletedDir) || -+ (parent == dev->unlinkedDir); ++ itsUnlinked = (parent == dev->del_dir) || ++ (parent == dev->unlinked_dir); + -+ if (isShrink) { ++ if (is_shrink) { + /* Mark the block as having a shrinkHeader */ -+ bi->hasShrinkHeader = 1; ++ bi->has_shrink_hdr = 1; + } + + /* Note re hardlinks. @@ -23422,35 +26660,35 @@ + * through this list and fix up all the chains. + */ + -+ switch (in->variantType) { ++ switch (in->variant_type) { + case YAFFS_OBJECT_TYPE_UNKNOWN: + /* Todo got a problem */ + break; + case YAFFS_OBJECT_TYPE_FILE: + -+ if (in->variant.fileVariant. -+ scannedFileSize < fileSize) { ++ if (in->variant.file_variant. ++ scanned_size < file_size) { + /* This covers the case where the file size is greater + * than where the data is + * This will happen if the file is resized to be larger + * than its current data extents. + */ -+ in->variant.fileVariant.fileSize = fileSize; -+ in->variant.fileVariant.scannedFileSize = fileSize; ++ in->variant.file_variant.file_size = file_size; ++ in->variant.file_variant.scanned_size = file_size; + } + -+ if (in->variant.fileVariant.shrinkSize > fileSize) -+ in->variant.fileVariant.shrinkSize = fileSize; ++ if (in->variant.file_variant.shrink_size > file_size) ++ in->variant.file_variant.shrink_size = file_size; + + + break; + case YAFFS_OBJECT_TYPE_HARDLINK: + if (!itsUnlinked) { -+ in->variant.hardLinkVariant.equivalentObjectId = -+ equivalentObjectId; -+ in->hardLinks.next = -+ (struct ylist_head *) hardList; -+ hardList = in; ++ in->variant.hardlink_variant.equiv_id = ++ equiv_id; ++ in->hard_links.next = ++ (struct ylist_head *) hard_list; ++ hard_list = in; + } + break; + case YAFFS_OBJECT_TYPE_DIRECTORY: @@ -23461,9 +26699,9 @@ + break; + case YAFFS_OBJECT_TYPE_SYMLINK: + if (oh) { -+ in->variant.symLinkVariant.alias = -+ yaffs_CloneString(oh->alias); -+ if (!in->variant.symLinkVariant.alias) ++ in->variant.symlink_variant.alias = ++ yaffs_clone_str(oh->alias); ++ if (!in->variant.symlink_variant.alias) + alloc_failed = 1; + } + break; @@ -23481,18 +26719,18 @@ + } + + -+ bi->blockState = state; ++ bi->block_state = state; + + /* Now let's see if it was dirty */ -+ if (bi->pagesInUse == 0 && -+ !bi->hasShrinkHeader && -+ bi->blockState == YAFFS_BLOCK_STATE_FULL) { -+ yaffs_BlockBecameDirty(dev, blk); ++ if (bi->pages_in_use == 0 && ++ !bi->has_shrink_hdr && ++ bi->block_state == YAFFS_BLOCK_STATE_FULL) { ++ yaffs_block_became_dirty(dev, blk); + } + + } + -+ yaffs_SkipRestOfBlock(dev); ++ yaffs_skip_rest_of_block(dev); + + if (altBlockIndex) + YFREE_ALT(blockIndex); @@ -23504,20 +26742,21 @@ + * We should now have scanned all the objects, now it's time to add these + * hardlinks. + */ -+ yaffs_HardlinkFixup(dev, hardList); ++ yaffs_link_fixup(dev, hard_list); + + -+ yaffs_ReleaseTempBuffer(dev, chunkData, __LINE__); ++ yaffs_release_temp_buffer(dev, chunkData, __LINE__); + + if (alloc_failed) + return YAFFS_FAIL; + -+ T(YAFFS_TRACE_SCAN, (TSTR("yaffs2_ScanBackwards ends" TENDSTR))); ++ T(YAFFS_TRACE_SCAN, (TSTR("yaffs2_scan_backwards ends" TENDSTR))); + + return YAFFS_OK; +} ---- /dev/null -+++ b/fs/yaffs2/yaffs_yaffs2.h +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yaffs_yaffs2.h linux-2.6.36-rc8.new/fs/yaffs2/yaffs_yaffs2.h +--- linux-2.6.36-rc8/fs/yaffs2/yaffs_yaffs2.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yaffs_yaffs2.h 2010-10-20 13:28:16.067000294 +0300 @@ -0,0 +1,36 @@ +/* + * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. @@ -23537,26 +26776,27 @@ + +#include "yaffs_guts.h" + -+void yaffs2_CalcOldestDirtySequence(yaffs_Device *dev); -+void yaffs2_FindOldestDirtySequence(yaffs_Device *dev); -+void yaffs2_ClearOldestDirtySequence(yaffs_Device *dev, yaffs_BlockInfo *bi); -+void yaffs2_UpdateOldestDirtySequence(yaffs_Device *dev, unsigned blockNo, yaffs_BlockInfo *bi); -+int yaffs2_BlockNotDisqualifiedFromGC(yaffs_Device *dev, yaffs_BlockInfo *bi); -+__u32 yaffs2_FindRefreshBlock(yaffs_Device *dev); -+int yaffs2_CheckpointRequired(yaffs_Device *dev); -+int yaffs2_CalcCheckpointBlocksRequired(yaffs_Device *dev); ++void yaffs_calc_oldest_dirty_seq(yaffs_dev_t *dev); ++void yaffs2_find_oldest_dirty_seq(yaffs_dev_t *dev); ++void yaffs2_clear_oldest_dirty_seq(yaffs_dev_t *dev, yaffs_block_info_t *bi); ++void yaffs2_update_oldest_dirty_seq(yaffs_dev_t *dev, unsigned block_no, yaffs_block_info_t *bi); ++int yaffs_block_ok_for_gc(yaffs_dev_t *dev, yaffs_block_info_t *bi); ++__u32 yaffs2_find_refresh_block(yaffs_dev_t *dev); ++int yaffs2_checkpt_required(yaffs_dev_t *dev); ++int yaffs_calc_checkpt_blocks_required(yaffs_dev_t *dev); + + -+void yaffs2_InvalidateCheckpoint(yaffs_Device *dev); -+int yaffs2_CheckpointSave(yaffs_Device *dev); -+int yaffs2_CheckpointRestore(yaffs_Device *dev); ++void yaffs2_checkpt_invalidate(yaffs_dev_t *dev); ++int yaffs2_checkpt_save(yaffs_dev_t *dev); ++int yaffs2_checkpt_restore(yaffs_dev_t *dev); + -+int yaffs2_HandleHole(yaffs_Object *obj, loff_t newSize); -+int yaffs2_ScanBackwards(yaffs_Device *dev); ++int yaffs2_handle_hole(yaffs_obj_t *obj, loff_t new_size); ++int yaffs2_scan_backwards(yaffs_dev_t *dev); + +#endif ---- a/fs/yaffs2/yportenv.h -+++ b/fs/yaffs2/yportenv.h +diff -Nrup linux-2.6.36-rc8/fs/yaffs2/yportenv.h linux-2.6.36-rc8.new/fs/yaffs2/yportenv.h +--- linux-2.6.36-rc8/fs/yaffs2/yportenv.h 2010-10-20 13:17:58.988000294 +0300 ++++ linux-2.6.36-rc8.new/fs/yaffs2/yportenv.h 2010-10-20 13:28:16.067000294 +0300 @@ -1,7 +1,7 @@ /* * YAFFS: Yet another Flash File System . A NAND-flash specific file system. @@ -23610,7 +26850,12 @@ #if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)) #define Y_CURRENT_TIME CURRENT_TIME.tv_sec -@@ -89,15 +91,10 @@ +@@ -85,19 +87,14 @@ + #define Y_TIME_CONVERT(x) (x) + #endif + +-#define yaffs_SumCompare(x, y) ((x) == (y)) ++#define yaffs_sum_cmp(x, y) ((x) == (y)) #define yaffs_strcmp(a, b) strcmp(a, b) #define TENDSTR "\n" @@ -23644,7 +26889,7 @@ #define yaffs_sprintf sprintf #define yaffs_toupper(a) toupper(a) -@@ -146,8 +142,8 @@ +@@ -146,10 +142,10 @@ #define YAFFS_LOSTNFOUND_PREFIX "obj" /* #define YPRINTF(x) printf x */ @@ -23653,8 +26898,11 @@ +#define YAFFS_ROOT_MODE 0755 +#define YAFFS_LOSTNFOUND_MODE 0700 - #define yaffs_SumCompare(x, y) ((x) == (y)) +-#define yaffs_SumCompare(x, y) ((x) == (y)) ++#define yaffs_sum_cmp(x, y) ((x) == (y)) #define yaffs_strcmp(a, b) strcmp(a, b) + + #else @@ -158,46 +154,180 @@ #endif