Add one-shot feature for yaffs auto checkpointing.
authorCharles Manning <cdhmanning@gmail.com>
Mon, 12 Apr 2010 04:55:22 +0000 (16:55 +1200)
committerCharles Manning <cdhmanning@gmail.com>
Mon, 12 Apr 2010 04:55:22 +0000 (16:55 +1200)
This feature is enabling by ORing in 0x04 to the yaffs_auto_checkpoint
module parameter. This will do a one-shot checkpoint on the next sync and
the bit will then be reset.

This is a nice way to force a checkpoint on the next sync. eg.
echo 6 > /sys/modules/yaffs/parameters/yaffs_auto_checkpoint
sync
yaffs_auto_checkpoint will now be 2

Signed-off-by: Charles Manning <cdhmanning@gmail.com>
yaffs_fs.c

index 95538ab..efaacac 100644 (file)
@@ -1937,17 +1937,23 @@ static int yaffs_do_sync_fs(struct super_block *sb, int do_checkpoint)
 {
 
        yaffs_Device *dev = yaffs_SuperToDevice(sb);
+       unsigned int oneshot_checkpoint = (yaffs_auto_checkpoint & 4);
+
        T(YAFFS_TRACE_OS | YAFFS_TRACE_SYNC, 
-               ("yaffs_do_sync_fs: %s %s\n", 
+               ("yaffs_do_sync_fs: %s %s%s\n",
                sb->s_dirt ? "dirty" : "clean",
-               do_checkpoint ? "with checkpoint" : "no checkpoint"));
+               do_checkpoint ? "with checkpoint" : "no checkpoint",
+               oneshot_checkpoint ? " one-shot" : "" ));
 
-       if (sb->s_dirt) {
+       if (sb->s_dirt || oneshot_checkpoint) {
                yaffs_GrossLock(dev);
                yaffs_FlushSuperBlock(sb,do_checkpoint);
                yaffs_GrossUnlock(dev);
 
                sb->s_dirt = 0;
+
+               if(oneshot_checkpoint)
+                       yaffs_auto_checkpoint &= ~4;
        }
        return 0;
 }