Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.29 148 lines 3.6 kB view raw
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#include <linux/device-mapper.h> 15 16/* 17 * The snapshot code deals with largish chunks of the disk at a 18 * time. Typically 32k - 512k. 19 */ 20typedef sector_t chunk_t; 21 22/* 23 * An exception is used where an old chunk of data has been 24 * replaced by a new one. 25 * If chunk_t is 64 bits in size, the top 8 bits of new_chunk hold the number 26 * of chunks that follow contiguously. Remaining bits hold the number of the 27 * chunk within the device. 28 */ 29struct dm_snap_exception { 30 struct list_head hash_list; 31 32 chunk_t old_chunk; 33 chunk_t new_chunk; 34}; 35 36/* 37 * Abstraction to handle the meta/layout of exception stores (the 38 * COW device). 39 */ 40struct dm_exception_store { 41 /* 42 * Destroys this object when you've finished with it. 43 */ 44 void (*destroy) (struct dm_exception_store *store); 45 46 /* 47 * The target shouldn't read the COW device until this is 48 * called. As exceptions are read from the COW, they are 49 * reported back via the callback. 50 */ 51 int (*read_metadata) (struct dm_exception_store *store, 52 int (*callback)(void *callback_context, 53 chunk_t old, chunk_t new), 54 void *callback_context); 55 56 /* 57 * Find somewhere to store the next exception. 58 */ 59 int (*prepare_exception) (struct dm_exception_store *store, 60 struct dm_snap_exception *e); 61 62 /* 63 * Update the metadata with this exception. 64 */ 65 void (*commit_exception) (struct dm_exception_store *store, 66 struct dm_snap_exception *e, 67 void (*callback) (void *, int success), 68 void *callback_context); 69 70 /* 71 * The snapshot is invalid, note this in the metadata. 72 */ 73 void (*drop_snapshot) (struct dm_exception_store *store); 74 75 int (*status) (struct dm_exception_store *store, status_type_t status, 76 char *result, unsigned int maxlen); 77 78 /* 79 * Return how full the snapshot is. 80 */ 81 void (*fraction_full) (struct dm_exception_store *store, 82 sector_t *numerator, 83 sector_t *denominator); 84 85 struct dm_snapshot *snap; 86 void *context; 87}; 88 89/* 90 * Funtions to manipulate consecutive chunks 91 */ 92# if defined(CONFIG_LBD) || (BITS_PER_LONG == 64) 93# define DM_CHUNK_CONSECUTIVE_BITS 8 94# define DM_CHUNK_NUMBER_BITS 56 95 96static inline chunk_t dm_chunk_number(chunk_t chunk) 97{ 98 return chunk & (chunk_t)((1ULL << DM_CHUNK_NUMBER_BITS) - 1ULL); 99} 100 101static inline unsigned dm_consecutive_chunk_count(struct dm_snap_exception *e) 102{ 103 return e->new_chunk >> DM_CHUNK_NUMBER_BITS; 104} 105 106static inline void dm_consecutive_chunk_count_inc(struct dm_snap_exception *e) 107{ 108 e->new_chunk += (1ULL << DM_CHUNK_NUMBER_BITS); 109 110 BUG_ON(!dm_consecutive_chunk_count(e)); 111} 112 113# else 114# define DM_CHUNK_CONSECUTIVE_BITS 0 115 116static inline chunk_t dm_chunk_number(chunk_t chunk) 117{ 118 return chunk; 119} 120 121static inline unsigned dm_consecutive_chunk_count(struct dm_snap_exception *e) 122{ 123 return 0; 124} 125 126static inline void dm_consecutive_chunk_count_inc(struct dm_snap_exception *e) 127{ 128} 129 130# endif 131 132int dm_exception_store_init(void); 133void dm_exception_store_exit(void); 134 135/* 136 * Two exception store implementations. 137 */ 138int dm_persistent_snapshot_init(void); 139void dm_persistent_snapshot_exit(void); 140 141int dm_transient_snapshot_init(void); 142void dm_transient_snapshot_exit(void); 143 144int dm_create_persistent(struct dm_exception_store *store); 145 146int dm_create_transient(struct dm_exception_store *store); 147 148#endif /* _LINUX_DM_EXCEPTION_STORE */