dm exception store: move chunk_fields
[safe/jmp/linux-2.6] / drivers / md / dm-snap-persistent.c
1 /*
2  * Copyright (C) 2001-2002 Sistina Software (UK) Limited.
3  * Copyright (C) 2006-2008 Red Hat GmbH
4  *
5  * This file is released under the GPL.
6  */
7
8 #include "dm-exception-store.h"
9 #include "dm-snap.h"
10
11 #include <linux/mm.h>
12 #include <linux/pagemap.h>
13 #include <linux/vmalloc.h>
14 #include <linux/slab.h>
15 #include <linux/dm-io.h>
16
17 #define DM_MSG_PREFIX "persistent snapshot"
18 #define DM_CHUNK_SIZE_DEFAULT_SECTORS 32        /* 16KB */
19
20 /*-----------------------------------------------------------------
21  * Persistent snapshots, by persistent we mean that the snapshot
22  * will survive a reboot.
23  *---------------------------------------------------------------*/
24
25 /*
26  * We need to store a record of which parts of the origin have
27  * been copied to the snapshot device.  The snapshot code
28  * requires that we copy exception chunks to chunk aligned areas
29  * of the COW store.  It makes sense therefore, to store the
30  * metadata in chunk size blocks.
31  *
32  * There is no backward or forward compatibility implemented,
33  * snapshots with different disk versions than the kernel will
34  * not be usable.  It is expected that "lvcreate" will blank out
35  * the start of a fresh COW device before calling the snapshot
36  * constructor.
37  *
38  * The first chunk of the COW device just contains the header.
39  * After this there is a chunk filled with exception metadata,
40  * followed by as many exception chunks as can fit in the
41  * metadata areas.
42  *
43  * All on disk structures are in little-endian format.  The end
44  * of the exceptions info is indicated by an exception with a
45  * new_chunk of 0, which is invalid since it would point to the
46  * header chunk.
47  */
48
49 /*
50  * Magic for persistent snapshots: "SnAp" - Feeble isn't it.
51  */
52 #define SNAP_MAGIC 0x70416e53
53
54 /*
55  * The on-disk version of the metadata.
56  */
57 #define SNAPSHOT_DISK_VERSION 1
58
59 struct disk_header {
60         uint32_t magic;
61
62         /*
63          * Is this snapshot valid.  There is no way of recovering
64          * an invalid snapshot.
65          */
66         uint32_t valid;
67
68         /*
69          * Simple, incrementing version. no backward
70          * compatibility.
71          */
72         uint32_t version;
73
74         /* In sectors */
75         uint32_t chunk_size;
76 };
77
78 struct disk_exception {
79         uint64_t old_chunk;
80         uint64_t new_chunk;
81 };
82
83 struct commit_callback {
84         void (*callback)(void *, int success);
85         void *context;
86 };
87
88 /*
89  * The top level structure for a persistent exception store.
90  */
91 struct pstore {
92         struct dm_snapshot *snap;       /* up pointer to my snapshot */
93         int version;
94         int valid;
95         uint32_t exceptions_per_area;
96
97         /*
98          * Now that we have an asynchronous kcopyd there is no
99          * need for large chunk sizes, so it wont hurt to have a
100          * whole chunks worth of metadata in memory at once.
101          */
102         void *area;
103
104         /*
105          * An area of zeros used to clear the next area.
106          */
107         void *zero_area;
108
109         /*
110          * Used to keep track of which metadata area the data in
111          * 'chunk' refers to.
112          */
113         chunk_t current_area;
114
115         /*
116          * The next free chunk for an exception.
117          */
118         chunk_t next_free;
119
120         /*
121          * The index of next free exception in the current
122          * metadata area.
123          */
124         uint32_t current_committed;
125
126         atomic_t pending_count;
127         uint32_t callback_count;
128         struct commit_callback *callbacks;
129         struct dm_io_client *io_client;
130
131         struct workqueue_struct *metadata_wq;
132 };
133
134 static unsigned sectors_to_pages(unsigned sectors)
135 {
136         return DIV_ROUND_UP(sectors, PAGE_SIZE >> 9);
137 }
138
139 static int alloc_area(struct pstore *ps)
140 {
141         int r = -ENOMEM;
142         size_t len;
143
144         len = ps->snap->store->chunk_size << SECTOR_SHIFT;
145
146         /*
147          * Allocate the chunk_size block of memory that will hold
148          * a single metadata area.
149          */
150         ps->area = vmalloc(len);
151         if (!ps->area)
152                 return r;
153
154         ps->zero_area = vmalloc(len);
155         if (!ps->zero_area) {
156                 vfree(ps->area);
157                 return r;
158         }
159         memset(ps->zero_area, 0, len);
160
161         return 0;
162 }
163
164 static void free_area(struct pstore *ps)
165 {
166         vfree(ps->area);
167         ps->area = NULL;
168         vfree(ps->zero_area);
169         ps->zero_area = NULL;
170 }
171
172 struct mdata_req {
173         struct dm_io_region *where;
174         struct dm_io_request *io_req;
175         struct work_struct work;
176         int result;
177 };
178
179 static void do_metadata(struct work_struct *work)
180 {
181         struct mdata_req *req = container_of(work, struct mdata_req, work);
182
183         req->result = dm_io(req->io_req, 1, req->where, NULL);
184 }
185
186 /*
187  * Read or write a chunk aligned and sized block of data from a device.
188  */
189 static int chunk_io(struct pstore *ps, chunk_t chunk, int rw, int metadata)
190 {
191         struct dm_io_region where = {
192                 .bdev = ps->snap->cow->bdev,
193                 .sector = ps->snap->store->chunk_size * chunk,
194                 .count = ps->snap->store->chunk_size,
195         };
196         struct dm_io_request io_req = {
197                 .bi_rw = rw,
198                 .mem.type = DM_IO_VMA,
199                 .mem.ptr.vma = ps->area,
200                 .client = ps->io_client,
201                 .notify.fn = NULL,
202         };
203         struct mdata_req req;
204
205         if (!metadata)
206                 return dm_io(&io_req, 1, &where, NULL);
207
208         req.where = &where;
209         req.io_req = &io_req;
210
211         /*
212          * Issue the synchronous I/O from a different thread
213          * to avoid generic_make_request recursion.
214          */
215         INIT_WORK(&req.work, do_metadata);
216         queue_work(ps->metadata_wq, &req.work);
217         flush_workqueue(ps->metadata_wq);
218
219         return req.result;
220 }
221
222 /*
223  * Convert a metadata area index to a chunk index.
224  */
225 static chunk_t area_location(struct pstore *ps, chunk_t area)
226 {
227         return 1 + ((ps->exceptions_per_area + 1) * area);
228 }
229
230 /*
231  * Read or write a metadata area.  Remembering to skip the first
232  * chunk which holds the header.
233  */
234 static int area_io(struct pstore *ps, int rw)
235 {
236         int r;
237         chunk_t chunk;
238
239         chunk = area_location(ps, ps->current_area);
240
241         r = chunk_io(ps, chunk, rw, 0);
242         if (r)
243                 return r;
244
245         return 0;
246 }
247
248 static void zero_memory_area(struct pstore *ps)
249 {
250         memset(ps->area, 0, ps->snap->store->chunk_size << SECTOR_SHIFT);
251 }
252
253 static int zero_disk_area(struct pstore *ps, chunk_t area)
254 {
255         struct dm_io_region where = {
256                 .bdev = ps->snap->cow->bdev,
257                 .sector = ps->snap->store->chunk_size * area_location(ps, area),
258                 .count = ps->snap->store->chunk_size,
259         };
260         struct dm_io_request io_req = {
261                 .bi_rw = WRITE,
262                 .mem.type = DM_IO_VMA,
263                 .mem.ptr.vma = ps->zero_area,
264                 .client = ps->io_client,
265                 .notify.fn = NULL,
266         };
267
268         return dm_io(&io_req, 1, &where, NULL);
269 }
270
271 static int read_header(struct pstore *ps, int *new_snapshot)
272 {
273         int r;
274         struct disk_header *dh;
275         chunk_t chunk_size;
276         int chunk_size_supplied = 1;
277
278         /*
279          * Use default chunk size (or hardsect_size, if larger) if none supplied
280          */
281         if (!ps->snap->store->chunk_size) {
282                 ps->snap->store->chunk_size = max(DM_CHUNK_SIZE_DEFAULT_SECTORS,
283                     bdev_hardsect_size(ps->snap->cow->bdev) >> 9);
284                 ps->snap->store->chunk_mask = ps->snap->store->chunk_size - 1;
285                 ps->snap->store->chunk_shift = ffs(ps->snap->store->chunk_size)
286                                                - 1;
287                 chunk_size_supplied = 0;
288         }
289
290         ps->io_client = dm_io_client_create(sectors_to_pages(ps->snap->
291                                                             store->chunk_size));
292         if (IS_ERR(ps->io_client))
293                 return PTR_ERR(ps->io_client);
294
295         r = alloc_area(ps);
296         if (r)
297                 return r;
298
299         r = chunk_io(ps, 0, READ, 1);
300         if (r)
301                 goto bad;
302
303         dh = (struct disk_header *) ps->area;
304
305         if (le32_to_cpu(dh->magic) == 0) {
306                 *new_snapshot = 1;
307                 return 0;
308         }
309
310         if (le32_to_cpu(dh->magic) != SNAP_MAGIC) {
311                 DMWARN("Invalid or corrupt snapshot");
312                 r = -ENXIO;
313                 goto bad;
314         }
315
316         *new_snapshot = 0;
317         ps->valid = le32_to_cpu(dh->valid);
318         ps->version = le32_to_cpu(dh->version);
319         chunk_size = le32_to_cpu(dh->chunk_size);
320
321         if (!chunk_size_supplied || ps->snap->store->chunk_size == chunk_size)
322                 return 0;
323
324         DMWARN("chunk size %llu in device metadata overrides "
325                "table chunk size of %llu.",
326                (unsigned long long)chunk_size,
327                (unsigned long long)ps->snap->store->chunk_size);
328
329         /* We had a bogus chunk_size. Fix stuff up. */
330         free_area(ps);
331
332         ps->snap->store->chunk_size = chunk_size;
333         ps->snap->store->chunk_mask = chunk_size - 1;
334         ps->snap->store->chunk_shift = ffs(chunk_size) - 1;
335
336         r = dm_io_client_resize(sectors_to_pages(ps->snap->store->chunk_size),
337                                 ps->io_client);
338         if (r)
339                 return r;
340
341         r = alloc_area(ps);
342         return r;
343
344 bad:
345         free_area(ps);
346         return r;
347 }
348
349 static int write_header(struct pstore *ps)
350 {
351         struct disk_header *dh;
352
353         memset(ps->area, 0, ps->snap->store->chunk_size << SECTOR_SHIFT);
354
355         dh = (struct disk_header *) ps->area;
356         dh->magic = cpu_to_le32(SNAP_MAGIC);
357         dh->valid = cpu_to_le32(ps->valid);
358         dh->version = cpu_to_le32(ps->version);
359         dh->chunk_size = cpu_to_le32(ps->snap->store->chunk_size);
360
361         return chunk_io(ps, 0, WRITE, 1);
362 }
363
364 /*
365  * Access functions for the disk exceptions, these do the endian conversions.
366  */
367 static struct disk_exception *get_exception(struct pstore *ps, uint32_t index)
368 {
369         BUG_ON(index >= ps->exceptions_per_area);
370
371         return ((struct disk_exception *) ps->area) + index;
372 }
373
374 static void read_exception(struct pstore *ps,
375                            uint32_t index, struct disk_exception *result)
376 {
377         struct disk_exception *e = get_exception(ps, index);
378
379         /* copy it */
380         result->old_chunk = le64_to_cpu(e->old_chunk);
381         result->new_chunk = le64_to_cpu(e->new_chunk);
382 }
383
384 static void write_exception(struct pstore *ps,
385                             uint32_t index, struct disk_exception *de)
386 {
387         struct disk_exception *e = get_exception(ps, index);
388
389         /* copy it */
390         e->old_chunk = cpu_to_le64(de->old_chunk);
391         e->new_chunk = cpu_to_le64(de->new_chunk);
392 }
393
394 /*
395  * Registers the exceptions that are present in the current area.
396  * 'full' is filled in to indicate if the area has been
397  * filled.
398  */
399 static int insert_exceptions(struct pstore *ps,
400                              int (*callback)(void *callback_context,
401                                              chunk_t old, chunk_t new),
402                              void *callback_context,
403                              int *full)
404 {
405         int r;
406         unsigned int i;
407         struct disk_exception de;
408
409         /* presume the area is full */
410         *full = 1;
411
412         for (i = 0; i < ps->exceptions_per_area; i++) {
413                 read_exception(ps, i, &de);
414
415                 /*
416                  * If the new_chunk is pointing at the start of
417                  * the COW device, where the first metadata area
418                  * is we know that we've hit the end of the
419                  * exceptions.  Therefore the area is not full.
420                  */
421                 if (de.new_chunk == 0LL) {
422                         ps->current_committed = i;
423                         *full = 0;
424                         break;
425                 }
426
427                 /*
428                  * Keep track of the start of the free chunks.
429                  */
430                 if (ps->next_free <= de.new_chunk)
431                         ps->next_free = de.new_chunk + 1;
432
433                 /*
434                  * Otherwise we add the exception to the snapshot.
435                  */
436                 r = callback(callback_context, de.old_chunk, de.new_chunk);
437                 if (r)
438                         return r;
439         }
440
441         return 0;
442 }
443
444 static int read_exceptions(struct pstore *ps,
445                            int (*callback)(void *callback_context, chunk_t old,
446                                            chunk_t new),
447                            void *callback_context)
448 {
449         int r, full = 1;
450
451         /*
452          * Keeping reading chunks and inserting exceptions until
453          * we find a partially full area.
454          */
455         for (ps->current_area = 0; full; ps->current_area++) {
456                 r = area_io(ps, READ);
457                 if (r)
458                         return r;
459
460                 r = insert_exceptions(ps, callback, callback_context, &full);
461                 if (r)
462                         return r;
463         }
464
465         ps->current_area--;
466
467         return 0;
468 }
469
470 static struct pstore *get_info(struct dm_exception_store *store)
471 {
472         return (struct pstore *) store->context;
473 }
474
475 static void persistent_fraction_full(struct dm_exception_store *store,
476                                      sector_t *numerator, sector_t *denominator)
477 {
478         *numerator = get_info(store)->next_free * store->chunk_size;
479         *denominator = get_dev_size(store->snap->cow->bdev);
480 }
481
482 static void persistent_dtr(struct dm_exception_store *store)
483 {
484         struct pstore *ps = get_info(store);
485
486         destroy_workqueue(ps->metadata_wq);
487         dm_io_client_destroy(ps->io_client);
488         vfree(ps->callbacks);
489         free_area(ps);
490         kfree(ps);
491 }
492
493 static int persistent_read_metadata(struct dm_exception_store *store,
494                                     int (*callback)(void *callback_context,
495                                                     chunk_t old, chunk_t new),
496                                     void *callback_context)
497 {
498         int r, uninitialized_var(new_snapshot);
499         struct pstore *ps = get_info(store);
500
501         /*
502          * Read the snapshot header.
503          */
504         r = read_header(ps, &new_snapshot);
505         if (r)
506                 return r;
507
508         /*
509          * Now we know correct chunk_size, complete the initialisation.
510          */
511         ps->exceptions_per_area = (ps->snap->store->chunk_size << SECTOR_SHIFT)
512                                   / sizeof(struct disk_exception);
513         ps->callbacks = dm_vcalloc(ps->exceptions_per_area,
514                         sizeof(*ps->callbacks));
515         if (!ps->callbacks)
516                 return -ENOMEM;
517
518         /*
519          * Do we need to setup a new snapshot ?
520          */
521         if (new_snapshot) {
522                 r = write_header(ps);
523                 if (r) {
524                         DMWARN("write_header failed");
525                         return r;
526                 }
527
528                 ps->current_area = 0;
529                 zero_memory_area(ps);
530                 r = zero_disk_area(ps, 0);
531                 if (r) {
532                         DMWARN("zero_disk_area(0) failed");
533                         return r;
534                 }
535         } else {
536                 /*
537                  * Sanity checks.
538                  */
539                 if (ps->version != SNAPSHOT_DISK_VERSION) {
540                         DMWARN("unable to handle snapshot disk version %d",
541                                ps->version);
542                         return -EINVAL;
543                 }
544
545                 /*
546                  * Metadata are valid, but snapshot is invalidated
547                  */
548                 if (!ps->valid)
549                         return 1;
550
551                 /*
552                  * Read the metadata.
553                  */
554                 r = read_exceptions(ps, callback, callback_context);
555                 if (r)
556                         return r;
557         }
558
559         return 0;
560 }
561
562 static int persistent_prepare_exception(struct dm_exception_store *store,
563                                         struct dm_snap_exception *e)
564 {
565         struct pstore *ps = get_info(store);
566         uint32_t stride;
567         chunk_t next_free;
568         sector_t size = get_dev_size(store->snap->cow->bdev);
569
570         /* Is there enough room ? */
571         if (size < ((ps->next_free + 1) * store->chunk_size))
572                 return -ENOSPC;
573
574         e->new_chunk = ps->next_free;
575
576         /*
577          * Move onto the next free pending, making sure to take
578          * into account the location of the metadata chunks.
579          */
580         stride = (ps->exceptions_per_area + 1);
581         next_free = ++ps->next_free;
582         if (sector_div(next_free, stride) == 1)
583                 ps->next_free++;
584
585         atomic_inc(&ps->pending_count);
586         return 0;
587 }
588
589 static void persistent_commit_exception(struct dm_exception_store *store,
590                                         struct dm_snap_exception *e,
591                                         void (*callback) (void *, int success),
592                                         void *callback_context)
593 {
594         unsigned int i;
595         struct pstore *ps = get_info(store);
596         struct disk_exception de;
597         struct commit_callback *cb;
598
599         de.old_chunk = e->old_chunk;
600         de.new_chunk = e->new_chunk;
601         write_exception(ps, ps->current_committed++, &de);
602
603         /*
604          * Add the callback to the back of the array.  This code
605          * is the only place where the callback array is
606          * manipulated, and we know that it will never be called
607          * multiple times concurrently.
608          */
609         cb = ps->callbacks + ps->callback_count++;
610         cb->callback = callback;
611         cb->context = callback_context;
612
613         /*
614          * If there are exceptions in flight and we have not yet
615          * filled this metadata area there's nothing more to do.
616          */
617         if (!atomic_dec_and_test(&ps->pending_count) &&
618             (ps->current_committed != ps->exceptions_per_area))
619                 return;
620
621         /*
622          * If we completely filled the current area, then wipe the next one.
623          */
624         if ((ps->current_committed == ps->exceptions_per_area) &&
625              zero_disk_area(ps, ps->current_area + 1))
626                 ps->valid = 0;
627
628         /*
629          * Commit exceptions to disk.
630          */
631         if (ps->valid && area_io(ps, WRITE))
632                 ps->valid = 0;
633
634         /*
635          * Advance to the next area if this one is full.
636          */
637         if (ps->current_committed == ps->exceptions_per_area) {
638                 ps->current_committed = 0;
639                 ps->current_area++;
640                 zero_memory_area(ps);
641         }
642
643         for (i = 0; i < ps->callback_count; i++) {
644                 cb = ps->callbacks + i;
645                 cb->callback(cb->context, ps->valid);
646         }
647
648         ps->callback_count = 0;
649 }
650
651 static void persistent_drop_snapshot(struct dm_exception_store *store)
652 {
653         struct pstore *ps = get_info(store);
654
655         ps->valid = 0;
656         if (write_header(ps))
657                 DMWARN("write header failed");
658 }
659
660 static int persistent_ctr(struct dm_exception_store *store,
661                           unsigned argc, char **argv)
662 {
663         struct pstore *ps;
664
665         /* allocate the pstore */
666         ps = kmalloc(sizeof(*ps), GFP_KERNEL);
667         if (!ps)
668                 return -ENOMEM;
669
670         ps->snap = store->snap;
671         ps->valid = 1;
672         ps->version = SNAPSHOT_DISK_VERSION;
673         ps->area = NULL;
674         ps->next_free = 2;      /* skipping the header and first area */
675         ps->current_committed = 0;
676
677         ps->callback_count = 0;
678         atomic_set(&ps->pending_count, 0);
679         ps->callbacks = NULL;
680
681         ps->metadata_wq = create_singlethread_workqueue("ksnaphd");
682         if (!ps->metadata_wq) {
683                 kfree(ps);
684                 DMERR("couldn't start header metadata update thread");
685                 return -ENOMEM;
686         }
687
688         store->context = ps;
689
690         return 0;
691 }
692
693 static int persistent_status(struct dm_exception_store *store,
694                              status_type_t status, char *result,
695                              unsigned int maxlen)
696 {
697         int sz = 0;
698
699         return sz;
700 }
701
702 static struct dm_exception_store_type _persistent_type = {
703         .name = "persistent",
704         .module = THIS_MODULE,
705         .ctr = persistent_ctr,
706         .dtr = persistent_dtr,
707         .read_metadata = persistent_read_metadata,
708         .prepare_exception = persistent_prepare_exception,
709         .commit_exception = persistent_commit_exception,
710         .drop_snapshot = persistent_drop_snapshot,
711         .fraction_full = persistent_fraction_full,
712         .status = persistent_status,
713 };
714
715 static struct dm_exception_store_type _persistent_compat_type = {
716         .name = "P",
717         .module = THIS_MODULE,
718         .ctr = persistent_ctr,
719         .dtr = persistent_dtr,
720         .read_metadata = persistent_read_metadata,
721         .prepare_exception = persistent_prepare_exception,
722         .commit_exception = persistent_commit_exception,
723         .drop_snapshot = persistent_drop_snapshot,
724         .fraction_full = persistent_fraction_full,
725         .status = persistent_status,
726 };
727
728 int dm_persistent_snapshot_init(void)
729 {
730         int r;
731
732         r = dm_exception_store_type_register(&_persistent_type);
733         if (r) {
734                 DMERR("Unable to register persistent exception store type");
735                 return r;
736         }
737
738         r = dm_exception_store_type_register(&_persistent_compat_type);
739         if (r) {
740                 DMERR("Unable to register old-style persistent exception "
741                       "store type");
742                 dm_exception_store_type_unregister(&_persistent_type);
743                 return r;
744         }
745
746         return r;
747 }
748
749 void dm_persistent_snapshot_exit(void)
750 {
751         dm_exception_store_type_unregister(&_persistent_type);
752         dm_exception_store_type_unregister(&_persistent_compat_type);
753 }