xref: /dragonfly/sys/vfs/hammer/hammer_ioctl.h (revision 8a7bdfea)
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.5 2008/03/20 06:08:40 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  * HAMMERIOC_PRUNE
49  *
50  * beg/end TID ranges in the element array must be sorted in descending
51  * order, with the most recent (highest) range at elms[0].
52  */
53 struct hammer_ioc_prune_elm {
54 	hammer_tid_t	beg_tid;	/* starting tid */
55 	hammer_tid_t	end_tid;	/* ending tid (non inclusive) */
56 	hammer_tid_t	mod_tid;	/* modulo */
57 };
58 
59 #define HAMMER_MAX_PRUNE_ELMS	64
60 
61 struct hammer_ioc_prune {
62 	int		nelms;
63 	int		flags;
64 	int64_t		beg_obj_id;
65 	int64_t		cur_obj_id;	/* initialize to end_obj_id */
66 	int64_t		cur_key;	/* initialize to HAMMER_MAX_KEY */
67 	int64_t		end_obj_id;	 /* (range-exclusive) */
68 	int64_t		stat_scanrecords;/* number of records scanned */
69 	int64_t		stat_rawrecords; /* number of raw records pruned */
70 	int64_t		stat_dirrecords; /* number of dir records pruned */
71 	int64_t		stat_bytes;	 /* number of data bytes pruned */
72 	int64_t		stat_realignments; /* number of raw records realigned */
73 	hammer_tid_t	stat_oldest_tid; /* oldest create_tid encountered */
74 	int64_t		reserved02[6];
75 	struct hammer_ioc_prune_elm elms[HAMMER_MAX_PRUNE_ELMS];
76 };
77 
78 #define HAMMER_IOC_PRUNE_ALL	0x0001
79 
80 
81 /*
82  * HAMMERIOC_GETHISTORY
83  *
84  * Retrieve an array of ordered transaction ids >= beg and < end indicating
85  * all changes made to the specified object's inode up to the
86  * maximum.
87  *
88  * If ATKEY is set the key field indicates a particular key within the
89  * inode to retrieve the history for.
90  *
91  * On return count is set to the number of elements returned, nxt_tid is
92  * set to the tid the caller should store in beg_tid to continue the
93  * iteration, and nxt_key is set to the nearest key boundary > key
94  * indicating the range key - nxt_key (nxt_key non-inclusive) the tid
95  * array represents.  Also obj_id is set to the object's inode number.
96  *
97  * nxt_key can be used to iterate the contents of a single file but should
98  * not be stored in key until all modifications at key have been retrieved.
99  * To work properly nxt_key should be initialized to HAMMER_MAX_KEY.
100  * Successive ioctl() calls will reduce nxt_key as appropriate so at the
101  * end of your iterating for 'key', key to nxt_key will represent the
102  * shortest range of keys that all returned TIDs apply to.
103  */
104 
105 #define HAMMER_MAX_HISTORY_ELMS	64
106 
107 struct hammer_ioc_history {
108 	int64_t		obj_id;
109 	hammer_tid_t	beg_tid;
110 	hammer_tid_t	nxt_tid;
111 	hammer_tid_t	end_tid;
112 	int64_t		key;
113 	int64_t		nxt_key;
114 	int		count;
115 	int		flags;
116 	hammer_tid_t	tid_ary[HAMMER_MAX_HISTORY_ELMS];
117 };
118 
119 #define HAMMER_IOC_HISTORY_ATKEY	0x0001
120 #define HAMMER_IOC_HISTORY_NEXT_TID	0x0002	/* iterate via nxt_tid */
121 #define HAMMER_IOC_HISTORY_NEXT_KEY	0x0004	/* iterate via nxt_key */
122 #define HAMMER_IOC_HISTORY_EOF		0x0008	/* no more keys */
123 #define HAMMER_IOC_HISTORY_UNSYNCED	0x0010	/* unsynced info in inode */
124 
125 /*
126  * Reblock request
127  */
128 struct hammer_ioc_reblock {
129 	int64_t		beg_obj_id;
130 	int64_t		cur_obj_id;		/* Stopped at (interrupt) */
131 	int64_t		end_obj_id;
132 	int32_t		free_level;		/* 0 for maximum compaction */
133 	int32_t		unused01;
134 
135 	int64_t		btree_count;		/* B-Tree nodes checked */
136 	int64_t		record_count;		/* Records checked */
137 	int64_t		data_count;		/* Data segments checked */
138 	int64_t		data_byte_count;	/* Data bytes checked */
139 
140 	int64_t		btree_moves;		/* B-Tree nodes moved */
141 	int64_t		record_moves;		/* Records moved */
142 	int64_t		data_moves;		/* Data segments moved */
143 	int64_t		data_byte_moves;	/* Data bytes moved */
144 
145 	int		flags;
146 	int		unused03;
147 };
148 
149 #define HAMMERIOC_PRUNE		_IOWR('h',1,struct hammer_ioc_prune)
150 #define HAMMERIOC_GETHISTORY	_IOWR('h',2,struct hammer_ioc_history)
151 #define HAMMERIOC_REBLOCK	_IOWR('h',3,struct hammer_ioc_reblock)
152 
153 #endif
154