From 3f107ebf545c27322a15a458198a3cd5dbc876f3 Mon Sep 17 00:00:00 2001 From: charles Date: Sun, 9 Jun 2002 07:36:54 +0000 Subject: [PATCH] *** empty log message *** --- Documentation/taffs-todo.html | 34 ----- Documentation/yaffs-todo.html | 53 ++++++++ snMakefile | 2 +- yaffs_fs.c | 167 ++++++++++++++++++----- yaffs_guts.c | 242 ++++++++++++++++++++-------------- yaffs_guts.h | 6 +- yaffsdev | Bin 104490 -> 104883 bytes yaffsdev.c | 12 ++ yaffsdev.proj | Bin 28672 -> 36864 bytes 9 files changed, 349 insertions(+), 167 deletions(-) delete mode 100644 Documentation/taffs-todo.html create mode 100644 Documentation/yaffs-todo.html diff --git a/Documentation/taffs-todo.html b/Documentation/taffs-todo.html deleted file mode 100644 index 1a81f4c..0000000 --- a/Documentation/taffs-todo.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - -

YAFFS Todo

-
    -
  1. Locking

    -
  2. Fix statfs. df does not give correct results.

    -
  3. Fix disk full condition. -

    -
  4. ECC and write failure handling.

    -
  5. Add symlinks and links to VFS interface.

    -
  6. Add memory mapping (to allow file execution).

    -
  7. Test with nandemul mtd.

    -
  8. Discuss improved NAND page interface with mtd group.

    -
-

NANDEmul MTD

-
    -
  1. Complete and test.

    -
  2. -

    -
-



-

- - \ No newline at end of file diff --git a/Documentation/yaffs-todo.html b/Documentation/yaffs-todo.html new file mode 100644 index 0000000..8489d72 --- /dev/null +++ b/Documentation/yaffs-todo.html @@ -0,0 +1,53 @@ + + + + + + + + + + + + +

YAFFS Todo as at 08/06/2002

+

Stuff not yet done

+
    +
  1. Directory locking during directory walk.

    +
  2. Other locking....

    +
  3. Test disk full condition. Might not be being handled + correctly.

    +
  4. Add write memory mapping. We probably need this to support + loop mounting.

    +
+

Recently done with no known problems (ie. probably needs +significant testing)

+
    +
  1. ECC and write failure handling.

    +
  2. Added symlinks and hard links to VFS interface.

    +
  3. Fixed problem with persistence. Object header was not being + updated at end of write and the file size was getting corrupted.

    +
  4. Fixed problem where obsoleted object headers were not being + deleted on NAND. This caused multiple file entries. Looks like it is + working properly now.

    +
  5. Read memory mapping. Can now execute a file from yaffs.

    +
  6. We now mark a chunk as deleted by marking the OOB data + validity flag. Before this we just stomped on the tags, which was + mot such a good thing to do with newer NANDs which do not like this + sort of thing.

    +
+

Done, but currently known to be broken

+
    +

    nothing.

    +
+

Longer term stuff to do

+
    +
  1. Discuss improved NAND page interface with mtd group. This has + actually started.

    +
  2. Pull out all YAFFS_OK and YAFFS_FAIL style errors and return + with -ENOMEM style error messages.

    +
+



+

