1 /******************************************************************************
2 * fsif.h
3 *
4 * Interface to FS level split device drivers.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 *
24 * Copyright (c) 2007, Grzegorz Milos, <gm281@cam.ac.uk>.
25 */
26
27 #ifndef __XEN_PUBLIC_IO_FSIF_H__
28 #define __XEN_PUBLIC_IO_FSIF_H__
29
30 #include "ring.h"
31 #include "../grant_table.h"
32
33 #define REQ_FILE_OPEN 1
34 #define REQ_FILE_CLOSE 2
35 #define REQ_FILE_READ 3
36 #define REQ_FILE_WRITE 4
37 #define REQ_STAT 5
38 #define REQ_FILE_TRUNCATE 6
39 #define REQ_REMOVE 7
40 #define REQ_RENAME 8
41 #define REQ_CREATE 9
42 #define REQ_DIR_LIST 10
43 #define REQ_CHMOD 11
44 #define REQ_FS_SPACE 12
45 #define REQ_FILE_SYNC 13
46
47 struct fsif_open_request {
48 grant_ref_t gref;
49 };
50
51 struct fsif_close_request {
52 uint32_t fd;
53 };
54
55 struct fsif_read_request {
56 uint32_t fd;
57 int32_t pad;
58 uint64_t len;
59 uint64_t offset;
60 grant_ref_t grefs[1]; /* Variable length */
61 };
62
63 struct fsif_write_request {
64 uint32_t fd;
65 int32_t pad;
66 uint64_t len;
67 uint64_t offset;
68 grant_ref_t grefs[1]; /* Variable length */
69 };
70
71 struct fsif_stat_request {
72 uint32_t fd;
73 };
74
75 /* This structure is a copy of some fields from stat structure, returned
76 * via the ring. */
77 struct fsif_stat_response {
78 int32_t stat_mode;
79 uint32_t stat_uid;
80 uint32_t stat_gid;
81 int32_t stat_ret;
82 int64_t stat_size;
83 int64_t stat_atime;
84 int64_t stat_mtime;
85 int64_t stat_ctime;
86 };
87
88 struct fsif_truncate_request {
89 uint32_t fd;
90 int32_t pad;
91 int64_t length;
92 };
93
94 struct fsif_remove_request {
95 grant_ref_t gref;
96 };
97
98 struct fsif_rename_request {
99 uint16_t old_name_offset;
100 uint16_t new_name_offset;
101 grant_ref_t gref;
102 };
103
104 struct fsif_create_request {
105 int8_t directory;
106 int8_t pad;
107 int16_t pad2;
108 int32_t mode;
109 grant_ref_t gref;
110 };
111
112 struct fsif_list_request {
113 uint32_t offset;
114 grant_ref_t gref;
115 };
116
117 #define NR_FILES_SHIFT 0
118 #define NR_FILES_SIZE 16 /* 16 bits for the number of files mask */
119 #define NR_FILES_MASK (((1ULL << NR_FILES_SIZE) - 1) << NR_FILES_SHIFT)
120 #define ERROR_SIZE 32 /* 32 bits for the error mask */
121 #define ERROR_SHIFT (NR_FILES_SIZE + NR_FILES_SHIFT)
122 #define ERROR_MASK (((1ULL << ERROR_SIZE) - 1) << ERROR_SHIFT)
123 #define HAS_MORE_SHIFT (ERROR_SHIFT + ERROR_SIZE)
124 #define HAS_MORE_FLAG (1ULL << HAS_MORE_SHIFT)
125
126 struct fsif_chmod_request {
127 uint32_t fd;
128 int32_t mode;
129 };
130
131 struct fsif_space_request {
132 grant_ref_t gref;
133 };
134
135 struct fsif_sync_request {
136 uint32_t fd;
137 };
138
139
140 /* FS operation request */
141 struct fsif_request {
142 uint8_t type; /* Type of the request */
143 uint8_t pad;
144 uint16_t id; /* Request ID, copied to the response */
145 uint32_t pad2;
146 union {
147 struct fsif_open_request fopen;
148 struct fsif_close_request fclose;
149 struct fsif_read_request fread;
150 struct fsif_write_request fwrite;
151 struct fsif_stat_request fstat;
152 struct fsif_truncate_request ftruncate;
153 struct fsif_remove_request fremove;
154 struct fsif_rename_request frename;
155 struct fsif_create_request fcreate;
156 struct fsif_list_request flist;
157 struct fsif_chmod_request fchmod;
158 struct fsif_space_request fspace;
159 struct fsif_sync_request fsync;
160 } u;
161 };
162 typedef struct fsif_request fsif_request_t;
163
164 /* FS operation response */
165 struct fsif_response {
166 uint16_t id;
167 uint16_t pad1;
168 uint32_t pad2;
169 union {
170 uint64_t ret_val;
171 struct fsif_stat_response fstat;
172 } u;
173 };
174
175 typedef struct fsif_response fsif_response_t;
176
177 #define FSIF_RING_ENTRY_SIZE 64
178
179 #define FSIF_NR_READ_GNTS ((FSIF_RING_ENTRY_SIZE - sizeof(struct fsif_read_request)) / \
180 sizeof(grant_ref_t) + 1)
181 #define FSIF_NR_WRITE_GNTS ((FSIF_RING_ENTRY_SIZE - sizeof(struct fsif_write_request)) / \
182 sizeof(grant_ref_t) + 1)
183
184 DEFINE_RING_TYPES(fsif, struct fsif_request, struct fsif_response);
185
186 #define STATE_INITIALISED "init"
187 #define STATE_READY "ready"
188 #define STATE_CLOSING "closing"
189 #define STATE_CLOSED "closed"
190
191
192 #endif
Cache object: 37907508eaa9dfeae2fc2196664d828b
|