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