tdedup.h - dedup - data deduplication program HTML git clone git://bitreich.org/dedup/ git://hg6vgqziawt5s4dj.onion/dedup/ DIR Log DIR Files DIR Refs DIR Tags DIR README DIR LICENSE --- tdedup.h (7438B) --- 1 #include "config.h" 2 3 #define SNAPSF ".snapshots" 4 #define STOREF ".store" 5 6 /* 7 * These are the actual sizes of the structs in the 8 * file format itself. The types are serialized/deserialized 9 * using the helpers from types.c. Any modification made to 10 * the structs below will need to be reflected here and in types.c. 11 */ 12 #define MSG_SIZE 256 13 #define MD_SIZE 32 14 15 #define SNAP_HDR_SIZE 104 16 #define BLK_HDR_SIZE 16 17 #define BLK_DESC_SIZE (MD_SIZE + 16) 18 #define SNAPSHOT_SIZE (8 + MSG_SIZE + MD_SIZE + 8) 19 20 /* file format version */ 21 #define VER_MIN 2 22 #define VER_MAJ 0 23 24 /* snapshot header and block header flags */ 25 #define VER_MIN_MASK 0xff 26 #define VER_MAJ_SHIFT 8 27 #define VER_MAJ_MASK 0xff 28 29 /* block header flags */ 30 #define HASH_ALGO_SHIFT 19 31 #define HASH_ALGO_MASK 0x7 /* max 8 hash algos */ 32 #define COMPR_ALGO_SHIFT 16 33 #define COMPR_ALGO_MASK 0x7 /* max 8 compression algos */ 34 35 enum { 36 WALK_CONTINUE, 37 WALK_STOP 38 }; 39 40 enum compr_algo { 41 COMPR_NONE, 42 COMPR_LZ4, 43 COMPR_SNAPPY, 44 NR_COMPRS, 45 }; 46 47 enum hash_algo { 48 HASH_BLAKE2B, 49 HASH_BLAKE2BP, 50 HASH_BLAKE2S, 51 HASH_BLAKE2SP, 52 NR_HASHES, 53 }; 54 55 struct chunker; 56 struct icache; 57 58 struct stats { 59 uint64_t orig_size; /* original store size */ 60 uint64_t compr_size; /* compressed store size */ 61 uint64_t dedup_size; /* deduplicated store size */ 62 uint64_t min_blk_size; 63 uint64_t max_blk_size; 64 uint64_t nr_blks; /* number of unique blocks */ 65 uint64_t reserved[4]; 66 }; 67 68 struct snap_hdr { 69 uint64_t flags; 70 uint64_t size; /* size of snapshots file */ 71 uint64_t nr_snaps; 72 struct stats st; 73 }; 74 75 struct blk_hdr { 76 uint64_t flags; 77 uint64_t size; /* size of store file */ 78 }; 79 80 struct blk_desc { 81 uint8_t md[MD_SIZE]; /* hash of block */ 82 uint64_t offset; /* offset into store file */ 83 uint64_t size; /* size of block */ 84 }; 85 86 struct snap { 87 uint64_t size; /* size of snapshot (including block descriptors) */ 88 uint8_t msg[MSG_SIZE]; /* arbitrary message attached to snapshot */ 89 uint8_t md[MD_SIZE]; /* hash of snapshot (hash of all block descriptor hashes) */ 90 uint64_t nr_blk_descs; 91 struct blk_desc blk_desc[]; 92 }; 93 94 struct compr_ctx { 95 struct compr_ops *ops; 96 }; 97 98 struct hash_ctx { 99 union { 100 blake2b_state blake2b_ctx; 101 blake2bp_state blake2bp_ctx; 102 blake2s_state blake2s_ctx; 103 blake2sp_state blake2sp_ctx; 104 } u; 105 struct hash_ops *ops; 106 }; 107 108 /* dedup.c */ 109 extern int verbose; 110 111 /* chunker.c */ 112 struct chunker *alloc_chunker(int fd, size_t min_size, size_t max_size, 113 size_t mask, size_t win_size); 114 void free_chunker(struct chunker *chunker); 115 ssize_t fill_chunker(struct chunker *chunker); 116 uint8_t *get_chunk(struct chunker *chunker, size_t *chunk_size); 117 void drain_chunker(struct chunker *chunker); 118 119 /* compress-none.c */ 120 int none_init(struct compr_ctx *ctx); 121 size_t none_size(struct compr_ctx *ctx, size_t n); 122 size_t none_compr(struct compr_ctx *ctx, const void *in, void *out, 123 size_t insize, size_t outsize); 124 size_t none_decompr(struct compr_ctx *ctx, const void *in, void *out, 125 size_t insize, size_t outsize); 126 int none_final(struct compr_ctx *ctx); 127 128 /* compress-lz4.c */ 129 int lz4_init(struct compr_ctx *ctx); 130 size_t lz4_size(struct compr_ctx *ctx, size_t n); 131 size_t lz4_compr(struct compr_ctx *ctx, const void *in, void *out, 132 size_t insize, size_t outsize); 133 size_t lz4_decompr(struct compr_ctx *ctx, const void *in, void *out, 134 size_t insize, size_t outsize); 135 int lz4_final(struct compr_ctx *ctx); 136 137 /* compress-snappy.c */ 138 int snappy_init(struct compr_ctx *ctx); 139 size_t snappy_size(struct compr_ctx *ctx, size_t n); 140 size_t snappy_compr(struct compr_ctx *ctx, const void *in, void *out, 141 size_t insize, size_t outsize); 142 size_t snappy_decompr(struct compr_ctx *ctx, const void *in, void *out, 143 size_t insize, size_t outsize); 144 int snappy_final(struct compr_ctx *ctx); 145 146 /* compress.c */ 147 int compr_init(struct compr_ctx *ctx, int type); 148 int compr_size(struct compr_ctx *ctx, size_t n); 149 size_t compr(struct compr_ctx *ctx, const void *in, void *out, 150 size_t insize, size_t outsize); 151 size_t decompr(struct compr_ctx *ctx, const void *in, void *out, 152 size_t insize, size_t outsize); 153 int compr_final(struct compr_ctx *ctx); 154 int compr_name2type(char *name); 155 char *compr_type2name(int type); 156 void compr_list(int fd); 157 158 /* hash-blake2b.c */ 159 int blake2bi(struct hash_ctx *ctx, size_t n); 160 int blake2bu(struct hash_ctx *ctx, const void *buf, size_t n); 161 int blake2bf(struct hash_ctx *ctx, void *buf, size_t n); 162 163 /* hash-blake2bp.c */ 164 int blake2bpi(struct hash_ctx *ctx, size_t n); 165 int blake2bpu(struct hash_ctx *ctx, const void *buf, size_t n); 166 int blake2bpf(struct hash_ctx *ctx, void *buf, size_t n); 167 168 /* hash-blake2s.c */ 169 int blake2si(struct hash_ctx *ctx, size_t n); 170 int blake2su(struct hash_ctx *ctx, const void *buf, size_t n); 171 int blake2sf(struct hash_ctx *ctx, void *buf, size_t n); 172 173 /* hash-blake2sp.c */ 174 int blake2spi(struct hash_ctx *ctx, size_t n); 175 int blake2spu(struct hash_ctx *ctx, const void *buf, size_t n); 176 int blake2spf(struct hash_ctx *ctx, void *buf, size_t n); 177 178 /* hash.c */ 179 int hash_init(struct hash_ctx *ctx, int type, size_t n); 180 int hash_update(struct hash_ctx *ctx, const void *buf, size_t n); 181 int hash_final(struct hash_ctx *ctx, void *buf, size_t n); 182 int hash_name2type(char *name); 183 char *hash_type2name(int type); 184 void hash_list(int fd); 185 186 /* icache.c */ 187 struct icache *alloc_icache(void); 188 void free_icache(struct icache *icache); 189 void insert_icache(struct icache *icache, struct blk_desc *desc); 190 int lookup_icache(struct icache *icache, struct blk_desc *desc); 191 void icache_stats(struct icache *icache, unsigned long long *hits, 192 unsigned long long *misses); 193 194 /* pack.c */ 195 int pack(unsigned char *dst, char *fmt, ...); 196 197 /* unpack.c */ 198 int unpack(unsigned char *src, char *fmt, ...); 199 200 /* types.c */ 201 void read_snap_hdr(int fd, struct snap_hdr *hdr); 202 void write_snap_hdr(int fd, struct snap_hdr *hdr); 203 void read_blk_hdr(int fd, struct blk_hdr *hdr); 204 void write_blk_hdr(int fd, struct blk_hdr *hdr); 205 void read_blk_desc(int fd, struct blk_desc *desc); 206 void write_blk_desc(int fd, struct blk_desc *desc); 207 void read_snap(int fd, struct snap *snap); 208 void read_snap_descs(int fd, struct snap *snap); 209 void write_snap(int fd, struct snap *snap); 210 void write_snap_blk_descs(int fd, struct snap *snap); 211 212 /* utils.c */ 213 void str2bin(char *s, uint8_t *d); 214 off_t xlseek(int fd, off_t offset, int whence); 215 ssize_t xread(int fd, void *buf, size_t nbytes); 216 ssize_t xwrite(int fd, const void *buf, size_t nbytes); 217 void init_blk_hdr(struct blk_hdr *hdr, int compr_algo, int hash_algo); 218 void init_snap_hdr(struct snap_hdr *hdr); 219 void load_blk_hdr(int fd, struct blk_hdr *hdr, int *compr_algo, int *hash_algo); 220 void load_snap_hdr(int fd, struct snap_hdr *hdr); 221 struct snap *alloc_snap(void); 222 void free_snap(struct snap *snap); 223 struct snap *grow_snap(struct snap *snap, uint64_t nr_blk_descs); 224 void append_snap(int fd, struct snap_hdr *hdr, struct snap *snap); 225 void hash_snap(struct snap *snap, uint8_t *md, int hash_algo); 226 void walk_snap(int fd, struct snap_hdr *hdr, 227 int (*fn)(struct snap *, void *), void *arg); 228 uint8_t *alloc_buf(size_t size); 229 void free_buf(uint8_t *buf); 230 void read_blk(int fd, uint8_t *buf, struct blk_desc *blk_desc); 231 void append_blk(int fd, struct blk_hdr *hdr, uint8_t *buf, 232 struct blk_desc *blk_desc); 233 void hash_blk(uint8_t *buf, size_t size, uint8_t *md, int hash_algo);