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);