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