diff options
-rw-r--r-- | drivers/md/dm-exception-store.c | 54 |
1 files changed, 29 insertions, 25 deletions
diff --git a/drivers/md/dm-exception-store.c b/drivers/md/dm-exception-store.c index 99cdffa7fbfe..07e0a0c84f6e 100644 --- a/drivers/md/dm-exception-store.c +++ b/drivers/md/dm-exception-store.c | |||
@@ -1,7 +1,8 @@ | |||
1 | /* | 1 | /* |
2 | * dm-snapshot.c | 2 | * dm-exception-store.c |
3 | * | 3 | * |
4 | * Copyright (C) 2001-2002 Sistina Software (UK) Limited. | 4 | * Copyright (C) 2001-2002 Sistina Software (UK) Limited. |
5 | * Copyright (C) 2006 Red Hat GmbH | ||
5 | * | 6 | * |
6 | * This file is released under the GPL. | 7 | * This file is released under the GPL. |
7 | */ | 8 | */ |
@@ -123,6 +124,7 @@ struct pstore { | |||
123 | atomic_t pending_count; | 124 | atomic_t pending_count; |
124 | uint32_t callback_count; | 125 | uint32_t callback_count; |
125 | struct commit_callback *callbacks; | 126 | struct commit_callback *callbacks; |
127 | struct dm_io_client *io_client; | ||
126 | }; | 128 | }; |
127 | 129 | ||
128 | static inline unsigned int sectors_to_pages(unsigned int sectors) | 130 | static inline unsigned int sectors_to_pages(unsigned int sectors) |
@@ -159,14 +161,20 @@ static void free_area(struct pstore *ps) | |||
159 | */ | 161 | */ |
160 | static int chunk_io(struct pstore *ps, uint32_t chunk, int rw) | 162 | static int chunk_io(struct pstore *ps, uint32_t chunk, int rw) |
161 | { | 163 | { |
162 | struct io_region where; | 164 | struct io_region where = { |
163 | unsigned long bits; | 165 | .bdev = ps->snap->cow->bdev, |
164 | 166 | .sector = ps->snap->chunk_size * chunk, | |
165 | where.bdev = ps->snap->cow->bdev; | 167 | .count = ps->snap->chunk_size, |
166 | where.sector = ps->snap->chunk_size * chunk; | 168 | }; |
167 | where.count = ps->snap->chunk_size; | 169 | struct dm_io_request io_req = { |
168 | 170 | .bi_rw = rw, | |
169 | return dm_io_sync_vm(1, &where, rw, ps->area, &bits); | 171 | .mem.type = DM_IO_VMA, |
172 | .mem.ptr.vma = ps->area, | ||
173 | .client = ps->io_client, | ||
174 | .notify.fn = NULL, | ||
175 | }; | ||
176 | |||
177 | return dm_io(&io_req, 1, &where, NULL); | ||
170 | } | 178 | } |
171 | 179 | ||
172 | /* | 180 | /* |
@@ -213,17 +221,18 @@ static int read_header(struct pstore *ps, int *new_snapshot) | |||
213 | chunk_size_supplied = 0; | 221 | chunk_size_supplied = 0; |
214 | } | 222 | } |
215 | 223 | ||
216 | r = dm_io_get(sectors_to_pages(ps->snap->chunk_size)); | 224 | ps->io_client = dm_io_client_create(sectors_to_pages(ps->snap-> |
217 | if (r) | 225 | chunk_size)); |
218 | return r; | 226 | if (IS_ERR(ps->io_client)) |
227 | return PTR_ERR(ps->io_client); | ||
219 | 228 | ||
220 | r = alloc_area(ps); | 229 | r = alloc_area(ps); |
221 | if (r) | 230 | if (r) |
222 | goto bad1; | 231 | return r; |
223 | 232 | ||
224 | r = chunk_io(ps, 0, READ); | 233 | r = chunk_io(ps, 0, READ); |
225 | if (r) | 234 | if (r) |
226 | goto bad2; | 235 | goto bad; |
227 | 236 | ||
228 | dh = (struct disk_header *) ps->area; | 237 | dh = (struct disk_header *) ps->area; |
229 | 238 | ||
@@ -235,7 +244,7 @@ static int read_header(struct pstore *ps, int *new_snapshot) | |||
235 | if (le32_to_cpu(dh->magic) != SNAP_MAGIC) { | 244 | if (le32_to_cpu(dh->magic) != SNAP_MAGIC) { |
236 | DMWARN("Invalid or corrupt snapshot"); | 245 | DMWARN("Invalid or corrupt snapshot"); |
237 | r = -ENXIO; | 246 | r = -ENXIO; |
238 | goto bad2; | 247 | goto bad; |
239 | } | 248 | } |
240 | 249 | ||
241 | *new_snapshot = 0; | 250 | *new_snapshot = 0; |
@@ -252,27 +261,22 @@ static int read_header(struct pstore *ps, int *new_snapshot) | |||
252 | (unsigned long long)ps->snap->chunk_size); | 261 | (unsigned long long)ps->snap->chunk_size); |
253 | 262 | ||
254 | /* We had a bogus chunk_size. Fix stuff up. */ | 263 | /* We had a bogus chunk_size. Fix stuff up. */ |
255 | dm_io_put(sectors_to_pages(ps->snap->chunk_size)); | ||
256 | free_area(ps); | 264 | free_area(ps); |
257 | 265 | ||
258 | ps->snap->chunk_size = chunk_size; | 266 | ps->snap->chunk_size = chunk_size; |
259 | ps->snap->chunk_mask = chunk_size - 1; | 267 | ps->snap->chunk_mask = chunk_size - 1; |
260 | ps->snap->chunk_shift = ffs(chunk_size) - 1; | 268 | ps->snap->chunk_shift = ffs(chunk_size) - 1; |
261 | 269 | ||
262 | r = dm_io_get(sectors_to_pages(chunk_size)); | 270 | r = dm_io_client_resize(sectors_to_pages(ps->snap->chunk_size), |
271 | ps->io_client); | ||
263 | if (r) | 272 | if (r) |
264 | return r; | 273 | return r; |
265 | 274 | ||
266 | r = alloc_area(ps); | 275 | r = alloc_area(ps); |
267 | if (r) | 276 | return r; |
268 | goto bad1; | ||
269 | |||
270 | return 0; | ||
271 | 277 | ||
272 | bad2: | 278 | bad: |
273 | free_area(ps); | 279 | free_area(ps); |
274 | bad1: | ||
275 | dm_io_put(sectors_to_pages(ps->snap->chunk_size)); | ||
276 | return r; | 280 | return r; |
277 | } | 281 | } |
278 | 282 | ||
@@ -405,7 +409,7 @@ static void persistent_destroy(struct exception_store *store) | |||
405 | { | 409 | { |
406 | struct pstore *ps = get_info(store); | 410 | struct pstore *ps = get_info(store); |
407 | 411 | ||
408 | dm_io_put(sectors_to_pages(ps->snap->chunk_size)); | 412 | dm_io_client_destroy(ps->io_client); |
409 | vfree(ps->callbacks); | 413 | vfree(ps->callbacks); |
410 | free_area(ps); | 414 | free_area(ps); |
411 | kfree(ps); | 415 | kfree(ps); |