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>
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
54 * WARNING: Do not make the SNAPSHOTS_BASE "/var/snapshots" because
55 * it will interfere with the older HAMMER VERS < 3 snapshots directory
58 #define SNAPSHOTS_BASE "/var/hammer" /* HAMMER VERS >= 3 */
61 #define SERIALBUF_SIZE (512 * 1024)
62 #define RD_HSIZE 32768
63 #define RD_HMASK (RD_HSIZE - 1)
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
76 * Hammer information system structures
78 struct libhammer_head {
84 typedef struct libhammer_pfsinfo {
85 struct libhammer_head head; /* Additional error and flags */
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;
97 hammer_tid_t beg_tid; /* Earliest TID with full history */
98 hammer_tid_t end_tid; /* Current synchronisation TID */
101 } *libhammer_pfsinfo_t;
103 typedef struct libhammer_volinfo {
104 struct libhammer_head head; /* Additional error and flags */
106 char vol_name[TXTLEN]; /* Volume name */
107 uuid_t vol_fsid; /* Filesystem UUID */
108 int version; /* HAMMER version */
109 int nvolumes; /* Number of volumes */
110 int64_t inodes; /* no. of inodes */
111 int64_t bigblocks; /* Total big blocks */
112 int64_t freebigblocks; /* Free big blocks */
113 int64_t rsvbigblocks; /* Reserved big blocks */
115 TAILQ_HEAD(pfslist, libhammer_pfsinfo) list_pseudo;
116 } *libhammer_volinfo_t;
118 struct libhammer_btree_stats {
128 struct libhammer_io_stats {
134 int64_t file_iop_writes;
135 int64_t file_iop_reads;
136 int64_t inode_flushes;
141 * Function prototypes
144 libhammer_volinfo_t libhammer_get_volinfo(const char *);
145 void libhammer_free_volinfo(libhammer_volinfo_t);
147 int libhammer_stats_redo(int64_t *);
148 int libhammer_stats_undo(int64_t *);
149 int libhammer_stats_commits(int64_t *);
150 int libhammer_stats_inode_flushes(int64_t *);
151 int libhammer_stats_disk_write(int64_t *);
152 int libhammer_stats_disk_read(int64_t *);
153 int libhammer_stats_file_iopsw(int64_t *);
154 int libhammer_stats_file_iopsr(int64_t *);
155 int libhammer_stats_file_write(int64_t *);
156 int libhammer_stats_file_read(int64_t *);
157 int libhammer_stats_record_iterations(int64_t *);
158 int libhammer_stats_root_iterations(int64_t *);
159 int libhammer_stats_btree_iterations(int64_t *);
160 int libhammer_stats_btree_splits(int64_t *);
161 int libhammer_stats_btree_elements(int64_t *);
162 int libhammer_stats_btree_deletes(int64_t *);
163 int libhammer_stats_btree_inserts(int64_t *);
164 int libhammer_stats_btree_lookups(int64_t *);
165 int libhammer_stats_btree_searches(int64_t *);
166 int libhammer_btree_stats(struct libhammer_btree_stats *);
167 int libhammer_io_stats(struct libhammer_io_stats *);
169 char *libhammer_find_pfs_mount(int, uuid_t, int);
170 void *_libhammer_malloc(size_t);
173 static __inline libhammer_pfsinfo_t
174 libhammer_get_next_pfs(libhammer_pfsinfo_t pfsinfo)
176 return TAILQ_NEXT(pfsinfo, entries);
179 static __inline libhammer_pfsinfo_t
180 libhammer_get_prev_pfs(libhammer_pfsinfo_t pfsinfo)
182 return TAILQ_PREV(pfsinfo, pfslist, entries);
185 static __inline libhammer_pfsinfo_t
186 libhammer_get_first_pfs(libhammer_volinfo_t volinfo)
188 return TAILQ_FIRST(&volinfo->list_pseudo);
191 static __inline libhammer_pfsinfo_t
192 libhammer_get_last_pfs(libhammer_volinfo_t volinfo)
194 return TAILQ_LAST(&volinfo->list_pseudo, pfslist);