Re: [Yaffs] Periodic Checkpointing

Top Page
Attachments:
Message as email
+ (text/plain)
Delete this message
Reply to this message
Author: Charles Manning
Date:  
To: yaffs
Subject: Re: [Yaffs] Periodic Checkpointing
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