1251767Sgibbs/******************************************************************************
2251767Sgibbs * fsif.h
3251767Sgibbs *
4251767Sgibbs * Interface to FS level split device drivers.
5251767Sgibbs *
6251767Sgibbs * Permission is hereby granted, free of charge, to any person obtaining a copy
7251767Sgibbs * of this software and associated documentation files (the "Software"), to
8251767Sgibbs * deal in the Software without restriction, including without limitation the
9251767Sgibbs * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10251767Sgibbs * sell copies of the Software, and to permit persons to whom the Software is
11251767Sgibbs * furnished to do so, subject to the following conditions:
12251767Sgibbs *
13251767Sgibbs * The above copyright notice and this permission notice shall be included in
14251767Sgibbs * all copies or substantial portions of the Software.
15251767Sgibbs *
16251767Sgibbs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17251767Sgibbs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18251767Sgibbs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19251767Sgibbs * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20251767Sgibbs * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21251767Sgibbs * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22251767Sgibbs * DEALINGS IN THE SOFTWARE.
23251767Sgibbs *
24251767Sgibbs * Copyright (c) 2007, Grzegorz Milos, <gm281@cam.ac.uk>.
25251767Sgibbs */
26251767Sgibbs
27251767Sgibbs#ifndef __XEN_PUBLIC_IO_FSIF_H__
28251767Sgibbs#define __XEN_PUBLIC_IO_FSIF_H__
29251767Sgibbs
30251767Sgibbs#include "ring.h"
31251767Sgibbs#include "../grant_table.h"
32251767Sgibbs
33251767Sgibbs#define REQ_FILE_OPEN        1
34251767Sgibbs#define REQ_FILE_CLOSE       2
35251767Sgibbs#define REQ_FILE_READ        3
36251767Sgibbs#define REQ_FILE_WRITE       4
37251767Sgibbs#define REQ_STAT             5
38251767Sgibbs#define REQ_FILE_TRUNCATE    6
39251767Sgibbs#define REQ_REMOVE           7
40251767Sgibbs#define REQ_RENAME           8
41251767Sgibbs#define REQ_CREATE           9
42251767Sgibbs#define REQ_DIR_LIST        10
43251767Sgibbs#define REQ_CHMOD           11
44251767Sgibbs#define REQ_FS_SPACE        12
45251767Sgibbs#define REQ_FILE_SYNC       13
46251767Sgibbs
47251767Sgibbsstruct fsif_open_request {
48251767Sgibbs    grant_ref_t gref;
49251767Sgibbs};
50251767Sgibbs
51251767Sgibbsstruct fsif_close_request {
52251767Sgibbs    uint32_t fd;
53251767Sgibbs};
54251767Sgibbs
55251767Sgibbsstruct fsif_read_request {
56251767Sgibbs    uint32_t fd;
57251767Sgibbs    int32_t pad;
58251767Sgibbs    uint64_t len;
59251767Sgibbs    uint64_t offset;
60251767Sgibbs    grant_ref_t grefs[1];  /* Variable length */
61251767Sgibbs};
62251767Sgibbs
63251767Sgibbsstruct fsif_write_request {
64251767Sgibbs    uint32_t fd;
65251767Sgibbs    int32_t pad;
66251767Sgibbs    uint64_t len;
67251767Sgibbs    uint64_t offset;
68251767Sgibbs    grant_ref_t grefs[1];  /* Variable length */
69251767Sgibbs};
70251767Sgibbs
71251767Sgibbsstruct fsif_stat_request {
72251767Sgibbs    uint32_t fd;
73251767Sgibbs};
74251767Sgibbs
75251767Sgibbs/* This structure is a copy of some fields from stat structure, returned
76251767Sgibbs * via the ring. */
77251767Sgibbsstruct fsif_stat_response {
78251767Sgibbs    int32_t  stat_mode;
79251767Sgibbs    uint32_t stat_uid;
80251767Sgibbs    uint32_t stat_gid;
81251767Sgibbs    int32_t  stat_ret;
82251767Sgibbs    int64_t  stat_size;
83251767Sgibbs    int64_t  stat_atime;
84251767Sgibbs    int64_t  stat_mtime;
85251767Sgibbs    int64_t  stat_ctime;
86251767Sgibbs};
87251767Sgibbs
88251767Sgibbsstruct fsif_truncate_request {
89251767Sgibbs    uint32_t fd;
90251767Sgibbs    int32_t pad;
91251767Sgibbs    int64_t length;
92251767Sgibbs};
93251767Sgibbs
94251767Sgibbsstruct fsif_remove_request {
95251767Sgibbs    grant_ref_t gref;
96251767Sgibbs};
97251767Sgibbs
98251767Sgibbsstruct fsif_rename_request {
99251767Sgibbs    uint16_t old_name_offset;
100251767Sgibbs    uint16_t new_name_offset;
101251767Sgibbs    grant_ref_t gref;
102251767Sgibbs};
103251767Sgibbs
104251767Sgibbsstruct fsif_create_request {
105251767Sgibbs    int8_t directory;
106251767Sgibbs    int8_t pad;
107251767Sgibbs    int16_t pad2;
108251767Sgibbs    int32_t mode;
109251767Sgibbs    grant_ref_t gref;
110251767Sgibbs};
111251767Sgibbs
112251767Sgibbsstruct fsif_list_request {
113251767Sgibbs    uint32_t offset;
114251767Sgibbs    grant_ref_t gref;
115251767Sgibbs};
116251767Sgibbs
117251767Sgibbs#define NR_FILES_SHIFT  0
118251767Sgibbs#define NR_FILES_SIZE   16   /* 16 bits for the number of files mask */
119251767Sgibbs#define NR_FILES_MASK   (((1ULL << NR_FILES_SIZE) - 1) << NR_FILES_SHIFT)
120251767Sgibbs#define ERROR_SIZE      32   /* 32 bits for the error mask */
121251767Sgibbs#define ERROR_SHIFT     (NR_FILES_SIZE + NR_FILES_SHIFT)
122251767Sgibbs#define ERROR_MASK      (((1ULL << ERROR_SIZE) - 1) << ERROR_SHIFT)
123251767Sgibbs#define HAS_MORE_SHIFT  (ERROR_SHIFT + ERROR_SIZE)
124251767Sgibbs#define HAS_MORE_FLAG   (1ULL << HAS_MORE_SHIFT)
125251767Sgibbs
126251767Sgibbsstruct fsif_chmod_request {
127251767Sgibbs    uint32_t fd;
128251767Sgibbs    int32_t mode;
129251767Sgibbs};
130251767Sgibbs
131251767Sgibbsstruct fsif_space_request {
132251767Sgibbs    grant_ref_t gref;
133251767Sgibbs};
134251767Sgibbs
135251767Sgibbsstruct fsif_sync_request {
136251767Sgibbs    uint32_t fd;
137251767Sgibbs};
138251767Sgibbs
139251767Sgibbs
140251767Sgibbs/* FS operation request */
141251767Sgibbsstruct fsif_request {
142251767Sgibbs    uint8_t type;                 /* Type of the request                  */
143251767Sgibbs    uint8_t pad;
144251767Sgibbs    uint16_t id;                  /* Request ID, copied to the response   */
145251767Sgibbs    uint32_t pad2;
146251767Sgibbs    union {
147251767Sgibbs        struct fsif_open_request     fopen;
148251767Sgibbs        struct fsif_close_request    fclose;
149251767Sgibbs        struct fsif_read_request     fread;
150251767Sgibbs        struct fsif_write_request    fwrite;
151251767Sgibbs        struct fsif_stat_request     fstat;
152251767Sgibbs        struct fsif_truncate_request ftruncate;
153251767Sgibbs        struct fsif_remove_request   fremove;
154251767Sgibbs        struct fsif_rename_request   frename;
155251767Sgibbs        struct fsif_create_request   fcreate;
156251767Sgibbs        struct fsif_list_request     flist;
157251767Sgibbs        struct fsif_chmod_request    fchmod;
158251767Sgibbs        struct fsif_space_request    fspace;
159251767Sgibbs        struct fsif_sync_request     fsync;
160251767Sgibbs    } u;
161251767Sgibbs};
162251767Sgibbstypedef struct fsif_request fsif_request_t;
163251767Sgibbs
164251767Sgibbs/* FS operation response */
165251767Sgibbsstruct fsif_response {
166251767Sgibbs    uint16_t id;
167251767Sgibbs    uint16_t pad1;
168251767Sgibbs    uint32_t pad2;
169251767Sgibbs    union {
170251767Sgibbs        uint64_t ret_val;
171251767Sgibbs        struct fsif_stat_response fstat;
172251767Sgibbs    } u;
173251767Sgibbs};
174251767Sgibbs
175251767Sgibbstypedef struct fsif_response fsif_response_t;
176251767Sgibbs
177251767Sgibbs#define FSIF_RING_ENTRY_SIZE   64
178251767Sgibbs
179251767Sgibbs#define FSIF_NR_READ_GNTS  ((FSIF_RING_ENTRY_SIZE - sizeof(struct fsif_read_request)) /  \
180251767Sgibbs                                sizeof(grant_ref_t) + 1)
181251767Sgibbs#define FSIF_NR_WRITE_GNTS ((FSIF_RING_ENTRY_SIZE - sizeof(struct fsif_write_request)) / \
182251767Sgibbs                                sizeof(grant_ref_t) + 1)
183251767Sgibbs
184251767SgibbsDEFINE_RING_TYPES(fsif, struct fsif_request, struct fsif_response);
185251767Sgibbs
186251767Sgibbs#define STATE_INITIALISED     "init"
187251767Sgibbs#define STATE_READY           "ready"
188251767Sgibbs#define STATE_CLOSING         "closing"
189251767Sgibbs#define STATE_CLOSED          "closed"
190251767Sgibbs
191251767Sgibbs
192251767Sgibbs#endif
193