*** empty log message ***
authorcharles <charles>
Sat, 16 Aug 2003 08:17:32 +0000 (08:17 +0000)
committercharles <charles>
Sat, 16 Aug 2003 08:17:32 +0000 (08:17 +0000)
yaffs_fs.c
yaffs_guts.c
yaffsdev.proj

index 6ef58ada7b1954913bc70dbc1262df260031174b..db59c239c0972529f4073b5d01809690b411d956 100644 (file)
  * Acknowledgements:
  * * Luc van OostenRyck for numerous patches.
  * * Nick Bane for numerous patches.
+ * * Nick Bane for 2.5/2.6 integration.
  * * Andras Toth for mknod rdev issue.
  * * Some code bodily lifted from JFFS2.
  */
 
 
-const char *yaffs_fs_c_version = "$Id: yaffs_fs.c,v 1.26 2003-05-20 23:20:53 charles Exp $";
+const char *yaffs_fs_c_version = "$Id: yaffs_fs.c,v 1.27 2003-08-16 08:17:32 charles Exp $";
 extern const char *yaffs_guts_c_version;
 
 
@@ -44,7 +45,18 @@ extern const char *yaffs_guts_c_version;
 #include <linux/mtd/mtd.h>
 #include <linux/interrupt.h>
 #include <linux/string.h>
+
+
+#if defined(CONFIG_KERNEL_2_5)
+#include <linux/statfs.h>      /* Added NCB 15-8-2003 */
+#include <asm/statfs.h>
+#define UnlockPage(p) unlock_page(p)
+#define Page_Uptodate(page)    test_bit(PG_uptodate, &(page)->flags)
+#define kdevname(x) cdevname(to_kdev_t(x))
+#else
 #include <linux/locks.h>
+#endif
+
 
 #include <asm/uaccess.h>
 
@@ -73,8 +85,13 @@ unsigned yaffs_traceMask = YAFFS_TRACE_ALWAYS | YAFFS_TRACE_BAD_BLOCKS;
 
 #define yaffs_InodeToObject(iptr) ((yaffs_Object *)((iptr)->u.generic_ip))
 #define yaffs_DentryToObject(dptr) yaffs_InodeToObject((dptr)->d_inode)
-#define yaffs_SuperToDevice(sb)        ((yaffs_Device *)sb->u.generic_sbp)
+//NCB #define yaffs_SuperToDevice(sb)  ((yaffs_Device *)sb->u.generic_sbp)
 
+#if defined(CONFIG_KERNEL_2_5)
+#define yaffs_SuperToDevice(sb)        ((yaffs_Device *)sb->s_fs_info)
+#else
+#define yaffs_SuperToDevice(sb)        ((yaffs_Device *)sb->u.generic_sbp)
+#endif
 
 
 static void yaffs_put_super(struct super_block *sb);
@@ -87,19 +104,39 @@ static int yaffs_sync_object(struct file * file, struct dentry *dentry, int data
 
 static int yaffs_readdir(struct file *f, void *dirent, filldir_t filldir);
 
+#if defined(CONFIG_KERNEL_2_5) /* Added NCB 185-8-2003 */
+static int yaffs_create(struct inode *dir, struct dentry *dentry, int mode, struct nameidata *n);
+static struct dentry * yaffs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *n);
+#else
 static int yaffs_create(struct inode *dir, struct dentry *dentry, int mode);
 static struct dentry * yaffs_lookup(struct inode *dir, struct dentry *dentry);
+#endif
 static int yaffs_link(struct dentry *old_dentry, struct inode * dir, struct dentry * dentry);
 static int yaffs_unlink(struct inode * dir, struct dentry *dentry);
 static int yaffs_symlink(struct inode * dir, struct dentry *dentry, const char * symname);
 static int yaffs_mkdir(struct inode * dir, struct dentry * dentry, int mode);
+
+#if defined(CONFIG_KERNEL_2_5)
+static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev);
+#else
 static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode, int dev);
+#endif
 static int yaffs_rename(struct inode * old_dir, struct dentry *old_dentry, struct inode * new_dir,struct dentry *new_dentry);
 static int yaffs_setattr(struct dentry *dentry, struct iattr *attr);
 
+#if defined(CONFIG_KERNEL_2_5) /* Added NCB 185-8-2003 */
+static int yaffs_statfs(struct super_block *sb, struct kstatfs *buf);
+#else
 static int yaffs_statfs(struct super_block *sb, struct statfs *buf);
+#endif
 static void yaffs_read_inode (struct inode *inode);
+
+#if defined(CONFIG_KERNEL_2_5)
+static struct super_block *yaffs_read_super(struct file_system_type * fs, int flags, const char *dev_name, void *data);
+#else
 static struct super_block *yaffs_read_super(struct super_block * sb, void * data, int silent);