+ + \ No newline at end of file diff --git a/snMakefile b/snMakefile index d7f5966..0872820 100644 --- a/snMakefile +++ b/snMakefile @@ -1,6 +1,6 @@ ######################################################### # Makefile auto generated by Cygnus Source Navigator. -# Target: yaffsdev_disk Date: May 29 2002 Time: 08:12:41 PM +# Target: yaffsdev_disk Date: Jun 05 2002 Time: 02:41:55 PM # diff --git a/yaffs_fs.c b/yaffs_fs.c index c3f57d7..6a2ddb3 100644 --- a/yaffs_fs.c +++ b/yaffs_fs.c @@ -83,11 +83,18 @@ static int yaffs_statfs(struct super_block *sb, struct statfs *buf); static void yaffs_read_inode (struct inode *inode); static struct super_block *yaffs_read_super(struct super_block * sb, void * data, int silent); static void yaffs_put_inode (struct inode *inode); +static int yaffs_readpage(struct file *file, struct page * page); -//static int yaffs_readpage(struct file*,struct page * -static struct address_space_operations yaffs_address_ops = { -// readpage: yaffs_readpage, +static int yaffs_readlink(struct dentry *dentry, char *buffer, int buflen); +static int yaffs_follow_link(struct dentry *dentry, struct nameidata *nd); + + + + + +static struct address_space_operations yaffs_file_address_operations = { + readpage: yaffs_readpage, // prepare_write: yaffs_prepare_write, // commit_write: yaffs_commit_write }; @@ -96,7 +103,7 @@ static struct address_space_operations yaffs_address_ops = { static struct file_operations yaffs_file_operations = { read: yaffs_file_read, write: yaffs_file_write, -// mmap: generic_file_mmap, + mmap: generic_file_mmap, fsync: yaffs_sync_object, }; @@ -106,11 +113,11 @@ static struct inode_operations yaffs_file_inode_operations = { }; - -static struct file_operations yaffs_dir_operations = { - read: generic_read_dir, - readdir: yaffs_readdir, - fsync: yaffs_sync_object, +struct inode_operations yaffs_symlink_inode_operations = +{ + readlink: yaffs_readlink, + follow_link: yaffs_follow_link, + setattr: yaffs_setattr }; static struct inode_operations yaffs_dir_inode_operations = { @@ -126,6 +133,13 @@ static struct inode_operations yaffs_dir_inode_operations = { setattr: yaffs_setattr, }; +static struct file_operations yaffs_dir_operations = { + read: generic_read_dir, + readdir: yaffs_readdir, + fsync: yaffs_sync_object, +}; + + static struct super_operations yaffs_super_ops = { statfs: yaffs_statfs, read_inode: yaffs_read_inode, @@ -137,6 +151,39 @@ static struct super_operations yaffs_super_ops = { }; + + + +static int yaffs_readlink(struct dentry *dentry, char *buffer, int buflen) +{ + unsigned char *alias; + int ret; + + alias = yaffs_GetSymlinkAlias(yaffs_DentryToObject(dentry)); + + if(!alias) + return -ENOMEM; + + ret = vfs_readlink(dentry, buffer, buflen, alias); + kfree(alias); + return ret; +} + +static int yaffs_follow_link(struct dentry *dentry, struct nameidata *nd) +{ + unsigned char *alias; + int ret; + alias = yaffs_GetSymlinkAlias(yaffs_DentryToObject(dentry)); + + if(!alias) + return -ENOMEM; + + ret = vfs_follow_link(nd,alias); + kfree(alias); + return ret; +} + + struct inode *yaffs_get_inode(struct super_block *sb, int mode, int dev,yaffs_Object *obj); /* @@ -152,6 +199,8 @@ static struct dentry * yaffs_lookup(struct inode *dir, struct dentry *dentry) obj = yaffs_FindObjectByName(yaffs_InodeToObject(dir),dentry->d_name.name); + obj = yaffs_GetEquivalentObject(obj); // in case it was a hardlink + if(obj) { T((KERN_DEBUG"yaffs_lookup found %d\n",obj->objectId)); @@ -185,15 +234,52 @@ static void yaffs_put_inode(struct inode *inode) } -#ifdef YAFFS_ADDRESS_OPS -static int yaffs_readpage(struct file *file, struct page * page) + + +static int yaffs_readpage(struct file *f, struct page * pg) { - T((KERN_DEBUG"yaffs_readpage\n")); + struct yaffs_Object *obj; + unsigned char *pg_buf; + int ret; + + T((KERN_DEBUG"yaffs_readpage at %08x, size %08x\n", + pg->index << PAGE_CACHE_SHIFT, PAGE_CACHE_SIZE)); - // TODO - return 0; + obj = yaffs_DentryToObject(f->f_dentry); + + //down(obj->sem); + + if (!PageLocked(pg)) + PAGE_BUG(pg); + + pg_buf = kmap(pg); + /* FIXME: Can kmap fail? */ + + ret = yaffs_ReadDataFromFile(obj,pg_buf, pg->index << PAGE_CACHE_SHIFT, PAGE_CACHE_SIZE); + + if(ret >= 0) ret = 0; + + if (ret) { + ClearPageUptodate(pg); + SetPageError(pg); + } else { + SetPageUptodate(pg); + ClearPageError(pg); + } + + flush_dcache_page(pg); + kunmap(pg); + + UnlockPage(pg); + + //up(&obj->sem); + + T((KERN_DEBUG"yaffs_readpage done\n")); + return ret; } +#ifdef YAFFS_ADDRESS_OPS + static int yaffs_prepare_write(struct file *file, struct page *page, unsigned offset, unsigned to) { T((KERN_DEBUG"yaffs_prepare_write\n")); @@ -227,7 +313,6 @@ static void yaffs_FillInodeFromObject(struct inode *inode, yaffs_Object *obj) inode->i_blksize = YAFFS_BYTES_PER_CHUNK; inode->i_blocks = 0; inode->i_rdev = NODEV; - inode->i_mapping->a_ops = &yaffs_address_ops; inode->i_atime = obj->st_atime; inode->i_mtime = obj->st_mtime; inode->i_ctime = obj->st_ctime; @@ -240,18 +325,19 @@ static void yaffs_FillInodeFromObject(struct inode *inode, yaffs_Object *obj) switch (obj->st_mode & S_IFMT) { default: - // init_special_inode(inode, mode, dev); + // init_special_inode(inode, mode, dev); break; case S_IFREG: // file inode->i_op = &yaffs_file_inode_operations; inode->i_fop = &yaffs_file_operations; + inode->i_mapping->a_ops = &yaffs_file_address_operations; break; case S_IFDIR: // directory inode->i_op = &yaffs_dir_inode_operations; inode->i_fop = &yaffs_dir_operations; break; case S_IFLNK: // symlink - inode->i_op = &page_symlink_inode_operations; + inode->i_op = &yaffs_symlink_inode_operations; break; } @@ -458,16 +544,13 @@ static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode, int d break; case S_IFLNK: // symlink T((KERN_DEBUG"yaffs_mknod: making file\n")); - obj = NULL; // Todo + obj = NULL; // Do we ever get here? break; } if(obj) { inode = yaffs_get_inode(dir->i_sb, mode, dev, obj); - -// did not fix dir bug if((mode & S_IFMT) == S_IFDIR) atomic_inc(&inode->i_count); - d_instantiate(dentry, inode); T((KERN_DEBUG"yaffs_mknod created object %d count = %d\n",obj->objectId,atomic_read(&inode->i_count))); error = 0; @@ -521,36 +604,52 @@ static int yaffs_unlink(struct inode * dir, struct dentry *dentry) /* - * Link a file.. + * Create a link... */ static int yaffs_link(struct dentry *old_dentry, struct inode * dir, struct dentry * dentry) { struct inode *inode = old_dentry->d_inode; + yaffs_Object *obj = NULL; + yaffs_Object *link=NULL; T((KERN_DEBUG"yaffs_link\n")); - return -EPERM; //Todo + obj = yaffs_InodeToObject(inode); - - if (S_ISDIR(inode->i_mode)) - return -EPERM; - - - return 0; + link = yaffs_Link(yaffs_InodeToObject(dir),dentry->d_name.name,obj); + + if(link) + { + return 0; + } + + + return -EPERM; } static int yaffs_symlink(struct inode * dir, struct dentry *dentry, const char * symname) { - int error; + yaffs_Object *obj; T((KERN_DEBUG"yaffs_symlink\n")); - - return -ENOMEM; //Todo + obj = yaffs_MknodSymLink(yaffs_InodeToObject(dir), dentry->d_name.name, + S_IFLNK | S_IRWXUGO, current->uid, current->gid, + symname); - error = yaffs_mknod(dir, dentry, S_IFLNK | S_IRWXUGO, 0); - return error; + if(obj) + { + T((KERN_DEBUG"symlink created OK\n")); + return 0; + } + else + { + T((KERN_DEBUG"symlink not created\n")); + + } + + return -ENOMEM; } static int yaffs_sync_object(struct file * file, struct dentry *dentry, int datasync) diff --git a/yaffs_guts.c b/yaffs_guts.c index 88b02a3..4c7e81a 100644 --- a/yaffs_guts.c +++ b/yaffs_guts.c @@ -75,7 +75,6 @@ static int yaffs_UpdateObjectHeader(yaffs_Object *in,const char *name); static void yaffs_DeleteChunk(yaffs_Device *dev,int chunkId); static void yaffs_RemoveObjectFromDirectory(yaffs_Object *obj); static int yaffs_CheckStructures(void); -static yaffs_Object *yaffs_GetEquivalentObject(yaffs_Object *obj); loff_t yaffs_GetFileSize(yaffs_Object *obj); @@ -1127,6 +1126,12 @@ yaffs_Object *yaffs_MknodObject( yaffs_ObjectType type, 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; + } + in = yaffs_CreateNewObject(dev,-1,type); if(in) @@ -1221,7 +1226,10 @@ static int yaffs_ChangeObjectName(yaffs_Object *obj, yaffs_Object *newDir, const obj->dirty = 1; yaffs_AddObjectToDirectory(newDir,obj); - return yaffs_UpdateObjectHeader(obj,newName); + if(yaffs_UpdateObjectHeader(obj,newName) >= 0) + { + return YAFFS_OK; + } } return YAFFS_FAIL; @@ -1631,6 +1639,7 @@ static int yaffs_ReadChunkTagsFromNAND(yaffs_Device *dev,int chunkInNAND, yaffs_ return YAFFS_OK; } +#if 0 static int yaffs_WriteChunkWithTagsToNAND(yaffs_Device *dev,int chunkInNAND, const __u8 *buffer, yaffs_Tags *tags) { // NB There must be tags, data is optional @@ -1656,6 +1665,8 @@ static int yaffs_WriteChunkWithTagsToNAND(yaffs_Device *dev,int chunkInNAND, con return yaffs_WriteChunkToNAND(dev,chunkInNAND,buffer,&spare); } +#endif + static int yaffs_WriteNewChunkWithTagsToNAND(yaffs_Device *dev, const __u8 *buffer, yaffs_Tags *tags, int useReserve) { @@ -1921,18 +1932,18 @@ static void yaffs_DeleteChunk(yaffs_Device *dev,int chunkId) { int block = chunkId / YAFFS_CHUNKS_PER_BLOCK; int page = chunkId % YAFFS_CHUNKS_PER_BLOCK; - yaffs_Tags tags; + yaffs_Spare spare; + + yaffs_SpareInitialise(&spare); - // Mark the deleted NAND page as deleted - tags.chunkId = 0; - tags.objectId = 0; - tags.byteCount = 0; - tags.ecc = 0; + spare.pageStatus = 0; // To mark it as deleted. + - yaffs_WriteChunkWithTagsToNAND(dev,chunkId,NULL,&tags); + yaffs_WriteChunkToNAND(dev,chunkId,NULL,&spare); // Pull out of the management area. + // If the whole block became dirty, this will kick off an erasure. if( dev->blockInfo[block].blockState == YAFFS_BLOCK_STATE_ALLOCATING || dev->blockInfo[block].blockState == YAFFS_BLOCK_STATE_FULL) { @@ -2573,12 +2584,14 @@ static int yaffs_UnlinkWorker(yaffs_Object *obj) char name[YAFFS_MAX_NAME_LENGTH+1]; hl = list_entry(obj->hardLinks.next,yaffs_Object,hardLinks); + list_del_init(&hl->hardLinks); list_del_init(&hl->siblings); yaffs_GetObjectName(hl,name,YAFFS_MAX_NAME_LENGTH+1); retVal = yaffs_ChangeObjectName(obj, hl->parent, name); + if(retVal == YAFFS_OK) { retVal = yaffs_DoGenericObjectDeletion(hl); @@ -2636,12 +2649,12 @@ static int yaffs_Scan(yaffs_Device *dev) int chunk; int c; int deleted; - int inuse; yaffs_BlockState state; yaffs_Object *hardList = NULL; yaffs_Object *hl; - __u32 pageBits; +// int inuse; +// __u32 pageBits; yaffs_ObjectHeader *oh; yaffs_Object *in; @@ -2649,18 +2662,24 @@ static int yaffs_Scan(yaffs_Device *dev) __u8 chunkData[YAFFS_BYTES_PER_CHUNK]; + + // Scan all the blocks... + for(blk = dev->startBlock; blk <= dev->endBlock; blk++) { deleted = 0; - pageBits = 0; - inuse = 0; - state = YAFFS_BLOCK_STATE_UNKNOWN; + dev->blockInfo[blk].pageBits = 0; + dev->blockInfo[blk].pagesInUse = 0; + state = YAFFS_BLOCK_STATE_SCANNING; + + // Read each chunk in the block. for(c = 0; c < YAFFS_CHUNKS_PER_BLOCK && - state == YAFFS_BLOCK_STATE_UNKNOWN; c++) + state == YAFFS_BLOCK_STATE_SCANNING; c++) { // Read the spare area and decide what to do chunk = blk * YAFFS_CHUNKS_PER_BLOCK + c; + yaffs_ReadChunkFromNAND(dev,chunk,NULL,&spare); @@ -2670,7 +2689,14 @@ static int yaffs_Scan(yaffs_Device *dev) // This block looks ok, now what's in this chunk? yaffs_GetTagsFromSpare(&spare,&tags); - if(tags.objectId == YAFFS_UNUSED_OBJECT_ID) + if(yaffs_countBits[spare.pageStatus] < 6) + { + // A deleted chunk + deleted++; + dev->nFreeChunks ++; + T((" %d %d deleted\n",blk,c)); + } + else if(tags.objectId == YAFFS_UNUSED_OBJECT_ID) { // An unassigned chunk in the block // This means that either the block is empty or @@ -2693,20 +2719,14 @@ static int yaffs_Scan(yaffs_Device *dev) dev->nFreeChunks += (YAFFS_CHUNKS_PER_BLOCK - c); } - else if(tags.objectId == 0) - { - // A deleted chunk - deleted++; - dev->nFreeChunks ++; - T((" %d %d deleted\n",blk,c)); - } else if(tags.chunkId > 0) { // A data chunk. - inuse++; - pageBits |= ( 1 <blockInfo[blk].pageBits |= (1 << c); + dev->blockInfo[blk].pagesInUse++; + in = yaffs_FindOrCreateObjectByNumber(dev,tags.objectId,YAFFS_OBJECT_TYPE_FILE); - // PutChuunkIntoFIle checks for a clash (two data chunks with + // PutChunkIntoFIle checks for a clash (two data chunks with // the same chunkId). yaffs_PutChunkIntoFile(in,tags.chunkId,chunk,1); T((" %d %d data %d %d\n",blk,c,tags.objectId,tags.chunkId)); @@ -2714,78 +2734,99 @@ static int yaffs_Scan(yaffs_Device *dev) else { // chunkId == 0, so it is an ObjectHeader. - inuse++; - pageBits |= ( 1 <blockInfo[blk].pageBits |= (1 << c); + dev->blockInfo[blk].pagesInUse++; + yaffs_ReadChunkFromNAND(dev,chunk,chunkData,NULL); + oh = (yaffs_ObjectHeader *)chunkData; in = yaffs_FindOrCreateObjectByNumber(dev,tags.objectId,oh->type); + if(in->valid) { - // todo we have already filled this one. We have - // a duplicate. Need to fix + // We have already filled this one. We have a duplicate and need to resolve it. + + unsigned existingSerial = in->serial; + unsigned newSerial = tags.serialNumber; + + if(((existingSerial+1) & 3) == newSerial) + { + // Use new one - destroy the exisiting one + yaffs_DeleteChunk(dev,in->chunkId); + in->valid = 0; + } + else + { + // Use existing - destroy this one. + yaffs_DeleteChunk(dev,chunk); + } } - // we don't have a duplicate... + if(!in->valid) + { + // we need to load this info - in->valid = 1; - in->variantType = oh->type; - - in->st_mode = oh->st_mode; - in->st_uid = oh->st_uid; - in->st_gid = oh->st_gid; - in->st_atime = oh->st_atime; - in->st_mtime = oh->st_mtime; - in->st_ctime = oh->st_ctime; - in->chunkId = chunk; - - in->sum = oh->sum; - in->dirty = 0; + in->valid = 1; + in->variantType = oh->type; + + in->st_mode = oh->st_mode; + in->st_uid = oh->st_uid; + in->st_gid = oh->st_gid; + in->st_atime = oh->st_atime; + in->st_mtime = oh->st_mtime; + in->st_ctime = oh->st_ctime; + in->chunkId = chunk; + + in->sum = oh->sum; + in->dirty = 0; - // directory stuff... - // hook up to parent - - parent = yaffs_FindOrCreateObjectByNumber(dev,oh->parentObjectId,YAFFS_OBJECT_TYPE_DIRECTORY); - if(parent->variantType == YAFFS_OBJECT_TYPE_UNKNOWN) - { - // Set up as a directory - parent->variantType = YAFFS_OBJECT_TYPE_DIRECTORY; - INIT_LIST_HEAD(&parent->variant.directoryVariant.children); - } - else if(parent->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) - { - // Hoosterman, another problem.... - // We're trying to use a non-directory as a directory - // Todo ... handle - } + // directory stuff... + // hook up to parent + + parent = yaffs_FindOrCreateObjectByNumber(dev,oh->parentObjectId,YAFFS_OBJECT_TYPE_DIRECTORY); + if(parent->variantType == YAFFS_OBJECT_TYPE_UNKNOWN) + { + // Set up as a directory + parent->variantType = YAFFS_OBJECT_TYPE_DIRECTORY; + INIT_LIST_HEAD(&parent->variant.directoryVariant.children); + } + else if(parent->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) + { + // Hoosterman, another problem.... + // We're trying to use a non-directory as a directory + // Todo ... handle + } - yaffs_AddObjectToDirectory(parent,in); + yaffs_AddObjectToDirectory(parent,in); - // 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. - - switch(in->variantType) - { - case YAFFS_OBJECT_TYPE_UNKNOWN: // Todo got a problem - break; - case YAFFS_OBJECT_TYPE_FILE: - in->variant.fileVariant.fileSize = oh->fileSize; - break; - case YAFFS_OBJECT_TYPE_HARDLINK: - in->variant.hardLinkVariant.equivalentObjectId = oh->equivalentObjectId; - (yaffs_Object *)(in->hardLinks.next) = hardList; - hardList = in; - break; - case YAFFS_OBJECT_TYPE_DIRECTORY: // Do nothing - break; - case YAFFS_OBJECT_TYPE_SYMLINK: // Do nothing - in->variant.symLinkVariant.alias = yaffs_CloneString(oh->alias); - break; + // 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. + + switch(in->variantType) + { + case YAFFS_OBJECT_TYPE_UNKNOWN: // Todo got a problem + break; + case YAFFS_OBJECT_TYPE_FILE: + in->variant.fileVariant.fileSize = oh->fileSize; + break; + case YAFFS_OBJECT_TYPE_HARDLINK: + in->variant.hardLinkVariant.equivalentObjectId = oh->equivalentObjectId; + (yaffs_Object *)(in->hardLinks.next) = hardList; + hardList = in; + break; + case YAFFS_OBJECT_TYPE_DIRECTORY: // Do nothing + break; + case YAFFS_OBJECT_TYPE_SYMLINK: // Do nothing + in->variant.symLinkVariant.alias = yaffs_CloneString(oh->alias); + break; + } + T((" %d %d header %d \"%s\" type %d\n",blk,c,tags.objectId,oh->name,in->variantType)); } - T((" %d %d header %d \"%s\" type %d\n",blk,c,tags.objectId,oh->name,in->variantType)); } } else @@ -2795,21 +2836,26 @@ static int yaffs_Scan(yaffs_Device *dev) } } - if(state == YAFFS_BLOCK_STATE_UNKNOWN) + if(state == YAFFS_BLOCK_STATE_SCANNING) { - // If we got this far, then the block is fully allocated. - // ie. Full or Dirty - state = (inuse) ? YAFFS_BLOCK_STATE_FULL : YAFFS_BLOCK_STATE_DIRTY; - + // If we got this far while scanning, then the block is fully allocated. + state = YAFFS_BLOCK_STATE_FULL; } - dev->blockInfo[blk].pageBits = pageBits; - dev->blockInfo[blk].pagesInUse = inuse; dev->blockInfo[blk].blockState = state; + // Now let's see if it was dirty + if( dev->blockInfo[blk].pagesInUse == 0 && + dev->blockInfo[blk].blockState == YAFFS_BLOCK_STATE_FULL) + { + yaffs_BlockBecameDirty(dev,blk); + } + } - // Todo fix up the hard link chains + // Fix up the hard link chains. + // We should now have scanned all the objects, now it's time to add these + // hardlinks. while(hardList) { hl = hardList; @@ -2819,12 +2865,14 @@ static int yaffs_Scan(yaffs_Device *dev) if(in) { + // Add the hardlink pointers hl->variant.hardLinkVariant.equivalentObject=in; list_add(&hl->hardLinks,&in->hardLinks); } else { - //Todo Need to report this better. + //Todo Need to report/handle this better. + // Got a problem... hardlink to a non-existant object hl->variant.hardLinkVariant.equivalentObject=NULL; INIT_LIST_HEAD(&hl->hardLinks); @@ -2930,7 +2978,7 @@ int yaffs_ApplyToDirectoryChildren(yaffs_Object *theDir,int (*fn)(yaffs_Object * // GetEquivalentObject dereferences any hard links to get to the // actual object. -static yaffs_Object *yaffs_GetEquivalentObject(yaffs_Object *obj) +yaffs_Object *yaffs_GetEquivalentObject(yaffs_Object *obj) { if(obj && obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK) { @@ -3092,8 +3140,8 @@ int yaffs_DumpObject(yaffs_Object *obj) yaffs_GetObjectName(obj,name,256); - YPRINTF(("Object %d \"%s\"\n dirty %d valid %d serial %d sum %d chunk %d type %d size %d\n", - yaffs_GetObjectInode(obj), name, obj->dirty, obj->valid, obj->serial, + YPRINTF(("Object %d, inode %d \"%s\"\n dirty %d valid %d serial %d sum %d chunk %d type %d size %d\n", + obj->objectId,yaffs_GetObjectInode(obj), name, obj->dirty, obj->valid, obj->serial, obj->sum, obj->chunkId, yaffs_GetObjectType(obj), yaffs_GetObjectFileLength(obj))); #if 0 diff --git a/yaffs_guts.h b/yaffs_guts.h index 7b059aa..3ae36e7 100644 --- a/yaffs_guts.h +++ b/yaffs_guts.h @@ -108,7 +108,9 @@ typedef struct // Block data in RAM typedef enum { - YAFFS_BLOCK_STATE_UNKNOWN = 0, + YAFFS_BLOCK_STATE_UddNKNOWN = 0, + YAFFS_BLOCK_STATE_SCANNING, // Used while the block is being scanned. + // NB Don't erase blocks while they're being scanned YAFFS_BLOCK_STATE_EMPTY, // This block is empty @@ -420,6 +422,8 @@ yaffs_Object *yaffs_FindObjectByNumber(yaffs_Device *dev,int number); // Link operations yaffs_Object *yaffs_Link(yaffs_Object *parent, const char *name, yaffs_Object *equivalentObject); +yaffs_Object *yaffs_GetEquivalentObject(yaffs_Object *obj); + // Symlink operations yaffs_Object *yaffs_MknodSymLink(yaffs_Object *parent, const char *name, __u32 mode, __u32 uid, __u32 gid, const char *alias); char *yaffs_GetSymlinkAlias(yaffs_Object *obj); diff --git a/yaffsdev b/yaffsdev index 70d4cc2136bc2f54eedded57b3a4a67290d7ee49..14777893ae8c047ed075a43b3ff7bbfad91a2087 100755 GIT binary patch delta 34943 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

