Mercurial > yaffs-ecoscentric
changeset 181:7bdee2571f8f pre_checkpoint_robustness
Add read-only remount patch
| author | charles |
|---|---|
| date | Tue, 20 Mar 2007 20:59:40 +0000 |
| parents | dd2ae17e37ee |
| children | ebfd69da1173 |
| files | yaffs_fs.c |
| diffstat | 1 files changed, 36 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/yaffs_fs.c +++ b/yaffs_fs.c @@ -158,6 +158,8 @@ static int yaffs_sync_fs(struct super_bl static int yaffs_write_super(struct super_block *sb); #endif +static int yaffs_remount_fs(struct super_block *, int *, char *); + #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17)) static int yaffs_statfs(struct dentry *dentry, struct kstatfs *buf); #elif (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) @@ -250,6 +252,7 @@ static struct super_operations yaffs_sup .read_inode = yaffs_read_inode, .put_inode = yaffs_put_inode, .put_super = yaffs_put_super, + .remount_fs = yaffs_remount_fs, .delete_inode = yaffs_delete_inode, .clear_inode = yaffs_clear_inode, .sync_fs = yaffs_sync_fs, @@ -1414,6 +1417,35 @@ static void yaffs_read_inode(struct inod static LIST_HEAD(yaffs_dev_list); +static int yaffs_remount_fs(struct super_block *sb, int *flags, char *data) +{ + yaffs_Device *dev = yaffs_SuperToDevice(sb); + + if( *flags & MS_RDONLY ) { + struct mtd_info *mtd = yaffs_SuperToDevice(sb)->genericDevice; + + T(YAFFS_TRACE_OS, + (KERN_DEBUG "yaffs_remount_fs: %s: RO\n", dev->name )); + + yaffs_GrossLock(dev); + + yaffs_FlushEntireDeviceCache(dev); + + yaffs_CheckpointSave(dev); + + if (mtd->sync) + mtd->sync(mtd); + + yaffs_GrossUnlock(dev); + } + else { + T(YAFFS_TRACE_OS, + (KERN_DEBUG "yaffs_remount_fs: %s: RW\n", dev->name )); + } + + return 0; +} + static void yaffs_put_super(struct super_block *sb) { yaffs_Device *dev = yaffs_SuperToDevice(sb); @@ -1423,12 +1455,13 @@ static void yaffs_put_super(struct super yaffs_GrossLock(dev); yaffs_FlushEntireDeviceCache(dev); - + + yaffs_CheckpointSave(dev); + if (dev->putSuperFunc) { dev->putSuperFunc(sb); } - - yaffs_CheckpointSave(dev); + yaffs_Deinitialise(dev); yaffs_GrossUnlock(dev);