+#endif
+
 static void yaffs_put_inode (struct inode *inode);
 static void yaffs_delete_inode(struct inode *);
 static void yaffs_clear_inode(struct inode *);
@@ -243,10 +280,14 @@ struct inode *yaffs_get_inode(struct super_block *sb, int mode, int dev,yaffs_Ob
 /*
  * Lookup is used to find objects in the fs
  */
+#if defined(CONFIG_KERNEL_2_5) /* Added NCB 185-8-2003 */
+static struct dentry * yaffs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *n)
+#else
 static struct dentry * yaffs_lookup(struct inode *dir, struct dentry *dentry)
+#endif
 {
        yaffs_Object *obj;
-       struct inode *inode;
+       struct inode *inode = NULL; // NCB 2.5/2.6 needs NULL here
        
        yaffs_Device *dev = yaffs_InodeToObject(dir)->myDev;
 
@@ -271,6 +312,8 @@ static struct dentry * yaffs_lookup(struct inode *dir, struct dentry *dentry)
                if(inode)
                {
                        T(YAFFS_TRACE_OS,(KERN_DEBUG"yaffs_loookup dentry \n"));
+/* #if 0 asserted by NCB for 2.5/6 compatability - falls through to d_add even if NULL inode */        
+#if 0
                        //dget(dentry); // try to solve directory bug
                        d_add(dentry,inode);
                        
@@ -278,6 +321,7 @@ static struct dentry * yaffs_lookup(struct inode *dir, struct dentry *dentry)
 
                        // return dentry;
                        return NULL;
+#endif
                }
 
        }
@@ -287,6 +331,9 @@ static struct dentry * yaffs_lookup(struct inode *dir, struct dentry *dentry)
                
        }
        yaffs_GrossUnlock(dev);
+
+/* added NCB for 2.5/6 compatability - forces add even if inode is NULL which creates dentry hash*/    
+       d_add(dentry,inode);
        
        return NULL;
        //      return (ERR_PTR(-EIO));
@@ -477,10 +524,20 @@ static void yaffs_FillInodeFromObject(struct inode *inode, yaffs_Object *obj)
                inode->i_gid = obj->st_gid;
                inode->i_blksize = inode->i_sb->s_blocksize;
                inode->i_blocks = 0;
-               inode->i_rdev = obj->st_rdev;;
+#if defined(CONFIG_KERNEL_2_5)
+               inode->i_rdev = to_kdev_t(obj->st_rdev);
+               inode->i_atime.tv_sec = (time_t)(obj->st_atime);
+               inode->i_atime.tv_nsec = 0;
+               inode->i_mtime.tv_sec = (time_t)obj->st_mtime;
+               inode->i_mtime.tv_nsec =0;
+               inode->i_ctime.tv_sec = (time_t)obj->st_ctime;
+               inode->i_ctime.tv_nsec = 0;
+#else
+               inode->i_rdev = obj->st_rdev;
                inode->i_atime = obj->st_atime;
                inode->i_mtime = obj->st_mtime;
                inode->i_ctime = obj->st_ctime;
+#endif
                inode->i_size = yaffs_GetObjectFileLength(obj);
                inode->i_nlink = yaffs_GetObjectLinkCount(obj);
                
@@ -490,7 +547,7 @@ static void yaffs_FillInodeFromObject(struct inode *inode, yaffs_Object *obj)
                switch (obj->st_mode & S_IFMT) 
                {
                        default: // fifo, device or socket
-                               init_special_inode(inode, obj->st_mode, obj->st_rdev);
+                               init_special_inode(inode, obj->st_mode,(dev_t)(obj->st_rdev));
                                break;
                        case S_IFREG:   // file         
                                inode->i_op = &yaffs_file_inode_operations;
@@ -715,7 +772,11 @@ static int yaffs_readdir(struct file *f, void *dirent, filldir_t filldir)
 /*
  * File creation. Allocate an inode, and we're done..
  */
+#if defined(CONFIG_KERNEL_2_5)
+static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev)
+#else
 static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode, int rdev)
+#endif
 {
        struct inode *inode;
        
@@ -798,7 +859,11 @@ static int yaffs_mkdir(struct inode * dir, struct dentry * dentry, int mode)
        return retVal;
 }
 
+#if defined(CONFIG_KERNEL_2_5) /* Added NCB 185-8-2003 */
+static int yaffs_create(struct inode *dir, struct dentry *dentry, int mode, struct nameidata *n)
+#else
 static int yaffs_create(struct inode *dir, struct dentry *dentry, int mode)
+#endif
 {
        T(YAFFS_TRACE_OS,(KERN_DEBUG"yaffs_create\n"));
        return yaffs_mknod(dir, dentry, mode | S_IFREG, 0);
@@ -1017,7 +1082,11 @@ static int yaffs_setattr(struct dentry *dentry, struct iattr *attr)
        return error;
 }
 