5Fm1NLK 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 VbG|aqo%2sbDYvWR66LD*{{eJw)pY;> delta 35003 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 z zdmivE!aco(fDaSyH*3>dSY4-6J0FIJSKkp&HrG(SG z2LbcPNC$ZL0mh%mM%X~_Zom}@5B6@svs4&O$CLn{setQ3F8r#?SLKYRhXCiX7#~ix z+sAWkPqo#2SPm0B@$Ivx+BjbY&IW!RU$Ve;efGLk-)Ej(an(%pK|Pe<_O)-8iP0cD zGYut!8u?a&LEMNWG6=Z^;wkWeRnBBV3fckoQuYGrd$YAz@~ zyOqgO1+9Jdq~6|VKl{_s*BG@!f(OE-R;Kvu)i>2Qk|a?0U#`Fp z`rZ||ukRayJNm8&JlJ&Dr@A1?W6oNuV$kFVjw6EwH|Q6H|t+{DLx{AXhLXaqh@nZPFds(fI@#4}P%OqR@= z;xorSR5{I8NmMi4S5x5UeDNkmvoTg0kp7vzc0&IPq(2q-dF+KS#YcZm`0T}frd07P zDOO(e*_)4uufADXkj?RR7I>a7Mc^z6zvSy9_}RWE3HL?E=J>1=30zb1% zHf-?O&tq-&*&CQQeAWRPydGu`LxBhxvDKIMq1CNhBqO#;Mr@Oe*y$@LD%<62DDX}x z^7i;T34T6BVII^KVcRIcHji^7vE7WYCO-wjJIIs+zLmn1{gNpMBvTGbro1cp<2~Pf zW|bIK_26@cbRO{?6gm$}I*&*?kA@|s$0VgEd_6=vPD;*vUm8KDq?zWlFI~u=^*v=` zGzcz*vLDExbH0Y>EPsD!8bmw2bCN|LNd|o^8B{3s`gzI8Ukc-}vVriy7d9oZZ+x>v zWnWWealp@GUrST&H$Lky17ZHHRPlGd@}LM4Jklo3G2i>_&GRKuF}!ue2YY!+LH2`K zSc2?7z7>N1lW(`cSA7L0t{7z3eD4F%0<4RG5$5wuR|DbB)Q(?#!H+Dbl~6l|Qaehd zcKjmw@4D2C8&bgD^wkm7-}1E(__nXRz<0z*fghH2@!8jxN`21@p+BXi z4460Ly4j52&w+AJQZpQWd>!m|qiM9(DBW+bZeG8&WWrC!{EdaS3jUq~SM-k-xS{_$ zfs_1~0rQDQ^W#Lrk8)1q`=6_aF%J`l#TEF>COcaA3qQ7wRLOoF1t7siEo-p>+|F$fl6_4mUHM+ts3<&OwF*gs$3 zA^xQTKjdF6@FV{90zc~CD)4aset}2$PgsEs>!QC-##r(^UnjBHQ?z;4c5|+YwDXw0LB~Ly9nQJEGW=ABcg&Ew<2k82p7&P~hQ1($&Mbej$;a+)37;=Wf7riB=zmetA8sjC5RodF z>$k7a%=0$|MWtkP#BW{^`vo=y(=n=+`wxL?tThN2zcIn38A;n(zcn(^ta9+VkIKH{ zKPSvuFPZgNXC-uG37>sXbKclf$_Al=X$krGfC-l zEC>Y_8DCs)UVkmg%%DQ}A6Ac>p)Djihm9o3q+dIlk`ZQYp->V(M@TY<%>&6HM)t4G zJ3LJ~7gD_-KvEbIg(UenTMd#w1BPD>Qj_)X39e|U-o?=l@&J|81 z<&|d`w{CPO#|um()0-OYZ`P?%3WDQcV>1R+AnpqaI5s*wa|_<5`{b=U@RnhC?dpDI zXnyD4?pNzS4I=UM(>OS^5ax5{QmVTdso7+#x|3P;0B|C#IlafRfN(P78{6RBK>0Hy z-;?eB3||$SKl<*YN*7+D7roh%m*@>|wzQsfdywH(cK+jsJ`4|^-;>t9EEX_(&iM29 zX64I2hc3ur#pme_vAEf`5jE>*ElC1ivU__GOum*cie8n9UZrkj)eLGqz6P^K7fY zU$A!s{)(Lw_-po!z~8aIImUIUm|2Gt*s8Gh<|u=gqOpeszRJc4{4-l7@HO_9z`w9# z0{_ZB75E1GRp7sws#y&#W0f@YKcpb+%Q}h-MHwZqs=OqyrtB2hsT>yAt$Zu6uKXde zN5Q`d$@Tk`1_Jw)kcGpnoHE2B;N_fC1r8|71+J)U6u7c-RN$)0cLK*KzX%+sSlcXo zTWC#lzYt`#l~jS_m63qMd{ix>QB?ejis9uQexK}RRtT7n)Z97@ukYaBHHL>+8UCe-X@u7@{G%2y zY_lg$-&SP~ITm{yc*jlE7<_pAm4HVrPhyNVR@#ewUhLY)-H-YHFQ;8GWB3%5WfXR z$FuuPE}vmPgod&4PmiD0>Dnas_yi?6cgJ#2 z+F@+N6JKTE0W!FT^}fqb3k_n8IxyMecROzv>VcO3+La7^xe z#PsLRpUiy=%N@D{KLvjhY{=a>8>%kBas|Z8{b!Z}zmJ5xletN=m3q#3f5Fc+at8oZ zyG_fTK3hpt8%)oA6~3L{PFL7fuAykQ5-2wfo(YJDvsW!poSFN_Y^A1iU;1l&qN6QQa2?O^=4hHd3Ezc7gHzEAYzZ{y^g&??!pde+<5pU*fb1 z8;&VJTZSso%kzLhAx)` z0u-^pqGTC>(aSl0csI0}3166xXONynxu4BZno+|v;G_2*1wOvW|4X3JkTF;e-e(_x z)egNg321!RJ(rIW%Q#4p-kF#WZ>mRw6bPFf_{KNU*E99K1~k5M-KuY^0#{VigF~o+TVJ?uzXJ9+z{%5Z8p;9GxPo~nfE^cHomQW%S z)=b<2Cz$kdpjUsITWOxsC5$iqu}ruIe0-hHI#bRK8MrIQF@k#VMgu4`T>(Z0yO@X z)iMazX8Z+cKQsRp(D);)7fc%0X#8!NMc)TBJ{b-{L;BkRjlXuX8r07Tn+E*Z5)K_S zU;+r>Pl3`+IvZ&GeT_wL2O1ybk28IL3}}2@A;pyc9%#I(pJ38uK;xqa-Ap7Ur^w9DSpc75{0OaHJjRpo_93BDs5afSM z`OyFP=dJKn^X-V?XBUA!2z~gMN#6k)-;42}N#jWi|4s%*IT~0UXnbU^(DYDqpz*Mi z45I||y8w+Z7Mp73KLRvfg+GGj!yxb!Fz}TAkg0GM(D?q7B$Hl*`S6P#oT*UZcA&>V z3m_Y4FWZCpKtD?r!i#KyE&_T7iSbi+fc6;tB;F-z6T0xn+mT3ZLN?MA!z@^^63+!n}NnFUd>Iq0O&~|@1*je3uw8E zz5*KmK1jSNe;sJp1%)9Nu?s3Qd{fFSP{4;BtOG!A(dn1tkbkqRI?(uzoJOXCCO|I& z`R+tB)&*$%YcM#oVFP*rjc=jCb3M|J0lgmN@uDVr^l6~`6u`~W$)-RA82ArC656=YY6m?1$G4;fj$J~Q_S)Y0*!zD#`3`9 zK;wNU?jb+R0NP6N0OkRGAbF88$629!ddAZeA09s~eekGpQwKkDVB>P7lK%eyP8F7~ diff --git a/yaffsdev.c b/yaffsdev.c index e38a983..9675dab 100644 --- a/yaffsdev.c +++ b/yaffsdev.c @@ -155,8 +155,16 @@ void TestTime(yaffs_Device *dev) int written; + printf("Exisiting objects\n"); + yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject); + printf("Exisiting objects in lost+found\n"); + lnf = yaffs_FindObjectByName(yaffs_Root(dev),YAFFS_LOSTNFOUND_NAME); + yaffs_ApplyToDirectoryChildren(lnf,yaffs_DumpObject); + printf("Start\n"); + + f = yaffs_FindObjectByName(yaffs_Root(dev),"Name1"); if(f) @@ -285,6 +293,10 @@ void TestTime(yaffs_Device *dev) x = yaffs_RenameObject(yaffs_Root(dev),YAFFS_LOSTNFOUND_NAME,NULL,"Renamed"); yaffs_ApplyToDirectoryChildren(yaffs_Root(dev),yaffs_DumpObject); + f = yaffs_MknodFile(yaffs_Root(dev),"pfile",0,0,0); + yaffs_WriteDataToFile(f,testStr,0,strlen(testStr)); + + yaffs_Link(yaffs_Root(dev),"phl4",f); } int main(int argc,char *argv[]) diff --git a/yaffsdev.proj b/yaffsdev.proj index fc2bac33a6995411fcd1a8d65cf58e8f071abf2c..e3e07f414dd3e0e9d25092f5de900db17f85a5be 100644 GIT binary patch delta 4690 zcmcgwdu&tJ8Na^1Cbr{yP8x@Vjs)M3CwX4miAg$OabA!PLLNrRV5xKMdmZ1{zBbp_ zA*ma=v}m37#{@gtx>jg|{ZWl}nwGlTsI;wYLj8wn8q+il6|`yHD%KZ4+Y6*fM@u2W1!b4p*fA-mb=JBlgwzT*@ zp4FGCqwZdYbufQ`f0B7Matc3psE8qsW4laW4f^UGY0R_n5 zD3}DJ;4t_S*bC}GE%<=01p}ZDG=ksLm+9Zouh9y9gm%%LbO&vwOX*KdzcXD*x=a3D zob*=BYS3h*2VJXdMy84(bgjyT4)1sY^|TvNWoRn`mZy;40@2Hsrf)Hlw$yYgd7LRV zmB-`Ja7^|J5;xasWom4TjFsJON3XUt*R{o?3n7op*t;E!ql2+`SecIQZgrl=bF;nM z)@-#W|JlNs^_mibxMLcm(OA!Zv{YJ_JbLIwP4bnV^5V?uXJq#U-FI{$om)4hbLmEP zJ-Sb+zf*ss-lGPnE~=HPrYuwmMNqf2pJ?CHUeo?odqqp?3F4&oN^)rA4p~w|%5GeOD69EtFpA{_S23SQ*^v%q0B_qdmn7+#nYy#muO1O-Lt zW6*9_8~V_7o!&1f1IJ_H92XQM1uaf}(VQbmBcaiW8aOCQe0tftFwBKe9nDEI8Ru0C%Tp{`er5~o^XJO3m5ToG zenAps(VNCk#U+L%6?W4-90mG#f(8?!;&*W~QCE1_IoywKPqnLN^b@kE2*bh&bZgR4 znv+PJdO^BZ`SUct+Sgnm(07P9yoH`MHp z#FRdNObQH1N_bEVrn0|YHZrjT3=I#t+y{roUG4(|&Qxr4jtFVKQd^v1fr^I`lMRl! zu*fs<#xz~}(@be<5hZ2UBGa_U#AQK|Gh|x(Q|uQt9^vHdL8TY?bdv8L8P%ef-ETYZ zP#;ixD3)rcc2cBvnf!?S3weXQO1?ubkr&ACk!Q(ok}r{SWR#pDkC9&{hsZ9{K{k># z4aRtZKyP@SEm<#5zTtVF+#bugnvcj=XRGoO z{0Sd}rknH)YT?Bq44Z-QMcceMet{R2j3ljqp71s1viE|o3a;gMqmM_{`np}XL{k;I zIbucwLs|~c%w^2*qU;uN9SQDmM36ZJQ#*POukxuk&dgyCs!)5d2uXq6=o4R&;cf|| zXX+bFYpPkm=2IESDO#MZoOMRWxEd%rK5NNMgsP*O{8imv(->~bp-e#|43;a%pqbW| zH=3@mE?FzUec-Nd27IEK!aCis6Wm=5sfo%4VC;{DA{i}ga_ur>usnb7K<8_BY}z`q zz8;a()0_y)0o)MOh;js2t0Bg?gs9>YLqhhvaO+)VQFb%qE{zZ&*0gJKJMy~m9HFk6YBa~rDg?abGyu+LjJ_O>)z%aX4Jk7|P? z@h^Cb{0Di9j4x_ZZ-S`C*W<-Qz`*jr(1nM78W_HMW}g9z38Ho1oI309Fyf&;KWrnW z;ZNW+{1`tLtk7Sl%jk0^)^w?Or1-kgZ(KI~(cm|%=uhjHuD(bn;`6fLW8(39vp>GL zrYISfWvy068*8^R8|nmWT5Y@Atc$pGQ_$(gwn>rfLT@@7HgfK^v#iL*VhdI)`u@{f z(T$!RwKltT1L_8{Ry&&uM6-1jgtjRuZ#&IT+d6DE)kmBKg^8yFO|xI^+<3QpgN^+3 zmk@S5`Fam;L|unKqKsIEAHwVK*YF4MJbVG3ggo@ZUg(5&cm@0%{1m(jdVvFUfGv0s z#PX>h>(%kY%y{nnK7#=hff#fSsk2H9^`(-dp77JZfC{_`I^bKhpB@2c0R_&|d+0x# z6w@}-Tg8(V#Vf{h#(v{X!zn|p;j-SZ*Xw^&bg*dYs&7l831e(i!P4RO`2}xaT#;j5 zMZ>ao8{6H+vR#_==1fe%J)B5MZJio+o=sCaOYAlbQ@#%CKKO};GH@U80(cdqOnu7v#A7_$Lb8*%+ZFSrA3vN44}Zq@Is%;k$Ho4F98Y}C(kckN z0Bp>Ef>@vWM+II0cH)sYoCo7fBI{MF0Q* delta 2310 zcmZ`)S!^3s6rIeHro=PTB)D0cS(Yx== zxy!rvzU#*p>BlbS9ktcc6h-Bcm&v}STzCEY-)Btxc{TY9S!Fe3~LexXgcN2nI6glqhF z{5d|rKgjRp@8R#_Z{uxzC11hk^DMt?xoWv!`Ob3260{sl`8QoFgvMuP!CqZwbyFjn z5w4%qad5k=OB36595A4-`aU@K%s8B{T!v4!un?N7hT>=q9I0uAqjOgHsHOrIcd+o< zTqS&4Prm-T{FONUSh$9%$F z?k2Cx?P)=Yh!QjWVJykWnM8>sBKXecBoWOMp(!aCjQL{$N$rtzdAFjD#vGw>@Ju<_ z9w`=vr+r(z?gp3J-Gs(9MMjB?!UH3ZkSri)y`maP)Z%G$dDfXsYv=WN;Ol8S?eW6Q z)Mgl-zLh~OO)%Eo%2Qzym!?no%`o8IVr%L|+Y@=v=5nOC2MY7Nr?}U-B&TsvPUa+T z5BCqd%wApB9>;aGCwmvF<&v~m@~|2hAyC}7;`$+yJwk(qy4)8S)EKG zD#88zRWQ~+NcKh0Fi-+-54dJfB4+4ua)elX4C_gxMWh(kk*rOqNGHjXvzfUUk1GM3 zVW9y{*3f=kF>q%%u8wBJK0ML63f!+4;Q=WWL+z1>7LW|QM+#xo*WPz;mTpRVzUe~I z;roH5RQI9142%s4F!K-xm6JTo9&Q57&p}^TKD>I!Civn;tXEYGMIyDtFmt$JJybO4 zfDWG(t{>h8SG$X0{^1g+P88+U!pR{kwEH&0*@x|3Y_uDOu8hPD97Bm<97UC6_Lw2! z!WBl_@uWm@;z4e+Q^=2$7bP4p+_Sl+Hkoc99UFR9seiRWC>peF^kE~@8K9OnuiBj~ zb>y2_^(&y2?#hX?Wm|KiR_e})vt`?$Dv+$49N{gge+zQ;btJkBJUM;VO?FngI!<_^ZqxEREgGX)ICT&Dk^ zf1oeWU(%n`AJXsBC+N56a{4WpAHFmbc*oMVKxUvhBh4p9U!Wc$*b78n!Ir4|3HIU| z><8*jg1xi``;lrS*vkat$!k6_`X|asuvdt@V(%hlBiO4HXx zg6~jqnLFELK~fnUT_Ho;p)%+gMYN2FSiYVY&KXVf<|3tlY72y{4}a!1!lC`Xx^yzwI>;y*?NwJhxlcx_q{_sie`TT#Xlue=7sJi? z>A0`dTDkO8gkgt^?bfv@NliUm*~V_zjmL4sJpl9DwnAHoEzIuIcl3DJ34acWAVn%+ zd1w=u`!|mi(#8}FN2=hBBfKdd4?FnWJk2_ZRINh@r_lV<>5i)bL($;4y}BT`haHd9 zv->p7FpV-qfW`1ulIFXeondTdhIHZ0YMx^d6