[dm-devel] [PATCH 7/9] dm snapshot: add shared exception store

FUJITA Tomonori fujita.tomonori at lab.ntt.co.jp
Wed Oct 29 00:19:00 UTC 2008


On Wed, 29 Oct 2008 08:57:00 +0900
FUJITA Tomonori <fujita.tomonori at lab.ntt.co.jp> wrote:

> On Mon, 27 Oct 2008 12:55:38 -0400
> Konrad Rzeszutek <konrad at virtualiron.com> wrote:
> 
> > On Mon, Oct 27, 2008 at 09:07:54PM +0900, FUJITA Tomonori wrote:
> > > This adds a new exception store implementation, shared exception
> > > store. The important design differences from the current two exception
> > > store implementations:
> > > 
> > > - It uses one exception store (cow disk) per origin device that is
> > >   shared by all snapshots.
> > > - It doesn't keep the complete exception tables in memory.
> > > 
> > > The shared exception store uses struct pstore, which the persistent
> > > exception store uses because there are many useful functions that
> > > struct pstore works with. The shared exception adds some variants to
> > > struct pstore, but not many.
> > 
> > Thank you for posting this. I've just two questions:
> 
> Thanks for the comments.
> 
> > ... 
> > > +static unsigned long shared_allocate_chunk(struct pstore *ps)
> > > +{
> > > +	unsigned long idx;
> > > +	unsigned long limit;
> > > +	unsigned long start_chunk;
> > > +	unsigned long nr = (ps->snap->chunk_size << SECTOR_SHIFT) * 8;
> > > +
> > > +	start_chunk = ps->cur_bitmap_chunk;
> > > +again:
> > > +	if (ps->cur_bitmap_chunk == ps->nr_bitmap_chunks)
> > > +		limit = ps->nr_chunks - (nr * (ps->nr_bitmap_chunks - 1));
> > 
> > Is this correct? If the chunk size is 16 the nr_chunks would be the bit-shift
> > value (5). Hence you are subtracting 8192*(some positivie number)-1 from 5 -
> > is that what you intend to do?
> 
> nr_chunks is the total number of chunks. What I try to do here is to
> calculate the number of chunks that the last bitmap chunk holds.
> 
> I guess that it's better to do something simpler like this:
> 
> if (ps->cur_bitmap_chunk == ps->nr_bitmap_chunks)
>         limit = ps->nr_chunks % nr;
> else
> 	limit = nr;

Duh, should have been:

if (ps->cur_bitmap_chunk == ps->nr_bitmap_chunks && ps->nr_chunks % nr)
         limit = ps->nr_chunks % nr;




More information about the dm-devel mailing list