+#if defined(CONFIG_KERNEL_2_5) /* Added NCB 185-8-2003 */
+static int yaffs_statfs(struct super_block *sb, struct kstatfs *buf)
+#else
 static int yaffs_statfs(struct super_block *sb, struct statfs *buf)
+#endif
 {
        yaffs_Device *dev = yaffs_SuperToDevice(sb);
        T(YAFFS_TRACE_OS,(KERN_DEBUG"yaffs_statfs\n"));
@@ -1226,7 +1295,11 @@ static struct super_block *yaffs_internal_read_super(int useRam, struct super_bl
                // like it has the right capabilities
                // Set the yaffs_Device up for ram emulation
 
+#if defined(CONFIG_KERNEL_2_5)
+               sb->s_fs_info = dev = kmalloc(sizeof(yaffs_Device),GFP_KERNEL);
+#else
                sb->u.generic_sbp =     dev = kmalloc(sizeof(yaffs_Device),GFP_KERNEL);
+#endif
                if(!dev)
                {
                        // Deep shit could not allocate device structure
@@ -1280,6 +1353,10 @@ static struct super_block *yaffs_internal_read_super(int useRam, struct super_bl
 
        if (!inode)
                return NULL;
+               
+// added NCB
+       inode->i_op = & yaffs_dir_inode_operations;
+       inode->i_fop = & yaffs_dir_operations;
 
        T(YAFFS_TRACE_OS,("yaffs_read_super: got root inode\n"));
                
@@ -1298,7 +1375,35 @@ static struct super_block *yaffs_internal_read_super(int useRam, struct super_bl
        return sb;
 }
 
+static int yaffs_internal_read_super_ram(struct super_block * sb, void * data, int silent)
+{
+        return yaffs_internal_read_super(1,sb,data,silent) ? 0 : -1;
+}
+static int yaffs_internal_read_super_mtd(struct super_block * sb, void * data, int silent)
+{
+        return yaffs_internal_read_super(0,sb,data,silent) ? 0 : -1;
+}
+
+
 #ifdef CONFIG_YAFFS_MTD_ENABLED
+#if defined(CONFIG_KERNEL_2_5)
+static struct super_block *yaffs_read_super(struct file_system_type * fs, int flags, const char *dev_name, void *data)
+{
+
+    return get_sb_bdev(fs, flags, dev_name, data, yaffs_internal_read_super_mtd);
+}
+
+/* changes NCB 2.5.70 */
+//static DECLARE_FSTYPE(yaffs_fs_type, "yaffs", yaffs_read_super, FS_REQUIRES_DEV);
+static struct file_system_type yaffs_fs_type = {
+       .owner          = THIS_MODULE,
+       .name           = "yaffs",
+       .get_sb         = yaffs_read_super,
+//     .kill_sb        = kill_block_super,
+       .kill_sb        = kill_litter_super,
+       .fs_flags       = FS_REQUIRES_DEV,
+};
+#else
 static struct super_block *yaffs_read_super(struct super_block * sb, void * data, int silent)
 {
        return yaffs_internal_read_super(0,sb,data,silent);
@@ -1306,15 +1411,35 @@ static struct super_block *yaffs_read_super(struct super_block * sb, void * data
 
 static DECLARE_FSTYPE(yaffs_fs_type, "yaffs", yaffs_read_super, FS_REQUIRES_DEV);
 #endif
+#endif
 
 #ifdef CONFIG_YAFFS_RAM_ENABLED
 
+#if defined(CONFIG_KERNEL_2_5)
+static struct super_block *yaffs_ram_read_super(struct file_system_type * fs, int flags, const char *dev_name, void *data)
+{
+
+    return get_sb_bdev(fs, flags, dev_name, data, yaffs_internal_read_super_ram);
+}
+
+/* changes NCB 2.5.70 */
+//static DECLARE_FSTYPE(yaffs_fs_type, "yaffs", yaffs_read_super, FS_REQUIRES_DEV);
+static struct file_system_type yaffs_fs_type = {
+       .owner          = THIS_MODULE,
+       .name           = "yaffsram",
+       .get_sb         = yaffs_ram_read_super,
+//     .kill_sb        = kill_block_super,
+       .kill_sb        = kill_litter_super,
+       .fs_flags       = FS_SINGLE,
+};
+#else
 static struct super_block *yaffs_ram_read_super(struct super_block * sb, void * data, int silent)
 {
        return yaffs_internal_read_super(1,sb,data,silent);
 }
 
 static DECLARE_FSTYPE(yaffs_ram_fs_type, "yaffsram", yaffs_ram_read_super, FS_SINGLE);
+#endif
 #endif // CONFIG_YAFFS_RAM_ENABLED
 
 
index 133dd15cc1fb51f3a3e6cd6fa4ff87f48a22ae26..5cbd371a938ecafc39814e049f7ca0381eac1e78 100644 (file)
@@ -14,7 +14,7 @@
  */
  //yaffs_guts.c
 
-const char *yaffs_guts_c_version="$Id: yaffs_guts.c,v 1.26 2003-05-20 23:20:53 charles Exp $";
+const char *yaffs_guts_c_version="$Id: yaffs_guts.c,v 1.27 2003-08-16 08:17:32 charles Exp $";
 
 #include "yportenv.h"
 
@@ -1625,7 +1625,12 @@ yaffs_Object *yaffs_CreateNewObject(yaffs_Device *dev,int number,yaffs_ObjectTyp
                theObject->win_ctime[1] = theObject->win_mtime[1] = theObject->win_atime[1];
 
 #else
-               theObject->st_atime = theObject->st_mtime =     theObject->st_ctime = CURRENT_TIME;
+
+#if defined(CONFIG_KERNEL_2_5)
+               theObject->st_atime = theObject->st_mtime =     theObject->st_ctime = CURRENT_TIME.tv_sec;              
+#else
+               theObject->st_atime = theObject->st_mtime =     theObject->st_ctime = CURRENT_TIME;             
+#endif
 #endif
                switch(type)
                {
@@ -1728,8 +1733,12 @@ yaffs_Object *yaffs_MknodObject( yaffs_ObjectType type,
                in->win_ctime[0] = in->win_mtime[0] = in->win_atime[0];
                in->win_ctime[1] = in->win_mtime[1] = in->win_atime[0];
                
+#else
+#if defined(CONFIG_KERNEL_2_5)
+               in->st_atime = in->st_mtime = in->st_ctime = CURRENT_TIME.tv_sec;
 #else
                in->st_atime = in->st_mtime = in->st_ctime = CURRENT_TIME;
+#endif
                in->st_rdev  = rdev;
                in->st_uid   = uid;
                in->st_gid   = gid;
@@ -3692,8 +3701,12 @@ int yaffs_FlushFile(yaffs_Object *in, int updateTime)
                {
 #ifdef CONFIG_YAFFS_WINCE
                        yfsd_WinFileTimeNow(in->win_mtime);
+#else
+#if defined(CONFIG_KERNEL_2_5)
+                       in->st_mtime = CURRENT_TIME.tv_sec;
 #else
                        in->st_mtime = CURRENT_TIME;
+#endif
 #endif
                }
 
@@ -4546,9 +4559,15 @@ int yaffs_SetAttributes(yaffs_Object *obj, struct iattr *attr)
        if(valid & ATTR_UID) obj->st_uid = attr->ia_uid;
        if(valid & ATTR_GID) obj->st_gid = attr->ia_gid;
        
+#if defined(CONFIG_KERNEL_2_5)
+       if(valid & ATTR_ATIME) obj->st_atime = attr->ia_atime.tv_sec;
+       if(valid & ATTR_CTIME) obj->st_ctime = attr->ia_ctime.tv_sec;
+       if(valid & ATTR_MTIME) obj->st_mtime = attr->ia_mtime.tv_sec;
+#else
        if(valid & ATTR_ATIME) obj->st_atime = attr->ia_atime;
        if(valid & ATTR_CTIME) obj->st_ctime = attr->ia_ctime;
        if(valid & ATTR_MTIME) obj->st_mtime = attr->ia_mtime;
+#endif
        
        if(valid & ATTR_SIZE) yaffs_ResizeFile(obj,attr->ia_size);
        
@@ -4565,10 +4584,15 @@ int yaffs_GetAttributes(yaffs_Object *obj, struct iattr *attr)
        attr->ia_uid = obj->st_uid;             valid |= ATTR_UID;
        attr->ia_gid = obj->st_gid;             valid |= ATTR_GID;
        
+#if defined(CONFIG_KERNEL_2_5)
+       attr->ia_atime.tv_sec = obj->st_atime;  valid |= ATTR_ATIME;
+       attr->ia_ctime.tv_sec = obj->st_ctime;  valid |= ATTR_CTIME;
+       attr->ia_mtime.tv_sec = obj->st_mtime;  valid |= ATTR_MTIME;
+#else  
        attr->ia_atime = obj->st_atime; valid |= ATTR_ATIME;
        attr->ia_ctime = obj->st_ctime; valid |= ATTR_CTIME;
        attr->ia_mtime = obj->st_mtime; valid |= ATTR_MTIME;
-       
+#endif 
        attr->ia_size = yaffs_GetFileSize(obj); valid |= ATTR_SIZE;
        
        attr->ia_valid = valid;
index 968816228bc6f770e3d929d6d03b7e6ee04d691d..28f3ae79b47f467b880b09d2e24900fb10805d8c 100644 (file)
Binary files a/yaffsdev.proj and b/yaffsdev.proj differ