xref: /dragonfly/lib/libhammer/libhammer.h (revision 0dace59e)
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_pfsinfo {
85 	struct libhammer_head head; /* Additional error and flags */
86 
87 	uint32_t  snapcount;	    /* Snapshot count */
88 	u_int32_t version;          /* HAMMER version */
89 	char      *mountedon;       /* Mount path of the PFS */
90 	int       ismaster;         /* Is a PFS master */
91 	int       pfs_id;           /* PFS ID number */
92 	int       mirror_flags;     /* Misc flags */
93 	char      snapshots[64];    /* softlink dir for pruning */
94 	uuid_t    unique_uuid;      /* unique uuid of this master/slave */
95 	TAILQ_ENTRY(libhammer_pfsinfo) entries;
96 } *libhammer_pfsinfo_t;
97 
98 typedef struct libhammer_volinfo {
99 	struct libhammer_head head; /* Additional error and flags */
100 
101 	char     vol_name[TXTLEN];  /* Volume name */
102 	uuid_t   vol_fsid;          /* Filesystem UUID */
103 	int      version;           /* HAMMER version */
104 	int      nvolumes;          /* Number of volumes */
105 	int64_t  inodes;            /* no. of inodes */
106 	int64_t  bigblocks;         /* Total big blocks */
107 	int64_t  freebigblocks;     /* Free big blocks */
108 	int64_t  rsvbigblocks;      /* Reserved big blocks */
109 	int32_t  rsv[8];
110 	TAILQ_HEAD(pfslist, libhammer_pfsinfo) list_pseudo;
111 } *libhammer_volinfo_t;
112 
113 struct libhammer_btree_stats {
114 	int64_t elements;
115 	int64_t iterations;
116 	int64_t splits;
117 	int64_t inserts;
118 	int64_t deletes;
119 	int64_t lookups;
120 	int64_t searches;
121 };
122 
123 struct libhammer_io_stats {
124 	int64_t undo;
125 	int64_t dev_writes;
126 	int64_t dev_reads;
127 	int64_t file_writes;
128 	int64_t file_reads;
129 	int64_t file_iop_writes;
130 	int64_t file_iop_reads;
131 	int64_t inode_flushes;
132 	int64_t commits;
133 };
134 
135 /*
136  * Function prototypes
137  */
138 __BEGIN_DECLS
139 libhammer_volinfo_t libhammer_get_volinfo(const char *);
140 void libhammer_free_volinfo(libhammer_volinfo_t);
141 
142 int libhammer_stats_redo(int64_t *);
143 int libhammer_stats_undo(int64_t *);
144 int libhammer_stats_commits(int64_t *);
145 int libhammer_stats_inode_flushes(int64_t *);
146 int libhammer_stats_disk_write(int64_t *);
147 int libhammer_stats_disk_read(int64_t *);
148 int libhammer_stats_file_iopsw(int64_t *);
149 int libhammer_stats_file_iopsr(int64_t *);
150 int libhammer_stats_file_write(int64_t *);
151 int libhammer_stats_file_read(int64_t *);
152 int libhammer_stats_record_iterations(int64_t *);
153 int libhammer_stats_root_iterations(int64_t *);
154 int libhammer_stats_btree_iterations(int64_t *);
155 int libhammer_stats_btree_splits(int64_t *);
156 int libhammer_stats_btree_elements(int64_t *);
157 int libhammer_stats_btree_deletes(int64_t *);
158 int libhammer_stats_btree_inserts(int64_t *);
159 int libhammer_stats_btree_lookups(int64_t *);
160 int libhammer_stats_btree_searches(int64_t *);
161 int libhammer_btree_stats(struct libhammer_btree_stats *);
162 int libhammer_io_stats(struct libhammer_io_stats *);
163 
164 char *libhammer_find_pfs_mount(int, uuid_t, int);
165 void *_libhammer_malloc(size_t);
166 __END_DECLS
167 
168 static __inline libhammer_pfsinfo_t
169 libhammer_get_next_pfs(libhammer_pfsinfo_t pfsinfo)
170 {
171 	return TAILQ_NEXT(pfsinfo, entries);
172 }
173 
174 static __inline libhammer_pfsinfo_t
175 libhammer_get_prev_pfs(libhammer_pfsinfo_t pfsinfo)
176 {
177 	return TAILQ_PREV(pfsinfo, pfslist, entries);
178 }
179 
180 static __inline libhammer_pfsinfo_t
181 libhammer_get_first_pfs(libhammer_volinfo_t volinfo)
182 {
183 	return TAILQ_FIRST(&volinfo->list_pseudo);
184 }
185 
186 static __inline libhammer_pfsinfo_t
187 libhammer_get_last_pfs(libhammer_volinfo_t volinfo)
188 {
189 	return TAILQ_LAST(&volinfo->list_pseudo, pfslist);
190 }
191 
192 #endif
193