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 243