Subject: Re: how to bring a mounted filesystem to an almost clean state?
To: None <>
From: David Young <>
List: tech-kern
Date: 02/25/2003 20:05:16
On Wed, Feb 26, 2003 at 11:42:24AM +1100, Daniel Carosone wrote:
> On Tue, Feb 25, 2003 at 12:07:20PM -0600, David Young wrote:
> >   cannot work, but here goes: mark every buffer with its generation,
> >   the buffer's generation being the number of VFS_SYNC's done between
> >   boot time and the time the buffer was most recently "dirtied." For
> I like the sound of this, but also don't understand the details of
> the present implementation.
> One implication would be that you'd have to be careful about
> overlapping/parallel sync() calls - at the simplest they'd need to
> be serialised with some lock. Otherwise you need to deal with
> multiple overlapping generations.

When you say overlap, do you mean that a new sync() comes in while
the snapshot for the last sync() is still underway?  Because I think
that's ok....

You can keep a ring that indicates which generations await a snapshot;
each element tells the number of dirty blocks in that generation.

generation  dirty
|          |     |
| ...      |     |
| N        |  3  | <- tail
| N+1      |  2  |
| N+2      |  4  | <- head
| ...      |     |
|          |     |

Say that you only have room in the ring for three generations. If a
fourth sync comes before you can flush generation N to disk, then you
can either add the number of dirty blocks in generation N to the number
in N+1, delete generation N, and start generation N+3, or you can add
the dirty blocks in N+2 to the blocks in N+1 and delete N+2 and stay at
generation N+2.

Possibly the ring should only be two generations deep, but it should be
at least long enough that snapshots always complete, even in the face
of zillions of sync()s.


David Young             OJC Technologies      Engineering from the Right Brain
                        Urbana, IL * (217) 278-3933