3
* Blktap library userspace code.
5
* Copyright (c) 2007, XenSource Inc.
8
* Redistribution and use in source and binary forms, with or without
9
* modification, are permitted provided that the following conditions are met:
10
* * Redistributions of source code must retain the above copyright
11
* notice, this list of conditions and the following disclaimer.
12
* * Redistributions in binary form must reproduce the above copyright
13
* notice, this list of conditions and the following disclaimer in the
14
* documentation and/or other materials provided with the distribution.
15
* * Neither the name of XenSource Inc. nor the names of its contributors
16
* may be used to endorse or promote products derived from this software
17
* without specific prior written permission.
19
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
23
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
#ifndef __BLKTAPLIB_H__
33
#define __BLKTAPLIB_H__
37
#include <xen/io/blkif.h>
40
#define DPRINTF(_f, _a...) syslog(LOG_INFO, _f, ##_a)
42
#define DPRINTF(_f, _a...) ((void)0)
45
#define EPRINTF(_f, _a...) syslog(LOG_ERR, "tap-err:%s: " _f, __func__, ##_a)
46
#define PERROR(_f, _a...) EPRINTF(_f ": %s", ##_a, strerror(errno))
48
#define BLK_RING_SIZE __CONST_RING_SIZE(blkif, XC_PAGE_SIZE)
50
/* size of the extra VMA area to map in attached pages. */
51
#define BLKTAP_VMA_PAGES BLK_RING_SIZE
53
/* blktap IOCTLs: These must correspond with the blktap driver ioctls */
54
#define BLKTAP_IOCTL_KICK_FE 1
55
#define BLKTAP_IOCTL_KICK_BE 2
56
#define BLKTAP_IOCTL_SETMODE 3
57
#define BLKTAP_IOCTL_SENDPID 4
58
#define BLKTAP_IOCTL_NEWINTF 5
59
#define BLKTAP_IOCTL_MINOR 6
60
#define BLKTAP_IOCTL_MAJOR 7
61
#define BLKTAP_QUERY_ALLOC_REQS 8
62
#define BLKTAP_IOCTL_FREEINTF 9
63
#define BLKTAP_IOCTL_PRINT_IDXS 100
64
#define BLKTAP_IOCTL_BACKDEV_SETUP 200
66
#define PRIO_SPECIAL_IO -9999
68
/* blktap switching modes: (Set with BLKTAP_IOCTL_SETMODE) */
69
#define BLKTAP_MODE_PASSTHROUGH 0x00000000 /* default */
70
#define BLKTAP_MODE_INTERCEPT_FE 0x00000001
71
#define BLKTAP_MODE_INTERCEPT_BE 0x00000002
73
#define BLKTAP_MODE_INTERPOSE \
74
(BLKTAP_MODE_INTERCEPT_FE | BLKTAP_MODE_INTERCEPT_BE)
76
static inline int BLKTAP_MODE_VALID(unsigned long arg)
79
( arg == BLKTAP_MODE_PASSTHROUGH ) ||
80
( arg == BLKTAP_MODE_INTERCEPT_FE ) ||
81
( arg == BLKTAP_MODE_INTERPOSE ) );
84
#define MAX_REQUESTS BLK_RING_SIZE
86
#define BLKTAP_IOCTL_KICK 1
87
#define MAX_PENDING_REQS BLK_RING_SIZE
88
#define BLKTAP_DEV_DIR "/dev/xen"
89
#define BLKTAP_DEV_NAME "blktap"
90
#define BACKDEV_NAME "backdev"
91
#define BLKTAP_DEV_MINOR 0
92
#define BLKTAP_CTRL_DIR "/var/run/tap"
94
extern int blktap_major;
96
#define BLKTAP_RING_PAGES 1 /* Front */
97
#define BLKTAP_MMAP_REGION_SIZE (BLKTAP_RING_PAGES + MMAP_PAGES)
108
struct timeval last_try;
111
typedef struct blkif {
118
enum { DISCONNECTED, DISCONNECTING, CONNECTED } state;
120
struct blkif_ops *ops;
121
struct blkif *hash_next;
123
void *prv; /* device-specific data */
124
struct blkif_info *info; /*Image parameter passing */
125
pending_req_t pending_list[MAX_REQUESTS];
138
typedef struct blkif_info {
144
typedef struct tapdev_info {
147
blkif_sring_t *sring;
148
blkif_back_ring_t fe_ring;
149
unsigned long vstart;
153
typedef struct domid_translate {
154
unsigned short domid;
155
unsigned short busid;
156
} domid_translate_t ;
158
typedef struct image {
159
unsigned long long size;
160
unsigned long secsize;
164
typedef struct msg_hdr {
171
typedef struct msg_params {
178
typedef struct msg_newdev {
183
typedef struct msg_pid {
187
typedef struct msg_cp {
193
typedef struct msg_lock {
203
/*Control Messages between manager and tapdev*/
204
#define CTLMSG_PARAMS 1
206
#define CTLMSG_IMG_FAIL 3
207
#define CTLMSG_NEWDEV 4
208
#define CTLMSG_NEWDEV_RSP 5
209
#define CTLMSG_NEWDEV_FAIL 6
210
#define CTLMSG_CLOSE 7
211
#define CTLMSG_CLOSE_RSP 8
213
#define CTLMSG_PID_RSP 10
214
#define CTLMSG_CHECKPOINT 11
215
#define CTLMSG_CHECKPOINT_RSP 12
216
#define CTLMSG_LOCK 13
217
#define CTLMSG_LOCK_RSP 14
218
#define CTLMSG_PAUSE 15
219
#define CTLMSG_PAUSE_RSP 16
220
#define CTLMSG_RESUME 17
221
#define CTLMSG_RESUME_RSP 18
223
#define TAPDISK_STORAGE_TYPE_NFS 1
224
#define TAPDISK_STORAGE_TYPE_EXT 2
225
#define TAPDISK_STORAGE_TYPE_LVM 3
226
#define TAPDISK_STORAGE_TYPE_DEFAULT TAPDISK_STORAGE_TYPE_EXT
228
/* Abitrary values, must match the underlying driver... */
229
#define MAX_TAP_DEV 256
231
/* Accessing attached data page mappings */
233
(MAX_PENDING_REQS * BLKIF_MAX_SEGMENTS_PER_REQUEST)
234
#define MMAP_VADDR(_vstart,_req,_seg) \
236
((_req) * BLKIF_MAX_SEGMENTS_PER_REQUEST * getpagesize()) + \
237
((_seg) * getpagesize()))
239
/* Defines that are only used by library clients */
241
#ifndef __COMPILING_BLKTAP_LIB
243
static char *blkif_op_name[] = {
244
[BLKIF_OP_READ] = "READ",
245
[BLKIF_OP_WRITE] = "WRITE",
248
#endif /* __COMPILING_BLKTAP_LIB */
250
#endif /* __BLKTAPLIB_H__ */