Supply dm_add_exception as a callback to the read_metadata function.
Add a status function ready for a later patch and name the functions
consistently.
Signed-off-by: Jonathan Brassow <jbrassow@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
 #include <linux/pagemap.h>
 #include <linux/vmalloc.h>
 #include <linux/slab.h>
-#include <linux/device-mapper.h>
 
 #define DM_MSG_PREFIX "snapshot exception stores"
 
 
 #define _LINUX_DM_EXCEPTION_STORE
 
 #include <linux/blkdev.h>
+#include <linux/device-mapper.h>
 
 /*
  * The snapshot code deals with largish chunks of the disk at a
  * COW device).
  */
 struct dm_exception_store {
-
        /*
         * Destroys this object when you've finished with it.
         */
 
        /*
         * The target shouldn't read the COW device until this is
-        * called.
+        * called.  As exceptions are read from the COW, they are
+        * reported back via the callback.
         */
-       int (*read_metadata) (struct dm_exception_store *store);
+       int (*read_metadata) (struct dm_exception_store *store,
+                             int (*callback)(void *callback_context,
+                                             chunk_t old, chunk_t new),
+                             void *callback_context);
 
        /*
         * Find somewhere to store the next exception.
         */
        void (*drop_snapshot) (struct dm_exception_store *store);
 
+       int (*status) (struct dm_exception_store *store, status_type_t status,
+                      char *result, unsigned int maxlen);
+
        /*
         * Return how full the snapshot is.
         */
 
  * 'full' is filled in to indicate if the area has been
  * filled.
  */
-static int insert_exceptions(struct pstore *ps, int *full)
+static int insert_exceptions(struct pstore *ps,
+                            int (*callback)(void *callback_context,
+                                            chunk_t old, chunk_t new),
+                            void *callback_context,
+                            int *full)
 {
        int r;
        unsigned int i;
                /*
                 * Otherwise we add the exception to the snapshot.
                 */
-               r = dm_add_exception(ps->snap, de.old_chunk, de.new_chunk);
+               r = callback(callback_context, de.old_chunk, de.new_chunk);
                if (r)
                        return r;
        }
        return 0;
 }
 
-static int read_exceptions(struct pstore *ps)
+static int read_exceptions(struct pstore *ps,
+                          int (*callback)(void *callback_context, chunk_t old,
+                                          chunk_t new),
+                          void *callback_context)
 {
        int r, full = 1;
 
                if (r)
                        return r;
 
-               r = insert_exceptions(ps, &full);
+               r = insert_exceptions(ps, callback, callback_context, &full);
                if (r)
                        return r;
        }
        kfree(ps);
 }
 
-static int persistent_read_metadata(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)
 {
        int r, uninitialized_var(new_snapshot);
        struct pstore *ps = get_info(store);
                /*
                 * Read the metadata.
                 */
-               r = read_exceptions(ps);
+               r = read_exceptions(ps, callback, callback_context);
                if (r)
                        return r;
        }
        return 0;
 }
 
-static int persistent_prepare(struct dm_exception_store *store,
-                             struct dm_snap_exception *e)
+static int persistent_prepare_exception(struct dm_exception_store *store,
+                                       struct dm_snap_exception *e)
 {
        struct pstore *ps = get_info(store);
        uint32_t stride;
        return 0;
 }
 
-static void persistent_commit(struct dm_exception_store *store,
-                             struct dm_snap_exception *e,
-                             void (*callback) (void *, int success),
-                             void *callback_context)
+static void persistent_commit_exception(struct dm_exception_store *store,
+                                       struct dm_snap_exception *e,
+                                       void (*callback) (void *, int success),
+                                       void *callback_context)
 {
        unsigned int i;
        struct pstore *ps = get_info(store);
        ps->callback_count = 0;
 }
 
-static void persistent_drop(struct dm_exception_store *store)
+static void persistent_drop_snapshot(struct dm_exception_store *store)
 {
        struct pstore *ps = get_info(store);
 
 
        store->destroy = persistent_destroy;
        store->read_metadata = persistent_read_metadata;
-       store->prepare_exception = persistent_prepare;
-       store->commit_exception = persistent_commit;
-       store->drop_snapshot = persistent_drop;
+       store->prepare_exception = persistent_prepare_exception;
+       store->commit_exception = persistent_commit_exception;
+       store->drop_snapshot = persistent_drop_snapshot;
        store->fraction_full = persistent_fraction_full;
        store->context = ps;
 
 
        kfree(store->context);
 }
 
-static int transient_read_metadata(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)
 {
        return 0;
 }
 
-static int transient_prepare(struct dm_exception_store *store,
-                            struct dm_snap_exception *e)
+static int transient_prepare_exception(struct dm_exception_store *store,
+                                      struct dm_snap_exception *e)
 {
        struct transient_c *tc = (struct transient_c *) store->context;
        sector_t size = get_dev_size(store->snap->cow->bdev);
        return 0;
 }
 
-static void transient_commit(struct dm_exception_store *store,
-                            struct dm_snap_exception *e,
-                            void (*callback) (void *, int success),
-                            void *callback_context)
+static void transient_commit_exception(struct dm_exception_store *store,
+                                      struct dm_snap_exception *e,
+                                      void (*callback) (void *, int success),
+                                      void *callback_context)
 {
        /* Just succeed */
        callback(callback_context, 1);
 
        store->destroy = transient_destroy;
        store->read_metadata = transient_read_metadata;
-       store->prepare_exception = transient_prepare;
-       store->commit_exception = transient_commit;
+       store->prepare_exception = transient_prepare_exception;
+       store->commit_exception = transient_commit_exception;
        store->drop_snapshot = NULL;
        store->fraction_full = transient_fraction_full;
 
 
        list_add(&new_e->hash_list, e ? &e->hash_list : l);
 }
 
-int dm_add_exception(struct dm_snapshot *s, chunk_t old, chunk_t new)
+/*
+ * Callback used by the exception stores to load exceptions when
+ * initialising.
+ */
+static int dm_add_exception(void *context, chunk_t old, chunk_t new)
 {
+       struct dm_snapshot *s = context;
        struct dm_snap_exception *e;
 
        e = alloc_exception();
        spin_lock_init(&s->tracked_chunk_lock);
 
        /* Metadata must only be loaded into one table at once */
-       r = s->store.read_metadata(&s->store);
+       r = s->store.read_metadata(&s->store, dm_add_exception, (void *)s);
        if (r < 0) {
                ti->error = "Failed to read snapshot metadata";
                goto bad_load_and_register;
 
        struct hlist_head tracked_chunk_hash[DM_TRACKED_CHUNK_HASH_SIZE];
 };
 
-/*
- * Used by the exception stores to load exceptions hen
- * initialising.
- */
-int dm_add_exception(struct dm_snapshot *s, chunk_t old, chunk_t new);
-
 /*
  * Return the number of sectors in the device.
  */