ia64/xen-unstable

view tools/blktap/lib/blktaplib.h @ 14105:e9bd3267ff23

[TAPDISK] honor read-only attributes when creating tap-based VBDs
Signed-off-by: Jake Wires <jwires@xensource.com>
author Jake Wires <jwires@xensource.com>
date Fri Feb 23 17:26:07 2007 -0800 (2007-02-23)
parents 3c827d68fa87
children 800aa9f5cec9
line source
1 /* blktaplib.h
2 *
3 * Blktap library userspace code.
4 *
5 * (c) 2005 Andrew Warfield and Julian Chesterfield
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License version 2
9 * as published by the Free Software Foundation; or, when distributed
10 * separately from the Linux kernel or incorporated into other
11 * software packages, subject to the following license:
12 *
13 * Permission is hereby granted, free of charge, to any person obtaining a copy
14 * of this source file (the "Software"), to deal in the Software without
15 * restriction, including without limitation the rights to use, copy, modify,
16 * merge, publish, distribute, sublicense, and/or sell copies of the Software,
17 * and to permit persons to whom the Software is furnished to do so, subject to
18 * the following conditions:
19 *
20 * The above copyright notice and this permission notice shall be included in
21 * all copies or substantial portions of the Software.
22 *
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
29 * IN THE SOFTWARE.
30 */
32 #ifndef __BLKTAPLIB_H__
33 #define __BLKTAPLIB_H__
35 #include <xenctrl.h>
36 #include <sys/user.h>
37 #include <xen/xen.h>
38 #include <xen/io/blkif.h>
39 #include <xen/io/ring.h>
40 #include <xs.h>
41 #include <sys/types.h>
42 #include <unistd.h>
44 #define BLK_RING_SIZE __RING_SIZE((blkif_sring_t *)0, XC_PAGE_SIZE)
46 /* size of the extra VMA area to map in attached pages. */
47 #define BLKTAP_VMA_PAGES BLK_RING_SIZE
49 /* blktap IOCTLs: These must correspond with the blktap driver ioctls*/
50 #define BLKTAP_IOCTL_KICK_FE 1
51 #define BLKTAP_IOCTL_KICK_BE 2
52 #define BLKTAP_IOCTL_SETMODE 3
53 #define BLKTAP_IOCTL_SENDPID 4
54 #define BLKTAP_IOCTL_NEWINTF 5
55 #define BLKTAP_IOCTL_MINOR 6
56 #define BLKTAP_IOCTL_MAJOR 7
57 #define BLKTAP_QUERY_ALLOC_REQS 8
58 #define BLKTAP_IOCTL_FREEINTF 9
59 #define BLKTAP_IOCTL_PRINT_IDXS 100
61 /* blktap switching modes: (Set with BLKTAP_IOCTL_SETMODE) */
62 #define BLKTAP_MODE_PASSTHROUGH 0x00000000 /* default */
63 #define BLKTAP_MODE_INTERCEPT_FE 0x00000001
64 #define BLKTAP_MODE_INTERCEPT_BE 0x00000002
66 #define BLKTAP_MODE_INTERPOSE \
67 (BLKTAP_MODE_INTERCEPT_FE | BLKTAP_MODE_INTERCEPT_BE)
69 static inline int BLKTAP_MODE_VALID(unsigned long arg)
70 {
71 return (
72 ( arg == BLKTAP_MODE_PASSTHROUGH ) ||
73 ( arg == BLKTAP_MODE_INTERCEPT_FE ) ||
74 ( arg == BLKTAP_MODE_INTERPOSE ) );
75 }
77 #define MAX_REQUESTS BLK_RING_SIZE
79 #define BLKTAP_IOCTL_KICK 1
80 #define MAX_PENDING_REQS BLK_RING_SIZE
81 #define BLKTAP_DEV_DIR "/dev/xen"
82 #define BLKTAP_DEV_NAME "blktap"
83 #define BLKTAP_DEV_MINOR 0
85 extern int blktap_major;
87 #define BLKTAP_RING_PAGES 1 /* Front */
88 #define BLKTAP_MMAP_REGION_SIZE (BLKTAP_RING_PAGES + MMAP_PAGES)
90 struct blkif;
92 typedef struct {
93 blkif_request_t req;
94 struct blkif *blkif;
95 int submitting;
96 int secs_pending;
97 int16_t status;
98 } pending_req_t;
100 struct blkif_ops {
101 unsigned long long (*get_size)(struct blkif *blkif);
102 unsigned long (*get_secsize)(struct blkif *blkif);
103 unsigned int (*get_info)(struct blkif *blkif);
104 };
106 typedef struct blkif {
107 domid_t domid;
108 long int handle;
110 long int pdev;
111 long int readonly;
113 enum { DISCONNECTED, DISCONNECTING, CONNECTED } state;
115 struct blkif_ops *ops;
116 struct blkif *hash_next;
118 void *prv; /* device-specific data */
119 void *info; /*Image parameter passing */
120 pending_req_t pending_list[MAX_REQUESTS];
121 int devnum;
122 int fds[2];
123 int be_id;
124 int major;
125 int minor;
126 pid_t tappid;
127 int drivertype;
128 uint16_t cookie;
129 } blkif_t;
131 typedef struct blkif_info {
132 char *params;
133 } blkif_info_t;
135 void register_new_devmap_hook(int (*fn)(blkif_t *blkif));
136 void register_new_unmap_hook(int (*fn)(blkif_t *blkif));
137 void register_new_blkif_hook(int (*fn)(blkif_t *blkif));
138 blkif_t *blkif_find_by_handle(domid_t domid, unsigned int handle);
139 blkif_t *alloc_blkif(domid_t domid);
140 int blkif_init(blkif_t *blkif, long int handle, long int pdev,
141 long int readonly);
142 void free_blkif(blkif_t *blkif);
143 void __init_blkif(void);
145 typedef struct busy_state {
146 int seg_idx;
147 blkif_request_t *req;
148 } busy_state_t;
150 typedef struct tapdev_info {
151 int fd;
152 char *mem;
153 blkif_sring_t *sring;
154 blkif_back_ring_t fe_ring;
155 unsigned long vstart;
156 blkif_t *blkif;
157 busy_state_t busy;
158 } tapdev_info_t;
160 typedef struct domid_translate {
161 unsigned short domid;
162 unsigned short busid;
163 } domid_translate_t ;
165 typedef struct image {
166 unsigned long long size;
167 unsigned long secsize;
168 unsigned int info;
169 } image_t;
171 typedef struct msg_hdr {
172 uint16_t type;
173 uint16_t len;
174 uint16_t drivertype;
175 uint16_t cookie;
176 uint8_t readonly;
177 } msg_hdr_t;
179 typedef struct msg_newdev {
180 uint8_t devnum;
181 uint16_t domid;
182 } msg_newdev_t;
184 typedef struct msg_pid {
185 pid_t pid;
186 } msg_pid_t;
188 #define READ 0
189 #define WRITE 1
191 /*Control Messages between manager and tapdev*/
192 #define CTLMSG_PARAMS 1
193 #define CTLMSG_IMG 2
194 #define CTLMSG_IMG_FAIL 3
195 #define CTLMSG_NEWDEV 4
196 #define CTLMSG_NEWDEV_RSP 5
197 #define CTLMSG_NEWDEV_FAIL 6
198 #define CTLMSG_CLOSE 7
199 #define CTLMSG_CLOSE_RSP 8
200 #define CTLMSG_PID 9
201 #define CTLMSG_PID_RSP 10
203 /* xenstore/xenbus: */
204 #define DOMNAME "Domain-0"
205 int setup_probe_watch(struct xs_handle *h);
206 int xs_fire_next_watch(struct xs_handle *h);
209 /* Abitrary values, must match the underlying driver... */
210 #define MAX_TAP_DEV 100
212 /* Accessing attached data page mappings */
213 #define MMAP_PAGES \
214 (MAX_PENDING_REQS * BLKIF_MAX_SEGMENTS_PER_REQUEST)
215 #define MMAP_VADDR(_vstart,_req,_seg) \
216 ((_vstart) + \
217 ((_req) * BLKIF_MAX_SEGMENTS_PER_REQUEST * getpagesize()) + \
218 ((_seg) * getpagesize()))
220 /* Defines that are only used by library clients */
222 #ifndef __COMPILING_BLKTAP_LIB
224 static char *blkif_op_name[] = {
225 [BLKIF_OP_READ] = "READ",
226 [BLKIF_OP_WRITE] = "WRITE",
227 };
229 #endif /* __COMPILING_BLKTAP_LIB */
231 #endif /* __BLKTAPLIB_H__ */