Merge from vendor branch LIBARCHIVE:
[dragonfly.git] / sys / sys / mountctl.h
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 */