1 /* 2 * Copyright (c) 2023 Institute of Parallel And Distributed Systems (IPADS), Shanghai Jiao Tong University (SJTU) 3 * Licensed under the Mulan PSL v2. 4 * You can use this software according to the terms and conditions of the Mulan PSL v2. 5 * You may obtain a copy of Mulan PSL v2 at: 6 * http://license.coscl.org.cn/MulanPSL2 7 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR 8 * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR 9 * PURPOSE. 10 * See the Mulan PSL v2 for more details. 11 */ 12 #ifndef FS_WRAPPER_DEFS_H 13 #define FS_WRAPPER_DEFS_H 14 15 #include <chcore/container/list.h> 16 #include <chcore-internal/fs_defs.h> 17 #include <chcore/ipc.h> 18 #include <fcntl.h> 19 #include <sys/stat.h> 20 #include <sys/statfs.h> 21 #include <malloc.h> 22 #include <string.h> 23 24 /* +++++++++++++++++++++ FS Server Private Data +++++++++++++++++++++++++++ */ 25 #define TEST_COUNT_PAGE true 26 #if TEST_COUNT_PAGE == 1 27 #define TEST_COUNT_PAGE_CACHE 28 #endif 29 #ifdef TEST_COUNT_PAGE_CACHE 30 struct test_count { 31 int hit; 32 int miss; 33 int disk_i; 34 int disk_o; 35 }; 36 extern struct test_count count; 37 #endif 38 39 /* Indicates whether a certain fs has been mounted */ 40 extern bool mounted; 41 extern bool using_page_cache; 42 extern struct fs_server_ops server_ops; 43 44 /* +++++++++++++++++++++++++++ FID Mapping ++++++++++++++++++++++++++++++++ */ 45 46 #define MAX_SERVER_ENTRY_PER_CLIENT 1024 47 /* (client_badge, fd) -> fid(server_entry) */ 48 struct server_entry_node { 49 badge_t client_badge; 50 int fd_to_fid[MAX_SERVER_ENTRY_PER_CLIENT]; 51 52 struct list_head node; 53 }; 54 55 extern struct list_head server_entry_mapping; 56 extern pthread_spinlock_t server_entry_mapping_lock; 57 58 void init_fs_wrapper(void); 59 int fs_wrapper_get_server_entry(badge_t client_badge, int fd); 60 int fs_wrapper_set_server_entry(badge_t client_badge, int fd, int fid); 61 void fs_wrapper_clear_server_entry(badge_t client_badge, int fd); 62 int translate_fd_to_fid(badge_t client_badge, struct fs_request *fr); 63 64 /* ++++++++++++++++++++++++ FS Server Operations ++++++++++++++++++++++++++ */ 65 66 /** 67 * FS Server Operation Vector 68 * 69 * NOTE: 70 * Each fs server should implement its own operations, 71 * and store in `server_ops` variable. 72 * If there is any need to expand this structure, 73 * do not forget add a default operation for every fs server impl. 74 */ 75 struct fs_server_ops { 76 int (*mount)(ipc_msg_t *ipc_msg, struct fs_request *fr); 77 int (*umount)(ipc_msg_t *ipc_msg, struct fs_request *fr); 78 79 int (*open)(char *path, int flags, int mode, ino_t *vnode_id, 80 off_t *vnode_size, int *vnode_type, void **private); 81 ssize_t (*read)(void *operator, off_t offset, size_t size, char * buf); 82 ssize_t (*write)(void *operator, off_t offset, size_t size, 83 const char * buf); 84 int (*close)(void *operator, bool is_dir, bool do_close); 85 86 int (*creat)(ipc_msg_t *ipc_msg, struct fs_request *fr); 87 int (*unlink)(const char *path, int flags); 88 int (*mkdir)(const char *path, mode_t mode); 89 int (*rmdir)(const char *path, int flags); 90 int (*rename)(const char *oldpath, const char *newpath); 91 92 int (*getdents64)(ipc_msg_t *ipc_msg, struct fs_request *fr); 93 int (*ftruncate)(void *operator, off_t size); 94 int (*fstatat)(const char *, struct stat *st, int flags); 95 int (*fstat)(ipc_msg_t *ipc_msg, struct fs_request *fr); 96 int (*statfs)(ipc_msg_t *ipc_msg, struct fs_request *fr); 97 int (*fstatfs)(ipc_msg_t *ipc_msg, struct fs_request *fr); 98 int (*faccessat)(ipc_msg_t *ipc_msg, struct fs_request *fr); 99 100 int (*symlinkat)(ipc_msg_t *ipc_msg, struct fs_request *fr); 101 ssize_t (*readlinkat)(ipc_msg_t *ipc_msg, struct fs_request *fr); 102 int (*fallocate)(ipc_msg_t *ipc_msg, struct fs_request *fr); 103 int (*fcntl)(void *operator, int fd, int fcntl_cmd, int fcntl_arg); 104 105 #ifdef CHCORE_ENABLE_FMAP 106 vaddr_t (*fmap_get_page_addr)(void *operator, off_t offset); 107 #endif 108 }; 109 110 int default_server_operation(ipc_msg_t *ipc_msg, struct fs_request *fr); 111 ssize_t default_ssize_t_server_operation(ipc_msg_t *ipc_msg, 112 struct fs_request *fr); 113 #ifdef CHCORE_ENABLE_FMAP 114 #define default_fmap_get_page_addr NULL 115 int fs_wrapper_fmap(badge_t client_badge, ipc_msg_t *ipc_msg, 116 struct fs_request *fr, bool *ret_with_cap); 117 int fs_wrapper_funmap(badge_t client_badge, ipc_msg_t *ipc_msg, 118 struct fs_request *fr); 119 #endif 120 int fs_wrapper_open(badge_t client_badge, ipc_msg_t *ipc_msg, 121 struct fs_request *fr); 122 int fs_wrapper_close(badge_t client_badge, ipc_msg_t *ipc_msg, 123 struct fs_request *fr); 124 int fs_wrapper_read(ipc_msg_t *ipc_msg, struct fs_request *fr); 125 int fs_wrapper_write(ipc_msg_t *ipc_msg, struct fs_request *fr); 126 int fs_wrapper_lseek(ipc_msg_t *ipc_msg, struct fs_request *fr); 127 int fs_wrapper_ftruncate(ipc_msg_t *ipc_msg, struct fs_request *fr); 128 int fs_wrapper_fstatat(ipc_msg_t *ipc_msg, struct fs_request *fr); 129 int fs_wrapper_unlink(ipc_msg_t *ipc_msg, struct fs_request *fr); 130 int fs_wrapper_rename(ipc_msg_t *ipc_msg, struct fs_request *fr); 131 int fs_wrapper_count(ipc_msg_t *ipc_msg, struct fs_request *fr); 132 int fs_wrapper_rmdir(ipc_msg_t *ipc_msg, struct fs_request *fr); 133 int fs_wrapper_mkdir(ipc_msg_t *ipc_msg, struct fs_request *fr); 134 int fs_wrapper_sync(void); 135 int fs_wrapper_fsync(ipc_msg_t *ipc_msg, struct fs_request *fr); 136 int fs_wrapper_creat(ipc_msg_t *ipc_msg, struct fs_request *fr); 137 int fs_wrapper_getdents64(ipc_msg_t *ipc_msg, struct fs_request *fr); 138 int fs_wrapper_fstat(ipc_msg_t *ipc_msg, struct fs_request *fr); 139 int fs_wrapper_statfs(ipc_msg_t *ipc_msg, struct fs_request *fr); 140 int fs_wrapper_fstatfs(ipc_msg_t *ipc_msg, struct fs_request *fr); 141 int fs_wrapper_faccessat(ipc_msg_t *ipc_msg, struct fs_request *fr); 142 int fs_wrapper_symlinkat(ipc_msg_t *ipc_msg, struct fs_request *fr); 143 int fs_wrapper_readlinkat(ipc_msg_t *ipc_msg, struct fs_request *fr); 144 int fs_wrapper_fallocate(ipc_msg_t *ipc_msg, struct fs_request *fr); 145 int fs_wrapper_fcntl(badge_t client_badge, ipc_msg_t *ipc_msg, 146 struct fs_request *fr); 147 int fs_wrapper_mount(ipc_msg_t *ipc_msg, struct fs_request *fr); 148 int fs_wrapper_umount(ipc_msg_t *ipc_msg, struct fs_request *fr); 149 void fs_server_destructor(badge_t client_badge); 150 151 void fs_server_dispatch(ipc_msg_t *ipc_msg, badge_t client_badge); 152 153 /* ++++++++++++++++++++++++ Concurrency Control ++++++++++++++++++++++++++ */ 154 155 extern pthread_rwlock_t fs_wrapper_meta_rwlock; 156 157 #endif /* FS_WRAPPER_DEFS_H */