|
[ source navigation ] [ diff markup ] [ identifier search ] [ general search ] |
|||
|
001 /* Copyright (C) 2005 David Decotigny !! 001 /* Copyright (C) 2005,2006 David Decotigny 002 Copyright (C) 2000-2005 The KOS Team (Thoma 002 Copyright (C) 2000-2005 The KOS Team (Thomas Petazzoni, David 003 Decotigny, Julien M 003 Decotigny, Julien Munier) 004 004 005 This program is free software; you can redi 005 This program is free software; you can redistribute it and/or 006 modify it under the terms of the GNU Genera 006 modify it under the terms of the GNU General Public License 007 as published by the Free Software Foundatio 007 as published by the Free Software Foundation; either version 2 008 of the License, or (at your option) any lat 008 of the License, or (at your option) any later version. 009 009 010 This program is distributed in the hope tha 010 This program is distributed in the hope that it will be useful, 011 but WITHOUT ANY WARRANTY; without even the 011 but WITHOUT ANY WARRANTY; without even the implied warranty of 012 MERCHANTABILITY or FITNESS FOR A PARTICULAR 012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 013 GNU General Public License for more details 013 GNU General Public License for more details. 014 014 015 You should have received a copy of the GNU 015 You should have received a copy of the GNU General Public License 016 along with this program; if not, write to t 016 along with this program; if not, write to the Free Software 017 Foundation, Inc., 59 Temple Place - Suite 3 017 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 018 USA. 018 USA. 019 */ 019 */ 020 #ifndef _SOS_FS_H_ 020 #ifndef _SOS_FS_H_ 021 #define _SOS_FS_H_ 021 #define _SOS_FS_H_ 022 022 023 023 024 /** 024 /** 025 * @file fs.h 025 * @file fs.h 026 * 026 * 027 * (Virtual) Filesystem management. 027 * (Virtual) Filesystem management. 028 * 028 * 029 * SOS provides a complete Unix-like file syst 029 * SOS provides a complete Unix-like file system service. Supported 030 * features of this service are: 030 * features of this service are: 031 * - mountpoints 031 * - mountpoints 032 * - generic file system support (FS) throug 032 * - generic file system support (FS) through object-oriented 033 * specialization (so-called VFS) 033 * specialization (so-called VFS) 034 * - hard & symbolic links 034 * - hard & symbolic links 035 * - regular files and directories 035 * - regular files and directories 036 * - block and character device special file 036 * - block and character device special files (from article 9 onward) 037 * - file mapping 037 * - file mapping 038 * - basic permission management ("rwx" only 038 * - basic permission management ("rwx" only, no notion of owner) 039 * - chroot 039 * - chroot 040 * - separation of disk node and namespace n 040 * - separation of disk node and namespace notions allowing hard links 041 * and to move/rename/remove files or dire 041 * and to move/rename/remove files or directories that are in use 042 * - basic FS interface (open/read/seek/crea 042 * - basic FS interface (open/read/seek/creat/mkdir/rename/link 043 * / symlink/chmod/mount/fcntl/ioctl...) 043 * / symlink/chmod/mount/fcntl/ioctl...) 044 * - deferred writes (ie file caching). @see 044 * - deferred writes (ie file caching). @see sync(3) 045 * 045 * 046 * Among the unsupported features: 046 * Among the unsupported features: 047 * - no user-based permission (uid/gid, ACLS 047 * - no user-based permission (uid/gid, ACLS) 048 * - no modification / access time accountin 048 * - no modification / access time accounting 049 * - no Fifo/socket special files (yet) 049 * - no Fifo/socket special files (yet) 050 * - no generic support library for common f 050 * - no generic support library for common fcntl commands 051 * (F_SETOWN/GETLEASE/NOTIFY, etc.) 051 * (F_SETOWN/GETLEASE/NOTIFY, etc.) 052 * - no flock-style functions 052 * - no flock-style functions 053 * 053 * 054 * Rationale 054 * Rationale 055 * ========= 055 * ========= 056 * The VFS layer is based on 3 central concept 056 * The VFS layer is based on 3 central concepts: 057 * 057 * 058 * - The meta-information for each file store 058 * - The meta-information for each file stored on disk: size, 059 * permissions, ... (struct sos_fs_node for 059 * permissions, ... (struct sos_fs_node for SOS, inode for Unix) 060 * 060 * 061 * It is sufficient to know where this meta 061 * It is sufficient to know where this meta-information is located 062 * on disk (a simple sector number most of 062 * on disk (a simple sector number most of the time) to build the 063 * corresponding struct sos_fs_node into me 063 * corresponding struct sos_fs_node into memory and to retrieve the 064 * data of the file from the disk 064 * data of the file from the disk 065 * 065 * 066 * For example, consider that we know a sec 066 * For example, consider that we know a sector that holds the meta 067 * information is located at sector 64589 o 067 * information is located at sector 64589 on disk. By retrieving 068 * this meta information directly from disk 068 * this meta information directly from disk, we can build the 069 * struct sos_fs_node, which would (for exa 069 * struct sos_fs_node, which would (for example) tell that the 070 * corresponding file spans (for example) o 070 * corresponding file spans (for example) over sectors 4345, 5645, 071 * 4539 and 6575, is 1.7kB long 071 * 4539 and 6575, is 1.7kB long 072 * 072 * 073 * Everything is stored this way on the dis 073 * Everything is stored this way on the disk, even the 074 * directories. From the disk contents' poi 074 * directories. From the disk contents' point of view, a directory 075 * is simply a file whose contents represen 075 * is simply a file whose contents represent a list of mappings 076 * "name" -> meta-information location 076 * "name" -> meta-information location 077 * 077 * 078 * - One or many nodes in the file hierarchy 078 * - One or many nodes in the file hierarchy pointing to this data 079 * (struct sos_fs_nscache_node for SOS, str 079 * (struct sos_fs_nscache_node for SOS, struct dentry for Linux). This 080 * tells that the entry "toto" in directory 080 * tells that the entry "toto" in directory "/home/zorglub" 081 * corresponds to the given struct sos_fs_n 081 * corresponds to the given struct sos_fs_node 082 * 082 * 083 * Actually, with the struct sos_fs_node ab 083 * Actually, with the struct sos_fs_node above, we can reach any 084 * file in the system. However, dealing wit 084 * file in the system. However, dealing with mountpoints requires 085 * an intermediary data structure because a 085 * an intermediary data structure because a directory on a disk 086 * cannot make reference to children struct 086 * cannot make reference to children struct sos_fs_node on other 087 * disk. This is one of the reasons why the 087 * disk. This is one of the reasons why there is this struct 088 * sos_fs_nscache_node. Another reason is t 088 * sos_fs_nscache_node. Another reason is that we kind-of "cache" the 089 * most used struct sos_fs_node: those that 089 * most used struct sos_fs_node: those that lead from the global 090 * root ("/") to the files and directories 090 * root ("/") to the files and directories currently being used 091 * (hence the name "nscache" for "namespace 091 * (hence the name "nscache" for "namespace cache"). This speeds-up 092 * the path-resolving process (aka "lookup" 092 * the path-resolving process (aka "lookup"), as the most-used path 093 * are already in-memory and the struct sos 093 * are already in-memory and the struct sos_fs_node are already 094 * in-memory too. 094 * in-memory too. 095 * 095 * 096 * A struct sos_fs_nscache_node can have at 096 * A struct sos_fs_nscache_node can have at most 1 parent (the ".." 097 * entry). It can also have 0 parent in cas 097 * entry). It can also have 0 parent in case the node is being used 098 * by a process (file is opened or mapped), 098 * by a process (file is opened or mapped), but the file is 099 * actually "removed", ie un-reachable from 099 * actually "removed", ie un-reachable from any directory. 100 * 100 * 101 * Many such structures can reference the s 101 * Many such structures can reference the same underlying struct 102 * sos_fs_node, which enables the support o 102 * sos_fs_node, which enables the support of "hard links". 103 * 103 * 104 * - The "opened file" strucures. They store 104 * - The "opened file" strucures. They store the information 105 * pertaining to a particular usage of a fi 105 * pertaining to a particular usage of a file. The most important 106 * thing they store is the "file pointer", 106 * thing they store is the "file pointer", which holds the 107 * location in the file where the next read 107 * location in the file where the next read/write operation should 108 * start 108 * start 109 * 109 * 110 * Each process has at least 2 such opened 110 * Each process has at least 2 such opened files: its "current 111 * working directory" (RTFM chdir) and its 111 * working directory" (RTFM chdir) and its "process root" (RTFM 112 * chroot). Those are heritated across fork 112 * chroot). Those are heritated across fork() and can be changed by 113 * appropriate syscalls (resp. chdir/chroot 113 * appropriate syscalls (resp. chdir/chroot). The main "root" of 114 * the system is the process root of the "i 114 * the system is the process root of the "init" process. The usual 115 * opened files (think of open() and opendi 115 * opened files (think of open() and opendir()) are stored in the 116 * file descriptor array (fds[]). This is t 116 * file descriptor array (fds[]). This is the index in this array 117 * that is commonly called a "file descript 117 * that is commonly called a "file descriptor". 118 * 118 * 119 * 119 * 120 * The whole VFS layer comprises a series of o 120 * The whole VFS layer comprises a series of objects that can be 121 * specialized to implement different FS suppo 121 * specialized to implement different FS support (fat, ext2, ffs, ...): 122 * 122 * 123 * - The notion of "file system manager", whi 123 * - The notion of "file system manager", which basically is a 124 * container to a FS name (eg "FAT", "EXT2" 124 * container to a FS name (eg "FAT", "EXT2", etc...) and a series of 125 * functions responsible for initializing a 125 * functions responsible for initializing a particular "mounting" of 126 * a FS (the "mount" method). This is SOS's 126 * a FS (the "mount" method). This is SOS's struct sos_fs_manager_type 127 * 127 * 128 * - The notion of "file system instance" whi 128 * - The notion of "file system instance" which contains the data 129 * proper to a particular mounting of an FS 129 * proper to a particular mounting of an FS. Its most important job 130 * is to allocate new struct sos_fs_node on 130 * is to allocate new struct sos_fs_node on disk, or to retrieve the 131 * meta-information (ie struct sos_fs_node) 131 * meta-information (ie struct sos_fs_node) located at the given 132 * location on disk. This is roughly THE pr 132 * location on disk. This is roughly THE primary physical interface 133 * between the VFS and the disks. This is S 133 * between the VFS and the disks. This is SOS's struct 134 * sos_fs_manager_instance, aka the Linux's 134 * sos_fs_manager_instance, aka the Linux's superblock 135 * 135 * 136 * For each struct sos_fs_node that it allo 136 * For each struct sos_fs_node that it allocates, or that is loads 137 * from disk into memory, this "instance ma 137 * from disk into memory, this "instance manager" is responsible 138 * for inidicating the functions that imple 138 * for inidicating the functions that implement the FS-dedicated 139 * routine such as read/write/mmap/ioctl/.. 139 * routine such as read/write/mmap/ioctl/... for this precise node. 140 * 140 * 141 * The nodes (struct sos_fs_node) of a stru 141 * The nodes (struct sos_fs_node) of a struct 142 * sos_fs_manager_instance that are current 142 * sos_fs_manager_instance that are currently loaded in memory are 143 * stored in a hash-table. The key of this 143 * stored in a hash-table. The key of this map is the location of the 144 * meta-information on disk. That way, it i 144 * meta-information on disk. That way, it is very fast to look for 145 * the given meta-information whose locatio 145 * the given meta-information whose location on disk is knows: if 146 * it has already been loaded into memory, 146 * it has already been loaded into memory, its memory address is 147 * quickly resolved thanks to this hash tab 147 * quickly resolved thanks to this hash table. 148 */ 148 */ 149 149 150 #include <sos/types.h> 150 #include <sos/types.h> 151 #include <sos/errno.h> 151 #include <sos/errno.h> 152 #include <sos/hash.h> 152 #include <sos/hash.h> 153 #include <sos/umem_vmm.h> 153 #include <sos/umem_vmm.h> 154 154 155 /* Forward declarations (structures defined in 155 /* Forward declarations (structures defined in this file) */ 156 struct sos_fs_manager_type; 156 struct sos_fs_manager_type; 157 struct sos_fs_manager_instance; 157 struct sos_fs_manager_instance; 158 struct sos_fs_statfs; 158 struct sos_fs_statfs; 159 struct sos_fs_node; 159 struct sos_fs_node; 160 struct sos_fs_opened_file; 160 struct sos_fs_opened_file; 161 struct sos_fs_stat; 161 struct sos_fs_stat; 162 162 163 #include "fs_nscache.h" 163 #include "fs_nscache.h" >> 164 #include <sos/blkdev.h> 164 165 165 /** 166 /** 166 * The type of filesystem object. 167 * The type of filesystem object. 167 * 168 * 168 * Each struct sos_fs_node has a type. Here ar 169 * Each struct sos_fs_node has a type. Here are the supported types. 169 */ 170 */ 170 typedef enum { 171 typedef enum { 171 SOS_FS_NODE_REGULAR_FILE = 0x42, 172 SOS_FS_NODE_REGULAR_FILE = 0x42, 172 SOS_FS_NODE_DIRECTORY = 0x24, 173 SOS_FS_NODE_DIRECTORY = 0x24, 173 SOS_FS_NODE_SYMLINK = 0x84, 174 SOS_FS_NODE_SYMLINK = 0x84, 174 SOS_FS_NODE_DEVICE_CHAR = 0x48, 175 SOS_FS_NODE_DEVICE_CHAR = 0x48, >> 176 SOS_FS_NODE_DEVICE_BLOCK = 0x12 175 } sos_fs_node_type_t; 177 } sos_fs_node_type_t; 176 178 177 179 178 #define SOS_FS_MANAGER_NAME_MAXLEN 32 180 #define SOS_FS_MANAGER_NAME_MAXLEN 32 179 /** 181 /** 180 * Description of a supported Filesystem type. 182 * Description of a supported Filesystem type. 181 * 183 * 182 * These descriptions are listed in an interna 184 * These descriptions are listed in an internal list (see 183 * fs.c:fs_list), and each time we want to mou 185 * fs.c:fs_list), and each time we want to mount a FS, we precise a 184 * name (eg "FAT", "EXT2", ...). The VFS will 186 * name (eg "FAT", "EXT2", ...). The VFS will look for this name into 185 * the list of supported filesystem types, and 187 * the list of supported filesystem types, and, when found, call its 186 * sos_fs_manager_type::mount() method. 188 * sos_fs_manager_type::mount() method. 187 * 189 * 188 * New filesystem types are registered using s 190 * New filesystem types are registered using sos_fs_register_fs_type() 189 */ 191 */ 190 struct sos_fs_manager_type 192 struct sos_fs_manager_type 191 { 193 { 192 char name[SOS_FS_MANAGER_NAME_MAXLEN]; 194 char name[SOS_FS_MANAGER_NAME_MAXLEN]; 193 195 194 /** 196 /** 195 * Responsible for making sure the underlyin 197 * Responsible for making sure the underlying device (if any) really 196 * stores the correct filesystem format, for 198 * stores the correct filesystem format, for creating the hash of fs 197 * nodes and for calling sos_fs_register_fs_ 199 * nodes and for calling sos_fs_register_fs_instance 198 * 200 * 199 * @param device May be NULL 201 * @param device May be NULL 200 * 202 * 201 * @note mandatory, may block 203 * @note mandatory, may block 202 */ 204 */ 203 sos_ret_t (*mount)(struct sos_fs_manager_typ 205 sos_ret_t (*mount)(struct sos_fs_manager_type * this, 204 struct sos_fs_node * devi 206 struct sos_fs_node * device, 205 const char * args, 207 const char * args, 206 struct sos_fs_manager_ins 208 struct sos_fs_manager_instance ** mounted_fs); 207 209 208 /** 210 /** 209 * Responsible for de-allocating the hash of 211 * Responsible for de-allocating the hash of fs nodes and for 210 * calling sos_fs_unregister_fs_instance 212 * calling sos_fs_unregister_fs_instance 211 * 213 * 212 * @note mandatory, may block 214 * @note mandatory, may block 213 */ 215 */ 214 sos_ret_t (*umount)(struct sos_fs_manager_ty 216 sos_ret_t (*umount)(struct sos_fs_manager_type * this, 215 struct sos_fs_manager_in 217 struct sos_fs_manager_instance * mounted_fs); 216 218 217 /** Free of use */ 219 /** Free of use */ 218 void * custom_data; 220 void * custom_data; 219 221 220 /** List of filesystem instances of this typ 222 /** List of filesystem instances of this type currently mounted 221 somewhere in the system */ 223 somewhere in the system */ 222 struct sos_fs_manager_instance * instances; 224 struct sos_fs_manager_instance * instances; 223 225 224 /** Linkage for the list of filesystem types 226 /** Linkage for the list of filesystem types registered in the 225 system */ 227 system */ 226 struct sos_fs_manager_type *prev, *next; 228 struct sos_fs_manager_type *prev, *next; 227 }; 229 }; 228 230 229 231 230 /** 232 /** 231 * Data related to a particular "mounting" of 233 * Data related to a particular "mounting" of a file system. A 232 * so-called "superblock" under Linux 234 * so-called "superblock" under Linux 233 * 235 * 234 * This holds the FUNDAMENTAL functions respon 236 * This holds the FUNDAMENTAL functions responsible for loading struct 235 * sos_fs_node from disk, or for allocating th 237 * sos_fs_node from disk, or for allocating thom on disk. It also 236 * holds the hash-table of struct sos_fs_node 238 * holds the hash-table of struct sos_fs_node already loaded into 237 * memory. 239 * memory. 238 */ 240 */ 239 struct sos_fs_manager_instance 241 struct sos_fs_manager_instance 240 { 242 { 241 /** 243 /** 242 * @note Publicly readable. Written only by 244 * @note Publicly readable. Written only by sos_fs_manager_type::mount() 243 */ 245 */ 244 struct sos_fs_manager_type * fs_type; 246 struct sos_fs_manager_type * fs_type; 245 247 246 /** 248 /** 247 * Usually, a filesystem relies on a device 249 * Usually, a filesystem relies on a device (disk, network, ram, 248 * ...) to fetch its data. This is the locat 250 * ...) to fetch its data. This is the location of the device. 249 * 251 * 250 * @note Publicly readable. Written only by 252 * @note Publicly readable. Written only by fs.c 251 */ 253 */ 252 struct sos_fs_node * device; 254 struct sos_fs_node * device; 253 255 254 #define SOS_FS_MOUNT_SYNC (1 << 0) 256 #define SOS_FS_MOUNT_SYNC (1 << 0) 255 #define SOS_FS_MOUNT_READONLY (1 << 1) 257 #define SOS_FS_MOUNT_READONLY (1 << 1) 256 #define SOS_FS_MOUNT_NOEXEC (1 << 2) 258 #define SOS_FS_MOUNT_NOEXEC (1 << 2) 257 /** 259 /** 258 * Is this FS read-only, without EXEC file p 260 * Is this FS read-only, without EXEC file permission, write-through 259 * ? Or-red combination of the SOS_FS_MOUNT_ 261 * ? Or-red combination of the SOS_FS_MOUNT_ flags 260 * 262 * 261 * @note Publicly readable. Written only by 263 * @note Publicly readable. Written only by fs.c 262 */ 264 */ 263 sos_ui32_t flags; 265 sos_ui32_t flags; 264 266 265 /** 267 /** 266 * The namespace node that is the root of TH 268 * The namespace node that is the root of THIS file system mounting 267 * 269 * 268 * @note Publicly readable. Written only by 270 * @note Publicly readable. Written only by fs.c 269 */ 271 */ 270 struct sos_fs_nscache_node * root; 272 struct sos_fs_nscache_node * root; 271 273 272 /** 274 /** 273 * List of dirty nodes. These are the nodes 275 * List of dirty nodes. These are the nodes that need to be written 274 * back to disk. With FS supporting deferred 276 * back to disk. With FS supporting deferred-writes, the 275 * sos_fs_sync() function will use this list 277 * sos_fs_sync() function will use this list to flush the dirty 276 * nodes back to disk. 278 * nodes back to disk. 277 * 279 * 278 * @note Reserved to fs.c 280 * @note Reserved to fs.c 279 */ 281 */ 280 struct sos_fs_node * dirty_nodes; 282 struct sos_fs_node * dirty_nodes; 281 283 282 /** 284 /** 283 * Build a fresh new FS node at the given lo 285 * Build a fresh new FS node at the given location. This implies 284 * the allocation of a new sos_fs_node struc 286 * the allocation of a new sos_fs_node structure in memory 285 * 287 * 286 * @note Mandatory, may block. Appropriate l 288 * @note Mandatory, may block. Appropriate locking MUST be implemented 287 */ 289 */ 288 sos_ret_t (*fetch_node_from_disk)(struct sos 290 sos_ret_t (*fetch_node_from_disk)(struct sos_fs_manager_instance * this, 289 sos_ui64_t 291 sos_ui64_t storage_location, 290 struct sos 292 struct sos_fs_node ** result); 291 293 292 /** 294 /** 293 * Build a fresh new FS node ON THE DISK of 295 * Build a fresh new FS node ON THE DISK of the given type (dir, 294 * plain file, symlink, ...), completely emp 296 * plain file, symlink, ...), completely empty ; return a newly 295 * allocated IN-MEMORY node structure repres 297 * allocated IN-MEMORY node structure representing it 296 * 298 * 297 * @param open_creat_flags is the open_flags 299 * @param open_creat_flags is the open_flags parameter passed to 298 * sos_fs_open() when O_CREAT is set. 0 when 300 * sos_fs_open() when O_CREAT is set. 0 when allocated trough 299 * creat/mkdir/mknod/symlink 301 * creat/mkdir/mknod/symlink 300 * 302 * 301 * @note Mandatory, may block. Appropriate l 303 * @note Mandatory, may block. Appropriate locking MUST be implemented 302 */ 304 */ 303 sos_ret_t (*allocate_new_node)(struct sos_fs 305 sos_ret_t (*allocate_new_node)(struct sos_fs_manager_instance * this, 304 sos_fs_node_t 306 sos_fs_node_type_t type, 305 const struct 307 const struct sos_process * creator, 306 sos_ui32_t ac 308 sos_ui32_t access_rights, 307 sos_ui32_t op 309 sos_ui32_t open_creat_flags, 308 struct sos_fs 310 struct sos_fs_node ** result); 309 311 310 /** 312 /** 311 * Return filesystem status (RTFM df) 313 * Return filesystem status (RTFM df) 312 * 314 * 313 * @note Optional, may block. Appropriate lo 315 * @note Optional, may block. Appropriate locking MUST be implemented 314 */ 316 */ 315 sos_ret_t (*statfs)(struct sos_fs_manager_in 317 sos_ret_t (*statfs)(struct sos_fs_manager_instance * this, 316 struct sos_fs_statfs * r 318 struct sos_fs_statfs * result); 317 319 318 /** 320 /** 319 * Comparison callback called when looking f 321 * Comparison callback called when looking for file/dirs in the 320 * namespace cache. Normally, a usual lexico 322 * namespace cache. Normally, a usual lexicographical comparison is 321 * done (when this function points to NULL). 323 * done (when this function points to NULL). But for some FS, it 322 * might be useful to use another comparison 324 * might be useful to use another comparison function (eg for 323 * case-insensitive FS) 325 * case-insensitive FS) 324 * 326 * 325 * @note Optional (may be NULL), must NOT bl 327 * @note Optional (may be NULL), must NOT block 326 */ 328 */ 327 sos_bool_t (*nsnode_same_name)(const char * 329 sos_bool_t (*nsnode_same_name)(const char * name1, sos_ui16_t namelen1, 328 const char * 330 const char * name2, sos_ui16_t namelen2); 329 331 330 /** 332 /** 331 * Hash table of the struct sos_fs_node of t 333 * Hash table of the struct sos_fs_node of this filesystem instance 332 * loaded in memory: key=storage_location, e 334 * loaded in memory: key=storage_location, element=sos_fs_node 333 */ 335 */ 334 struct sos_hash_table * nodecache; 336 struct sos_hash_table * nodecache; 335 337 336 /** 338 /** 337 * Unique identifier of this FS (used in syn 339 * Unique identifier of this FS (used in sync method, updated by 338 * fs.c). This enables sync_all_fs to be res 340 * fs.c). This enables sync_all_fs to be resilient to mount/umount 339 * and (un)register_fs_type/instance 341 * and (un)register_fs_type/instance 340 */ 342 */ 341 sos_ui64_t uid; 343 sos_ui64_t uid; 342 344 343 void * custom_data; 345 void * custom_data; 344 346 345 /** Linkage for the list of instances for th 347 /** Linkage for the list of instances for the underlying fs type */ 346 struct sos_fs_manager_instance * prev, * nex 348 struct sos_fs_manager_instance * prev, * next; 347 }; 349 }; 348 350 349 351 350 /** 352 /** 351 * The CENTRAL data structure of the whole thi 353 * The CENTRAL data structure of the whole thing. A so-called "inode" 352 * 354 * 353 * This represents the meta-information relate 355 * This represents the meta-information related to a file on disk: its 354 * permission, where its data is located. Actu 356 * permission, where its data is located. Actually, in SOS, these 355 * information are not stored in this structur 357 * information are not stored in this structure. Instead, we define a 356 * series of methods in this structure that MU 358 * series of methods in this structure that MUST be implemented by the 357 * FS and that realize the higher level operat 359 * FS and that realize the higher level operations needed by the 358 * OS. These operations will rely on the meta- 360 * OS. These operations will rely on the meta-information that the FS 359 * code MUST define and manage by itself (henc 361 * code MUST define and manage by itself (hence the 360 * sos_fs_node::custom_data field). 362 * sos_fs_node::custom_data field). 361 */ 363 */ 362 struct sos_fs_node 364 struct sos_fs_node 363 { 365 { 364 /** 366 /** 365 * An struct sos_fs_node always belong to ex 367 * An struct sos_fs_node always belong to exactly ONE file system 366 */ 368 */ 367 struct sos_fs_manager_instance * fs; 369 struct sos_fs_manager_instance * fs; 368 370 369 /** 371 /** 370 * The so-called "inode": location of this n 372 * The so-called "inode": location of this node inside the FS 371 * instance. Updated by struct 373 * instance. Updated by struct 372 * sos_fs_manager_instance::fetch_node_from_ 374 * sos_fs_manager_instance::fetch_node_from_disk() 373 */ 375 */ 374 sos_ui64_t storage_location; 376 sos_ui64_t storage_location; 375 377 376 /** 378 /** 377 * Number of ON-DISK links to this node. 379 * Number of ON-DISK links to this node. 378 * 380 * 379 * - For everything but directories: the num 381 * - For everything but directories: the number of hard links to the file 380 * - For directories: 1 + the number of chil 382 * - For directories: 1 + the number of children nodes 381 * 383 * 382 * @note Publicly readable. Written only by 384 * @note Publicly readable. Written only by 383 * sos_fs_node_ops_dir::link() and sos_fs_no 385 * sos_fs_node_ops_dir::link() and sos_fs_node_ops_dir::unlink() 384 */ 386 */ 385 sos_count_t ondisk_lnk_cnt; 387 sos_count_t ondisk_lnk_cnt; 386 388 387 /** 389 /** 388 * Number of IN-MEMORY nscache_nodes referen 390 * Number of IN-MEMORY nscache_nodes referencing this FS node. 389 * 391 * 390 * Corresponds to the number of struct sos_f 392 * Corresponds to the number of struct sos_fs_nscache_node pointing 391 * to this node. This could be as much as on 393 * to this node. This could be as much as ondisk_lnk_cnt + 1, but is 392 * usually less 394 * usually less 393 * 395 * 394 * @note Reserved to fs.c 396 * @note Reserved to fs.c 395 */ 397 */ 396 sos_count_t inmem_ref_cnt; 398 sos_count_t inmem_ref_cnt; 397 399 398 /** 400 /** 399 * Directory, symlink, ... 401 * Directory, symlink, ... 400 * 402 * 401 * @see sos_fs_node_type_t 403 * @see sos_fs_node_type_t 402 * 404 * 403 * @note Publicly readable. Written only by 405 * @note Publicly readable. Written only by fs.c 404 */ 406 */ 405 sos_fs_node_type_t type; 407 sos_fs_node_type_t type; 406 408 407 #define SOS_FS_READABLE 00400 409 #define SOS_FS_READABLE 00400 408 #define SOS_FS_WRITABLE 00200 410 #define SOS_FS_WRITABLE 00200 409 #define SOS_FS_EXECUTABLE 00100 411 #define SOS_FS_EXECUTABLE 00100 410 /** 412 /** 411 * read/write, ... @see the SOS_FS_*ABLE fla 413 * read/write, ... @see the SOS_FS_*ABLE flags 412 * @note Publicly readable. Written only by 414 * @note Publicly readable. Written only by fs.c 413 */ 415 */ 414 sos_ui32_t access_rights; 416 sos_ui32_t access_rights; 415 417 416 /** 418 /** 417 * @note Reserved to fs.c 419 * @note Reserved to fs.c 418 */ 420 */ 419 sos_bool_t dirty; 421 sos_bool_t dirty; 420 422 421 /** 423 /** 422 * Incremented each time one of the opened f 424 * Incremented each time one of the opened files for this node is 423 * modified 425 * modified 424 * @note Publicly readable. Written only by 426 * @note Publicly readable. Written only by fs.c 425 */ 427 */ 426 sos_lcount_t generation; 428 sos_lcount_t generation; 427 429 428 /** 430 /** 429 * @note Available only for device files (ch 431 * @note Available only for device files (char/block) 430 * @note Publicly readable. Written only by 432 * @note Publicly readable. Written only by 431 * sos_fs_manager_instance::fetch_node_from_ 433 * sos_fs_manager_instance::fetch_node_from_disk() and mknod() 432 */ 434 */ 433 struct sos_fs_dev_id_t 435 struct sos_fs_dev_id_t 434 { 436 { 435 sos_ui32_t device_class; /**< aka "majo 437 sos_ui32_t device_class; /**< aka "major" */ 436 sos_ui32_t device_instance; /**< aka "mino 438 sos_ui32_t device_instance; /**< aka "minor" */ 437 } dev_id; 439 } dev_id; 438 440 439 /** Operations common to all node types */ 441 /** Operations common to all node types */ 440 struct sos_fs_node_ops_file *ops_file; 442 struct sos_fs_node_ops_file *ops_file; 441 443 442 /** Operations specific to some node types * 444 /** Operations specific to some node types */ 443 union 445 union 444 { 446 { 445 /** when type == SOS_FS_NODE_DIRECTORY */ 447 /** when type == SOS_FS_NODE_DIRECTORY */ 446 struct sos_fs_node_ops_dir *ops_dir; 448 struct sos_fs_node_ops_dir *ops_dir; 447 449 >> 450 /** >> 451 * when type == SOS_FS_NODE_DEVICE_BLOCK >> 452 * The FS node has a link to some data pertaining to the device, >> 453 * not to any special operations >> 454 * @see blkdev.c for a definition of this structure >> 455 */ >> 456 struct sos_blockdev_instance *block_device; >> 457 448 /** when type == SOS_FS_NODE_SYMLINK */ 458 /** when type == SOS_FS_NODE_SYMLINK */ 449 struct sos_fs_node_ops_symlink *ops_symli 459 struct sos_fs_node_ops_symlink *ops_symlink; 450 }; /* Anonymous union (gcc extension) */ 460 }; /* Anonymous union (gcc extension) */ 451 461 452 462 453 /** 463 /** 454 * Flush any change to disk << 455 * << 456 * @note Mandatory, may block. Appropriate l << 457 */ << 458 sos_ret_t (*sync)(struct sos_fs_node *this); << 459 << 460 << 461 /** << 462 * Simply free this FS node from the kernel 464 * Simply free this FS node from the kernel memory: it does NOT 463 * mean that the corresponding on-disk node 465 * mean that the corresponding on-disk node is free ! Actually, the 464 * corresponding ON-DISK node is free iff on 466 * corresponding ON-DISK node is free iff ondisk_lnk_cnt == 0. No 465 * need to sync anything to disk, as the VFS 467 * need to sync anything to disk, as the VFS will sync the node 466 * before calling this method 468 * before calling this method 467 * 469 * 468 * @note Mandatory, may block, no special lo 470 * @note Mandatory, may block, no special locking needed 469 */ 471 */ 470 sos_ret_t (*destructor)(struct sos_fs_node * 472 sos_ret_t (*destructor)(struct sos_fs_node * this); 471 473 472 /** 474 /** 473 * Called when a process opens the node 475 * Called when a process opens the node 474 * 476 * 475 * @note Mandatory, may block. Appropriate l 477 * @note Mandatory, may block. Appropriate locking MUST be implemented 476 * @note FS-specific EXCPET for device speci 478 * @note FS-specific EXCPET for device special files (char & 477 * block) because they are handled in an uni 479 * block) because they are handled in an uniform way by the 478 * chardev/blockdev subsystems 480 * chardev/blockdev subsystems 479 * @note As a consequence, FS code can safel 481 * @note As a consequence, FS code can safely assume that "this" is 480 * never a character or block device 482 * never a character or block device 481 */ 483 */ 482 sos_ret_t (*new_opened_file)(struct sos_fs_n 484 sos_ret_t (*new_opened_file)(struct sos_fs_node * this, 483 const struct so 485 const struct sos_process * owner, 484 sos_ui32_t open 486 sos_ui32_t open_flags, 485 struct sos_fs_o 487 struct sos_fs_opened_file ** result_of); 486 488 487 /** 489 /** 488 * Called when a process opens the node 490 * Called when a process opens the node 489 * 491 * 490 * @note Mandatory, may block. Appropriate l 492 * @note Mandatory, may block. Appropriate locking MUST be implemented 491 * @note FS-specific EXCEPT for device speci 493 * @note FS-specific EXCEPT for device special files (char & 492 * block) because they are handled in an uni 494 * block) because they are handled in an uniform way by the 493 * chardev/blockdev subsystems 495 * chardev/blockdev subsystems 494 * @note As a consequence, FS code can safel 496 * @note As a consequence, FS code can safely assume that "this" is 495 * never a character or block device 497 * never a character or block device 496 */ 498 */ 497 sos_ret_t (*close_opened_file)(struct sos_fs 499 sos_ret_t (*close_opened_file)(struct sos_fs_node * this, 498 struct sos_fs 500 struct sos_fs_opened_file * of); 499 501 500 /** 502 /** 501 * This should hold the meta information for 503 * This should hold the meta information for this node as needed by 502 * the FS instance. 504 * the FS instance. 503 */ 505 */ 504 void * custom_data; 506 void * custom_data; 505 507 506 /** Hash linkage entry for this FS node in t 508 /** Hash linkage entry for this FS node in the nodecache 507 dictionary */ 509 dictionary */ 508 struct sos_hash_linkage hlink_nodecache; 510 struct sos_hash_linkage hlink_nodecache; 509 511 510 /** Linkage to list the dirty nodes of the g 512 /** Linkage to list the dirty nodes of the given FS */ 511 struct sos_fs_node *prev_dirty, *next_dirty; 513 struct sos_fs_node *prev_dirty, *next_dirty; 512 }; 514 }; 513 515 514 516 515 517 516 /** 518 /** 517 * The list of methods implementing the basic 519 * The list of methods implementing the basic VFS operations on the 518 * given struct sos_fs_node 520 * given struct sos_fs_node 519 * 521 * 520 * @see sos_fs_node::ops_file 522 * @see sos_fs_node::ops_file 521 */ 523 */ 522 struct sos_fs_node_ops_file 524 struct sos_fs_node_ops_file 523 { 525 { 524 /** 526 /** 525 * Change size of file 527 * Change size of file 526 * 528 * 527 * @note Optional, may block. Appropriate lo 529 * @note Optional, may block. Appropriate locking MUST be implemented 528 */ 530 */ 529 sos_ret_t (*truncate)(struct sos_fs_node *th 531 sos_ret_t (*truncate)(struct sos_fs_node *this, 530 sos_lsoffset_t length) 532 sos_lsoffset_t length); 531 533 532 /** 534 /** 533 * Retrieve the status (eg size) of the file 535 * Retrieve the status (eg size) of the file 534 * 536 * 535 * @note Mandatory, may block. Appropriate l 537 * @note Mandatory, may block. Appropriate locking MUST be implemented 536 */ 538 */ 537 sos_ret_t (*stat)(struct sos_fs_node * this, 539 sos_ret_t (*stat)(struct sos_fs_node * this, 538 struct sos_fs_stat * resul 540 struct sos_fs_stat * result); 539 541 540 /** 542 /** 541 * Change the sos_fs_node::access_rights att 543 * Change the sos_fs_node::access_rights attribute 542 * 544 * 543 * @note Mandatory, may block. Appropriate l 545 * @note Mandatory, may block. Appropriate locking MUST be implemented 544 */ 546 */ 545 sos_ret_t (*chmod)(struct sos_fs_node * this 547 sos_ret_t (*chmod)(struct sos_fs_node * this, 546 sos_ui32_t new_access_rig 548 sos_ui32_t new_access_rights); >> 549 >> 550 >> 551 /** >> 552 * Flush any change to the node back to the file system backing store >> 553 * >> 554 * @note Mandatory, may block. Appropriate locking MUST be implemented >> 555 */ >> 556 sos_ret_t (*sync)(struct sos_fs_node *this); 547 }; 557 }; 548 558 549 559 550 /** 560 /** 551 * The list of methods implementing the basic 561 * The list of methods implementing the basic VFS symlink operations 552 * 562 * 553 * @see sos_fs_node::ops_symlink 563 * @see sos_fs_node::ops_symlink 554 */ 564 */ 555 struct sos_fs_node_ops_symlink 565 struct sos_fs_node_ops_symlink 556 { 566 { 557 /** 567 /** 558 * Used by the _kernel_ to resolve the symli 568 * Used by the _kernel_ to resolve the symlinks. To change/create a 559 * symlink target, it is needed only from us 569 * symlink target, it is needed only from userland: the read/write 560 * methods are made for this 570 * methods are made for this 561 * 571 * 562 * @param target Pointer to the string repre 572 * @param target Pointer to the string representing the target's 563 * path, allocated for the fs_node's lifetim 573 * path, allocated for the fs_node's lifetime ! 564 * 574 * 565 * @note Mandatory, may block. Appropriate l 575 * @note Mandatory, may block. Appropriate locking MUST be implemented 566 */ 576 */ 567 sos_ret_t (*expand)(struct sos_fs_node *this 577 sos_ret_t (*expand)(struct sos_fs_node *this, 568 char const ** target, 578 char const ** target, 569 sos_size_t * target_len) 579 sos_size_t * target_len); 570 }; 580 }; 571 581 572 582 573 /** 583 /** 574 * The list of methods implementing the basic 584 * The list of methods implementing the basic VFS directory operations 575 * 585 * 576 * @see sos_fs_node::ops_dir 586 * @see sos_fs_node::ops_dir 577 */ 587 */ 578 struct sos_fs_node_ops_dir 588 struct sos_fs_node_ops_dir 579 { 589 { 580 /** 590 /** 581 * Look for the on-disk location of the sos_ 591 * Look for the on-disk location of the sos_fs_node having the given 582 * name 592 * name 583 * 593 * 584 * @note Mandatory, may block. Appropriate l 594 * @note Mandatory, may block. Appropriate locking MUST be implemented 585 */ 595 */ 586 sos_ret_t (*lookup)(struct sos_fs_node *this 596 sos_ret_t (*lookup)(struct sos_fs_node *this, 587 const char * name, sos_u 597 const char * name, sos_ui16_t namelen, 588 sos_ui64_t * result_stor 598 sos_ui64_t * result_storage_location); 589 599 590 /** 600 /** 591 * Add a new reference in the current sos_fs 601 * Add a new reference in the current sos_fs_node to the on-disk 592 * location of the given sos_fs_node 602 * location of the given sos_fs_node 593 * 603 * 594 * @note Responsible for updating this->ondi 604 * @note Responsible for updating this->ondisk_lnk_cnt 595 * @note Mandatory for writable directories, 605 * @note Mandatory for writable directories, may block. Appropriate 596 * locking MUST be implemented 606 * locking MUST be implemented 597 */ 607 */ 598 sos_ret_t (*link)(struct sos_fs_node *this, 608 sos_ret_t (*link)(struct sos_fs_node *this, 599 const struct sos_process * 609 const struct sos_process *actor, 600 const char * entry_name, s 610 const char * entry_name, sos_ui16_t entry_namelen, 601 struct sos_fs_node * node) 611 struct sos_fs_node * node); 602 612 603 /** 613 /** 604 * Remove the entry in the current sos_fs_no 614 * Remove the entry in the current sos_fs_node for the on-disk 605 * location with the given name 615 * location with the given name 606 * 616 * 607 * @note Responsible for updating this->ondi 617 * @note Responsible for updating this->ondisk_lnk_cnt 608 * @note Mandatory for writable directories, 618 * @note Mandatory for writable directories, may block. Appropriate 609 * locking MUST be implemented 619 * locking MUST be implemented 610 */ 620 */ 611 sos_ret_t (*unlink)(struct sos_fs_node *this 621 sos_ret_t (*unlink)(struct sos_fs_node *this, 612 const struct sos_process 622 const struct sos_process *actor, 613 const char * entry_name, 623 const char * entry_name, sos_ui16_t entry_namelen); 614 }; 624 }; 615 625 616 626 617 /** 627 /** 618 * The data structure holding information and 628 * The data structure holding information and method related to a 619 * particular usage of a file. A so-called "st 629 * particular usage of a file. A so-called "struct file" 620 * 630 * 621 * This represents the kernel structure behind 631 * This represents the kernel structure behind a "file descriptor" or 622 * behind a chdir/chroot. Among other things, 632 * behind a chdir/chroot. Among other things, it holds the methods 623 * responsible for reading/writing into the fi 633 * responsible for reading/writing into the file, and for moving the 624 * file pointer (see @sos_fs_opened_file::posi 634 * file pointer (see @sos_fs_opened_file::position) inside it. 625 */ 635 */ 626 struct sos_fs_opened_file 636 struct sos_fs_opened_file 627 { 637 { 628 /** The process that opened the file/dir */ 638 /** The process that opened the file/dir */ 629 const struct sos_process * owner; 639 const struct sos_process * owner; 630 640 631 /** 641 /** 632 * The reference to the sos_fs_nscache_node 642 * The reference to the sos_fs_nscache_node and, hence, to the underlying sos_fs_node. 633 * 643 * 634 * Used to cache the in-memory fs nodes 644 * Used to cache the in-memory fs nodes 635 */ 645 */ 636 struct sos_fs_nscache_node * direntry; 646 struct sos_fs_nscache_node * direntry; 637 647 638 /** Use for memory-management */ 648 /** Use for memory-management */ 639 sos_count_t ref_cnt; 649 sos_count_t ref_cnt; 640 650 641 /** 651 /** 642 * Always > 0 (ie max size = 2^63-1 = 9.2 10 652 * Always > 0 (ie max size = 2^63-1 = 9.2 10^18). We make it 643 * "signed" here to limit its range. Because 653 * "signed" here to limit its range. Because we must be able to 644 * seek to the begining of the file with SEE 654 * seek to the begining of the file with SEEK_END and a negative 645 * offset, so the max size of the file must 655 * offset, so the max size of the file must be reachable by a lseek 646 * offset 656 * offset 647 * 657 * 648 * @note reserved to filesystem instance cod 658 * @note reserved to filesystem instance code. Not modified nor used 649 * by fs.c 659 * by fs.c 650 */ 660 */ 651 sos_lsoffset_t position; 661 sos_lsoffset_t position; 652 662 653 /** 663 /** 654 * Incremented each time this opened file is 664 * Incremented each time this opened file is modified 655 * 665 * 656 * Used to implement a readdir method resili 666 * Used to implement a readdir method resilient to 657 * creat/mkdir/rmdir/unlink 667 * creat/mkdir/rmdir/unlink 658 */ 668 */ 659 sos_lcount_t generation; 669 sos_lcount_t generation; 660 670 661 /** 671 /** 662 * @see SOS_FS_OPEN_* flags 672 * @see SOS_FS_OPEN_* flags 663 */ 673 */ 664 sos_ui32_t open_flags; 674 sos_ui32_t open_flags; 665 675 666 /** Operations common to all node types */ 676 /** Operations common to all node types */ 667 struct sos_fs_ops_opened_file * ops_file; 677 struct sos_fs_ops_opened_file * ops_file; 668 678 669 /** Operations specific to some node types * 679 /** Operations specific to some node types */ 670 union 680 union 671 { 681 { 672 /** when direntry->fs_node->type == SOS_FS 682 /** when direntry->fs_node->type == SOS_FS_NODE_DIRECTORY */ 673 struct sos_fs_ops_opened_dir * ops_di 683 struct sos_fs_ops_opened_dir * ops_dir; 674 684 675 /** when direntry->fs_node->type == SOS_FS 685 /** when direntry->fs_node->type == SOS_FS_NODE_DEVICE_CHAR */ 676 struct sos_fs_ops_opened_chardev * ops_ch 686 struct sos_fs_ops_opened_chardev * ops_chardev; >> 687 >> 688 /** when direntry->fs_node->type == SOS_FS_NODE_DEVICE_BLOCK */ >> 689 struct sos_fs_ops_opened_blockdev * ops_blockdev; 677 }; /* Anonymous union (gcc extension) */ 690 }; /* Anonymous union (gcc extension) */ 678 691 679 /** 692 /** 680 * Called upon fork() to duplicate all the o 693 * Called upon fork() to duplicate all the opened files 681 * 694 * 682 * @note FS-specific EXCEPT for device speci 695 * @note FS-specific EXCEPT for device special files (char & 683 * block) because they are handled in an uni 696 * block) because they are handled in an uniform way by the 684 * chardev/blockdev subsystems 697 * chardev/blockdev subsystems 685 * @note As a consequence, FS code can safel 698 * @note As a consequence, FS code can safely assume that "this" is 686 * never a character or block device 699 * never a character or block device 687 */ 700 */ 688 sos_ret_t (*duplicate)(struct sos_fs_opened_ 701 sos_ret_t (*duplicate)(struct sos_fs_opened_file *this, 689 const struct sos_proc 702 const struct sos_process * for_owner, 690 struct sos_fs_opened_ 703 struct sos_fs_opened_file **result); 691 704 692 void * custom_data; 705 void * custom_data; 693 }; 706 }; 694 707 695 708 696 /** 709 /** 697 * Reference position for sos_fs_seek 710 * Reference position for sos_fs_seek 698 */ 711 */ 699 typedef enum { SOS_SEEK_SET=42, 712 typedef enum { SOS_SEEK_SET=42, 700 SOS_SEEK_CUR=24, 713 SOS_SEEK_CUR=24, 701 SOS_SEEK_END=84 } sos_seek_when 714 SOS_SEEK_END=84 } sos_seek_whence_t; 702 /** 715 /** 703 * The list of methods implementing the basic 716 * The list of methods implementing the basic VFS opened file 704 * operations 717 * operations 705 * 718 * 706 * See the Unix manual pages, they basically f 719 * See the Unix manual pages, they basically form the interfaces to to 707 * these functions 720 * these functions 708 * 721 * 709 * @see sos_fs_opened_file::ops_file 722 * @see sos_fs_opened_file::ops_file 710 */ 723 */ 711 struct sos_fs_ops_opened_file 724 struct sos_fs_ops_opened_file 712 { 725 { 713 /** 726 /** 714 * @note Mandatory, may block. Appropriate l 727 * @note Mandatory, may block. Appropriate locking MUST be implemented 715 * @note Please call sos_fs_mark_dirty() if 728 * @note Please call sos_fs_mark_dirty() if disk contents is changed 716 */ 729 */ 717 sos_ret_t (*seek)(struct sos_fs_opened_file 730 sos_ret_t (*seek)(struct sos_fs_opened_file *this, 718 sos_lsoffset_t offset, 731 sos_lsoffset_t offset, 719 sos_seek_whence_t whence, 732 sos_seek_whence_t whence, 720 /* out */ sos_lsoffset_t * 733 /* out */ sos_lsoffset_t * result_position); 721 734 722 /** 735 /** 723 * @note Mandatory, may block. Appropriate l 736 * @note Mandatory, may block. Appropriate locking MUST be implemented 724 * @note Please call sos_fs_mark_dirty() if 737 * @note Please call sos_fs_mark_dirty() if disk contents is changed 725 */ 738 */ 726 sos_ret_t (*read)(struct sos_fs_opened_file 739 sos_ret_t (*read)(struct sos_fs_opened_file *this, 727 sos_uaddr_t dest_buf, 740 sos_uaddr_t dest_buf, 728 sos_size_t * /* in/out */l 741 sos_size_t * /* in/out */len); 729 742 730 /** 743 /** 731 * @note Optional (might be NULL), may block 744 * @note Optional (might be NULL), may block. Appropriate locking 732 * MUST be implemented 745 * MUST be implemented 733 * @note Please call sos_fs_mark_dirty() if 746 * @note Please call sos_fs_mark_dirty() if disk contents is changed 734 */ 747 */ 735 sos_ret_t (*write)(struct sos_fs_opened_file 748 sos_ret_t (*write)(struct sos_fs_opened_file *this, 736 sos_uaddr_t src_buf, 749 sos_uaddr_t src_buf, 737 sos_size_t * /* in/out */ 750 sos_size_t * /* in/out */len); 738 751 739 /** 752 /** 740 * @note Optional (might be NULL), may block 753 * @note Optional (might be NULL), may block. Appropriate locking 741 * MUST be implemented 754 * MUST be implemented 742 * @note Please call sos_fs_mark_dirty() if 755 * @note Please call sos_fs_mark_dirty() if disk contents is changed 743 */ 756 */ 744 sos_ret_t (*mmap)(struct sos_fs_opened_file 757 sos_ret_t (*mmap)(struct sos_fs_opened_file *this, 745 sos_uaddr_t *uaddr, sos_si 758 sos_uaddr_t *uaddr, sos_size_t size, 746 sos_ui32_t access_rights, 759 sos_ui32_t access_rights, 747 sos_ui32_t flags, 760 sos_ui32_t flags, 748 sos_luoffset_t offset); 761 sos_luoffset_t offset); 749 762 750 /** 763 /** 751 * @note Optional (might be NULL), may block 764 * @note Optional (might be NULL), may block. Appropriate locking 752 * MUST be implemented 765 * MUST be implemented 753 * @note Please call sos_fs_mark_dirty() if 766 * @note Please call sos_fs_mark_dirty() if disk contents is changed 754 */ 767 */ 755 sos_ret_t (*fcntl)(struct sos_fs_opened_file 768 sos_ret_t (*fcntl)(struct sos_fs_opened_file *this, 756 int req_id, 769 int req_id, 757 sos_ui32_t req_arg /* Usu 770 sos_ui32_t req_arg /* Usually: sos_uaddr_t */); 758 }; 771 }; 759 772 760 773 761 /** 774 /** 762 * The list of methods implementing the basic 775 * The list of methods implementing the basic VFS opened character device 763 * operations 776 * operations 764 * 777 * 765 * @see sos_fs_opened_file::ops_file 778 * @see sos_fs_opened_file::ops_file 766 */ 779 */ 767 struct sos_fs_ops_opened_chardev 780 struct sos_fs_ops_opened_chardev 768 { 781 { 769 /** 782 /** 770 * @note Optional (might be NULL), may block 783 * @note Optional (might be NULL), may block. Appropriate locking 771 * MUST be implemented 784 * MUST be implemented 772 * @note Please call sos_fs_mark_dirty() if 785 * @note Please call sos_fs_mark_dirty() if disk contents is changed 773 */ 786 */ 774 sos_ret_t (*ioctl)(struct sos_fs_opened_file 787 sos_ret_t (*ioctl)(struct sos_fs_opened_file *this, 775 int req_id, 788 int req_id, 776 sos_ui32_t req_arg /* Usu 789 sos_ui32_t req_arg /* Usually: sos_uaddr_t */); 777 }; 790 }; 778 791 779 792 >> 793 /** >> 794 * The list of methods implementing the basic VFS opened block device >> 795 * operations >> 796 * >> 797 * @see sos_fs_opened_file::ops_file >> 798 */ >> 799 struct sos_fs_ops_opened_blockdev >> 800 { >> 801 /** >> 802 * @note Optional (might be NULL), may block. Appropriate locking >> 803 * MUST be implemented >> 804 * @note Please call sos_fs_mark_dirty() if disk contents is changed >> 805 */ >> 806 sos_ret_t (*ioctl)(struct sos_fs_opened_file *this, >> 807 int req_id, >> 808 sos_ui32_t req_arg /* Usually: sos_uaddr_t */); >> 809 }; >> 810 >> 811 780 /** Data structure that is to be filled by rea 812 /** Data structure that is to be filled by readdir */ 781 struct sos_fs_dirent 813 struct sos_fs_dirent 782 { 814 { 783 sos_ui64_t storage_location; 815 sos_ui64_t storage_location; 784 sos_si64_t offset_in_dirfile; 816 sos_si64_t offset_in_dirfile; 785 sos_ui32_t type; 817 sos_ui32_t type; 786 sos_ui16_t namelen; 818 sos_ui16_t namelen; 787 819 788 #define SOS_FS_DIRENT_NAME_MAXLEN 128 820 #define SOS_FS_DIRENT_NAME_MAXLEN 128 789 char name[SOS_FS_DIRENT_NAME_MAXLEN]; 821 char name[SOS_FS_DIRENT_NAME_MAXLEN]; 790 }; 822 }; 791 823 792 824 793 /** 825 /** 794 * The list of methods implementing the basic 826 * The list of methods implementing the basic VFS opened directory 795 * operations 827 * operations 796 * 828 * 797 * @see sos_fs_opened_file::ops_file 829 * @see sos_fs_opened_file::ops_file 798 */ 830 */ 799 struct sos_fs_ops_opened_dir 831 struct sos_fs_ops_opened_dir 800 { 832 { 801 /** 833 /** 802 * Each time it is called, responsible for f 834 * Each time it is called, responsible for filling the sos_fs_dirent 803 * structure, return -SOS_ENOENT when done. 835 * structure, return -SOS_ENOENT when done. 804 * 836 * 805 * @note Mandatory, may block. Appropriate l 837 * @note Mandatory, may block. Appropriate locking MUST be implemented 806 * @note Please call sos_fs_mark_dirty() if 838 * @note Please call sos_fs_mark_dirty() if disk contents is changed 807 */ 839 */ 808 sos_ret_t (*readdir)(struct sos_fs_opened_fi 840 sos_ret_t (*readdir)(struct sos_fs_opened_file *this, 809 struct sos_fs_dirent * 841 struct sos_fs_dirent * result); 810 }; 842 }; 811 843 812 844 813 845 814 /** 846 /** 815 * Used by the stat calls 847 * Used by the stat calls 816 * 848 * 817 * @see sos_fs_node_ops_file::stat 849 * @see sos_fs_node_ops_file::stat 818 */ 850 */ 819 struct sos_fs_stat 851 struct sos_fs_stat 820 { 852 { 821 struct sos_fs_dev_id_t st_rdev; 853 struct sos_fs_dev_id_t st_rdev; 822 sos_fs_node_type_t st_type; 854 sos_fs_node_type_t st_type; 823 sos_ui64_t st_storage_location; 855 sos_ui64_t st_storage_location; 824 sos_ui32_t st_access_rights; 856 sos_ui32_t st_access_rights; 825 sos_count_t st_nlink; 857 sos_count_t st_nlink; 826 sos_si64_t st_size; 858 sos_si64_t st_size; 827 }; 859 }; 828 860 829 861 830 /** 862 /** 831 * Used by the statvfs calls 863 * Used by the statvfs calls 832 * 864 * 833 * @see sos_fs_manager_instance::statfs 865 * @see sos_fs_manager_instance::statfs 834 */ 866 */ 835 struct sos_fs_statfs 867 struct sos_fs_statfs 836 { 868 { 837 struct sos_fs_dev_id_t f_rdev; 869 struct sos_fs_dev_id_t f_rdev; 838 sos_size_t f_sz_total; /**< Tot 870 sos_size_t f_sz_total; /**< Total size */ 839 sos_size_t f_sz_free; /**< Siz 871 sos_size_t f_sz_free; /**< Size left on device */ 840 sos_count_t f_node_total;/**< Tot 872 sos_count_t f_node_total;/**< Total allocatable FS nodes */ 841 sos_count_t f_node_avail;/**< Num 873 sos_count_t f_node_avail;/**< Number of available free FS nodes */ 842 sos_ui32_t f_flags; 874 sos_ui32_t f_flags; 843 }; 875 }; 844 876 845 877 846 /** 878 /** 847 * Must be called AFTER the FS manager types n 879 * Must be called AFTER the FS manager types needed to mount the root 848 * filesystem have been registered 880 * filesystem have been registered 849 */ 881 */ 850 sos_ret_t sos_fs_subsystem_setup(const char * 882 sos_ret_t sos_fs_subsystem_setup(const char * root_device, 851 const char * 883 const char * fs_type, 852 const char * 884 const char * mount_args, 853 struct sos_fs 885 struct sos_fs_manager_instance ** result_rootfs); 854 886 855 887 856 /* ****************************************** 888 /* *************************************************************** 857 * The Following functions are relatively stan 889 * The Following functions are relatively standard 858 * 890 * 859 * @see Unix manual pages for details 891 * @see Unix manual pages for details 860 */ 892 */ 861 893 862 894 863 /** 895 /** 864 * mount a file system 896 * mount a file system 865 * 897 * 866 * @param actor process calling mount 898 * @param actor process calling mount 867 * @param _src_path(len) may be NULL (as for v 899 * @param _src_path(len) may be NULL (as for virtfs or /proc) 868 * @fsname the name of the filesystem type to 900 * @fsname the name of the filesystem type to mount 869 * @args any args passed to the sos_fs_manager 901 * @args any args passed to the sos_fs_manager_type::mount method 870 * @result_fs the resulting filesystem instanc 902 * @result_fs the resulting filesystem instance 871 */ 903 */ 872 sos_ret_t sos_fs_mount(struct sos_process * ac 904 sos_ret_t sos_fs_mount(struct sos_process * actor, 873 const char * _src_path, 905 const char * _src_path, 874 sos_size_t _src_pathlen 906 sos_size_t _src_pathlen, 875 const char * _dst_path, 907 const char * _dst_path, 876 sos_size_t _dst_pathlen 908 sos_size_t _dst_pathlen, 877 const char * fsname, 909 const char * fsname, 878 sos_ui32_t mountflags, 910 sos_ui32_t mountflags, 879 const char * args, 911 const char * args, 880 struct sos_fs_manager_i 912 struct sos_fs_manager_instance ** /*out*/result_fs); 881 913 882 /** 914 /** 883 * unmount the filesystem at the given locatio 915 * unmount the filesystem at the given location 884 */ 916 */ 885 sos_ret_t sos_fs_umount(struct sos_process * a 917 sos_ret_t sos_fs_umount(struct sos_process * actor, 886 const char * _mountpoi 918 const char * _mountpoint_path, 887 sos_size_t _mountpoint 919 sos_size_t _mountpoint_pathlen); 888 920 889 /** 921 /** 890 * Flush all the dirty nodes of all the FS to 922 * Flush all the dirty nodes of all the FS to disk 891 */ 923 */ 892 sos_ret_t sos_fs_sync_all_fs(); !! 924 sos_ret_t sos_fs_sync_all_fs(void); 893 925 894 /** 926 /** 895 * Retrieve filesystem status, or return -SOS_ 927 * Retrieve filesystem status, or return -SOS_ENOSYS if filesystem 896 * cannot report this 928 * cannot report this 897 */ 929 */ 898 sos_ret_t sos_fs_vfstat(const struct sos_proce 930 sos_ret_t sos_fs_vfstat(const struct sos_process * actor, 899 const char * _path, 931 const char * _path, 900 sos_size_t _pathlen, 932 sos_size_t _pathlen, 901 struct sos_fs_statfs * 933 struct sos_fs_statfs * result); 902 934 903 /** 935 /** 904 * Open flags 936 * Open flags 905 */ 937 */ 906 #define SOS_FS_OPEN_EXCL (1 << 0) 938 #define SOS_FS_OPEN_EXCL (1 << 0) 907 #define SOS_FS_OPEN_CREAT (1 << 1) 939 #define SOS_FS_OPEN_CREAT (1 << 1) 908 #define SOS_FS_OPEN_TRUNC (1 << 2) 940 #define SOS_FS_OPEN_TRUNC (1 << 2) 909 #define SOS_FS_OPEN_NOFOLLOW (1 << 3) 941 #define SOS_FS_OPEN_NOFOLLOW (1 << 3) 910 #define SOS_FS_OPEN_DIRECTORY (1 << 4) /* In 942 #define SOS_FS_OPEN_DIRECTORY (1 << 4) /* Incompatible with CREAT/TRUNC */ 911 #define SOS_FS_OPEN_SYNC (1 << 5) 943 #define SOS_FS_OPEN_SYNC (1 << 5) 912 #define SOS_FS_OPEN_CLOSEONEXEC (1 << 6) /* By 944 #define SOS_FS_OPEN_CLOSEONEXEC (1 << 6) /* By default, files are kept 913 op 945 open upon an exec() */ 914 946 915 #define SOS_FS_OPEN_READ (1 << 16) 947 #define SOS_FS_OPEN_READ (1 << 16) 916 #define SOS_FS_OPEN_WRITE (1 << 17) 948 #define SOS_FS_OPEN_WRITE (1 << 17) 917 949 918 950 919 /** 951 /** 920 * FS access rights 952 * FS access rights 921 */ 953 */ 922 #define SOS_FS_S_IRUSR 00400 954 #define SOS_FS_S_IRUSR 00400 923 #define SOS_FS_S_IWUSR 00200 955 #define SOS_FS_S_IWUSR 00200 924 #define SOS_FS_S_IXUSR 00100 956 #define SOS_FS_S_IXUSR 00100 925 957 926 #define SOS_FS_S_IRWXALL 07777 /* For symlinks 958 #define SOS_FS_S_IRWXALL 07777 /* For symlinks */ 927 959 928 sos_ret_t sos_fs_open(const struct sos_process 960 sos_ret_t sos_fs_open(const struct sos_process *owner, 929 const char *_path, 961 const char *_path, 930 sos_size_t _pathlen, 962 sos_size_t _pathlen, 931 sos_ui32_t open_flags, 963 sos_ui32_t open_flags, 932 sos_ui32_t creat_access_ 964 sos_ui32_t creat_access_rights, 933 struct sos_fs_opened_fil 965 struct sos_fs_opened_file ** of); 934 966 935 sos_ret_t sos_fs_close(struct sos_fs_opened_fi 967 sos_ret_t sos_fs_close(struct sos_fs_opened_file * of); 936 968 937 sos_ret_t sos_fs_read(struct sos_fs_opened_fil 969 sos_ret_t sos_fs_read(struct sos_fs_opened_file * of, 938 sos_uaddr_t dest_buf, 970 sos_uaddr_t dest_buf, 939 sos_size_t * /* in/ou */ 971 sos_size_t * /* in/ou */len); 940 972 941 sos_ret_t sos_fs_readdir(struct sos_fs_opened_ 973 sos_ret_t sos_fs_readdir(struct sos_fs_opened_file * of, 942 struct sos_fs_dirent 974 struct sos_fs_dirent * result); 943 975 944 sos_ret_t sos_fs_write(struct sos_fs_opened_fi 976 sos_ret_t sos_fs_write(struct sos_fs_opened_file * of, 945 sos_uaddr_t src_buf, 977 sos_uaddr_t src_buf, 946 sos_size_t * /* in/out 978 sos_size_t * /* in/out */len); 947 979 948 sos_ret_t sos_fs_seek(struct sos_fs_opened_fil 980 sos_ret_t sos_fs_seek(struct sos_fs_opened_file *of, 949 sos_lsoffset_t offset, 981 sos_lsoffset_t offset, 950 sos_seek_whence_t whence 982 sos_seek_whence_t whence, 951 sos_lsoffset_t * result_ 983 sos_lsoffset_t * result_position); 952 984 953 sos_ret_t sos_fs_ftruncate(struct sos_fs_opene 985 sos_ret_t sos_fs_ftruncate(struct sos_fs_opened_file *of, 954 sos_lsoffset_t leng 986 sos_lsoffset_t length); 955 987 956 sos_ret_t sos_fs_mmap(struct sos_fs_opened_fil 988 sos_ret_t sos_fs_mmap(struct sos_fs_opened_file *of, 957 sos_uaddr_t *uaddr, sos_ 989 sos_uaddr_t *uaddr, sos_size_t size, 958 sos_ui32_t access_rights 990 sos_ui32_t access_rights, 959 sos_ui32_t flags, 991 sos_ui32_t flags, 960 sos_luoffset_t offset); 992 sos_luoffset_t offset); 961 993 962 sos_ret_t sos_fs_fsync(struct sos_fs_opened_fi 994 sos_ret_t sos_fs_fsync(struct sos_fs_opened_file * of); 963 995 964 sos_ret_t sos_fs_fcntl(struct sos_fs_opened_fi 996 sos_ret_t sos_fs_fcntl(struct sos_fs_opened_file *of, 965 int req_id, 997 int req_id, 966 sos_ui32_t req_arg /* U 998 sos_ui32_t req_arg /* Usually: sos_uaddr_t */); 967 999 968 sos_ret_t sos_fs_ioctl(struct sos_fs_opened_fi 1000 sos_ret_t sos_fs_ioctl(struct sos_fs_opened_file *of, 969 int req_id, 1001 int req_id, 970 sos_ui32_t req_arg /* U 1002 sos_ui32_t req_arg /* Usually: sos_uaddr_t */); 971 1003 972 sos_ret_t sos_fs_creat(const struct sos_proces 1004 sos_ret_t sos_fs_creat(const struct sos_process * creator, 973 const char * _path, 1005 const char * _path, 974 sos_size_t _pathlen, 1006 sos_size_t _pathlen, 975 sos_ui32_t access_right 1007 sos_ui32_t access_rights); 976 1008 977 sos_ret_t sos_fs_link(const struct sos_process 1009 sos_ret_t sos_fs_link(const struct sos_process * creator, 978 const char * _old_path, 1010 const char * _old_path, 979 sos_size_t _old_pathlen, 1011 sos_size_t _old_pathlen, 980 const char * _dest_path, 1012 const char * _dest_path, 981 sos_size_t _dest_pathlen 1013 sos_size_t _dest_pathlen); 982 1014 983 sos_ret_t sos_fs_rename(const struct sos_proce 1015 sos_ret_t sos_fs_rename(const struct sos_process * creator, 984 const char * _old_path 1016 const char * _old_path, 985 sos_size_t _old_pathle 1017 sos_size_t _old_pathlen, 986 const char * _dest_pat 1018 const char * _dest_path, 987 sos_size_t _dest_pathl 1019 sos_size_t _dest_pathlen); 988 1020 989 sos_ret_t sos_fs_unlink(const struct sos_proce 1021 sos_ret_t sos_fs_unlink(const struct sos_process * actor, 990 const char * _path, 1022 const char * _path, 991 sos_size_t _pathlen); 1023 sos_size_t _pathlen); 992 1024 993 sos_ret_t sos_fs_symlink(const struct sos_proc 1025 sos_ret_t sos_fs_symlink(const struct sos_process * creator, 994 const char * _path, 1026 const char * _path, 995 sos_size_t _pathlen, 1027 sos_size_t _pathlen, 996 sos_uaddr_t symlink_t 1028 sos_uaddr_t symlink_target, 997 sos_size_t symlink_ta 1029 sos_size_t symlink_target_len); 998 1030 999 sos_ret_t sos_fs_mknod(const struct sos_proces 1031 sos_ret_t sos_fs_mknod(const struct sos_process * creator, 1000 const char * _path, 1032 const char * _path, 1001 sos_size_t _pathlen, 1033 sos_size_t _pathlen, 1002 sos_fs_node_type_t typ 1034 sos_fs_node_type_t type /* only block/char allowed */, 1003 sos_ui32_t access_righ 1035 sos_ui32_t access_rights, 1004 const struct sos_fs_de 1036 const struct sos_fs_dev_id_t * devid); 1005 1037 1006 sos_ret_t sos_fs_mkdir(const struct sos_proce 1038 sos_ret_t sos_fs_mkdir(const struct sos_process * creator, 1007 const char * _path, 1039 const char * _path, 1008 sos_size_t _pathlen, 1040 sos_size_t _pathlen, 1009 sos_ui32_t access_righ 1041 sos_ui32_t access_rights); 1010 1042 1011 sos_ret_t sos_fs_rmdir(const struct sos_proce 1043 sos_ret_t sos_fs_rmdir(const struct sos_process * actor, 1012 const char * _path, 1044 const char * _path, 1013 sos_size_t _pathlen); 1045 sos_size_t _pathlen); 1014 1046 1015 sos_ret_t sos_fs_chmod(const struct sos_proce 1047 sos_ret_t sos_fs_chmod(const struct sos_process * actor, 1016 const char * _path, 1048 const char * _path, 1017 sos_size_t _pathlen, 1049 sos_size_t _pathlen, 1018 sos_ui32_t access_righ 1050 sos_ui32_t access_rights); 1019 1051 1020 sos_ret_t sos_fs_stat(const struct sos_proces 1052 sos_ret_t sos_fs_stat(const struct sos_process * actor, 1021 const char * _path, 1053 const char * _path, 1022 sos_size_t _pathlen, 1054 sos_size_t _pathlen, 1023 int nofollow, 1055 int nofollow, 1024 struct sos_fs_stat * re 1056 struct sos_fs_stat * result); 1025 1057 1026 1058 1027 /* ****************************************** 1059 /* *************************************************************** 1028 * Restricted functions reserved to FS code a 1060 * Restricted functions reserved to FS code and block/char devices 1029 */ 1061 */ 1030 1062 1031 /** 1063 /** 1032 * Function to be called when proposing a new 1064 * Function to be called when proposing a new File system type 1033 */ 1065 */ 1034 sos_ret_t sos_fs_register_fs_type(struct sos_ 1066 sos_ret_t sos_fs_register_fs_type(struct sos_fs_manager_type * fstype); 1035 sos_ret_t sos_fs_unregister_fs_type(struct so 1067 sos_ret_t sos_fs_unregister_fs_type(struct sos_fs_manager_type * fstype); 1036 1068 1037 /** 1069 /** 1038 * Marthe given file as dirty, for FS support 1070 * Marthe given file as dirty, for FS supporting deferred write access 1039 * mode 1071 * mode 1040 */ 1072 */ 1041 sos_ret_t sos_fs_mark_dirty(struct sos_fs_ope 1073 sos_ret_t sos_fs_mark_dirty(struct sos_fs_opened_file * of); 1042 1074 1043 /** 1075 /** 1044 * Helper function to be called from the moun 1076 * Helper function to be called from the mount() method of the FS 1045 * instance code. Responsible for creating an 1077 * instance code. Responsible for creating and updating the "root" 1046 * field of the FS instance structure and for 1078 * field of the FS instance structure and for connecting this FS in 1047 * the nscache 1079 * the nscache 1048 * @param root_fsnode The root of the FS bein 1080 * @param root_fsnode The root of the FS being mounted 1049 */ 1081 */ 1050 sos_ret_t sos_fs_register_fs_instance(struct 1082 sos_ret_t sos_fs_register_fs_instance(struct sos_fs_manager_instance * fs, 1051 struct 1083 struct sos_fs_node * root_fsnode); 1052 1084 1053 /** 1085 /** 1054 * Helper function to be called from the umou 1086 * Helper function to be called from the umount() method of the FS 1055 * instance code. Responsible for unregisteri 1087 * instance code. Responsible for unregistering the instance from the 1056 * FS type's instances list and for disconnec 1088 * FS type's instances list and for disconnecting this mountpoint in 1057 * the nscache. 1089 * the nscache. 1058 */ 1090 */ 1059 sos_ret_t sos_fs_unregister_fs_instance(struc 1091 sos_ret_t sos_fs_unregister_fs_instance(struct sos_fs_manager_instance * fs); 1060 1092 1061 1093 1062 /* ****************************************** 1094 /* *************************************************************** 1063 * Restricted functions reserved to syscall.c 1095 * Restricted functions reserved to syscall.c 1064 */ 1096 */ 1065 sos_ret_t sos_fs_ref_opened_file(struct sos_f 1097 sos_ret_t sos_fs_ref_opened_file(struct sos_fs_opened_file * of); 1066 sos_ret_t _sos_fs_unref_opened_file(struct so 1098 sos_ret_t _sos_fs_unref_opened_file(struct sos_fs_opened_file ** of); 1067 #define sos_fs_unref_opened_file(f) _sos_fs_u 1099 #define sos_fs_unref_opened_file(f) _sos_fs_unref_opened_file(&(f)) 1068 1100 1069 1101 1070 /* ****************************************** 1102 /* *************************************************************** 1071 * Restricted functions to be used only by fs 1103 * Restricted functions to be used only by fs_nscache.c 1072 */ 1104 */ 1073 1105 1074 sos_ret_t sos_fs_ref_fsnode(struct sos_fs_nod 1106 sos_ret_t sos_fs_ref_fsnode(struct sos_fs_node * fsnode); 1075 1107 1076 sos_ret_t _sos_fs_unref_fsnode(struct sos_fs_ 1108 sos_ret_t _sos_fs_unref_fsnode(struct sos_fs_node * fsnode); 1077 #define sos_fs_unref_fsnode(n) \ 1109 #define sos_fs_unref_fsnode(n) \ 1078 ({ sos_ret_t __retval = _sos_fs_unref_fsnod 1110 ({ sos_ret_t __retval = _sos_fs_unref_fsnode(n); (n)=NULL; __retval; }) 1079 1111 1080 1112 1081 /* ****************************************** 1113 /* *************************************************************** 1082 * Restricted functions reserved to process.c 1114 * Restricted functions reserved to process.c and main.c:start_init() 1083 */ 1115 */ 1084 sos_ret_t sos_fs_new_opened_file(const struct 1116 sos_ret_t sos_fs_new_opened_file(const struct sos_process * proc, 1085 struct sos_f 1117 struct sos_fs_nscache_node * nsnode, 1086 sos_ui32_t o 1118 sos_ui32_t open_flags, 1087 struct sos_f 1119 struct sos_fs_opened_file ** result_of); 1088 1120 1089 1121 1090 sos_ret_t sos_fs_duplicate_opened_file(struct 1122 sos_ret_t sos_fs_duplicate_opened_file(struct sos_fs_opened_file * src_of, 1091 const 1123 const struct sos_process * dst_proc, 1092 struct 1124 struct sos_fs_opened_file ** result_of); 1093 1125 1094 1126 1095 1127 1096 #endif /* _SOS_FS_H_ */ 1128 #endif /* _SOS_FS_H_ */
[ source navigation ] | [ diff markup ] | [ identifier search ] | [ general search ] |