• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 */