#include "yaffs_nandemul.h"
// 2 MB of RAM for emulation
#define YAFFS_RAM_EMULATION_SIZE 0x200000
-#endif // YAFFS_RAM_ENABLED
+#endif //YAFFS_RAM_ENABLED
#ifdef YAFFS_MTD_ENABLED
#include <linux/mtd/mtd.h>
+static void yaffs_put_super(struct super_block *sb);
+
static ssize_t yaffs_file_read(struct file *f, char *buf, size_t n, loff_t *pos);
static ssize_t yaffs_file_write(struct file *f, const char *buf, size_t n, loff_t *pos);
statfs: yaffs_statfs,
read_inode: yaffs_read_inode,
put_inode: yaffs_put_inode,
+ put_super: yaffs_put_super,
// read_inode:
// remount_fs:
// clear_inode:
static void yaffs_put_inode(struct inode *inode)
{
T(("yaffs_put_inode: ino %d, count %d\n",(int)inode->i_ino, atomic_read(&inode->i_count)));
+
+ yaffs_FlushFile(yaffs_InodeToObject(inode));
+
}
#ifdef YAFFS_ADDRESS_OPS
buf->f_blocks = yaffs_SuperToDevice(sb)->nBlocks * YAFFS_CHUNKS_PER_BLOCK;
buf->f_files = 0;
buf->f_ffree = 0;
- buf->f_bavail = yaffs_GetNumberOfFreeChunks(yaffs_SuperToDevice(sb));
+ buf->f_bavail = buf->f_bfree = yaffs_GetNumberOfFreeChunks(yaffs_SuperToDevice(sb));
return 0;
}
}
+static void yaffs_put_super(struct super_block *sb)
+{
+ yaffs_Device *dev = yaffs_SuperToDevice(sb);
+
+ if(dev->putSuperFunc)
+ {
+ dev->putSuperFunc(sb);
+ }
+}
+
+
+#ifdef YAFFS_MTD_ENABLED
+
+static void yaffs_MTDPutSuper(struct super_block *sb)
+{
+
+ struct mtd_info *mtd = yaffs_SuperToDevice(sb)->genericDevice;
+
+ if(mtd->sync)
+ {
+ mtd->sync(mtd);
+ }
+
+ put_mtd_device(mtd);
+}
+
+#endif
+
static struct super_block *yaffs_internal_read_super(int useRam, struct super_block * sb, void * data, int silent)
{
struct inode * inode;
if(useRam)
{
-#if YAFFS_RAM_ENABLED
+#ifdef YAFFS_RAM_ENABLED
// Set the yaffs_Device up for ram emulation
sb->u.generic_sbp = dev = kmalloc(sizeof(yaffs_Device),GFP_KERNEL);
dev->readChunkFromNAND = nandemul_ReadChunkFromNAND;
dev->eraseBlockInNAND = nandemul_EraseBlockInNAND;
dev->initialiseNAND = nandemul_InitialiseNAND;
+
#endif
}
// Set up the memory size parameters....
- dev->nBlocks = YAFFS_RAM_EMULATION_SIZE / (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK);
+// NCB dev->nBlocks = YAFFS_RAM_EMULATION_SIZE / (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK);
+ dev->nBlocks = mtd->size / (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK);
dev->startBlock = 1; // Don't use block 0
dev->endBlock = dev->nBlocks - 1;
dev->eraseBlockInNAND = nandmtd_EraseBlockInNAND;
dev->initialiseNAND = nandmtd_InitialiseNAND;
+ dev->putSuperFunc = yaffs_MTDPutSuper;
#endif
}
remove_proc_entry("yaffs",&proc_root);
#ifdef YAFFS_RAM_ENABLED
- unregister_filesystem(&yaffs_fs_type);
+ unregister_filesystem(&yaffs_ram_fs_type);
#endif
#ifdef YAFFS_MTD_ENABLED
- unregister_filesystem(&yaffs_ram_fs_type);
+ unregister_filesystem(&yaffs_fs_type);
#endif
}