blob: 11315494a19a81eb83ff6d518630b71e51cd6175 [file] [log] [blame]
Theodore Ts'off6dbcc2002-05-24 22:44:42 -04001/* -*- 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 */
38typedef 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 */
101typedef 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
125typedef 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
141typedef 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
153typedef 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
165typedef 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
174typedef 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
192typedef 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 */
202typedef 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
220typedef 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
239typedef 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 */
249typedef 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
266typedef 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
276typedef 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
287typedef 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