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