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.15 2008/06/01 19:27:37 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 #define MOUNTCTL_INSTALL_VFS_JOURNAL 1 68 #define MOUNTCTL_REMOVE_VFS_JOURNAL 2 69 #define MOUNTCTL_RESYNC_VFS_JOURNAL 3 70 #define MOUNTCTL_STATUS_VFS_JOURNAL 4 71 #define MOUNTCTL_RESTART_VFS_JOURNAL 5 72 73 #define MOUNTCTL_INSTALL_BLK_JOURNAL 8 74 #define MOUNTCTL_REMOVE_BLK_JOURNAL 9 75 #define MOUNTCTL_RESYNC_BLK_JOURNAL 10 76 #define MOUNTCTL_STATUS_BLK_JOURNAL 11 77 78 #define MOUNTCTL_SET_EXPORT 16 /* sys/mount.h:export_args */ 79 #define MOUNTCTL_STATVFS 17 /* get extended stats */ 80 81 /* 82 * Data structures for the journaling API 83 */ 84 85 struct mountctl_install_journal { 86 char id[JIDMAX]; 87 int flags; /* journaling flags */ 88 int unused01; 89 int64_t membufsize; /* backing store */ 90 int64_t swapbufsize; /* backing store */ 91 int64_t transid; /* starting with specified transaction id */ 92 int64_t unused02; 93 int stallwarn; /* stall warning (seconds) */ 94 int stallerror; /* stall error (seconds) */ 95 int unused03; 96 int unused04; 97 }; 98 99 #define MC_JOURNAL_UNUSED0001 0x00000001 100 #define MC_JOURNAL_STOP_REQ 0x00000002 /* stop request pend */ 101 #define MC_JOURNAL_STOP_IMM 0x00000004 /* STOP+trash fifo */ 102 #define MC_JOURNAL_WACTIVE 0x00000008 /* wthread running */ 103 #define MC_JOURNAL_RACTIVE 0x00000010 /* rthread running */ 104 #define MC_JOURNAL_WWAIT 0x00000040 /* write stall */ 105 #define MC_JOURNAL_WANT_AUDIT 0x00010000 /* audit trail */ 106 #define MC_JOURNAL_WANT_REVERSABLE 0x00020000 /* reversable stream */ 107 #define MC_JOURNAL_WANT_FULLDUPLEX 0x00040000 /* has ack stream */ 108 109 struct mountctl_restart_journal { 110 char id[JIDMAX]; 111 int flags; 112 int unused01; 113 }; 114 115 struct mountctl_remove_journal { 116 char id[JIDMAX]; 117 int flags; 118 }; 119 120 #define MC_JOURNAL_REMOVE_TRASH 0x00000001 /* data -> trash */ 121 #define MC_JOURNAL_REMOVE_ASSYNC 0x00000002 /* asynchronous op */ 122 123 struct mountctl_status_journal { 124 char id[JIDMAX]; 125 int index; 126 }; 127 128 #define MC_JOURNAL_INDEX_ALL -2 129 #define MC_JOURNAL_INDEX_ID -1 130 131 struct mountctl_journal_ret_status { 132 int recsize; 133 char id[JIDMAX]; 134 int index; 135 int flags; 136 int64_t membufsize; 137 int64_t membufused; 138 int64_t membufunacked; 139 int64_t swapbufsize; 140 int64_t swapbufused; 141 int64_t swapbufunacked; 142 int64_t transidstart; 143 int64_t transidcurrent; 144 int64_t transidunacked; 145 int64_t transidacked; 146 int64_t bytessent; 147 int64_t bytesacked; 148 int64_t fifostalls; 149 int64_t reserved[4]; 150 struct timeval lastack; 151 }; 152 153 #define MC_JOURNAL_STATUS_MORETOCOME 0x00000001 154 155 #if defined(_KERNEL) || defined(_KERNEL_STRUCTURES) 156 157 /* 158 * Support structures for the generic journaling structure 159 */ 160 struct journal_memfifo { 161 int size; /* size (power of two) */ 162 int mask; /* index mask (size - 1) */ 163 int rindex; /* stream reader index (track fd writes) */ 164 int xindex; /* last acked / reader restart */ 165 int windex; /* stream writer index */ 166 char *membase; /* memory buffer representing the FIFO */ 167 }; 168 169 /* 170 * Generic journaling structure attached to a mount point. 171 */ 172 struct journal { 173 TAILQ_ENTRY(journal) jentry; 174 struct file *fp; 175 char id[JIDMAX]; 176 int flags; /* journaling flags */ 177 int64_t transid; 178 int64_t total_acked; 179 int64_t fifostalls; 180 struct journal_memfifo fifo; 181 struct thread wthread; 182 struct thread rthread; 183 }; 184 185 186 /* 187 * The jrecord structure is used to build a journaling transaction. Since 188 * a single journaling transaction might encompass very large buffers it 189 * is possible for multiple transactions to be written out to the FIFO 190 * in parallel and in peacemeal. 191 */ 192 struct jrecord { 193 struct journal *jo; 194 char *stream_ptr; 195 int stream_residual; 196 int stream_reserved; 197 struct journal_rawrecbeg *rawp; 198 struct journal_subrecord *parent; 199 struct journal_subrecord *last; 200 int16_t streamid; 201 int pushcount; 202 int pushptrgood; 203 int residual; 204 int residual_align; 205 206 /* 207 * These fields are not used by the jrecord routines. They may 208 * be used by higher level routines to manage multiple jrecords. 209 * See the jreclist_*() functions. 210 */ 211 TAILQ_ENTRY(jrecord) user_entry; 212 void *user_save; 213 }; 214 215 struct jrecord_list { 216 TAILQ_HEAD(, jrecord) list; 217 int16_t streamid; 218 }; 219 220 #endif /* kernel or kernel structures */ 221 222 #if defined(_KERNEL) 223 224 struct namecache; 225 struct ucred; 226 struct uio; 227 struct vnode; 228 struct vattr; 229 struct vm_page; 230 231 void journal_create_threads(struct journal *jo); 232 void journal_destroy_threads(struct journal *jo, int flags); 233 234 /* 235 * Primary journal record support procedures 236 */ 237 void jrecord_init(struct journal *jo, 238 struct jrecord *jrec, int16_t streamid); 239 struct journal_subrecord *jrecord_push( 240 struct jrecord *jrec, int16_t rectype); 241 void jrecord_pop(struct jrecord *jrec, struct journal_subrecord *parent); 242 void jrecord_leaf(struct jrecord *jrec, 243 int16_t rectype, void *ptr, int bytes); 244 struct journal_subrecord *jrecord_write(struct jrecord *jrec, 245 int16_t rectype, int bytes); 246 void jrecord_data(struct jrecord *jrec, const void *buf, int bytes); 247 void jrecord_done(struct jrecord *jrec, int abortit); 248 249 /* 250 * Rollup journal record support procedures 251 */ 252 void jrecord_write_path(struct jrecord *jrec, 253 int16_t rectype, struct namecache *ncp); 254 void jrecord_write_vattr(struct jrecord *jrec, struct vattr *vat); 255 void jrecord_write_cred(struct jrecord *jrec, struct thread *td, 256 struct ucred *cred); 257 void jrecord_write_vnode_ref(struct jrecord *jrec, struct vnode *vp); 258 void jrecord_write_vnode_link(struct jrecord *jrec, struct vnode *vp, 259 struct namecache *notncp); 260 void jrecord_write_pagelist(struct jrecord *jrec, int16_t rectype, 261 struct vm_page **pglist, int *rtvals, int pgcount, 262 off_t offset); 263 void jrecord_write_uio(struct jrecord *jrec, int16_t rectype, struct uio *uio); 264 void jrecord_file_data(struct jrecord *jrec, struct vnode *vp, 265 off_t off, off_t bytes); 266 267 MALLOC_DECLARE(M_JOURNAL); 268 MALLOC_DECLARE(M_JFIFO); 269 270 #else 271 272 #include <sys/cdefs.h> 273 274 __BEGIN_DECLS 275 int mountctl (const char *path, int op, int fd, void *ctl, int ctllen, 276 void *buf, int buflen); 277 __END_DECLS 278 279 #endif /* kernel */ 280 281 #endif /* header */ 282