]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/md/dm-exception-store.c
[IA64] kill sys32_pipe
[linux-2.6-omap-h63xx.git] / drivers / md / dm-exception-store.c
index 6933301733df1c6d2969c120bb2e17a996cf6216..769ab677f8e05a4b3887093be5e98e0cf9cd4125 100644 (file)
@@ -9,13 +9,13 @@
 
 #include "dm.h"
 #include "dm-snap.h"
-#include "dm-io.h"
-#include "kcopyd.h"
 
 #include <linux/mm.h>
 #include <linux/pagemap.h>
 #include <linux/vmalloc.h>
 #include <linux/slab.h>
+#include <linux/dm-io.h>
+#include <linux/dm-kcopyd.h>
 
 #define DM_MSG_PREFIX "snapshots"
 #define DM_CHUNK_SIZE_DEFAULT_SECTORS 32       /* 16KB */
@@ -108,12 +108,12 @@ struct pstore {
         * Used to keep track of which metadata area the data in
         * 'chunk' refers to.
         */
-       uint32_t current_area;
+       chunk_t current_area;
 
        /*
         * The next free chunk for an exception.
         */
-       uint32_t next_free;
+       chunk_t next_free;
 
        /*
         * The index of next free exception in the current
@@ -175,7 +175,7 @@ static void do_metadata(struct work_struct *work)
 /*
  * Read or write a chunk aligned and sized block of data from a device.
  */
-static int chunk_io(struct pstore *ps, uint32_t chunk, int rw, int metadata)
+static int chunk_io(struct pstore *ps, chunk_t chunk, int rw, int metadata)
 {
        struct dm_io_region where = {
                .bdev = ps->snap->cow->bdev,
@@ -208,17 +208,24 @@ static int chunk_io(struct pstore *ps, uint32_t chunk, int rw, int metadata)
        return req.result;
 }
 
+/*
+ * Convert a metadata area index to a chunk index.
+ */
+static chunk_t area_location(struct pstore *ps, chunk_t area)
+{
+       return 1 + ((ps->exceptions_per_area + 1) * area);
+}
+
 /*
  * Read or write a metadata area.  Remembering to skip the first
  * chunk which holds the header.
  */
-static int area_io(struct pstore *ps, uint32_t area, int rw)
+static int area_io(struct pstore *ps, chunk_t area, int rw)
 {
        int r;
-       uint32_t chunk;
+       chunk_t chunk;
 
-       /* convert a metadata area index to a chunk index */
-       chunk = 1 + ((ps->exceptions_per_area + 1) * area);
+       chunk = area_location(ps, area);
 
        r = chunk_io(ps, chunk, rw, 0);
        if (r)
@@ -228,7 +235,7 @@ static int area_io(struct pstore *ps, uint32_t area, int rw)
        return 0;
 }
 
-static int zero_area(struct pstore *ps, uint32_t area)
+static int zero_area(struct pstore *ps, chunk_t area)
 {
        memset(ps->area, 0, ps->snap->chunk_size << SECTOR_SHIFT);
        return area_io(ps, area, WRITE);
@@ -404,7 +411,7 @@ static int insert_exceptions(struct pstore *ps, int *full)
 
 static int read_exceptions(struct pstore *ps)
 {
-       uint32_t area;
+       chunk_t area;
        int r, full = 1;
 
        /*
@@ -517,6 +524,7 @@ static int persistent_prepare(struct exception_store *store,
 {
        struct pstore *ps = get_info(store);
        uint32_t stride;
+       chunk_t next_free;
        sector_t size = get_dev_size(store->snap->cow->bdev);
 
        /* Is there enough room ? */
@@ -530,7 +538,8 @@ static int persistent_prepare(struct exception_store *store,
         * into account the location of the metadata chunks.
         */
        stride = (ps->exceptions_per_area + 1);
-       if ((++ps->next_free % stride) == 1)
+       next_free = ++ps->next_free;
+       if (sector_div(next_free, stride) == 1)
                ps->next_free++;
 
        atomic_inc(&ps->pending_count);