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