From 4d9efb8e3f1bd240579632b4c1446d7384c3cc96 Mon Sep 17 00:00:00 2001 From: charles Date: Fri, 27 Sep 2002 20:50:50 +0000 Subject: [PATCH] *** empty log message *** --- devextras.h | 540 ++++++++++++++++++++++--------------------- nand_ecc.c | 4 +- snMakefile | 2 +- utils/mkyaffs.c | 1 + utils/mkyaffsimage.c | 36 ++- yaffs_fs.c | 45 ++-- yaffs_guts.c | 67 +++++- yaffs_guts.h | 6 + yaffs_mtdif.c | 3 + yaffs_mtdif.h | 1 + yaffs_nandemul.h | 1 + yaffs_ramem.c | 2 + yaffsdev | Bin 126051 -> 0 bytes yaffsdev.proj | Bin 53248 -> 53248 bytes yportenv.h | 288 +++++++++++------------ 15 files changed, 547 insertions(+), 449 deletions(-) delete mode 100755 yaffsdev diff --git a/devextras.h b/devextras.h index 9615362..3150f96 100644 --- a/devextras.h +++ b/devextras.h @@ -1,269 +1,271 @@ -/* - * YAFFS: Yet another FFS. A NAND-flash specific file system. - * devextras.h - * - * Copyright (C) 2002 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Charles Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 2.1 as - * published by the Free Software Foundation. - * - * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. - * - * This file is just holds extra declarations used during development. - * Most of these are from kernel includes placed here so we can use them in - * applications. - * - */ - -#ifndef __EXTRAS_H__ -#define __EXTRAS_H__ - -#if defined WIN32 -#define __inline__ __inline -#define new newHack -#endif - -#if !(defined __KERNEL__) || (defined WIN32) - -// User space defines - -typedef unsigned char __u8; -typedef unsigned short __u16; -typedef unsigned __u32; - - -/* - * Simple doubly linked list implementation. - * - * Some of the internal functions ("__xxx") are useful when - * manipulating whole lists rather than single entries, as - * sometimes we already know the next/prev entries and we can - * generate better code by using them directly rather than - * using the generic single-entry routines. - */ - - #define prefetch(x) 1 - - -struct list_head { - struct list_head *next, *prev; -}; - -#define LIST_HEAD_INIT(name) { &(name), &(name) } - -#define LIST_HEAD(name) \ - struct list_head name = LIST_HEAD_INIT(name) - -#define INIT_LIST_HEAD(ptr) do { \ - (ptr)->next = (ptr); (ptr)->prev = (ptr); \ -} while (0) - -/* - * Insert a new entry between two known consecutive entries. - * - * This is only for internal list manipulation where we know - * the prev/next entries already! - */ -static __inline__ void __list_add(struct list_head * new, - struct list_head * prev, - struct list_head * next) -{ - next->prev = new; - new->next = next; - new->prev = prev; - prev->next = new; -} - -/** - * list_add - add a new entry - * @new: new entry to be added - * @head: list head to add it after - * - * Insert a new entry after the specified head. - * This is good for implementing stacks. - */ -static __inline__ void list_add(struct list_head *new, struct list_head *head) -{ - __list_add(new, head, head->next); -} - -/** - * list_add_tail - add a new entry - * @new: new entry to be added - * @head: list head to add it before - * - * Insert a new entry before the specified head. - * This is useful for implementing queues. - */ -static __inline__ void list_add_tail(struct list_head *new, struct list_head *head) -{ - __list_add(new, head->prev, head); -} - -/* - * Delete a list entry by making the prev/next entries - * point to each other. - * - * This is only for internal list manipulation where we know - * the prev/next entries already! - */ -static __inline__ void __list_del(struct list_head * prev, - struct list_head * next) -{ - next->prev = prev; - prev->next = next; -} - -/** - * list_del - deletes entry from list. - * @entry: the element to delete from the list. - * Note: list_empty on entry does not return true after this, the entry is in an undefined state. - */ -static __inline__ void list_del(struct list_head *entry) -{ - __list_del(entry->prev, entry->next); -} - -/** - * list_del_init - deletes entry from list and reinitialize it. - * @entry: the element to delete from the list. - */ -static __inline__ void list_del_init(struct list_head *entry) -{ - __list_del(entry->prev, entry->next); - INIT_LIST_HEAD(entry); -} - -/** - * list_empty - tests whether a list is empty - * @head: the list to test. - */ -static __inline__ int list_empty(struct list_head *head) -{ - return head->next == head; -} - -/** - * list_splice - join two lists - * @list: the new list to add. - * @head: the place to add it in the first list. - */ -static __inline__ void list_splice(struct list_head *list, struct list_head *head) -{ - struct list_head *first = list->next; - - if (first != list) { - struct list_head *last = list->prev; - struct list_head *at = head->next; - - first->prev = head; - head->next = first; - - last->next = at; - at->prev = last; - } -} - -/** - * list_entry - get the struct for this entry - * @ptr: the &struct list_head pointer. - * @type: the type of the struct this is embedded in. - * @member: the name of the list_struct within the struct. - */ -#define list_entry(ptr, type, member) \ - ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) - -/** - * list_for_each - iterate over a list - * @pos: the &struct list_head to use as a loop counter. - * @head: the head for your list. - */ -#define list_for_each(pos, head) \ - for (pos = (head)->next, prefetch(pos->next); pos != (head); \ - pos = pos->next, prefetch(pos->next)) - -/** - * list_for_each_safe - iterate over a list safe against removal of list entry - * @pos: the &struct list_head to use as a loop counter. - * @n: another &struct list_head to use as temporary storage - * @head: the head for your list. - */ -#define list_for_each_safe(pos, n, head) \ - for (pos = (head)->next, n = pos->next; pos != (head); \ - pos = n, n = pos->next) - - - - -/* - * File types - */ -#define DT_UNKNOWN 0 -#define DT_FIFO 1 -#define DT_CHR 2 -#define DT_DIR 4 -#define DT_BLK 6 -#define DT_REG 8 -#define DT_LNK 10 -#define DT_SOCK 12 -#define DT_WHT 14 - -#ifndef WIN32 -#include -#endif - -/* - * Attribute flags. These should be or-ed together to figure out what - * has been changed! - */ -#define ATTR_MODE 1 -#define ATTR_UID 2 -#define ATTR_GID 4 -#define ATTR_SIZE 8 -#define ATTR_ATIME 16 -#define ATTR_MTIME 32 -#define ATTR_CTIME 64 -#define ATTR_ATIME_SET 128 -#define ATTR_MTIME_SET 256 -#define ATTR_FORCE 512 /* Not a change, but a change it */ -#define ATTR_ATTR_FLAG 1024 - - -struct iattr { - unsigned int ia_valid; - unsigned ia_mode; - unsigned ia_uid; - unsigned ia_gid; - unsigned ia_size; - unsigned ia_atime; - unsigned ia_mtime; - unsigned ia_ctime; - unsigned int ia_attr_flags; -}; - -#define KERN_DEBUG - - -#else - -#ifndef WIN32 -#include -#include -#include -#include -#endif - -#endif - - - -#if defined WIN32 -#undef new -#endif - -#endif - +/* + * YAFFS: Yet another FFS. A NAND-flash specific file system. + * devextras.h + * + * Copyright (C) 2002 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Charles Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 2.1 as + * published by the Free Software Foundation. + * + * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. + * + * This file is just holds extra declarations used during development. + * Most of these are from kernel includes placed here so we can use them in + * applications. + * + * $Id: devextras.h,v 1.5 2002-09-27 20:50:50 charles Exp $ + * + */ + +#ifndef __EXTRAS_H__ +#define __EXTRAS_H__ + +#if defined WIN32 +#define __inline__ __inline +#define new newHack +#endif + +#if !(defined __KERNEL__) || (defined WIN32) + +// User space defines + +typedef unsigned char __u8; +typedef unsigned short __u16; +typedef unsigned __u32; + + +/* + * Simple doubly linked list implementation. + * + * Some of the internal functions ("__xxx") are useful when + * manipulating whole lists rather than single entries, as + * sometimes we already know the next/prev entries and we can + * generate better code by using them directly rather than + * using the generic single-entry routines. + */ + + #define prefetch(x) 1 + + +struct list_head { + struct list_head *next, *prev; +}; + +#define LIST_HEAD_INIT(name) { &(name), &(name) } + +#define LIST_HEAD(name) \ + struct list_head name = LIST_HEAD_INIT(name) + +#define INIT_LIST_HEAD(ptr) do { \ + (ptr)->next = (ptr); (ptr)->prev = (ptr); \ +} while (0) + +/* + * Insert a new entry between two known consecutive entries. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ +static __inline__ void __list_add(struct list_head * new, + struct list_head * prev, + struct list_head * next) +{ + next->prev = new; + new->next = next; + new->prev = prev; + prev->next = new; +} + +/** + * list_add - add a new entry + * @new: new entry to be added + * @head: list head to add it after + * + * Insert a new entry after the specified head. + * This is good for implementing stacks. + */ +static __inline__ void list_add(struct list_head *new, struct list_head *head) +{ + __list_add(new, head, head->next); +} + +/** + * list_add_tail - add a new entry + * @new: new entry to be added + * @head: list head to add it before + * + * Insert a new entry before the specified head. + * This is useful for implementing queues. + */ +static __inline__ void list_add_tail(struct list_head *new, struct list_head *head) +{ + __list_add(new, head->prev, head); +} + +/* + * Delete a list entry by making the prev/next entries + * point to each other. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ +static __inline__ void __list_del(struct list_head * prev, + struct list_head * next) +{ + next->prev = prev; + prev->next = next; +} + +/** + * list_del - deletes entry from list. + * @entry: the element to delete from the list. + * Note: list_empty on entry does not return true after this, the entry is in an undefined state. + */ +static __inline__ void list_del(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); +} + +/** + * list_del_init - deletes entry from list and reinitialize it. + * @entry: the element to delete from the list. + */ +static __inline__ void list_del_init(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); + INIT_LIST_HEAD(entry); +} + +/** + * list_empty - tests whether a list is empty + * @head: the list to test. + */ +static __inline__ int list_empty(struct list_head *head) +{ + return head->next == head; +} + +/** + * list_splice - join two lists + * @list: the new list to add. + * @head: the place to add it in the first list. + */ +static __inline__ void list_splice(struct list_head *list, struct list_head *head) +{ + struct list_head *first = list->next; + + if (first != list) { + struct list_head *last = list->prev; + struct list_head *at = head->next; + + first->prev = head; + head->next = first; + + last->next = at; + at->prev = last; + } +} + +/** + * list_entry - get the struct for this entry + * @ptr: the &struct list_head pointer. + * @type: the type of the struct this is embedded in. + * @member: the name of the list_struct within the struct. + */ +#define list_entry(ptr, type, member) \ + ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) + +/** + * list_for_each - iterate over a list + * @pos: the &struct list_head to use as a loop counter. + * @head: the head for your list. + */ +#define list_for_each(pos, head) \ + for (pos = (head)->next, prefetch(pos->next); pos != (head); \ + pos = pos->next, prefetch(pos->next)) + +/** + * list_for_each_safe - iterate over a list safe against removal of list entry + * @pos: the &struct list_head to use as a loop counter. + * @n: another &struct list_head to use as temporary storage + * @head: the head for your list. + */ +#define list_for_each_safe(pos, n, head) \ + for (pos = (head)->next, n = pos->next; pos != (head); \ + pos = n, n = pos->next) + + + + +/* + * File types + */ +#define DT_UNKNOWN 0 +#define DT_FIFO 1 +#define DT_CHR 2 +#define DT_DIR 4 +#define DT_BLK 6 +#define DT_REG 8 +#define DT_LNK 10 +#define DT_SOCK 12 +#define DT_WHT 14 + +#ifndef WIN32 +#include +#endif + +/* + * Attribute flags. These should be or-ed together to figure out what + * has been changed! + */ +#define ATTR_MODE 1 +#define ATTR_UID 2 +#define ATTR_GID 4 +#define ATTR_SIZE 8 +#define ATTR_ATIME 16 +#define ATTR_MTIME 32 +#define ATTR_CTIME 64 +#define ATTR_ATIME_SET 128 +#define ATTR_MTIME_SET 256 +#define ATTR_FORCE 512 /* Not a change, but a change it */ +#define ATTR_ATTR_FLAG 1024 + + +struct iattr { + unsigned int ia_valid; + unsigned ia_mode; + unsigned ia_uid; + unsigned ia_gid; + unsigned ia_size; + unsigned ia_atime; + unsigned ia_mtime; + unsigned ia_ctime; + unsigned int ia_attr_flags; +}; + +#define KERN_DEBUG + + +#else + +#ifndef WIN32 +#include +#include +#include +#include +#endif + +#endif + + + +#if defined WIN32 +#undef new +#endif + +#endif + diff --git a/nand_ecc.c b/nand_ecc.c index 6e2b7cd..c22397b 100644 --- a/nand_ecc.c +++ b/nand_ecc.c @@ -4,7 +4,7 @@ * Copyright (C) 2000 Steven J. Hill (sjhill@cotw.com) * Toshiba America Electronics Components, Inc. * - * $Id: nand_ecc.c,v 1.2 2002-09-17 04:45:48 charles Exp $ + * $Id: nand_ecc.c,v 1.3 2002-09-27 20:50:50 charles Exp $ * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -16,6 +16,8 @@ // Minor tweak by Charles Manning to prevent exporting symbols // when compiled in with yaffs. +const char *nand_ecc_c_version = "$Id: nand_ecc.c,v 1.3 2002-09-27 20:50:50 charles Exp $"; + #if 0 #include #include diff --git a/snMakefile b/snMakefile index 5f52d0f..0b9fbb9 100644 --- a/snMakefile +++ b/snMakefile @@ -1,6 +1,6 @@ ######################################################### # Makefile auto generated by Cygnus Source Navigator. -# Target: yaffsdev_disk Date: Sep 18 2002 Time: 10:19:04 AM +# Target: yaffsdev_disk Date: Sep 27 2002 Time: 09:05:11 AM # diff --git a/utils/mkyaffs.c b/utils/mkyaffs.c index 3a0ed67..91a3c9d 100644 --- a/utils/mkyaffs.c +++ b/utils/mkyaffs.c @@ -34,6 +34,7 @@ #include #include +cost char *mkyaffs_c_version = "$Id: mkyaffs.c,v 1.3 2002-09-27 20:50:50 charles Exp $"; // countBits is a quick way of counting the number of bits in a byte. // ie. countBits[n] holds the number of 1 bits in a byte with the value n. diff --git a/utils/mkyaffsimage.c b/utils/mkyaffsimage.c index 797bc0f..bab5797 100644 --- a/utils/mkyaffsimage.c +++ b/utils/mkyaffsimage.c @@ -14,6 +14,9 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * + * + * Nick Bane modifications flagged NCB + * */ #include @@ -30,14 +33,13 @@ #define MAX_OBJECTS 10000 +const char * mkyaffsimage_c_version = "$Id: mkyaffsimage.c,v 1.3 2002-09-27 20:50:50 charles Exp $"; + // External functions for ECC on data void nand_calculate_ecc (const u_char *dat, u_char *ecc_code); int nand_correct_data (u_char *dat, u_char *read_ecc, u_char *calc_ecc); - - - typedef struct { dev_t dev; @@ -113,6 +115,22 @@ int find_obj_in_list(dev_t dev, ino_t ino) return -1; } +// NCB added 10/9/2002 +static __u16 yaffs_CalcNameSum(const char *name) +{ + __u16 sum = 0; + __u16 i = 1; + + __u8 *bname = (__u8 *)name; + + while (*bname) + { + sum += (*bname) * i; + i++; + bname++; + } + return sum; +} void yaffs_CalcECC(const __u8 *data, yaffs_Spare *spare) @@ -133,7 +151,8 @@ void yaffs_CalcTagsECC(yaffs_Tags *tags) for(i = 0; i < 8; i++) { - for(j = 1; j &0x7f; j<<=1) +// NCB modified 20-9-02 for(j = 1; j &0x7f; j<<=1) + for(j = 1; j &0xff; j<<=1) { bit++; if(b[i] & j) @@ -206,11 +225,15 @@ int write_object_header(int objId, yaffs_ObjectType t, struct stat *s, int paren strncpy(oh->name,name,YAFFS_MAX_NAME_LENGTH); + // NCB added 10/9/2001 + oh->sum = yaffs_CalcNameSum(oh->name); + if(t != YAFFS_OBJECT_TYPE_HARDLINK) { oh->st_mode = s->st_mode; oh->st_uid = s->st_uid; - oh->st_gid = s->st_uid; +// NCB 12/9/02 oh->st_gid = s->st_uid; + oh->st_gid = s->st_gid; oh->st_atime = s->st_atime; oh->st_mtime = s->st_mtime; oh->st_ctime = s->st_ctime; @@ -364,7 +387,8 @@ int process_directory(int parent, const char *path) { printf("directory\n"); error = write_object_header(newObj, YAFFS_OBJECT_TYPE_DIRECTORY, &stats, parent, entry->d_name, -1, NULL); - process_directory(1,full_name); +// NCB modified 10/9/2001 process_directory(1,full_name); + process_directory(newObj,full_name); } } } diff --git a/yaffs_fs.c b/yaffs_fs.c index 8ef7da7..b693305 100644 --- a/yaffs_fs.c +++ b/yaffs_fs.c @@ -22,10 +22,13 @@ * Acknowledgements: * * Luc van OostenRyck for numerous patches. * * Nick Bane for numerous patches. + * * Andras Toth for mknod rdev issue. * * Some code bodily lifted from JFFS2. */ +const char *yaffs_fs_c_version = "$Id: yaffs_fs.c,v 1.16 2002-09-27 20:50:50 charles Exp $"; + #include #include #include @@ -361,7 +364,7 @@ static int yaffs_readpage_nolock(struct file *f, struct page * pg) yaffs_Device *dev; T((KERN_DEBUG"yaffs_readpage at %08x, size %08x\n", - pg->index << PAGE_CACHE_SHIFT, PAGE_CACHE_SIZE)); + (unsigned)(pg->index << PAGE_CACHE_SHIFT), (unsigned)PAGE_CACHE_SIZE)); obj = yaffs_DentryToObject(f->f_dentry); @@ -431,7 +434,7 @@ static int yaffs_commit_write(struct file *f, struct page *pg, unsigned offset, int nWritten; unsigned spos = pos; - unsigned saddr = addr; + unsigned saddr = (unsigned)addr; T((KERN_DEBUG"yaffs_commit_write addr %x pos %x nBytes %d\n",saddr,spos,nBytes)); @@ -613,7 +616,7 @@ static ssize_t yaffs_file_write(struct file *f, const char *buf, size_t n, loff_ inode->i_size = ipos; inode->i_blocks = (ipos + inode->i_blksize - 1)/ inode->i_blksize; - T((KERN_DEBUG"yaffs_file_write size updated to %d bytes, %d blocks\n",ipos,inode->i_blocks)); + T((KERN_DEBUG"yaffs_file_write size updated to %d bytes, %d blocks\n",ipos,(int)(inode->i_blocks))); } } @@ -704,7 +707,7 @@ static int yaffs_readdir(struct file *f, void *dirent, filldir_t filldir) /* * File creation. Allocate an inode, and we're done.. */ -static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode, int dev) +static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode, int rdev) { struct inode *inode; @@ -727,7 +730,7 @@ static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode, int d } T(("yaffs_mknod: making oject for %s, mode %x dev %x\n", - dentry->d_name.name, mode,dev)); + dentry->d_name.name, mode,rdev)); dev = parent->myDev; @@ -738,7 +741,7 @@ static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode, int d default: // Special (socket, fifo, device...) T((KERN_DEBUG"yaffs_mknod: making special\n")); - obj = yaffs_MknodSpecial(parent,dentry->d_name.name,mode,current->uid, current->gid,dev); + obj = yaffs_MknodSpecial(parent,dentry->d_name.name,mode,current->uid, current->gid,rdev); break; case S_IFREG: // file T((KERN_DEBUG"yaffs_mknod: making file\n")); @@ -756,7 +759,7 @@ static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode, int d if(obj) { - inode = yaffs_get_inode(dir->i_sb, mode, dev, obj); + inode = yaffs_get_inode(dir->i_sb, mode, rdev, obj); d_instantiate(dentry, inode); T((KERN_DEBUG"yaffs_mknod created object %d count = %d\n",obj->objectId,atomic_read(&inode->i_count))); error = 0; @@ -802,13 +805,12 @@ static int yaffs_unlink(struct inode * dir, struct dentry *dentry) yaffs_Device *dev; - T((KERN_DEBUG"yaffs_unlink %d:%s\n",dir->i_ino,dentry->d_name.name)); + T((KERN_DEBUG"yaffs_unlink %d:%s\n",(int)(dir->i_ino),dentry->d_name.name)); dev = yaffs_InodeToObject(dir)->myDev; yaffs_GrossLock(dev); - nlinks = retVal = yaffs_Unlink(yaffs_InodeToObject(dir),dentry->d_name.name); @@ -930,6 +932,7 @@ static int yaffs_rename(struct inode * old_dir, struct dentry *old_dentry, struc yaffs_GrossLock(dev); + retVal = yaffs_RenameObject(yaffs_InodeToObject(old_dir),old_dentry->d_name.name, yaffs_InodeToObject(new_dir),new_dentry->d_name.name); yaffs_GrossUnlock(dev); @@ -1083,7 +1086,7 @@ static struct super_block *yaffs_internal_read_super(int useRam, struct super_bl sb->s_blocksize = PAGE_CACHE_SIZE; sb->s_blocksize_bits = PAGE_CACHE_SHIFT; #endif - T(("yaffs_read_super: %s block size %d\n", useRam ? "RAM" : "MTD",sb->s_blocksize)); + T(("yaffs_read_super: %s block size %d\n", useRam ? "RAM" : "MTD",(int)(sb->s_blocksize))); #ifdef CONFIG_YAFFS_DISABLE_WRITE_VERIFY T(("yaffs: Write verification disabled. All guarantees null and void\n"); @@ -1144,13 +1147,13 @@ static struct super_block *yaffs_internal_read_super(int useRam, struct super_bl return NULL; } - printk(KERN_DEBUG" erase %x\n",mtd->erase); - printk(KERN_DEBUG" read %x\n",mtd->read); - printk(KERN_DEBUG" write %x\n",mtd->write); - printk(KERN_DEBUG" readoob %x\n",mtd->read_oob); - printk(KERN_DEBUG" writeoob %x\n",mtd->write_oob); - printk(KERN_DEBUG" oobblock %x\n",mtd->oobblock); - printk(KERN_DEBUG" oobsize %x\n",mtd->oobsize); + //printk(KERN_DEBUG" erase %x\n",mtd->erase); + //printk(KERN_DEBUG" read %x\n",mtd->read); + //printk(KERN_DEBUG" write %x\n",mtd->write); + //printk(KERN_DEBUG" readoob %x\n",mtd->read_oob); + //printk(KERN_DEBUG" writeoob %x\n",mtd->write_oob); + //printk(KERN_DEBUG" oobblock %x\n",mtd->oobblock); + //printk(KERN_DEBUG" oobsize %x\n",mtd->oobsize); if(!mtd->erase || @@ -1281,6 +1284,10 @@ static char * yaffs_dump_dev(char *buf,yaffs_Device *dev,char *name) buf +=sprintf(buf,"garbageCollections. %d\n",dev->garbageCollections); buf +=sprintf(buf,"nRetriedWrites..... %d\n",dev->nRetriedWrites); buf +=sprintf(buf,"nRetireBlocks...... %d\n",dev->nRetiredBlocks); + buf +=sprintf(buf,"eccFixed........... %d\n",dev->eccFixed); + buf +=sprintf(buf,"eccUnfixed......... %d\n",dev->eccUnfixed); + buf +=sprintf(buf,"tagsEccFixed....... %d\n",dev->tagsEccFixed); + buf +=sprintf(buf,"tagsEccUnfixed..... %d\n",dev->tagsEccUnfixed); buf +=sprintf(buf,"cacheHits.......... %d\n",dev->cacheHits); buf +=sprintf(buf,"nDeletedFiles...... %d\n",dev->nDeletedFiles); buf +=sprintf(buf,"nUnlinkedFiles..... %d\n",dev->nUnlinkedFiles); @@ -1357,7 +1364,7 @@ static int __init init_yaffs_fs(void) } #ifdef CONFIG_YAFFS_RAM_ENABLED - +#if 0 my_proc_ram_write_entry = create_proc_entry("yaffs_ram", S_IRUGO | S_IFREG, &proc_root); @@ -1370,6 +1377,8 @@ static int __init init_yaffs_fs(void) { my_proc_ram_write_entry->write_proc = yaffs_proc_ram_write; } +#endif + error = register_filesystem(&yaffs_ram_fs_type); if(error) { diff --git a/yaffs_guts.c b/yaffs_guts.c index eaa18fd..bfe10b7 100644 --- a/yaffs_guts.c +++ b/yaffs_guts.c @@ -14,6 +14,8 @@ */ //yaffs_guts.c +const char *yaffs_guts_c_version="$Id: yaffs_guts.c,v 1.10 2002-09-27 20:50:50 charles Exp $"; + #include "yportenv.h" #include "yaffsinterface.h" @@ -63,7 +65,7 @@ static int yaffs_CountBits(__u8 x) // Local prototypes static int yaffs_CheckObjectHashSanity(yaffs_Device *dev); static void yaffs_LoadTagsIntoSpare(yaffs_Spare *sparePtr, yaffs_Tags *tagsPtr); -static void yaffs_GetTagsFromSpare(yaffs_Spare *sparePtr,yaffs_Tags *tagsPtr); +static void yaffs_GetTagsFromSpare(yaffs_Device *dev, yaffs_Spare *sparePtr,yaffs_Tags *tagsPtr); 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); @@ -178,19 +180,23 @@ int yaffs_ReadChunkFromNAND(struct yaffs_DeviceStruct *dev,int chunkInNAND, __u8 if(eccResult1>0) { T((TSTR("**>>ecc error fix performed on chunk %d:0" TENDSTR),chunkInNAND)); + dev->eccFixed++; } else if(eccResult1<0) { T((TSTR("**>>ecc error unfixed on chunk %d:0" TENDSTR),chunkInNAND)); + dev->eccUnfixed++; } if(eccResult2>0) { T((TSTR("**>>ecc error fix performed on chunk %d:1" TENDSTR),chunkInNAND)); + dev->eccFixed++; } else if(eccResult2<0) { T((TSTR("**>>ecc error unfixed on chunk %d:1" TENDSTR),chunkInNAND)); + dev->eccUnfixed++; } if(eccResult1 || eccResult2) @@ -488,7 +494,7 @@ void yaffs_CalcTagsECC(yaffs_Tags *tags) } -void yaffs_CheckECCOnTags(yaffs_Tags *tags) +int yaffs_CheckECCOnTags(yaffs_Tags *tags) { unsigned ecc = tags->ecc; @@ -496,9 +502,9 @@ void yaffs_CheckECCOnTags(yaffs_Tags *tags) ecc ^= tags->ecc; - if(ecc) + if(ecc && ecc <= 64) { - // Needs fixing + // TODO: Handle the failure better. Retire? unsigned char *b = ((yaffs_TagsUnion *)tags)->asBytes; ecc--; @@ -507,7 +513,17 @@ void yaffs_CheckECCOnTags(yaffs_Tags *tags) // Now recvalc the ecc yaffs_CalcTagsECC(tags); + + return 1; // recovered error + } + else if(ecc) + { + // Wierd ecc failure value + // TODO Need to do somethiong here + return -1; //unrecovered error } + + return 0; } @@ -1867,7 +1883,8 @@ int yaffs_GarbageCollectBlock(yaffs_Device *dev,int block) yaffs_ReadChunkFromNAND(dev,oldChunk,buffer, &spare,1); - yaffs_GetTagsFromSpare(&spare,&tags); + yaffs_GetTagsFromSpare(dev,&spare,&tags); + tags.serialNumber++; yaffs_LoadTagsIntoSpare(&spare,&tags); @@ -2020,9 +2037,10 @@ static void yaffs_LoadTagsIntoSpare(yaffs_Spare *sparePtr, yaffs_Tags *tagsPtr) sparePtr->tagByte7 = tu->asBytes[7]; } -static void yaffs_GetTagsFromSpare(yaffs_Spare *sparePtr,yaffs_Tags *tagsPtr) +static void yaffs_GetTagsFromSpare(yaffs_Device *dev, yaffs_Spare *sparePtr,yaffs_Tags *tagsPtr) { yaffs_TagsUnion *tu = (yaffs_TagsUnion *)tagsPtr; + int result; tu->asBytes[0]= sparePtr->tagByte0; tu->asBytes[1]= sparePtr->tagByte1; @@ -2033,7 +2051,15 @@ static void yaffs_GetTagsFromSpare(yaffs_Spare *sparePtr,yaffs_Tags *tagsPtr) tu->asBytes[6]= sparePtr->tagByte6; tu->asBytes[7]= sparePtr->tagByte7; - yaffs_CheckECCOnTags(tagsPtr); + result = yaffs_CheckECCOnTags(tagsPtr); + if(result> 0) + { + dev->tagsEccFixed++; + } + else if(result <0) + { + dev->tagsEccUnfixed++; + } } static void yaffs_SpareInitialise(yaffs_Spare *spare) @@ -2049,7 +2075,7 @@ static int yaffs_ReadChunkTagsFromNAND(yaffs_Device *dev,int chunkInNAND, yaffs_ if(yaffs_ReadChunkFromNAND(dev,chunkInNAND,NULL,&spare,1) == YAFFS_OK) { *chunkDeleted = (yaffs_CountBits(spare.pageStatus) < 7) ? 1 : 0; - yaffs_GetTagsFromSpare(&spare,tags); + yaffs_GetTagsFromSpare(dev,&spare,tags); return YAFFS_OK; } else @@ -2798,9 +2824,9 @@ int yaffs_ReadDataFromFile(yaffs_Object *in, __u8 * buffer, __u32 offset, int nB #ifdef CONFIG_YAFFS_SHORT_OP_CACHE yaffs_ChunkCache *cache; -#else - __u8 localBuffer[YAFFS_BYTES_PER_CHUNK]; #endif + + __u8 localBuffer[YAFFS_BYTES_PER_CHUNK]; int chunk; int start; @@ -2849,8 +2875,15 @@ int yaffs_ReadDataFromFile(yaffs_Object *in, __u8 * buffer, __u32 offset, int nB } else { +#ifdef WIN32 + // Under WinCE can't do direct transfer. Need to use a local buffer. + // This is because we otherwise screw up WinCE's memory mapper + yaffs_ReadChunkDataFromObject(in,chunk,localBuffer); + memcpy(buffer,localBuffer,YAFFS_BYTES_PER_CHUNK); +#else // A full chunk. Read directly into the supplied buffer. yaffs_ReadChunkDataFromObject(in,chunk,buffer); +#endif } n -= nToCopy; @@ -2914,8 +2947,16 @@ int yaffs_WriteDataToFile(yaffs_Object *in,const __u8 * buffer, __u32 offset, in } else { + +#ifdef WIN32 + // Under WinCE can't do direct transfer. Need to use a local buffer. + // This is because we otherwise screw up WinCE's memory mapper + memcpy(localBuffer,buffer,YAFFS_BYTES_PER_CHUNK); + chunkWritten = yaffs_WriteChunkDataToObject(in,chunk,localBuffer,YAFFS_BYTES_PER_CHUNK,0); +#else // A full chunk. Write directly from the supplied buffer. chunkWritten = yaffs_WriteChunkDataToObject(in,chunk,buffer,YAFFS_BYTES_PER_CHUNK,0); +#endif //T(("Write to chunk %d %d\n",chunk,chunkWritten)); } @@ -3432,7 +3473,7 @@ static int yaffs_Scan(yaffs_Device *dev) // This block looks ok, now what's in this chunk? - yaffs_GetTagsFromSpare(&spare,&tags); + yaffs_GetTagsFromSpare(dev,&spare,&tags); if(yaffs_CountBits(spare.pageStatus) < 6) { @@ -4038,6 +4079,10 @@ int yaffs_GutsInitialise(yaffs_Device *dev) dev->nDeletedFiles = 0; dev->nBackgroundDeletions=0; dev->nUnlinkedFiles = 0; + dev->eccFixed=0; + dev->eccUnfixed=0; + dev->tagsEccFixed=0; + dev->tagsEccUnfixed=0; yaffs_InitialiseBlocks(dev,nBlocks); diff --git a/yaffs_guts.h b/yaffs_guts.h index b42c7cb..4a63c99 100644 --- a/yaffs_guts.h +++ b/yaffs_guts.h @@ -13,6 +13,8 @@ * * * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. + * + * $Id: yaffs_guts.h,v 1.10 2002-09-27 20:50:50 charles Exp $ */ #ifndef __YAFFS_GUTS_H__ @@ -423,6 +425,10 @@ struct yaffs_DeviceStruct int garbageCollections; int nRetriedWrites; int nRetiredBlocks; + int eccFixed; + int eccUnfixed; + int tagsEccFixed; + int tagsEccUnfixed; yaffs_Object *rootDir; yaffs_Object *lostNFoundDir; diff --git a/yaffs_mtdif.c b/yaffs_mtdif.c index 7f74b6f..923de91 100644 --- a/yaffs_mtdif.c +++ b/yaffs_mtdif.c @@ -12,6 +12,9 @@ * published by the Free Software Foundation. * */ + +const char *yaffs_mtdif_c_version = "$Id: yaffs_mtdif.c,v 1.3 2002-09-27 20:50:50 charles Exp $"; + #ifdef CONFIG_YAFFS_MTD_ENABLED #include "yportenv.h" diff --git a/yaffs_mtdif.h b/yaffs_mtdif.h index dd908ec..7431299 100644 --- a/yaffs_mtdif.h +++ b/yaffs_mtdif.h @@ -14,6 +14,7 @@ * * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. * + * $Id: yaffs_mtdif.h,v 1.4 2002-09-27 20:50:50 charles Exp $ */ #ifndef __YAFFS_MTDIF_H__ diff --git a/yaffs_nandemul.h b/yaffs_nandemul.h index bd51465..2faeb65 100644 --- a/yaffs_nandemul.h +++ b/yaffs_nandemul.h @@ -15,6 +15,7 @@ * * yaffs_nandemul.h: Interface to emulated NAND functions * + * $Id: yaffs_nandemul.h,v 1.4 2002-09-27 20:50:50 charles Exp $ */ #ifndef __YAFFS_NANDEMUL_H__ diff --git a/yaffs_ramem.c b/yaffs_ramem.c index 09e49c3..28ce406 100644 --- a/yaffs_ramem.c +++ b/yaffs_ramem.c @@ -15,6 +15,8 @@ //yaffs_ramem.c // Since this creates the RAM block at start up it is pretty useless for testing the scanner. +const char *yaffs_ramem_c_version = "$Id: yaffs_ramem.c,v 1.5 2002-09-27 20:50:50 charles Exp $"; + #ifndef __KERNEL__ #define CONFIG_YAFFS_RAM_ENABLED #endif diff --git a/yaffsdev b/yaffsdev deleted file mode 100755 index e1033293f8ed5dad5cea6fa8c7176c616a51b729..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126051 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 JABRdxegnZ%W4HhS diff --git a/yportenv.h b/yportenv.h index 6f42e10..6393174 100644 --- a/yportenv.h +++ b/yportenv.h @@ -1,143 +1,145 @@ -/* - * YAFFS: Yet another FFS. A NAND-flash specific file system. - * yportenv.h: Portable services used by yaffs. This is done to allow - * simple migration from kernel space into app space for testing. - * - * Copyright (C) 2002 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering - * - * Created by Charles Manning - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 2.1 as - * published by the Free Software Foundation. - * - * - * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. - * - */ - -#ifndef __PORTENV_H__ -#define __PORTENV_H__ - - -#if defined WIN32 - -// Win32 -#include "stdlib.h" -#include "stdio.h" -#include "string.h" - -#define YMALLOC(x) malloc(x) -#define YFREE(x) free(x) - - -#define YINFO(s) YPRINTF(( __FILE__ " %d %s\n",__LINE__,s)) -#define YALERT(s) YINFO(s) - -#include - -#define YAFFS_LOSTNFOUND_NAME "LOST_CLUSTERS" -#define YAFFS_LOSTNFOUND_PREFIX "OBJ" - -#define YPRINTF(x) - -// Always pass the sum compare to overcome the case insensitivity issue -#define yaffs_SumCompare(x,y) 1 -#define yaffs_strcmp(a,b) _stricmp(a,b) - - -#define u_char unsigned char -#define loff_t int -#define S_IFDIR 04000 - -#define S_ISFIFO(x) 0 -#define S_ISCHR(x) 0 -#define S_ISBLK(x) 0 -#define S_ISSOCK(x) 0 - -extern unsigned yfsd_U32FileTimeNow(void); - -#define CURRENT_TIME yfsd_U32FileTimeNow() -#define YAFFS_ROOT_MODE FILE_ATTRIBUTE_ARCHIVE -#define YAFFS_LOSTNFOUND_MODE (FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_HIDDEN) - - -#define TENDSTR "\r\n" -#define TSTR(x) TEXT(x) -#define T(x) RETAILMSG(1, x) - - -#elif defined __KERNEL__ - - - -// Linux kernel -#include "linux/kernel.h" -#include "linux/mm.h" -#include "linux/string.h" -#include "linux/slab.h" -#define YAFFS_LOSTNFOUND_NAME "lost+found" -#define YAFFS_LOSTNFOUND_PREFIX "obj" - -#define YPRINTF(x) printk x -#define YMALLOC(x) kmalloc(x,GFP_KERNEL) -#define YFREE(x) kfree(x) - -#define YAFFS_ROOT_MODE 0666 -#define YAFFS_LOSTNFOUND_MODE 0666 - - -#define yaffs_SumCompare(x,y) ((x) == (y)) -#define yaffs_strcmp(a,b) strcmp(a,b) - -#define TENDSTR "\n" -#define TSTR(x) KERN_DEBUG x -#define T(x) printk x - - -#else - -// Linux application -#include "stdlib.h" -#include "stdio.h" -#include "string.h" - -#define YMALLOC(x) malloc(x) -#define YFREE(x) free(x) - - -#define YINFO(s) YPRINTF(( __FILE__ " %d %s\n",__LINE__,s)) -#define YALERT(s) YINFO(s) - - -#define TENDSTR "\n" -#define TSTR(x) x -#define T(x) printf x - - -#define YAFFS_LOSTNFOUND_NAME "lost+found" -#define YAFFS_LOSTNFOUND_PREFIX "obj" -#define YPRINTF(x) printf x - -#define CURRENT_TIME 0 -#define YAFFS_ROOT_MODE 0666 -#define YAFFS_LOSTNFOUND_MODE 0666 - -#define yaffs_SumCompare(x,y) ((x) == (y)) -#define yaffs_strcmp(a,b) strcmp(a,b) - -#endif - - - -#undef YINFO - - -#define YINFO(s) YPRINTF((KERN_DEBUG __FILE__ " %d %s\n",__LINE__,s)) -#define YALERT(s) YINFO(s) - -#define YBUG() do{YINFO("bug");} while(0) - - -#endif +/* + * YAFFS: Yet another FFS. A NAND-flash specific file system. + * yportenv.h: Portable services used by yaffs. This is done to allow + * simple migration from kernel space into app space for testing. + * + * Copyright (C) 2002 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering + * + * Created by Charles Manning + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 2.1 as + * published by the Free Software Foundation. + * + * + * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. + * + * $Id: yportenv.h,v 1.5 2002-09-27 20:50:50 charles Exp $ + * + */ + +#ifndef __PORTENV_H__ +#define __PORTENV_H__ + + +#if defined WIN32 + +// Win32 +#include "stdlib.h" +#include "stdio.h" +#include "string.h" + +#define YMALLOC(x) malloc(x) +#define YFREE(x) free(x) + + +#define YINFO(s) YPRINTF(( __FILE__ " %d %s\n",__LINE__,s)) +#define YALERT(s) YINFO(s) + +#include + +#define YAFFS_LOSTNFOUND_NAME "LOST_CLUSTERS" +#define YAFFS_LOSTNFOUND_PREFIX "OBJ" + +#define YPRINTF(x) + +// Always pass the sum compare to overcome the case insensitivity issue +#define yaffs_SumCompare(x,y) 1 +#define yaffs_strcmp(a,b) _stricmp(a,b) + + +#define u_char unsigned char +#define loff_t int +#define S_IFDIR 04000 + +#define S_ISFIFO(x) 0 +#define S_ISCHR(x) 0 +#define S_ISBLK(x) 0 +#define S_ISSOCK(x) 0 + +extern unsigned yfsd_U32FileTimeNow(void); + +#define CURRENT_TIME yfsd_U32FileTimeNow() +#define YAFFS_ROOT_MODE FILE_ATTRIBUTE_ARCHIVE +#define YAFFS_LOSTNFOUND_MODE (FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_HIDDEN) + + +#define TENDSTR "\r\n" +#define TSTR(x) TEXT(x) +#define T(x) RETAILMSG(1, x) + + +#elif defined __KERNEL__ + + + +// Linux kernel +#include "linux/kernel.h" +#include "linux/mm.h" +#include "linux/string.h" +#include "linux/slab.h" +#define YAFFS_LOSTNFOUND_NAME "lost+found" +#define YAFFS_LOSTNFOUND_PREFIX "obj" + +#define YPRINTF(x) printk x +#define YMALLOC(x) kmalloc(x,GFP_KERNEL) +#define YFREE(x) kfree(x) + +#define YAFFS_ROOT_MODE 0666 +#define YAFFS_LOSTNFOUND_MODE 0666 + + +#define yaffs_SumCompare(x,y) ((x) == (y)) +#define yaffs_strcmp(a,b) strcmp(a,b) + +#define TENDSTR "\n" +#define TSTR(x) KERN_DEBUG x +#define T(x) printk x + + +#else + +// Linux application +#include "stdlib.h" +#include "stdio.h" +#include "string.h" + +#define YMALLOC(x) malloc(x) +#define YFREE(x) free(x) + + +#define YINFO(s) YPRINTF(( __FILE__ " %d %s\n",__LINE__,s)) +#define YALERT(s) YINFO(s) + + +#define TENDSTR "\n" +#define TSTR(x) x +#define T(x) printf x + + +#define YAFFS_LOSTNFOUND_NAME "lost+found" +#define YAFFS_LOSTNFOUND_PREFIX "obj" +#define YPRINTF(x) printf x + +#define CURRENT_TIME 0 +#define YAFFS_ROOT_MODE 0666 +#define YAFFS_LOSTNFOUND_MODE 0666 + +#define yaffs_SumCompare(x,y) ((x) == (y)) +#define yaffs_strcmp(a,b) strcmp(a,b) + +#endif + + + +#undef YINFO + + +#define YINFO(s) YPRINTF((KERN_DEBUG __FILE__ " %d %s\n",__LINE__,s)) +#define YALERT(s) YINFO(s) + +#define YBUG() do{YINFO("bug");} while(0) + + +#endif -- 2.30.2