X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=yaffs_fs.c;h=54b1e8e36ef282b6fbb74c79a5d476d65a99a5e5;hp=09591117f4f50a91ed323402d8c90ac23d6838bd;hb=7068d4b91f6928a40a0897572cb6407f690ebc1e;hpb=e1b8e63260986ab7afec3c379e7a320677c95846 diff --git a/yaffs_fs.c b/yaffs_fs.c index 0959111..54b1e8e 100644 --- a/yaffs_fs.c +++ b/yaffs_fs.c @@ -31,7 +31,7 @@ */ const char *yaffs_fs_c_version = - "$Id: yaffs_fs.c,v 1.46 2006-05-08 10:13:34 charles Exp $"; + "$Id: yaffs_fs.c,v 1.50 2006-06-05 04:12:44 charles Exp $"; extern const char *yaffs_guts_c_version; #include @@ -66,6 +66,11 @@ extern const char *yaffs_guts_c_version; #define BDEVNAME_SIZE 0 #define yaffs_devname(sb, buf) kdevname(sb->s_dev) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) +/* added NCB 26/5/2006 for 2.4.25-vrs2-tcl1 kernel */ +#define __user +#endif + #endif #include @@ -132,6 +137,9 @@ 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); +static int yaffs_sync_fs(struct super_block *sb); +static int yaffs_write_super(struct super_block *sb); + #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) static int yaffs_statfs(struct super_block *sb, struct kstatfs *buf); #else @@ -217,6 +225,8 @@ static struct super_operations yaffs_super_ops = { .put_super = yaffs_put_super, .delete_inode = yaffs_delete_inode, .clear_inode = yaffs_clear_inode, + .sync_fs = yaffs_sync_fs, + .write_super = yaffs_write_super, }; static void yaffs_GrossLock(yaffs_Device * dev) @@ -905,6 +915,9 @@ static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode, int error = -ENOSPC; uid_t uid = current->fsuid; gid_t gid = (dir->i_mode & S_ISGID) ? dir->i_gid : current->fsgid; + + if((dir->i_mode & S_ISGID) && S_ISDIR(mode)) + mode |= S_ISGID; if (parent) { T(YAFFS_TRACE_OS, @@ -1252,6 +1265,47 @@ static int yaffs_statfs(struct super_block *sb, struct statfs *buf) return 0; } + + +static int yaffs_do_sync_fs(struct super_block *sb) +{ + + yaffs_Device *dev = yaffs_SuperToDevice(sb); + T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_do_sync_fs\n")); + + if(sb->s_dirt) { + yaffs_GrossLock(dev); + + if(dev) + yaffs_CheckpointSave(dev); + + yaffs_GrossUnlock(dev); + + sb->s_dirt = 0; + } + return 0; +} + + +static int yaffs_write_super(struct super_block *sb) +{ + + T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_write_super\n")); + return 0; /* yaffs_do_sync_fs(sb);*/ + +} + + +static int yaffs_sync_fs(struct super_block *sb) +{ + + T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_sync_fs\n")); + + return 0; /* yaffs_do_sync_fs(sb);*/ + +} + + static void yaffs_read_inode(struct inode *inode) { /* NB This is called as a side effect of other functions, but @@ -1280,6 +1334,8 @@ static void yaffs_put_super(struct super_block *sb) { yaffs_Device *dev = yaffs_SuperToDevice(sb); + T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_put_super\n")); + yaffs_GrossLock(dev); yaffs_FlushEntireDeviceCache(dev); @@ -1318,6 +1374,15 @@ static void yaffs_MTDPutSuper(struct super_block *sb) } +static void yaffs_MarkSuperBlockDirty(void *vsb) +{ + struct super_block *sb = (struct super_block *)vsb; + + T(YAFFS_TRACE_OS, (KERN_DEBUG "yaffs_MarkSuperBlockDirty() sb = %p\n",sb)); +// if(sb) +// sb->s_dirt = 1; +} + static struct super_block *yaffs_internal_read_super(int yaffsVersion, struct super_block *sb, void *data, int silent) @@ -1399,6 +1464,14 @@ static struct super_block *yaffs_internal_read_super(int yaffsVersion, T(YAFFS_TRACE_ALWAYS,("yaffs: auto selecting yaffs2\n")); yaffsVersion = 2; } + + /* Added NCB 26/5/2006 for completeness */ + if (yaffsVersion == 2 && + mtd->oobblock == 512) { + T(YAFFS_TRACE_ALWAYS,("yaffs: auto selecting yaffs1\n")); + yaffsVersion = 1; + } + #endif if (yaffsVersion == 2) { @@ -1490,9 +1563,9 @@ static struct super_block *yaffs_internal_read_super(int yaffsVersion, dev->nBytesPerChunk = mtd->oobblock; dev->nChunksPerBlock = mtd->erasesize / mtd->oobblock; nBlocks = mtd->size / mtd->erasesize; - dev->checkpointStartBlock = 0; - dev->checkpointEndBlock = 20; - dev->startBlock = dev->checkpointEndBlock + 1; + + dev->nCheckpointReservedBlocks = 10; + dev->startBlock = 0; dev->endBlock = nBlocks - 1; } else { dev->writeChunkToNAND = nandmtd_WriteChunkToNAND; @@ -1504,6 +1577,10 @@ static struct super_block *yaffs_internal_read_super(int yaffsVersion, dev->initialiseNAND = nandmtd_InitialiseNAND; dev->putSuperFunc = yaffs_MTDPutSuper; + + dev->superBlock = (void *)sb; + dev->markSuperBlockDirty = yaffs_MarkSuperBlockDirty; + #ifndef CONFIG_YAFFS_DOES_ECC dev->useNANDECC = 1;