Home | History | Annotate | Line # | Download | only in io
      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 (at) 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
    193