[dm-devel] Re: [PATCH v5 03/13] dm exception store: snapshot-merge usage accounting
Mike Snitzer
snitzer at redhat.com
Mon Dec 7 23:53:01 UTC 2009
On Mon, Dec 07 2009 at 6:44pm -0500,
Alasdair G Kergon <agk at redhat.com> wrote:
> On Mon, Dec 07, 2009 at 04:10:53PM -0500, Mike Snitzer wrote:
> > Subject: dm exception store: snapshot-merge usage accounting
>
> Comments updated a bit and folded into
> dm-exception-store-add-merge-specific-methods.patch # 64745
OK, I did the following based on our chat.. but haven't looked at your
version yet (ftp://sources.redhat.com appears to be down?).
Mike
---
From: Mike Snitzer <snitzer at redhat.com>
Subject: dm exception store: snapshot-merge usage accounting
Adjust the persistent exception store's next_free to the last chunk that
was processed in persistent_commit_merge(). prepare_merge() may change
ps->current_area but not before commit_merge() processes 'nr_merged'
chunks from it.
Signed-off-by: Mike Snitzer <snitzer at redhat.com>
Cc: Mikulas Patocka <mpatocka at redhat.com>
---
drivers/md/dm-snap-persistent.c | 33 ++++++++++++++++++++++++++++-----
1 file changed, 28 insertions(+), 5 deletions(-)
Index: linux-rhel6/drivers/md/dm-snap-persistent.c
===================================================================
--- linux-rhel6.orig/drivers/md/dm-snap-persistent.c
+++ linux-rhel6/drivers/md/dm-snap-persistent.c
@@ -119,7 +119,24 @@ struct pstore {
chunk_t current_area;
/*
- * The next free chunk for an exception.
+ * 'next_free' can have two meanings.
+ *
+ * When creating exceptions:
+ * The next free chunk for an exception. 'next_free' means all
+ * the slots here and above are free. Though there may be
+ * holes in the exception store because chunks can be committed
+ * out of order -- if the system halts abruptly it could
+ * leave a hole.
+ *
+ * When merging exceptions:
+ * The last chunk that was merged from a linear extent of
+ * chunks [returned from persistent_prepare_merge()].
+ * When merging 'next_free' does _not_ mean all the slots here
+ * and above are free. It holds the value it would have held
+ * if all chunks in an area had been committed in order. So
+ * the value may occasionally be slightly inaccurate, because
+ * chunks can be committed out of order, but since it's only
+ * used for 'status' this doesn't matter.
*/
chunk_t next_free;
@@ -753,10 +770,16 @@ static int persistent_commit_merge(struc
ps->current_committed -= nr_merged;
/*
- * Note that we make no attempt to keep ps->next_free up-to-date
- * as exceptions may have been allocated out-of-order.
- * Once a snapshot has become merging, nothing further uses it.
- */
+ * Update ps->next_free so persistent_usage() is accurate
+ * - it may be less than the actual 'next_free' chunk but we
+ * will not allocate exceptions again so this doesn't matter
+ * - must account for the first two metadata chunks
+ * - prepare_merge() may change ps->current_area but not before
+ * commit_merge() processes 'nr_merged' from the current_area
+ */
+ ps->next_free =
+ (area_location(ps, ps->current_area) - 1 +
+ ps->current_committed + 2);
return 0;
}
More information about the dm-devel
mailing list