dm snapshot: separate out exception store interface

Pull structures that bridge the gap between snapshot and
exception store out of dm-snap.h and put them in a new
.h file - dm-exception-store.h. This file will define the
API for new exception stores.

Ultimately, dm-snap.h is unnecessary, since only dm-snap.c
should be using it.

Signed-off-by: Jonathan Brassow <jbrassow@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>

authored by

Jonathan Brassow and committed by
Alasdair G Kergon
aea53d92 fe9cf30e

+134 -120
+1
drivers/md/dm-exception-store.c
··· 7 7 * This file is released under the GPL. 8 8 */ 9 9 10 + #include "dm-exception-store.h" 10 11 #include "dm-snap.h" 11 12 12 13 #include <linux/mm.h>
+131
drivers/md/dm-exception-store.h
··· 1 + /* 2 + * Copyright (C) 2001-2002 Sistina Software (UK) Limited. 3 + * Copyright (C) 2008 Red Hat, Inc. All rights reserved. 4 + * 5 + * Device-mapper snapshot exception store. 6 + * 7 + * This file is released under the GPL. 8 + */ 9 + 10 + #ifndef _LINUX_DM_EXCEPTION_STORE 11 + #define _LINUX_DM_EXCEPTION_STORE 12 + 13 + #include <linux/blkdev.h> 14 + 15 + /* 16 + * The snapshot code deals with largish chunks of the disk at a 17 + * time. Typically 32k - 512k. 18 + */ 19 + typedef sector_t chunk_t; 20 + 21 + /* 22 + * An exception is used where an old chunk of data has been 23 + * replaced by a new one. 24 + * If chunk_t is 64 bits in size, the top 8 bits of new_chunk hold the number 25 + * of chunks that follow contiguously. Remaining bits hold the number of the 26 + * chunk within the device. 27 + */ 28 + struct dm_snap_exception { 29 + struct list_head hash_list; 30 + 31 + chunk_t old_chunk; 32 + chunk_t new_chunk; 33 + }; 34 + 35 + /* 36 + * Abstraction to handle the meta/layout of exception stores (the 37 + * COW device). 38 + */ 39 + struct exception_store { 40 + /* 41 + * Destroys this object when you've finished with it. 42 + */ 43 + void (*destroy) (struct exception_store *store); 44 + 45 + /* 46 + * The target shouldn't read the COW device until this is 47 + * called. 48 + */ 49 + int (*read_metadata) (struct exception_store *store); 50 + 51 + /* 52 + * Find somewhere to store the next exception. 53 + */ 54 + int (*prepare_exception) (struct exception_store *store, 55 + struct dm_snap_exception *e); 56 + 57 + /* 58 + * Update the metadata with this exception. 59 + */ 60 + void (*commit_exception) (struct exception_store *store, 61 + struct dm_snap_exception *e, 62 + void (*callback) (void *, int success), 63 + void *callback_context); 64 + 65 + /* 66 + * The snapshot is invalid, note this in the metadata. 67 + */ 68 + void (*drop_snapshot) (struct exception_store *store); 69 + 70 + /* 71 + * Return how full the snapshot is. 72 + */ 73 + void (*fraction_full) (struct exception_store *store, 74 + sector_t *numerator, 75 + sector_t *denominator); 76 + 77 + struct dm_snapshot *snap; 78 + void *context; 79 + }; 80 + 81 + /* 82 + * Funtions to manipulate consecutive chunks 83 + */ 84 + # if defined(CONFIG_LBD) || (BITS_PER_LONG == 64) 85 + # define DM_CHUNK_CONSECUTIVE_BITS 8 86 + # define DM_CHUNK_NUMBER_BITS 56 87 + 88 + static inline chunk_t dm_chunk_number(chunk_t chunk) 89 + { 90 + return chunk & (chunk_t)((1ULL << DM_CHUNK_NUMBER_BITS) - 1ULL); 91 + } 92 + 93 + static inline unsigned dm_consecutive_chunk_count(struct dm_snap_exception *e) 94 + { 95 + return e->new_chunk >> DM_CHUNK_NUMBER_BITS; 96 + } 97 + 98 + static inline void dm_consecutive_chunk_count_inc(struct dm_snap_exception *e) 99 + { 100 + e->new_chunk += (1ULL << DM_CHUNK_NUMBER_BITS); 101 + 102 + BUG_ON(!dm_consecutive_chunk_count(e)); 103 + } 104 + 105 + # else 106 + # define DM_CHUNK_CONSECUTIVE_BITS 0 107 + 108 + static inline chunk_t dm_chunk_number(chunk_t chunk) 109 + { 110 + return chunk; 111 + } 112 + 113 + static inline unsigned dm_consecutive_chunk_count(struct dm_snap_exception *e) 114 + { 115 + return 0; 116 + } 117 + 118 + static inline void dm_consecutive_chunk_count_inc(struct dm_snap_exception *e) 119 + { 120 + } 121 + 122 + # endif 123 + 124 + /* 125 + * Two exception store implementations. 126 + */ 127 + int dm_create_persistent(struct exception_store *store); 128 + 129 + int dm_create_transient(struct exception_store *store); 130 + 131 + #endif /* _LINUX_DM_EXCEPTION_STORE */
+1
drivers/md/dm-snap.c
··· 21 21 #include <linux/log2.h> 22 22 #include <linux/dm-kcopyd.h> 23 23 24 + #include "dm-exception-store.h" 24 25 #include "dm-snap.h" 25 26 #include "dm-bio-list.h" 26 27
+1 -120
drivers/md/dm-snap.h
··· 1 1 /* 2 - * dm-snapshot.c 3 - * 4 2 * Copyright (C) 2001-2002 Sistina Software (UK) Limited. 5 3 * 6 4 * This file is released under the GPL. ··· 8 10 #define DM_SNAPSHOT_H 9 11 10 12 #include <linux/device-mapper.h> 13 + #include "dm-exception-store.h" 11 14 #include "dm-bio-list.h" 12 15 #include <linux/blkdev.h> 13 16 #include <linux/workqueue.h> ··· 17 18 uint32_t hash_mask; 18 19 unsigned hash_shift; 19 20 struct list_head *table; 20 - }; 21 - 22 - /* 23 - * The snapshot code deals with largish chunks of the disk at a 24 - * time. Typically 32k - 512k. 25 - */ 26 - typedef sector_t chunk_t; 27 - 28 - /* 29 - * An exception is used where an old chunk of data has been 30 - * replaced by a new one. 31 - * If chunk_t is 64 bits in size, the top 8 bits of new_chunk hold the number 32 - * of chunks that follow contiguously. Remaining bits hold the number of the 33 - * chunk within the device. 34 - */ 35 - struct dm_snap_exception { 36 - struct list_head hash_list; 37 - 38 - chunk_t old_chunk; 39 - chunk_t new_chunk; 40 - }; 41 - 42 - /* 43 - * Funtions to manipulate consecutive chunks 44 - */ 45 - # if defined(CONFIG_LBD) || (BITS_PER_LONG == 64) 46 - # define DM_CHUNK_CONSECUTIVE_BITS 8 47 - # define DM_CHUNK_NUMBER_BITS 56 48 - 49 - static inline chunk_t dm_chunk_number(chunk_t chunk) 50 - { 51 - return chunk & (chunk_t)((1ULL << DM_CHUNK_NUMBER_BITS) - 1ULL); 52 - } 53 - 54 - static inline unsigned dm_consecutive_chunk_count(struct dm_snap_exception *e) 55 - { 56 - return e->new_chunk >> DM_CHUNK_NUMBER_BITS; 57 - } 58 - 59 - static inline void dm_consecutive_chunk_count_inc(struct dm_snap_exception *e) 60 - { 61 - e->new_chunk += (1ULL << DM_CHUNK_NUMBER_BITS); 62 - 63 - BUG_ON(!dm_consecutive_chunk_count(e)); 64 - } 65 - 66 - # else 67 - # define DM_CHUNK_CONSECUTIVE_BITS 0 68 - 69 - static inline chunk_t dm_chunk_number(chunk_t chunk) 70 - { 71 - return chunk; 72 - } 73 - 74 - static inline unsigned dm_consecutive_chunk_count(struct dm_snap_exception *e) 75 - { 76 - return 0; 77 - } 78 - 79 - static inline void dm_consecutive_chunk_count_inc(struct dm_snap_exception *e) 80 - { 81 - } 82 - 83 - # endif 84 - 85 - /* 86 - * Abstraction to handle the meta/layout of exception stores (the 87 - * COW device). 88 - */ 89 - struct exception_store { 90 - 91 - /* 92 - * Destroys this object when you've finished with it. 93 - */ 94 - void (*destroy) (struct exception_store *store); 95 - 96 - /* 97 - * The target shouldn't read the COW device until this is 98 - * called. 99 - */ 100 - int (*read_metadata) (struct exception_store *store); 101 - 102 - /* 103 - * Find somewhere to store the next exception. 104 - */ 105 - int (*prepare_exception) (struct exception_store *store, 106 - struct dm_snap_exception *e); 107 - 108 - /* 109 - * Update the metadata with this exception. 110 - */ 111 - void (*commit_exception) (struct exception_store *store, 112 - struct dm_snap_exception *e, 113 - void (*callback) (void *, int success), 114 - void *callback_context); 115 - 116 - /* 117 - * The snapshot is invalid, note this in the metadata. 118 - */ 119 - void (*drop_snapshot) (struct exception_store *store); 120 - 121 - /* 122 - * Return how full the snapshot is. 123 - */ 124 - void (*fraction_full) (struct exception_store *store, 125 - sector_t *numerator, 126 - sector_t *denominator); 127 - 128 - struct dm_snapshot *snap; 129 - void *context; 130 21 }; 131 22 132 23 #define DM_TRACKED_CHUNK_HASH_SIZE 16 ··· 80 191 * initialising. 81 192 */ 82 193 int dm_add_exception(struct dm_snapshot *s, chunk_t old, chunk_t new); 83 - 84 - /* 85 - * Constructor and destructor for the default persistent 86 - * store. 87 - */ 88 - int dm_create_persistent(struct exception_store *store); 89 - 90 - int dm_create_transient(struct exception_store *store); 91 194 92 195 /* 93 196 * Return the number of sectors in the device.