[dm-devel] [PATCH 7/9] dm snapshot: add shared exception store
Konrad Rzeszutek
konrad at virtualiron.com
Mon Oct 27 16:55:38 UTC 2008
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:
...
> +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?
> + else
> + limit = nr;
> +
> + idx = find_next_zero_bit(ps->bitmap, limit, ps->cur_bitmap_index);
> + if (idx < limit) {
> + set_bit(idx, ps->bitmap);
> +
> + if (idx == limit - 1) {
> + ps->cur_bitmap_index = 0;
> +
> + read_new_bitmap_chunk(ps);
> + } else
> + ps->cur_bitmap_index++;
> + } else {
> + chunk_io(ps, ps->cur_bitmap_chunk, WRITE, 1, ps->bitmap);
> +
> + read_new_bitmap_chunk(ps);
> +
> + /* todo: check # free chunks */
> + if (start_chunk == ps->cur_bitmap_chunk) {
> + DMERR("%s %d: fail to find a new chunk",
> + __func__, __LINE__);
> + return 0;
> + }
> +
> + goto again;
> + }
> +
> + return idx + (ps->cur_bitmap_chunk - FIRST_BITMAP_CHUNK) * nr;
.. snip..
> +static int shared_create_bitmap(struct exception_store *store)
> +{
> + struct pstore *ps = get_info(store);
> + int i, r, rest, this;
> + chunk_t chunk;
> +
> + /* bitmap + superblock */
> + rest = ps->nr_bitmap_chunks + 1;
> +
> + for (chunk = 0; chunk < ps->nr_bitmap_chunks; chunk++) {
> + memset(ps->area, 0, ps->snap->chunk_size << SECTOR_SHIFT);
> +
> + this = min_t(int, rest, ps->snap->chunk_size * 512 * 8);
512? Why not do the << SECTOR_SHIFT as in the other places?
> + if (this) {
> + rest -= this;
> +
> + memset(ps->area, 0xff, this / 8);
> +
> + for (i = 0; i < this % 8; i++)
> + set_bit(i, (unsigned long *)ps->area + this / 8);
> + }
> +
> + r = chunk_io(ps, chunk + FIRST_BITMAP_CHUNK, WRITE, 1,
> + ps->area);
> + if (r)
> + return r;
> + }
> +
> + return 0;
More information about the dm-devel
mailing list