SimpleOS

LXR

Navigation



Site hébergé par : enix

The LXR Cross Referencer for SOS

source navigation ]
diff markup ]
identifier search ]
general search ]
 
 
Article:1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 6.5 ] [ 7 ] [ 7.5 ] [ 8 ] [ 9 ] [ 9.5 ]

Diff markup

Differences between /sos/fs.h (Article 9) and /sos/fs.h (Article 9.5)


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 ]