xref: /dragonfly/sys/vfs/hammer/hammer_ioctl.h (revision c3b249e6)
1 /*
2  * Copyright (c) 2008 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/vfs/hammer/hammer_ioctl.h,v 1.23 2008/11/13 02:18:43 dillon Exp $
35  */
36 /*
37  * HAMMER ioctl's.  This file can be #included from userland
38  */
39 
40 #ifndef VFS_HAMMER_IOCTL_H_
41 #define VFS_HAMMER_IOCTL_H_
42 
43 #include <sys/types.h>
44 #include <sys/ioccom.h>
45 #include "hammer_disk.h"
46 
47 /*
48  * Common HAMMER ioctl header
49  *
50  * Global flags are stored in the upper 16 bits.
51  */
52 struct hammer_ioc_head {
53 	int32_t		flags;
54 	int32_t		error;
55 	int32_t		reserved02[4];
56 };
57 
58 #define HAMMER_IOC_HEAD_ERROR	0x00008000
59 #define HAMMER_IOC_HEAD_INTR	0x00010000
60 #define HAMMER_IOC_DO_BTREE	0x00020000	/* reblocker */
61 #define HAMMER_IOC_DO_INODES	0x00040000	/* reblocker */
62 #define HAMMER_IOC_DO_DATA	0x00080000	/* reblocker */
63 #define HAMMER_IOC_DO_DIRS	0x00100000	/* reblocker */
64 
65 #define HAMMER_IOC_DO_FLAGS	(HAMMER_IOC_DO_BTREE |	\
66 				 HAMMER_IOC_DO_INODES |	\
67 				 HAMMER_IOC_DO_DATA |	\
68 				 HAMMER_IOC_DO_DIRS)
69 
70 /*
71  * HAMMERIOC_PRUNE
72  *
73  * beg/end TID ranges in the element array must be sorted in descending
74  * order, with the most recent (highest) range at elms[0].
75  */
76 struct hammer_ioc_prune_elm {
77 	hammer_tid_t	beg_tid;	/* starting tid */
78 	hammer_tid_t	end_tid;	/* ending tid (non inclusive) */
79 	hammer_tid_t	mod_tid;	/* modulo */
80 };
81 
82 #define HAMMER_MAX_PRUNE_ELMS	(1024*1024/24)
83 
84 struct hammer_ioc_prune {
85 	struct hammer_ioc_head head;
86 	int		nelms;
87 	int		reserved01;
88 
89 	struct hammer_base_elm key_beg;	/* stop forward scan (reverse scan) */
90 	struct hammer_base_elm key_end;	/* start forward scan (reverse scan) */
91 	struct hammer_base_elm key_cur;	/* scan interruption point */
92 
93 	int64_t		stat_scanrecords;/* number of records scanned */
94 	int64_t		stat_rawrecords; /* number of raw records pruned */
95 	int64_t		stat_dirrecords; /* number of dir records pruned */
96 	int64_t		stat_bytes;	 /* number of data bytes pruned */
97 	int64_t		stat_realignments; /* number of raw records realigned */
98 	hammer_tid_t	stat_oldest_tid; /* oldest create_tid encountered */
99 	int64_t		reserved02[6];
100 	struct hammer_ioc_prune_elm *elms; /* user supplied array */
101 };
102 
103 #define HAMMER_IOC_PRUNE_ALL	0x0001
104 
105 
106 /*
107  * HAMMERIOC_GETHISTORY
108  *
109  * Retrieve an array of ordered transaction ids >= beg and < end indicating
110  * all changes made to the specified object's inode up to the
111  * maximum.
112  *
113  * If ATKEY is set the key field indicates a particular key within the
114  * inode to retrieve the history for.
115  *
116  * On return count is set to the number of elements returned, nxt_tid is
117  * set to the tid the caller should store in beg_tid to continue the
118  * iteration, and nxt_key is set to the nearest key boundary > key
119  * indicating the range key - nxt_key (nxt_key non-inclusive) the tid
120  * array represents.  Also obj_id is set to the object's inode number.
121  *
122  * nxt_key can be used to iterate the contents of a single file but should
123  * not be stored in key until all modifications at key have been retrieved.
124  * To work properly nxt_key should be initialized to HAMMER_MAX_KEY.
125  * Successive ioctl() calls will reduce nxt_key as appropriate so at the
126  * end of your iterating for 'key', key to nxt_key will represent the
127  * shortest range of keys that all returned TIDs apply to.
128  */
129 
130 #define HAMMER_MAX_HISTORY_ELMS	64
131 
132 typedef struct hammer_ioc_hist_entry {
133 	hammer_tid_t	tid;
134 	u_int32_t	time32;
135 	u_int32_t	unused;
136 } *hammer_ioc_hist_entry_t;
137 
138 struct hammer_ioc_history {
139 	struct hammer_ioc_head head;
140 	int64_t		obj_id;
141 	hammer_tid_t	beg_tid;
142 	hammer_tid_t	nxt_tid;
143 	hammer_tid_t	end_tid;
144 	int64_t		key;
145 	int64_t		nxt_key;
146 	int		count;
147 	int		reserve01;
148 	struct hammer_ioc_hist_entry hist_ary[HAMMER_MAX_HISTORY_ELMS];
149 };
150 
151 #define HAMMER_IOC_HISTORY_ATKEY	0x0001
152 #define HAMMER_IOC_HISTORY_NEXT_TID	0x0002	/* iterate via nxt_tid */
153 #define HAMMER_IOC_HISTORY_NEXT_KEY	0x0004	/* iterate via nxt_key */
154 #define HAMMER_IOC_HISTORY_EOF		0x0008	/* no more keys */
155 #define HAMMER_IOC_HISTORY_UNSYNCED	0x0010	/* unsynced info in inode */
156 
157 /*
158  * Reblock request
159  */
160 struct hammer_ioc_reblock {
161 	struct hammer_ioc_head head;
162 	int32_t		free_level;		/* 0 for maximum compaction */
163 	u_int32_t	reserved01;
164 
165 	struct hammer_base_elm key_beg;		/* start forward scan */
166 	struct hammer_base_elm key_end;		/* stop forward scan */
167 	struct hammer_base_elm key_cur;		/* scan interruption point */
168 
169 	int64_t		btree_count;		/* B-Tree nodes checked */
170 	int64_t		record_count;		/* Records checked */
171 	int64_t		data_count;		/* Data segments checked */
172 	int64_t		data_byte_count;	/* Data bytes checked */
173 
174 	int64_t		btree_moves;		/* B-Tree nodes moved */
175 	int64_t		record_moves;		/* Records moved */
176 	int64_t		data_moves;		/* Data segments moved */
177 	int64_t		data_byte_moves;	/* Data bytes moved */
178 
179 	int32_t		unused02;
180 	int32_t		unused03;
181 };
182 
183 /*
184  * HAMMERIOC_SYNCTID
185  */
186 enum hammer_synctid_op {
187 	HAMMER_SYNCTID_NONE,	/* no sync (TID will not be accurate) */
188 	HAMMER_SYNCTID_ASYNC,	/* async (TID will not be accurate) */
189 	HAMMER_SYNCTID_SYNC1,	/* single sync - might undo after crash */
190 	HAMMER_SYNCTID_SYNC2	/* double sync - guarantee no undo */
191 };
192 
193 struct hammer_ioc_synctid {
194 	struct hammer_ioc_head	head;
195 	enum hammer_synctid_op	op;
196 	hammer_tid_t		tid;
197 };
198 
199 /*
200  * HAMMERIOC_GET_PSEUDOFS
201  * HAMMERIOC_SET_PSEUDOFS
202  */
203 struct hammer_ioc_pseudofs_rw {
204 	struct hammer_ioc_head	head;
205 	int			pfs_id;
206 	u_int32_t		bytes;
207 	u_int32_t		version;
208 	u_int32_t		flags;
209 	struct hammer_pseudofs_data *ondisk;
210 };
211 
212 #define HAMMER_IOC_PSEUDOFS_VERSION	1
213 
214 #define HAMMER_IOC_PFS_SYNC_BEG		0x0001
215 #define HAMMER_IOC_PFS_SYNC_END		0x0002
216 #define HAMMER_IOC_PFS_SHARED_UUID	0x0004
217 #define HAMMER_IOC_PFS_MIRROR_UUID	0x0008
218 #define HAMMER_IOC_PFS_MASTER_ID	0x0010
219 #define HAMMER_IOC_PFS_MIRROR_FLAGS	0x0020
220 #define HAMMER_IOC_PFS_LABEL		0x0040
221 
222 #define HAMMER_MAX_PFS			65536
223 
224 /*
225  * HAMMERIOC_MIRROR_READ/WRITE
226  */
227 struct hammer_ioc_mirror_rw {
228 	struct hammer_ioc_head	head;
229 	struct hammer_base_elm 	key_beg;	/* start forward scan */
230 	struct hammer_base_elm 	key_end;	/* stop forward scan */
231 	struct hammer_base_elm	key_cur;	/* interruption point */
232 	hammer_tid_t		tid_beg;	/* filter modification range */
233 	hammer_tid_t		tid_end;	/* filter modification range */
234 	void			*ubuf;		/* user buffer */
235 	int			count;		/* current size */
236 	int			size;		/* max size */
237 	int			pfs_id;		/* PFS id being read/written */
238 	int			reserved01;
239 	uuid_t			shared_uuid;	/* validator for safety */
240 };
241 
242 /*
243  * NOTE: crc is for the data block starting at rec_size, not including the
244  * data[] array.
245  */
246 struct hammer_ioc_mrecord_head {
247 	u_int32_t		signature;	/* signature for byte order */
248 	u_int32_t		rec_crc;
249 	u_int32_t		rec_size;
250 	u_int32_t		type;
251 	/* extended */
252 };
253 
254 typedef struct hammer_ioc_mrecord_head *hammer_ioc_mrecord_head_t;
255 
256 struct hammer_ioc_mrecord_rec {
257 	struct hammer_ioc_mrecord_head	head;
258 	struct hammer_btree_leaf_elm	leaf;
259 	/* extended by data */
260 };
261 
262 struct hammer_ioc_mrecord_skip {
263 	struct hammer_ioc_mrecord_head	head;
264 	struct hammer_base_elm	 	skip_beg;
265 	struct hammer_base_elm 		skip_end;
266 };
267 
268 struct hammer_ioc_mrecord_update {
269 	struct hammer_ioc_mrecord_head	head;
270 	hammer_tid_t			tid;
271 };
272 
273 struct hammer_ioc_mrecord_sync {
274 	struct hammer_ioc_mrecord_head	head;
275 };
276 
277 struct hammer_ioc_mrecord_pfs {
278 	struct hammer_ioc_mrecord_head	head;
279 	u_int32_t			version;
280 	u_int32_t			reserved01;
281 	struct hammer_pseudofs_data	pfsd;
282 };
283 
284 struct hammer_ioc_version {
285 	struct hammer_ioc_head head;
286 	u_int32_t		cur_version;
287 	u_int32_t		min_version;
288 	u_int32_t		wip_version;
289 	u_int32_t		max_version;
290 	char			description[64];
291 };
292 
293 union hammer_ioc_mrecord_any {
294 	struct hammer_ioc_mrecord_head	head;
295 	struct hammer_ioc_mrecord_rec	rec;
296 	struct hammer_ioc_mrecord_skip	skip;
297 	struct hammer_ioc_mrecord_update update;
298 	struct hammer_ioc_mrecord_update sync;
299 	struct hammer_ioc_mrecord_pfs	pfs;
300 	struct hammer_ioc_version	version;
301 };
302 
303 typedef union hammer_ioc_mrecord_any *hammer_ioc_mrecord_any_t;
304 
305 #define HAMMER_MREC_TYPE_RESERVED	0
306 #define HAMMER_MREC_TYPE_REC		1	/* record w/ data */
307 #define HAMMER_MREC_TYPE_PFSD		2	/* (userland only) */
308 #define HAMMER_MREC_TYPE_UPDATE		3	/* (userland only) */
309 #define HAMMER_MREC_TYPE_SYNC		4	/* (userland only) */
310 #define HAMMER_MREC_TYPE_SKIP		5	/* skip-range */
311 #define HAMMER_MREC_TYPE_PASS		6	/* record for cmp only (pass) */
312 #define HAMMER_MREC_TYPE_TERM		7	/* (userland only) */
313 #define HAMMER_MREC_TYPE_IDLE		8	/* (userland only) */
314 
315 #define HAMMER_MREC_CRCOFF	(offsetof(struct hammer_ioc_mrecord_head, rec_size))
316 #define HAMMER_MREC_HEADSIZE	sizeof(struct hammer_ioc_mrecord_head)
317 
318 #define HAMMER_IOC_MIRROR_SIGNATURE	0x4dd97272U
319 #define HAMMER_IOC_MIRROR_SIGNATURE_REV	0x7272d94dU
320 
321 /*
322  * Ioctl cmd ids
323  */
324 
325 #define HAMMERIOC_PRUNE		_IOWR('h',1,struct hammer_ioc_prune)
326 #define HAMMERIOC_GETHISTORY	_IOWR('h',2,struct hammer_ioc_history)
327 #define HAMMERIOC_REBLOCK	_IOWR('h',3,struct hammer_ioc_reblock)
328 #define HAMMERIOC_SYNCTID	_IOWR('h',4,struct hammer_ioc_synctid)
329 #define HAMMERIOC_SET_PSEUDOFS	_IOWR('h',5,struct hammer_ioc_pseudofs_rw)
330 #define HAMMERIOC_GET_PSEUDOFS	_IOWR('h',6,struct hammer_ioc_pseudofs_rw)
331 #define HAMMERIOC_MIRROR_READ	_IOWR('h',7,struct hammer_ioc_mirror_rw)
332 #define HAMMERIOC_MIRROR_WRITE	_IOWR('h',8,struct hammer_ioc_mirror_rw)
333 #define HAMMERIOC_UPG_PSEUDOFS	_IOWR('h',9,struct hammer_ioc_pseudofs_rw)
334 #define HAMMERIOC_DGD_PSEUDOFS	_IOWR('h',10,struct hammer_ioc_pseudofs_rw)
335 #define HAMMERIOC_RMR_PSEUDOFS	_IOWR('h',11,struct hammer_ioc_pseudofs_rw)
336 #define HAMMERIOC_WAI_PSEUDOFS	_IOWR('h',12,struct hammer_ioc_pseudofs_rw)
337 #define HAMMERIOC_GET_VERSION	_IOWR('h',13,struct hammer_ioc_version)
338 #define HAMMERIOC_SET_VERSION	_IOWR('h',14,struct hammer_ioc_version)
339 
340 #endif
341 
342