On Monday 12 April 2010 14:25:24 Charles Manning wrote:
> On Saturday 03 April 2010 04:12:39 Jean-Loup Sabatier wrote:
> > Good morning Josh, Good morning all,
> >
> > We use to force a YAFFS2 checkpoint (in a Linux root filesystem) after a
> > modification and when we're not going to change it anymore for some time.
> > For that we're remounting the partition in read only (it's a fake
> > "remount" in "read-only", i.e. we could still write in the file system,
> > but it just forces the check point).
>
> Jean-Loup
> Does this do anything more than sync() with yaffs_auto_checkpoint set
> correctly?
>
> One limitation I see with the current sync() method is that it always does
> what is in yaffs_auto_checkpoint. If the mount is not dirtied then changing
> the yaffs_auto_checkpoint and re-syncing will not result in a checkpoint.
>
> eg.
> echo 0 > /sys/modules/yaffs2/parameters/yaffs2_auto_checkpoint
> sync
> echo 2 > /sys/modules/yaffs2/parameters/yaffs2_auto_checkpoint
> sync
> will not write a checkpoint since the superblock is not dirty in the second
> sync
>
> Perhaps the following is a good idea:
> --- a/yaffs_fs.c
> +++ b/yaffs_fs.c
> @@ -1935,20 +1935,28 @@ static void yaffs_FlushSuperBlock(struct
> super_block *sb, int do_check
>
> static int yaffs_do_sync_fs(struct super_block *sb, int do_checkpoint)
> {
> -
> yaffs_Device *dev = yaffs_SuperToDevice(sb);
> + unsigned int current_auto;
> +
> + /* Todo race conditions? */
> + current_auto=yaffs_auto_checkpoint;
> +
> T(YAFFS_TRACE_OS | YAFFS_TRACE_SYNC,
> ("yaffs_do_sync_fs: %s %s\n",
> sb->s_dirt ? "dirty" : "clean",
> do_checkpoint ? "with checkpoint" : "no checkpoint"));
>
> - if (sb->s_dirt) {
> + if (sb->s_dirt || (current_auto & 4)) {
> yaffs_GrossLock(dev);
> yaffs_FlushSuperBlock(sb,do_checkpoint);
> yaffs_GrossUnlock(dev);
>
> sb->s_dirt = 0;
> }
> +
> + if(current_auto & 4)
> + yaffs_auto_checkpoint &= 3;
> +
> return 0;
> }
>
> Now a checkpoint can be forced by the following:
>
> echo 0 > /sys/modules/yaffs2/parameters/yaffs2_auto_checkpoint
> sync
> echo 4 > /sys/modules/yaffs2/parameters/yaffs2_auto_checkpoint
> sync
>
> The above allows the sync to force a checkpoint by writing a value with bit
> 0x04 set. This will be cleared as soon as the checkpoint has been written
> which makes the forcing a "one-shot".
This looks like a nice feature and I have added a modified version to git.
The capability is a oneshot therefore you just or in 4 to the previous value
and a sync will happen and then clear out the oneshot bit.
eg.
echo 4 > /sys/modules/yaffs2/parameters/yaffs2_auto_checkpoint
sync
cat /sys/modules/yaffs2/parameters/yaffs2_auto_checkpoint
0
echo 5 > /sys/modules/yaffs2/parameters/yaffs2_auto_checkpoint
sync
cat /sys/modules/yaffs2/parameters/yaffs2_auto_checkpoint
1
-- Charles