This patch ports dm-exception-store.c to the new, scalable dm_io() interface. It replaces dm_io_get()/dm_io_put() by dm_io_client_create()/dm_io_client_destroy() calls and dm_io_sync_vm() by dm_io() to achive this. Signed-off-by: Heinz Mauelshagen --- drivers/md/dm-exception-store.c | 51 +++++++++++++++++++++------------------- 1 files changed, 27 insertions(+), 24 deletions(-) Index: linux-2.6.20.1/drivers/md/dm-exception-store.c =================================================================== --- linux-2.6.20.1.orig/drivers/md/dm-exception-store.c 2007-02-20 06:34:32.000000000 +0000 +++ linux-2.6.20.1/drivers/md/dm-exception-store.c 2007-02-20 21:10:19.000000000 +0000 @@ -1,7 +1,8 @@ /* - * dm-snapshot.c + * dm-exception-store.c * * Copyright (C) 2001-2002 Sistina Software (UK) Limited. + * Copyright (C) 2006 Red Hat GmbH * * This file is released under the GPL. */ @@ -75,7 +76,7 @@ struct disk_header { /* In sectors */ uint32_t chunk_size; -}; +} __attribute__((__packed__)); struct disk_exception { uint64_t old_chunk; @@ -123,6 +124,7 @@ struct pstore { atomic_t pending_count; uint32_t callback_count; struct commit_callback *callbacks; + void *dm_io_client; }; static inline unsigned int sectors_to_pages(unsigned int sectors) @@ -159,14 +161,21 @@ static void free_area(struct pstore *ps) */ static int chunk_io(struct pstore *ps, uint32_t chunk, int rw) { - struct io_region where; unsigned long bits; - where.bdev = ps->snap->cow->bdev; - where.sector = ps->snap->chunk_size * chunk; - where.count = ps->snap->chunk_size; + struct io_region where = { + .bdev = ps->snap->cow->bdev, + .sector = ps->snap->chunk_size * chunk, + .count = ps->snap->chunk_size, + }; + struct io_control control = { + .rw = rw, + .sync = 1, + .mem.type = IO_VMA, + .mem.ptr.vma = ps->area, + }; - return dm_io_sync_vm(1, &where, rw, ps->area, &bits); + return dm_io(ps->dm_io_client, &control, 1, &where, &bits); } /* @@ -213,17 +222,17 @@ static int read_header(struct pstore *ps chunk_size_supplied = 0; } - r = dm_io_get(sectors_to_pages(ps->snap->chunk_size)); - if (r) - return r; + ps->dm_io_client = dm_io_client_create(sectors_to_pages(ps->snap->chunk_size)); + if (!ps->dm_io_client) + return -ENOMEM; r = alloc_area(ps); if (r) - goto bad1; + return r; r = chunk_io(ps, 0, READ); if (r) - goto bad2; + goto bad; dh = (struct disk_header *) ps->area; @@ -235,7 +244,7 @@ static int read_header(struct pstore *ps if (le32_to_cpu(dh->magic) != SNAP_MAGIC) { DMWARN("Invalid or corrupt snapshot"); r = -ENXIO; - goto bad2; + goto bad; } *new_snapshot = 0; @@ -252,27 +261,21 @@ static int read_header(struct pstore *ps (unsigned long long)ps->snap->chunk_size); /* We had a bogus chunk_size. Fix stuff up. */ - dm_io_put(sectors_to_pages(ps->snap->chunk_size)); free_area(ps); - ps->snap->chunk_size = chunk_size; ps->snap->chunk_mask = chunk_size - 1; ps->snap->chunk_shift = ffs(chunk_size) - 1; - r = dm_io_get(sectors_to_pages(chunk_size)); + r = dm_io_client_resize(&ps->dm_io_client, + sectors_to_pages(ps->snap->chunk_size)); if (r) return r; r = alloc_area(ps); - if (r) - goto bad1; - - return 0; + return r; -bad2: +bad: free_area(ps); -bad1: - dm_io_put(sectors_to_pages(ps->snap->chunk_size)); return r; } @@ -405,7 +408,7 @@ static void persistent_destroy(struct ex { struct pstore *ps = get_info(store); - dm_io_put(sectors_to_pages(ps->snap->chunk_size)); + dm_io_client_destroy(ps->dm_io_client); vfree(ps->callbacks); free_area(ps); kfree(ps);