@@ -54,11 +54,15 @@ struct dm_exception_store_type {
* The target shouldn't read the COW device until this is
* called. As exceptions are read from the COW, they are
* reported back via the callback.
+ *
+ * will_handover means that there is another snapshot active;
+ * chunk size must be setup but no exceptions need to be read
+ * because they will be handed over from the active snapshot.
*/
int (*read_metadata) (struct dm_exception_store *store,
int (*callback)(void *callback_context,
chunk_t old, chunk_t new),
- void *callback_context);
+ void *callback_context, int will_handover);
/*
* Find somewhere to store the next exception.
@@ -529,7 +529,7 @@ static void persistent_dtr(struct dm_exception_store *store)
static int persistent_read_metadata(struct dm_exception_store *store,
int (*callback)(void *callback_context,
chunk_t old, chunk_t new),
- void *callback_context)
+ void *callback_context, int will_handover)
{
int r, uninitialized_var(new_snapshot);
struct pstore *ps = get_info(store);
@@ -586,7 +586,8 @@ static int persistent_read_metadata(struct dm_exception_store *store,
/*
* Read the metadata.
*/
- r = read_exceptions(ps, callback, callback_context);
+ if (!will_handover)
+ r = read_exceptions(ps, callback, callback_context);
return r;
}
@@ -30,7 +30,7 @@ static void transient_dtr(struct dm_exception_store *store)
static int transient_read_metadata(struct dm_exception_store *store,
int (*callback)(void *callback_context,
chunk_t old, chunk_t new),
- void *callback_context)
+ void *callback_context, int will_handover)
{
return 0;
}
@@ -739,7 +739,7 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv)
/* Metadata must only be loaded into one table at once */
r = s->store->type->read_metadata(s->store, dm_add_exception,
- (void *)s);
+ (void *)s, s->handover);
if (r < 0) {
ti->error = "Failed to read snapshot metadata";
goto bad_load_and_register;