Theodore Ts'o | ff6dbcc | 2002-05-24 22:44:42 -0400 | [diff] [blame^] | 1 | /* -*- linux-c -*- */ |
| 2 | /* |
| 3 | * |
| 4 | * Copyright (c) International Business Machines Corp., 2000 |
| 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by |
| 8 | * the Free Software Foundation; either version 2 of the License, or |
| 9 | * (at your option) any later version. |
| 10 | * |
| 11 | * This program is distributed in the hope that it will be useful, |
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See |
| 14 | * the GNU General Public License for more details. |
| 15 | * |
| 16 | * You should have received a copy of the GNU General Public License |
| 17 | * along with this program; if not, write to the Free Software |
| 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 19 | */ |
| 20 | /* |
| 21 | * linux/include/linux/evms.h |
| 22 | * |
| 23 | * EVMS public kernel header file |
| 24 | * |
| 25 | */ |
| 26 | |
| 27 | #ifndef __EVMS_IOCTL_INCLUDED__ |
| 28 | #define __EVMS_IOCTL_INCLUDED__ |
| 29 | |
| 30 | #include <linux/hdreg.h> |
| 31 | |
| 32 | /* IOCTL interface version definitions */ |
| 33 | #define EVMS_IOCTL_INTERFACE_MAJOR 10 |
| 34 | #define EVMS_IOCTL_INTERFACE_MINOR 0 |
| 35 | #define EVMS_IOCTL_INTERFACE_PATCHLEVEL 0 |
| 36 | |
| 37 | /* IOCTL definitions */ |
| 38 | typedef enum evms_ioctl_cmds_s { |
| 39 | /* version commands */ |
| 40 | EVMS_GET_IOCTL_VERSION_NUMBER = 0, |
| 41 | EVMS_GET_VERSION_NUMBER, |
| 42 | #ifdef __KERNEL__ |
| 43 | /* EVMS internal commands */ |
| 44 | EVMS_GET_DISK_LIST_NUMBER = 0x40, |
| 45 | EVMS_CHECK_MEDIA_CHANGE_NUMBER, |
| 46 | EVMS_REVALIDATE_DISK_NUMBER, |
| 47 | EVMS_OPEN_VOLUME_NUMBER, |
| 48 | EVMS_CLOSE_VOLUME_NUMBER, |
| 49 | EVMS_QUIESCE_VOLUME_NUMBER, |
| 50 | EVMS_CHECK_DEVICE_STATUS_NUMBER, |
| 51 | #endif |
| 52 | /* configuration commands */ |
| 53 | EVMS_GET_INFO_LEVEL_NUMBER = 0x80, |
| 54 | EVMS_SET_INFO_LEVEL_NUMBER, |
| 55 | EVMS_REDISCOVER_VOLUMES_NUMBER, |
| 56 | EVMS_DELETE_VOLUME_NUMBER, |
| 57 | EVMS_PLUGIN_IOCTL_NUMBER, |
| 58 | EVMS_PROCESS_NOTIFY_EVENT_NUMBER, |
| 59 | /* query info commands */ |
| 60 | EVMS_GET_LOGICAL_DISK_NUMBER = 0xC0, |
| 61 | EVMS_GET_LOGICAL_DISK_INFO_NUMBER, |
| 62 | EVMS_SECTOR_IO_NUMBER, |
| 63 | EVMS_GET_MINOR_NUMBER, |
| 64 | EVMS_GET_VOLUME_DATA_NUMBER, |
| 65 | EVMS_GET_PLUGIN_NUMBER, |
| 66 | EVMS_COMPUTE_CSUM_NUMBER, |
| 67 | EVMS_GET_BMAP_NUMBER, |
| 68 | } evms_ioctl_cmds_t; |
| 69 | |
| 70 | /* version commands */ |
| 71 | #define EVMS_GET_IOCTL_VERSION_STRING "EVMS_GET_IOCTL_VERSION" |
| 72 | #define EVMS_GET_IOCTL_VERSION _IOR(EVMS_MAJOR, EVMS_GET_IOCTL_VERSION_NUMBER, evms_version_t) |
| 73 | |
| 74 | #define EVMS_GET_VERSION_STRING "EVMS_GET_VERSION" |
| 75 | #define EVMS_GET_VERSION _IOR(EVMS_MAJOR, EVMS_GET_VERSION_NUMBER, evms_version_t) |
| 76 | |
| 77 | #ifdef __KERNEL__ |
| 78 | |
| 79 | /* EVMS internal commands */ |
| 80 | #define EVMS_GET_DISK_LIST_STRING "EVMS_GET_DISK_LIST" |
| 81 | #define EVMS_GET_DISK_LIST _IOWR(EVMS_MAJOR, EVMS_GET_DISK_LIST_NUMBER, evms_list_node_t **) |
| 82 | |
| 83 | #define EVMS_CHECK_MEDIA_CHANGE_STRING "EVMS_CHECK_MEDIA_CHANGE" |
| 84 | #define EVMS_CHECK_MEDIA_CHANGE _IO(EVMS_MAJOR, EVMS_CHECK_MEDIA_CHANGE_NUMBER) |
| 85 | |
| 86 | #define EVMS_REVALIDATE_DISK_STRING "EVMS_REVALIDATE_DISK" |
| 87 | #define EVMS_REVALIDATE_DISK _IO(EVMS_MAJOR, EVMS_REVALIDATE_DISK_NUMBER) |
| 88 | |
| 89 | #define EVMS_OPEN_VOLUME_STRING "EVMS_OPEN_VOLUME" |
| 90 | #define EVMS_OPEN_VOLUME _IO(EVMS_MAJOR, EVMS_OPEN_VOLUME_NUMBER) |
| 91 | |
| 92 | #define EVMS_CLOSE_VOLUME_STRING "EVMS_CLOSE_VOLUME" |
| 93 | #define EVMS_CLOSE_VOLUME _IO(EVMS_MAJOR, EVMS_CLOSE_VOLUME_NUMBER) |
| 94 | |
| 95 | /* field: command: defines */ |
| 96 | #define EVMS_UNQUIESCE 0 |
| 97 | #define EVMS_QUIESCE 1 |
| 98 | |
| 99 | /* field: do_vfs: defines */ |
| 100 | /* see evms_delete_volume */ |
| 101 | typedef struct evms_quiesce_volume_s { |
| 102 | int command; /* 0 = unquiesce, 1 = quiesce */ |
| 103 | int minor; /* minor device number of target volume */ |
| 104 | int do_vfs; /* 0 = do nothing, 1 = also perform equivalent VFS operation */ |
| 105 | int status; /* 0 = success */ |
| 106 | } evms_quiesce_volume_t; |
| 107 | |
| 108 | #define EVMS_QUIESCE_VOLUME_STRING "EVMS_QUIESCE_VOLUME" |
| 109 | #define EVMS_QUIESCE_VOLUME _IOR(EVMS_MAJOR, EVMS_QUIESCE_VOLUME_NUMBER, evms_quiesce_volume_t) |
| 110 | |
| 111 | #define EVMS_CHECK_DEVICE_STATUS_STRING "EVMS_CHECK_DEVICE_STATUS" |
| 112 | #define EVMS_CHECK_DEVICE_STATUS _IOR(EVMS_MAJOR, EVMS_CHECK_DEVICE_STATUS_NUMBER, int) |
| 113 | |
| 114 | #endif |
| 115 | |
| 116 | /* configuration commands */ |
| 117 | #define EVMS_GET_INFO_LEVEL_STRING "EVMS_GET_INFO_LEVEL" |
| 118 | #define EVMS_GET_INFO_LEVEL _IOR(EVMS_MAJOR, EVMS_GET_INFO_LEVEL_NUMBER, int) |
| 119 | |
| 120 | #define EVMS_SET_INFO_LEVEL_STRING "EVMS_SET_INFO_LEVEL" |
| 121 | #define EVMS_SET_INFO_LEVEL _IOW(EVMS_MAJOR, EVMS_SET_INFO_LEVEL_NUMBER, int) |
| 122 | |
| 123 | /* field: drive_count: defines */ |
| 124 | #define REDISCOVER_ALL_DEVICES 0xFFFFFFFF |
| 125 | typedef struct evms_rediscover_s { |
| 126 | int status; |
| 127 | unsigned int drive_count; /* 0xffffffff = rediscover all known disks */ |
| 128 | unsigned long *drive_array; |
| 129 | } evms_rediscover_t; |
| 130 | |
| 131 | #define EVMS_REDISCOVER_VOLUMES_STRING "EVMS_REDISCOVER_VOLUMES" |
| 132 | #define EVMS_REDISCOVER_VOLUMES _IOWR(EVMS_MAJOR, EVMS_REDISCOVER_VOLUMES_NUMBER, evms_rediscover_t) |
| 133 | |
| 134 | /* field: command: defines */ |
| 135 | #define EVMS_SOFT_DELETE 0 |
| 136 | #define EVMS_HARD_DELETE 1 |
| 137 | |
| 138 | /* field: do_vfs: defines */ |
| 139 | #define EVMS_VFS_DO_NOTHING 0 |
| 140 | #define EVMS_VFS_DO 1 |
| 141 | typedef struct evms_delete_volume_s { |
| 142 | int command; /* 0 = "temp", 1 = "permanent" */ |
| 143 | int minor; /* minor device number of target volume */ |
| 144 | int do_vfs; /* 0 = do nothing, 1 = perform VFS operations */ |
| 145 | int associative_minor; /* optional minor of associative volume */ |
| 146 | /* must be 0 when not in use */ |
| 147 | int status; /* 0 = success, other is error */ |
| 148 | } evms_delete_volume_t; |
| 149 | |
| 150 | #define EVMS_DELETE_VOLUME_STRING "EVMS_DELETE_VOLUME" |
| 151 | #define EVMS_DELETE_VOLUME _IOR(EVMS_MAJOR, EVMS_DELETE_VOLUME_NUMBER, evms_delete_volume_t) |
| 152 | |
| 153 | typedef struct evms_plugin_ioctl_s { |
| 154 | unsigned long feature_id; /* ID of feature to receive this ioctl */ |
| 155 | int feature_command; /* feature specific ioctl command */ |
| 156 | int status; /* 0 = completed, non-0 = error */ |
| 157 | void *feature_ioctl_data; /* ptr to feature specific struct */ |
| 158 | } evms_plugin_ioctl_t; |
| 159 | |
| 160 | #define EVMS_PLUGIN_IOCTL_STRING "EVMS_PLUGIN_IOCTL" |
| 161 | #define EVMS_PLUGIN_IOCTL _IOR(EVMS_MAJOR, EVMS_PLUGIN_IOCTL_NUMBER, evms_plugin_ioctl_t) |
| 162 | |
| 163 | /* field: eventid: defines */ |
| 164 | #define EVMS_EVENT_END_OF_DISCOVERY 0 |
| 165 | typedef struct evms_event_s { |
| 166 | int pid; /* PID to act on */ |
| 167 | int eventid; /* event id to respond to */ |
| 168 | int signo; /* signal # to send when event occurs */ |
| 169 | } evms_event_t; |
| 170 | |
| 171 | /* field: command: defines */ |
| 172 | #define EVMS_EVENT_UNREGISTER 0 |
| 173 | #define EVMS_EVENT_REGISTER 1 |
| 174 | typedef struct evms_notify_s { |
| 175 | int command; /* 0 = unregister, 1 = register */ |
| 176 | evms_event_t eventry; /* event structure */ |
| 177 | int status; /* return status */ |
| 178 | } evms_notify_t; |
| 179 | |
| 180 | #define EVMS_PROCESS_NOTIFY_EVENT_STRING "EVMS_PROCESS_NOTIFY_EVENT" |
| 181 | #define EVMS_PROCESS_NOTIFY_EVENT _IOWR(EVMS_MAJOR, EVMS_PROCESS_NOTIFY_EVENT_NUMBER, evms_notify_t) |
| 182 | |
| 183 | /* query info commands */ |
| 184 | |
| 185 | /* field: command: defines */ |
| 186 | #define EVMS_FIRST_DISK 0 |
| 187 | #define EVMS_NEXT_DISK 1 |
| 188 | |
| 189 | /* field: status: defines */ |
| 190 | #define EVMS_DISK_INVALID 0 |
| 191 | #define EVMS_DISK_VALID 1 |
| 192 | typedef struct evms_user_disk_s { |
| 193 | int command; /* 0 = first disk, 1 = next disk */ |
| 194 | int status; /* 0 = no more disks, 1 = valid disk info */ |
| 195 | unsigned long disk_handle; /* only valid when status == 1 */ |
| 196 | } evms_user_disk_t; |
| 197 | |
| 198 | #define EVMS_GET_LOGICAL_DISK_STRING "EVMS_GET_LOGICAL_DISK" |
| 199 | #define EVMS_GET_LOGICAL_DISK _IOWR(EVMS_MAJOR, EVMS_GET_LOGICAL_DISK_NUMBER, evms_user_disk_t) |
| 200 | |
| 201 | /* flags fields described in evms_common.h */ |
| 202 | typedef struct evms_user_disk_info_s { |
| 203 | unsigned int status; |
| 204 | unsigned int flags; |
| 205 | unsigned long disk_handle; |
| 206 | unsigned int disk_dev; |
| 207 | struct hd_geometry geometry; |
| 208 | unsigned int block_size; |
| 209 | unsigned int hardsect_size; |
| 210 | u_int64_t total_sectors; |
| 211 | char disk_name[EVMS_VOLUME_NAME_SIZE]; |
| 212 | } evms_user_disk_info_t; |
| 213 | |
| 214 | #define EVMS_GET_LOGICAL_DISK_INFO_STRING "EVMS_GET_LOGICAL_DISK_INFO" |
| 215 | #define EVMS_GET_LOGICAL_DISK_INFO _IOWR(EVMS_MAJOR, EVMS_GET_LOGICAL_DISK_INFO_NUMBER, evms_user_disk_info_t) |
| 216 | |
| 217 | /* field: io_flag: defines */ |
| 218 | #define EVMS_SECTOR_IO_READ 0 |
| 219 | #define EVMS_SECTOR_IO_WRITE 1 |
| 220 | typedef struct evms_sector_io_s { |
| 221 | unsigned long disk_handle; /* valid disk handle */ |
| 222 | int io_flag; /* 0 = READ, 1 = WRITE */ |
| 223 | evms_sector_t starting_sector; /* disk relative LBA */ |
| 224 | evms_sector_t sector_count; /* number of sectors in IO */ |
| 225 | unsigned char *buffer_address; /* IO address */ |
| 226 | int status; /* 0 = success, not 0 = error */ |
| 227 | } evms_sector_io_t; |
| 228 | |
| 229 | #define EVMS_SECTOR_IO_STRING "EVMS_SECTOR_IO" |
| 230 | #define EVMS_SECTOR_IO _IOWR(EVMS_MAJOR, EVMS_SECTOR_IO_NUMBER, evms_sector_io_t) |
| 231 | |
| 232 | /* field: command: defines */ |
| 233 | #define EVMS_FIRST_VOLUME 0 |
| 234 | #define EVMS_NEXT_VOLUME 1 |
| 235 | |
| 236 | /* field: status: defines */ |
| 237 | #define EVMS_VOLUME_INVALID 0 |
| 238 | #define EVMS_VOLUME_VALID 1 |
| 239 | typedef struct evms_user_minor_s { |
| 240 | int command; /* 0 = first volume, 1 = next volume */ |
| 241 | int status; /* 0 = no more, 1 = valid info */ |
| 242 | int minor; /* only valid when status == 1 */ |
| 243 | } evms_user_minor_t; |
| 244 | |
| 245 | #define EVMS_GET_MINOR_STRING "EVMS_GET_MINOR" |
| 246 | #define EVMS_GET_MINOR _IOWR(EVMS_MAJOR, EVMS_GET_MINOR_NUMBER, evms_user_minor_t) |
| 247 | |
| 248 | /* flags field described in evms_common.h */ |
| 249 | typedef struct evms_volume_data_s { |
| 250 | int minor; /* minor of target volume */ |
| 251 | int flags; |
| 252 | char volume_name[EVMS_VOLUME_NAME_SIZE + 1]; |
| 253 | int status; |
| 254 | } evms_volume_data_t; |
| 255 | |
| 256 | #define EVMS_GET_VOLUME_DATA_STRING "EVMS_GET_VOLUME_DATA" |
| 257 | #define EVMS_GET_VOLUME_DATA _IOWR(EVMS_MAJOR, EVMS_GET_VOLUME_DATA_NUMBER, evms_volume_data_t) |
| 258 | |
| 259 | /* field: command: defines */ |
| 260 | #define EVMS_FIRST_PLUGIN 0 |
| 261 | #define EVMS_NEXT_PLUGIN 1 |
| 262 | |
| 263 | /* field: status: defines */ |
| 264 | #define EVMS_PLUGIN_INVALID 0 |
| 265 | #define EVMS_PLUGIN_VALID 1 |
| 266 | typedef struct evms_kernel_plugin_s { |
| 267 | int command; /* 0 = first item, 1 = next item */ |
| 268 | u_int32_t id; /* returned plugin id */ |
| 269 | evms_version_t version; /* maj,min,patch of plugin */ |
| 270 | int status; /* 0 = no more, 1 = valid info */ |
| 271 | } evms_kernel_plugin_t; |
| 272 | |
| 273 | #define EVMS_GET_PLUGIN_STRING "EVMS_GET_PLUGIN" |
| 274 | #define EVMS_GET_PLUGIN _IOWR(EVMS_MAJOR, EVMS_GET_PLUGIN_NUMBER, evms_kernel_plugin_t) |
| 275 | |
| 276 | typedef struct evms_compute_csum_s { |
| 277 | unsigned char *buffer_address; /* IO address */ |
| 278 | int buffer_size; /* byte size of buffer */ |
| 279 | unsigned int insum; /* previous csum to be factored in */ |
| 280 | unsigned int outsum; /* resulting csum value of buffer */ |
| 281 | int status; /* 0 = success, not 0 = error */ |
| 282 | } evms_compute_csum_t; |
| 283 | |
| 284 | #define EVMS_COMPUTE_CSUM_STRING "EVMS_COMPUTE_CSUM" |
| 285 | #define EVMS_COMPUTE_CSUM _IOWR(EVMS_MAJOR, EVMS_COMPUTE_CSUM_NUMBER, evms_compute_csum_t) |
| 286 | |
| 287 | typedef struct evms_get_bmap_s { |
| 288 | u_int64_t rsector; /* input: volume relative rsector value */ |
| 289 | /* output: disk relative rsector value */ |
| 290 | u_int32_t dev; /* output = physical device */ |
| 291 | int status; /* 0 = success, not 0 = error */ |
| 292 | } evms_get_bmap_t; |
| 293 | |
| 294 | #define EVMS_GET_BMAP_STRING "EVMS_GET_BMAP" |
| 295 | #define EVMS_GET_BMAP _IOWR(EVMS_MAJOR, EVMS_GET_BMAP_NUMBER, evms_get_bmap_t) |
| 296 | |
| 297 | #endif |