2 * Copyright (c) 2011 The DragonFly Project. All rights reserved.
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>
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
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
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.
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
40 #include <sys/queue.h>
41 #include <sys/param.h>
43 #include <vfs/hammer/hammer_disk.h>
44 #include <vfs/hammer/hammer_ioctl.h>
49 * WARNING: Do not make the SNAPSHOTS_BASE "/var/snapshots" because
50 * it will interfere with the older HAMMER VERS < 3 snapshots directory
53 #define SNAPSHOTS_BASE "/var/hammer" /* HAMMER VERS >= 3 */
56 * Hammer information system structures
58 struct libhammer_head
{
64 typedef struct libhammer_snapinfo
{
65 struct libhammer_head head
; /* Additional error and flags */
67 TAILQ_ENTRY(libhammer_snapinfo
) entries
;
72 } *libhammer_snapinfo_t
;
74 typedef struct libhammer_pfsinfo
{
75 struct libhammer_head head
; /* Additional error and flags */
77 uint32_t snapcount
; /* Snapshot count */
78 u_int32_t version
; /* HAMMER version */
79 char *mountedon
; /* Mount path of the PFS */
80 int ismaster
; /* Is a PFS master */
81 int pfs_id
; /* PFS ID number */
82 int mirror_flags
; /* Misc flags */
83 char snapshots
[64]; /* softlink dir for pruning */
84 uuid_t unique_uuid
; /* unique uuid of this master/slave */
85 TAILQ_ENTRY(libhammer_pfsinfo
) entries
;
86 TAILQ_HEAD(snaplist
, libhammer_snapinfo
) list_snap
;
87 hammer_tid_t beg_tid
; /* Earliest TID with full history */
88 hammer_tid_t end_tid
; /* Current synchronisation TID */
91 } *libhammer_pfsinfo_t
;
93 typedef struct libhammer_fsinfo
{
94 struct libhammer_head head
; /* Additional error and flags */
96 char vol_name
[TXTLEN
]; /* Volume name */
97 uuid_t vol_fsid
; /* Filesystem UUID */
98 int version
; /* HAMMER version */
99 int nvolumes
; /* Number of volumes */
100 int64_t inodes
; /* no. of inodes */
101 int64_t bigblocks
; /* Total big blocks */
102 int64_t freebigblocks
; /* Free big blocks */
103 int64_t rsvbigblocks
; /* Reserved big blocks */
104 int32_t rootvol
; /* Root volume # */
106 TAILQ_HEAD(pfslist
, libhammer_pfsinfo
) list_pseudo
;
107 } *libhammer_fsinfo_t
;
109 struct libhammer_btree_stats
{
119 struct libhammer_io_stats
{
125 int64_t file_iop_writes
;
126 int64_t file_iop_reads
;
127 int64_t inode_flushes
;
132 * Function prototypes
135 libhammer_fsinfo_t
libhammer_get_fsinfo(const char *);
136 void libhammer_free_fsinfo(libhammer_fsinfo_t
);
138 int libhammer_stats_redo(int64_t *);
139 int libhammer_stats_undo(int64_t *);
140 int libhammer_stats_commits(int64_t *);
141 int libhammer_stats_inode_flushes(int64_t *);
142 int libhammer_stats_disk_write(int64_t *);
143 int libhammer_stats_disk_read(int64_t *);
144 int libhammer_stats_file_iopsw(int64_t *);
145 int libhammer_stats_file_iopsr(int64_t *);
146 int libhammer_stats_file_write(int64_t *);
147 int libhammer_stats_file_read(int64_t *);
148 int libhammer_stats_record_iterations(int64_t *);
149 int libhammer_stats_root_iterations(int64_t *);
150 int libhammer_stats_btree_iterations(int64_t *);
151 int libhammer_stats_btree_splits(int64_t *);
152 int libhammer_stats_btree_elements(int64_t *);
153 int libhammer_stats_btree_deletes(int64_t *);
154 int libhammer_stats_btree_inserts(int64_t *);
155 int libhammer_stats_btree_lookups(int64_t *);
156 int libhammer_stats_btree_searches(int64_t *);
157 int libhammer_btree_stats(struct libhammer_btree_stats
*);
158 int libhammer_io_stats(struct libhammer_io_stats
*);
160 int libhammer_pfs_get_snapshots(libhammer_fsinfo_t
, libhammer_pfsinfo_t
);
161 void libhammer_pfs_free_snapshots(libhammer_pfsinfo_t
);
163 char *libhammer_find_pfs_mount(uuid_t
*);
164 void libhammer_pfs_canonical_path(char *, libhammer_pfsinfo_t
, char **);
165 void *_libhammer_malloc(size_t);
166 void libhammer_compat_old_snapcount(libhammer_pfsinfo_t
);
170 * Wrappers to operate PFS TAILQ for each HAMMER filesystem
172 static __inline libhammer_pfsinfo_t
173 libhammer_get_next_pfs(libhammer_pfsinfo_t pfsinfo
)
175 return TAILQ_NEXT(pfsinfo
, entries
);
178 static __inline libhammer_pfsinfo_t
179 libhammer_get_prev_pfs(libhammer_pfsinfo_t pfsinfo
)
181 return TAILQ_PREV(pfsinfo
, pfslist
, entries
);
184 static __inline libhammer_pfsinfo_t
185 libhammer_get_first_pfs(libhammer_fsinfo_t fip
)
187 return TAILQ_FIRST(&fip
->list_pseudo
);
190 static __inline libhammer_pfsinfo_t
191 libhammer_get_last_pfs(libhammer_fsinfo_t fip
)
193 return TAILQ_LAST(&fip
->list_pseudo
, pfslist
);
197 * Wrappers to operate snapshot TAILQ for each PFS
199 static __inline libhammer_snapinfo_t
200 libhammer_get_next_snap(libhammer_snapinfo_t sip
)
202 return TAILQ_NEXT(sip
, entries
);
205 static __inline libhammer_snapinfo_t
206 libhammer_get_prev_snap(libhammer_snapinfo_t sip
)
208 return TAILQ_PREV(sip
, snaplist
, entries
);
211 static __inline libhammer_snapinfo_t
212 libhammer_get_first_snap(libhammer_pfsinfo_t pip
)
214 return TAILQ_FIRST(&pip
->list_snap
);
217 static __inline libhammer_snapinfo_t
218 libhammer_get_last_snap(libhammer_pfsinfo_t pip
)
220 return TAILQ_LAST(&pip
->list_snap
, snaplist
);