1 /* 2 * Copyright (c) 2004 The DragonFly Project. All rights reserved. 3 * 4 * This code is derived from software contributed to The DragonFly Project 5 * by Matthew Dillon <dillon@backplane.com> 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in 15 * the documentation and/or other materials provided with the 16 * distribution. 17 * 3. Neither the name of The DragonFly Project nor the names of its 18 * contributors may be used to endorse or promote products derived 19 * from this software without specific, prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 25 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 26 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, 27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 29 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 30 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 31 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 * 34 * $DragonFly: src/sys/sys/mountctl.h,v 1.13 2006/05/20 02:42:13 dillon Exp $ 35 */ 36 37 #ifndef _SYS_MOUNTCTL_H_ 38 #define _SYS_MOUNTCTL_H_ 39 40 #ifndef _SYS_TYPES_H_ 41 #include <sys/types.h> 42 #endif 43 #ifndef _SYS_TIME_H_ 44 #include <sys/time.h> 45 #endif 46 #ifndef _SYS_QUEUE_H_ 47 #include <sys/queue.h> 48 #endif 49 #ifndef _SYS_THREAD_H_ 50 #include <sys/thread.h> 51 #endif 52 53 #ifdef _KERNEL 54 55 #ifndef _SYS_MALLOC_H_ 56 #include <sys/malloc.h> 57 #endif 58 59 #endif 60 61 /* 62 * General constants 63 */ 64 65 #define JIDMAX 32 /* id string buf[] size (incls \0) */ 66 67 /* 68 * Data structures for the journaling API 69 */ 70 71 #define MOUNTCTL_INSTALL_VFS_JOURNAL 1 72 #define MOUNTCTL_REMOVE_VFS_JOURNAL 2 73 #define MOUNTCTL_RESYNC_VFS_JOURNAL 3 74 #define MOUNTCTL_STATUS_VFS_JOURNAL 4 75 #define MOUNTCTL_RESTART_VFS_JOURNAL 5 76 77 #define MOUNTCTL_INSTALL_BLK_JOURNAL 8 78 #define MOUNTCTL_REMOVE_BLK_JOURNAL 9 79 #define MOUNTCTL_RESYNC_BLK_JOURNAL 10 80 #define MOUNTCTL_STATUS_BLK_JOURNAL 11 81 82 struct mountctl_install_journal { 83 char id[JIDMAX]; 84 int flags; /* journaling flags */ 85 int unused01; 86 int64_t membufsize; /* backing store */ 87 int64_t swapbufsize; /* backing store */ 88 int64_t transid; /* starting with specified transaction id */ 89 int64_t unused02; 90 int stallwarn; /* stall warning (seconds) */ 91 int stallerror; /* stall error (seconds) */ 92 int unused03; 93 int unused04; 94 }; 95 96 #define MC_JOURNAL_UNUSED0001 0x00000001 97 #define MC_JOURNAL_STOP_REQ 0x00000002 /* stop request pend */ 98 #define MC_JOURNAL_STOP_IMM 0x00000004 /* STOP+trash fifo */ 99 #define MC_JOURNAL_WACTIVE 0x00000008 /* wthread running */ 100 #define MC_JOURNAL_RACTIVE 0x00000010 /* rthread running */ 101 #define MC_JOURNAL_WWAIT 0x00000040 /* write stall */ 102 #define MC_JOURNAL_WANT_AUDIT 0x00010000 /* audit trail */ 103 #define MC_JOURNAL_WANT_REVERSABLE 0x00020000 /* reversable stream */ 104 #define MC_JOURNAL_WANT_FULLDUPLEX 0x00040000 /* has ack stream */ 105 106 struct mountctl_restart_journal { 107 char id[JIDMAX]; 108 int flags; 109 int unused01; 110 }; 111 112 struct mountctl_remove_journal { 113 char id[JIDMAX]; 114 int flags; 115 }; 116 117 #define MC_JOURNAL_REMOVE_TRASH 0x00000001 /* data -> trash */ 118 #define MC_JOURNAL_REMOVE_ASSYNC 0x00000002 /* asynchronous op */ 119 120 struct mountctl_status_journal { 121 char id[JIDMAX]; 122 int index; 123 }; 124 125 #define MC_JOURNAL_INDEX_ALL -2 126 #define MC_JOURNAL_INDEX_ID -1 127 128 struct mountctl_journal_ret_status { 129 int recsize; 130 char id[JIDMAX]; 131 int index; 132 int flags; 133 int64_t membufsize; 134 int64_t membufused; 135 int64_t membufunacked; 136 int64_t swapbufsize; 137 int64_t swapbufused; 138 int64_t swapbufunacked; 139 int64_t transidstart; 140 int64_t transidcurrent; 141 int64_t transidunacked; 142 int64_t transidacked; 143 int64_t bytessent; 144 int64_t bytesacked; 145 int64_t fifostalls; 146 int64_t reserved[4]; 147 struct timeval lastack; 148 }; 149 150 #define MC_JOURNAL_STATUS_MORETOCOME 0x00000001 151 152 #if defined(_KERNEL) || defined(_KERNEL_STRUCTURES) 153 154 /* 155 * Support structures for the generic journaling structure 156 */ 157 struct journal_memfifo { 158 int size; /* size (power of two) */ 159 int mask; /* index mask (size - 1) */ 160 int rindex; /* stream reader index (track fd writes) */ 161 int xindex; /* last acked / reader restart */ 162 int windex; /* stream writer index */ 163 char *membase; /* memory buffer representing the FIFO */ 164 }; 165 166 /* 167 * Generic journaling structure attached to a mount point. 168 */ 169 struct journal { 170 TAILQ_ENTRY(journal) jentry; 171 struct file *fp; 172 char id[JIDMAX]; 173 int flags; /* journaling flags */ 174 int64_t transid; 175 int64_t total_acked; 176 int64_t fifostalls; 177 struct journal_memfifo fifo; 178 struct thread wthread; 179 struct thread rthread; 180 }; 181 182 183 /* 184 * The jrecord structure is used to build a journaling transaction. Since 185 * a single journaling transaction might encompass very large buffers it 186 * is possible for multiple transactions to be written out to the FIFO 187 * in parallel and in peacemeal. 188 */ 189 struct jrecord { 190 struct journal *jo; 191 char *stream_ptr; 192 int stream_residual; 193 int stream_reserved; 194 struct journal_rawrecbeg *rawp; 195 struct journal_subrecord *parent; 196 struct journal_subrecord *last; 197 int16_t streamid; 198 int pushcount; 199 int pushptrgood; 200 int residual; 201 int residual_align; 202 203 /* 204 * These fields are not used by the jrecord routines. They may 205 * be used by higher level routines to manage multiple jrecords. 206 * See the jreclist_*() functions. 207 */ 208 TAILQ_ENTRY(jrecord) user_entry; 209 void *user_save; 210 }; 211 212 struct jrecord_list { 213 TAILQ_HEAD(, jrecord) list; 214 int16_t streamid; 215 }; 216 217 #endif /* kernel or kernel structures */ 218 219 #if defined(_KERNEL) 220 221 struct namecache; 222 struct ucred; 223 struct uio; 224 struct vnode; 225 struct vattr; 226 struct vm_page; 227 228 void journal_create_threads(struct journal *jo); 229 void journal_destroy_threads(struct journal *jo, int flags); 230 231 /* 232 * Primary journal record support procedures 233 */ 234 void jrecord_init(struct journal *jo, 235 struct jrecord *jrec, int16_t streamid); 236 struct journal_subrecord *jrecord_push( 237 struct jrecord *jrec, int16_t rectype); 238 void jrecord_pop(struct jrecord *jrec, struct journal_subrecord *parent); 239 void jrecord_leaf(struct jrecord *jrec, 240 int16_t rectype, void *ptr, int bytes); 241 struct journal_subrecord *jrecord_write(struct jrecord *jrec, 242 int16_t rectype, int bytes); 243 void jrecord_data(struct jrecord *jrec, const void *buf, int bytes); 244 void jrecord_done(struct jrecord *jrec, int abortit); 245 246 /* 247 * Rollup journal record support procedures 248 */ 249 void jrecord_write_path(struct jrecord *jrec, 250 int16_t rectype, struct namecache *ncp); 251 void jrecord_write_vattr(struct jrecord *jrec, struct vattr *vat); 252 void jrecord_write_cred(struct jrecord *jrec, struct thread *td, 253 struct ucred *cred); 254 void jrecord_write_vnode_ref(struct jrecord *jrec, struct vnode *vp); 255 void jrecord_write_vnode_link(struct jrecord *jrec, struct vnode *vp, 256 struct namecache *notncp); 257 void jrecord_write_pagelist(struct jrecord *jrec, int16_t rectype, 258 struct vm_page **pglist, int *rtvals, int pgcount, 259 off_t offset); 260 void jrecord_write_uio(struct jrecord *jrec, int16_t rectype, struct uio *uio); 261 void jrecord_file_data(struct jrecord *jrec, struct vnode *vp, 262 off_t off, off_t bytes); 263 264 MALLOC_DECLARE(M_JOURNAL); 265 MALLOC_DECLARE(M_JFIFO); 266 267 #endif /* kernel */ 268 269 #endif /* header */ 270