|
|
1.1 ! root 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, <[email protected]>. ! 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: }; ! 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: ! 189: ! 190: ! 191: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.