libhammer - Add an overlooked function that releases snaps
[dragonfly.git] / lib / libhammer / libhammer.h
1 /*
2  * Copyright (c) 2011 The DragonFly Project.  All rights reserved.
3  *
4  * This code is derived from software contributed to The DragonFly Project
5  * by Antonio Huete <tuxillo@quantumachine.net>
6  * by Matthew Dillon <dillon@backplane.com>
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in
16  *    the documentation and/or other materials provided with the
17  *    distribution.
18  * 3. Neither the name of The DragonFly Project nor the names of its
19  *    contributors may be used to endorse or promote products derived
20  *    from this software without specific, prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
26  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
28  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
30  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
31  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
32  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  *
35  */
36
37 #ifndef _LIBHAMMER_H_
38 #define _LIBHAMMER_H_
39
40 #include <sys/queue.h>
41 #include <sys/param.h>
42
43 #include <vfs/hammer/hammer_disk.h>
44 #include <vfs/hammer/hammer_ioctl.h>
45
46 #define TXTLEN  64
47
48 #define HAMMER_BUFLISTS         64
49 #define HAMMER_BUFLISTMASK      (HAMMER_BUFLISTS - 1)
50 #define COLLECT_HSIZE   1024
51 #define COLLECT_HMASK   (COLLECT_HSIZE - 1)
52 #define HAMMER_BUFINFO_READAHEAD        0x0001
53 /*
54  * WARNING: Do not make the SNAPSHOTS_BASE "/var/snapshots" because
55  * it will interfere with the older HAMMER VERS < 3 snapshots directory
56  * for the /var PFS.
57  */
58 #define SNAPSHOTS_BASE  "/var/hammer"   /* HAMMER VERS >= 3 */
59 #define WS      " \t\r\n"
60
61 #define SERIALBUF_SIZE  (512 * 1024)
62 #define RD_HSIZE        32768
63 #define RD_HMASK        (RD_HSIZE - 1)
64
65 #define DICTF_MADEDIR   0x01
66 #define DICTF_MADEFILE  0x02
67 #define DICTF_PARENT    0x04    /* parent attached for real */
68 #define DICTF_TRAVERSED 0x80
69 #define FLAG_TOOFARLEFT         0x0001
70 #define FLAG_TOOFARRIGHT        0x0002
71 #define FLAG_BADTYPE            0x0004
72 #define FLAG_BADCHILDPARENT     0x0008
73 #define FLAG_BADMIRRORTID       0x0010
74
75 /*
76  * Hammer information system structures
77  */
78 struct libhammer_head {
79         int32_t error;
80         int32_t flags;
81         int32_t rsv[2];
82 };
83
84 typedef struct libhammer_snapinfo {
85         struct libhammer_head head; /* Additional error and flags */
86
87         TAILQ_ENTRY(libhammer_snapinfo) entries;
88         hammer_tid_t    tid;
89         u_int64_t       ts;
90         char            label[64];
91         u_int64_t       rsv;
92 } *libhammer_snapinfo_t;
93
94 typedef struct libhammer_pfsinfo {
95         struct libhammer_head head; /* Additional error and flags */
96
97         uint32_t  snapcount;        /* Snapshot count */
98         u_int32_t version;          /* HAMMER version */
99         char      *mountedon;       /* Mount path of the PFS */
100         int       ismaster;         /* Is a PFS master */
101         int       pfs_id;           /* PFS ID number */
102         int       mirror_flags;     /* Misc flags */
103         char      snapshots[64];    /* softlink dir for pruning */
104         uuid_t    unique_uuid;      /* unique uuid of this master/slave */
105         TAILQ_ENTRY(libhammer_pfsinfo) entries;
106         TAILQ_HEAD(snaplist, libhammer_snapinfo) list_snap;
107         hammer_tid_t beg_tid;       /* Earliest TID with full history */
108         hammer_tid_t end_tid;       /* Current synchronisation TID */
109
110         uint64_t rsv[4];
111 } *libhammer_pfsinfo_t;
112
113 typedef struct libhammer_fsinfo {
114         struct libhammer_head head; /* Additional error and flags */
115
116         char     vol_name[TXTLEN];  /* Volume name */
117         uuid_t   vol_fsid;          /* Filesystem UUID */
118         int      version;           /* HAMMER version */
119         int      nvolumes;          /* Number of volumes */
120         int64_t  inodes;            /* no. of inodes */
121         int64_t  bigblocks;         /* Total big blocks */
122         int64_t  freebigblocks;     /* Free big blocks */
123         int64_t  rsvbigblocks;      /* Reserved big blocks */
124         int32_t  rsv[8];
125         TAILQ_HEAD(pfslist, libhammer_pfsinfo) list_pseudo;
126 } *libhammer_fsinfo_t;
127
128 struct libhammer_btree_stats {
129         int64_t elements;
130         int64_t iterations;
131         int64_t splits;
132         int64_t inserts;
133         int64_t deletes;
134         int64_t lookups;
135         int64_t searches;
136 };
137
138 struct libhammer_io_stats {
139         int64_t undo;
140         int64_t dev_writes;
141         int64_t dev_reads;
142         int64_t file_writes;
143         int64_t file_reads;
144         int64_t file_iop_writes;
145         int64_t file_iop_reads;
146         int64_t inode_flushes;
147         int64_t commits;
148 };
149
150 /*
151  * Function prototypes
152  */
153 __BEGIN_DECLS
154 libhammer_fsinfo_t libhammer_get_fsinfo(const char *);
155 void libhammer_free_fsinfo(libhammer_fsinfo_t);
156
157 int libhammer_stats_redo(int64_t *);
158 int libhammer_stats_undo(int64_t *);
159 int libhammer_stats_commits(int64_t *);
160 int libhammer_stats_inode_flushes(int64_t *);
161 int libhammer_stats_disk_write(int64_t *);
162 int libhammer_stats_disk_read(int64_t *);
163 int libhammer_stats_file_iopsw(int64_t *);
164 int libhammer_stats_file_iopsr(int64_t *);
165 int libhammer_stats_file_write(int64_t *);
166 int libhammer_stats_file_read(int64_t *);
167 int libhammer_stats_record_iterations(int64_t *);
168 int libhammer_stats_root_iterations(int64_t *);
169 int libhammer_stats_btree_iterations(int64_t *);
170 int libhammer_stats_btree_splits(int64_t *);
171 int libhammer_stats_btree_elements(int64_t *);
172 int libhammer_stats_btree_deletes(int64_t *);
173 int libhammer_stats_btree_inserts(int64_t *);
174 int libhammer_stats_btree_lookups(int64_t *);
175 int libhammer_stats_btree_searches(int64_t *);
176 int libhammer_btree_stats(struct libhammer_btree_stats *);
177 int libhammer_io_stats(struct libhammer_io_stats *);
178
179 int libhammer_pfs_get_snapshots(libhammer_fsinfo_t, libhammer_pfsinfo_t);
180 void libhammer_pfs_free_snapshots(libhammer_pfsinfo_t);
181
182 char *libhammer_find_pfs_mount(uuid_t *);
183 void libhammer_pfs_canonical_path(char *, libhammer_pfsinfo_t, char **);
184 void *_libhammer_malloc(size_t);
185 void libhammer_compat_old_snapcount(libhammer_pfsinfo_t);
186 __END_DECLS
187
188 /*
189  * Wrappers to operate PFS TAILQ for each HAMMER filesystem
190  */
191 static __inline libhammer_pfsinfo_t
192 libhammer_get_next_pfs(libhammer_pfsinfo_t pfsinfo)
193 {
194         return TAILQ_NEXT(pfsinfo, entries);
195 }
196
197 static __inline libhammer_pfsinfo_t
198 libhammer_get_prev_pfs(libhammer_pfsinfo_t pfsinfo)
199 {
200         return TAILQ_PREV(pfsinfo, pfslist, entries);
201 }
202
203 static __inline libhammer_pfsinfo_t
204 libhammer_get_first_pfs(libhammer_fsinfo_t fip)
205 {
206         return TAILQ_FIRST(&fip->list_pseudo);
207 }
208
209 static __inline libhammer_pfsinfo_t
210 libhammer_get_last_pfs(libhammer_fsinfo_t fip)
211 {
212         return TAILQ_LAST(&fip->list_pseudo, pfslist);
213 }
214
215 /*
216  * Wrappers to operate snapshot TAILQ for each PFS
217  */
218 static __inline libhammer_snapinfo_t
219 libhammer_get_next_snap(libhammer_snapinfo_t sip)
220 {
221         return TAILQ_NEXT(sip, entries);
222 }
223
224 static __inline libhammer_snapinfo_t
225 libhammer_get_prev_snap(libhammer_snapinfo_t sip)
226 {
227         return TAILQ_PREV(sip, snaplist, entries);
228 }
229
230 static __inline libhammer_snapinfo_t
231 libhammer_get_first_snap(libhammer_pfsinfo_t pip)
232 {
233         return TAILQ_FIRST(&pip->list_snap);
234 }
235
236 static __inline libhammer_snapinfo_t
237 libhammer_get_last_snap(libhammer_pfsinfo_t pip)
238 {
239         return TAILQ_LAST(&pip->list_snap, snaplist);
240 }
241
242 #endif