1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- 2 * vim:expandtab:shiftwidth=8:tabstop=8: 3 * 4 * Copyright (C) 2001, 2002 Cluster File Systems, Inc. 5 * Copyright (C) 2001 Tacit Networks, Inc. 6 * 7 * This file is part of InterMezzo, http://www.inter-mezzo.org. 8 * 9 * InterMezzo is free software; you can redistribute it and/or 10 * modify it under the terms of version 2 of the GNU General Public 11 * License as published by the Free Software Foundation. 12 * 13 * InterMezzo is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with InterMezzo; if not, write to the Free Software 20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 21 */ 22 23 #ifndef __INTERMEZZO_IDL_H__ 24 #define __INTERMEZZO_IDL_H__ 25 26 #include <linux/ioctl.h> 27 #include <linux/types.h> 28 29 /* this file contains all data structures used in InterMezzo's interfaces: 30 * - upcalls 31 * - ioctl's 32 * - KML records 33 * - RCVD records 34 * - rpc's 35 */ 36 37 /* UPCALL */ 38 #define INTERMEZZO_MINOR 248 39 40 41 #define IZO_UPC_VERSION 0x00010002 42 #define IZO_UPC_PERMIT 1 43 #define IZO_UPC_CONNECT 2 44 #define IZO_UPC_GO_FETCH_KML 3 45 #define IZO_UPC_OPEN 4 46 #define IZO_UPC_REVOKE_PERMIT 5 47 #define IZO_UPC_KML 6 48 #define IZO_UPC_BACKFETCH 7 49 #define IZO_UPC_KML_TRUNC 8 50 #define IZO_UPC_SET_KMLSIZE 9 51 #define IZO_UPC_BRANCH_UNDO 10 52 #define IZO_UPC_BRANCH_REDO 11 53 #define IZO_UPC_GET_FILEID 12 54 #define IZO_UPC_CLIENT_MAKE_BRANCH 13 55 #define IZO_UPC_SERVER_MAKE_BRANCH 14 56 #define IZO_UPC_REPSTATUS 15 57 58 #define IZO_UPC_LARGEST_OPCODE 15 59 60 struct izo_upcall_hdr { 61 __u32 u_len; 62 __u32 u_version; 63 __u32 u_opc; 64 __u32 u_uniq; 65 __u32 u_pid; 66 __u32 u_uid; 67 __u32 u_pathlen; 68 __u32 u_fsetlen; 69 __u64 u_offset; 70 __u64 u_length; 71 __u32 u_first_recno; 72 __u32 u_last_recno; 73 __u32 u_async; 74 __u32 u_reclen; 75 __u8 u_uuid[16]; 76 }; 77 78 /* This structure _must_ sit at the beginning of the buffer */ 79 struct izo_upcall_resp { 80 __u32 opcode; 81 __u32 unique; 82 __u32 result; 83 }; 84 85 86 /* IOCTL */ 87 88 #define IZO_IOCTL_VERSION 0x00010003 89 90 /* maximum size supported for ioc_pbuf1 */ 91 #define KML_MAX_BUF (64*1024) 92 93 struct izo_ioctl_hdr { 94 __u32 ioc_len; 95 __u32 ioc_version; 96 }; 97 98 struct izo_ioctl_data { 99 __u32 ioc_len; 100 __u32 ioc_version; 101 __u32 ioc_izodev; 102 __u32 ioc_kmlrecno; 103 __u64 ioc_kmlsize; 104 __u32 ioc_flags; 105 __s32 ioc_inofd; 106 __u64 ioc_ino; 107 __u64 ioc_generation; 108 __u32 ioc_mark_what; 109 __u32 ioc_and_flag; 110 __u32 ioc_or_flag; 111 __u32 ioc_dev; 112 __u32 ioc_offset; 113 __u32 ioc_slot; 114 __u64 ioc_uid; 115 __u8 ioc_uuid[16]; 116 117 __u32 ioc_inllen1; /* path */ 118 char *ioc_inlbuf1; 119 __u32 ioc_inllen2; /* fileset */ 120 char *ioc_inlbuf2; 121 122 __u32 ioc_plen1; /* buffers in user space (KML) */ 123 char *ioc_pbuf1; 124 __u32 ioc_plen2; /* buffers in user space (KML) */ 125 char *ioc_pbuf2; 126 127 char ioc_bulk[0]; 128 }; 129 130 #define IZO_IOC_DEVICE _IOW ('p',0x50, void *) 131 #define IZO_IOC_REINTKML _IOW ('p',0x51, void *) 132 #define IZO_IOC_GET_RCVD _IOW ('p',0x52, void *) 133 #define IZO_IOC_SET_IOCTL_UID _IOW ('p',0x53, void *) 134 #define IZO_IOC_GET_KML_SIZE _IOW ('p',0x54, void *) 135 #define IZO_IOC_PURGE_FILE_DATA _IOW ('p',0x55, void *) 136 #define IZO_IOC_CONNECT _IOW ('p',0x56, void *) 137 #define IZO_IOC_GO_FETCH_KML _IOW ('p',0x57, void *) 138 #define IZO_IOC_MARK _IOW ('p',0x58, void *) 139 #define IZO_IOC_CLEAR_FSET _IOW ('p',0x59, void *) 140 #define IZO_IOC_CLEAR_ALL_FSETS _IOW ('p',0x60, void *) 141 #define IZO_IOC_SET_FSET _IOW ('p',0x61, void *) 142 #define IZO_IOC_REVOKE_PERMIT _IOW ('p',0x62, void *) 143 #define IZO_IOC_SET_KMLSIZE _IOW ('p',0x63, void *) 144 #define IZO_IOC_CLIENT_MAKE_BRANCH _IOW ('p',0x64, void *) 145 #define IZO_IOC_SERVER_MAKE_BRANCH _IOW ('p',0x65, void *) 146 #define IZO_IOC_BRANCH_UNDO _IOW ('p',0x66, void *) 147 #define IZO_IOC_BRANCH_REDO _IOW ('p',0x67, void *) 148 #define IZO_IOC_SET_PID _IOW ('p',0x68, void *) 149 #define IZO_IOC_SET_CHANNEL _IOW ('p',0x69, void *) 150 #define IZO_IOC_GET_CHANNEL _IOW ('p',0x70, void *) 151 #define IZO_IOC_GET_FILEID _IOW ('p',0x71, void *) 152 #define IZO_IOC_ADJUST_LML _IOW ('p',0x72, void *) 153 #define IZO_IOC_SET_FILEID _IOW ('p',0x73, void *) 154 #define IZO_IOC_REPSTATUS _IOW ('p',0x74, void *) 155 156 /* marking flags for fsets */ 157 #define FSET_CLIENT_RO 0x00000001 158 #define FSET_LENTO_RO 0x00000002 159 #define FSET_HASPERMIT 0x00000004 /* we have a permit to WB */ 160 #define FSET_INSYNC 0x00000008 /* this fileset is in sync */ 161 #define FSET_PERMIT_WAITING 0x00000010 /* Lento is waiting for permit */ 162 #define FSET_STEAL_PERMIT 0x00000020 /* take permit if Lento is dead */ 163 #define FSET_JCLOSE_ON_WRITE 0x00000040 /* Journal closes on writes */ 164 #define FSET_DATA_ON_DEMAND 0x00000080 /* update data on file_open() */ 165 #define FSET_PERMIT_EXCLUSIVE 0x00000100 /* only one permitholder allowed */ 166 #define FSET_HAS_BRANCHES 0x00000200 /* this fileset contains branches */ 167 #define FSET_IS_BRANCH 0x00000400 /* this fileset is a branch */ 168 #define FSET_FLAT_BRANCH 0x00000800 /* this fileset is ROOT with branches */ 169 170 /* what to mark indicator (ioctl parameter) */ 171 #define MARK_DENTRY 101 172 #define MARK_FSET 102 173 #define MARK_CACHE 103 174 #define MARK_GETFL 104 175 176 /* KML */ 177 178 #define KML_MAJOR_VERSION 0x00010000 179 #define KML_MINOR_VERSION 0x00000002 180 #define KML_OPCODE_NOOP 0 181 #define KML_OPCODE_CREATE 1 182 #define KML_OPCODE_MKDIR 2 183 #define KML_OPCODE_UNLINK 3 184 #define KML_OPCODE_RMDIR 4 185 #define KML_OPCODE_CLOSE 5 186 #define KML_OPCODE_SYMLINK 6 187 #define KML_OPCODE_RENAME 7 188 #define KML_OPCODE_SETATTR 8 189 #define KML_OPCODE_LINK 9 190 #define KML_OPCODE_OPEN 10 191 #define KML_OPCODE_MKNOD 11 192 #define KML_OPCODE_WRITE 12 193 #define KML_OPCODE_RELEASE 13 194 #define KML_OPCODE_TRUNC 14 195 #define KML_OPCODE_SETEXTATTR 15 196 #define KML_OPCODE_DELEXTATTR 16 197 #define KML_OPCODE_KML_TRUNC 17 198 #define KML_OPCODE_GET_FILEID 18 199 #define KML_OPCODE_NUM 19 200 /* new stuff */ 201 struct presto_version { 202 __u64 pv_mtime; 203 __u64 pv_ctime; 204 __u64 pv_size; 205 }; 206 207 struct kml_prefix_hdr { 208 __u32 len; 209 __u32 version; 210 __u32 pid; 211 __u32 auid; 212 __u32 fsuid; 213 __u32 fsgid; 214 __u32 opcode; 215 __u32 ngroups; 216 }; 217 218 struct kml_prefix { 219 struct kml_prefix_hdr *hdr; 220 __u32 *groups; 221 }; 222 223 struct kml_suffix { 224 __u32 prevrec; 225 __u32 recno; 226 __u32 time; 227 __u32 len; 228 }; 229 230 struct kml_rec { 231 char *buf; 232 struct kml_prefix prefix; 233 __u64 offset; 234 char *path; 235 int pathlen; 236 char *name; 237 int namelen; 238 char *target; 239 int targetlen; 240 struct presto_version *old_objectv; 241 struct presto_version *new_objectv; 242 struct presto_version *old_parentv; 243 struct presto_version *new_parentv; 244 struct presto_version *old_targetv; 245 struct presto_version *new_targetv; 246 __u32 valid; 247 __u32 mode; 248 __u32 uid; 249 __u32 gid; 250 __u64 size; 251 __u32 mtime; 252 __u32 ctime; 253 __u32 flags; 254 __u32 ino; 255 __u32 rdev; 256 __u32 major; 257 __u32 minor; 258 __u32 generation; 259 __u32 old_mode; 260 __u32 old_rdev; 261 __u64 old_uid; 262 __u64 old_gid; 263 char *old_target; 264 int old_targetlen; 265 struct kml_suffix *suffix; 266 }; 267 268 269 /* RCVD */ 270 271 /* izo_rcvd_rec fills the .intermezzo/fset/last_rcvd file and provides data about 272 * our view of reintegration offsets for a given peer. 273 * 274 * The only exception is the last_rcvd record which has a UUID consisting of all 275 * zeroes; this record's lr_local_offset field is the logical byte offset of our 276 * KML, which is updated when KML truncation takes place. All other fields are 277 * reserved. */ 278 279 /* XXX - document how clean shutdowns are recorded */ 280 281 struct izo_rcvd_rec { 282 __u8 lr_uuid[16]; /* which peer? */ 283 __u64 lr_remote_recno; /* last confirmed remote recno */ 284 __u64 lr_remote_offset; /* last confirmed remote offset */ 285 __u64 lr_local_recno; /* last locally reinted recno */ 286 __u64 lr_local_offset; /* last locally reinted offset */ 287 __u64 lr_last_ctime; /* the largest ctime that has reintegrated */ 288 }; 289 290 /* Cache purge database 291 * 292 * Each DB entry is this structure followed by the path name, no trailing NUL. */ 293 struct izo_purge_entry { 294 __u64 p_atime; 295 __u32 p_pathlen; 296 }; 297 298 /* RPC */ 299 300 #endif 301