Creating a filesystem
Introduction
This page will present how to create a new filesystem driver for the VFS.
This is an advanced topic, not usually explored by many people. Please make sure you are familiar with VFS basics before going further.
In order to create a file system driver, we must create a library that implements a certain set of functions.
Typically, our driver would then also provide some 'initialization' function that takes care of registering the driver with the VFS.
Ideally, our driver would also provide a small substrate to auto-register it with the VFS, taking away the need for the user to do it manually.
Skeleton
Below is a complete skeleton for a file system driver. This will cover all aspects presented above including dfe.conf and substrate.
This skeleton will be for an imaginary file system driver called 'exfs' (example fs).
Library definition (dfe.conf)
Let's start with the dfe.conf for our library:
name: exfs
type: lib
deps:
- vfs
- storage
Driver code
Next, below is the code skeleton for the driver implementation. While this is shown as a single C file, it can of course be split into multiple files for easier management.
1 #include <storage/storage.h>
2 #include <vfs/vfs.h>
3
4 // File System Name
5 #define EXFS "exfs"
6
7 // EXFS-specific Mountpoint Data Structure
8 struct exfs_mountpoint_data
9 {
10 /* Our file system can store some information
11 * about the mountpoint here.
12 */
13 };
14
15 // Define the above structure as VFS Mountpoint Data
16 vfs_mountpoint_data_struct(exfs_mountpoint_data);
17
18 // Handle Data Structure
19 struct exfs_handle_data
20 {
21 /* Our file system can store some information
22 * about the object handle here.
23 */
24 };
25
26 // Define the above structure as VFS Handle Data
27 vfs_handle_data_struct(exfs_handle_data);
28
29 // Structure to hold our File System info
30 struct vfs_fs exfs;
31
32 // Mount a Storage Device through Example File System
33 uint8_t exfs_mount(struct vfs_mountpoint *mp, struct storage *st)
34 {
35 struct exfs_mountpoint_data *d;
36
37 // Acquire & Setup FS Data Structure
38 d = (struct exfs_mountpoint_data *)(mp->data);
39
40 /* Our file system driver can store information
41 * in the mountpoint data structure.
42 */
43
44 // ToDo: Write implementation
45 return 1;
46 }
47
48 // Un-Mount
49 uint8_t exfs_unmount(struct vfs_mountpoint *mp)
50 {
51 // ToDo: Write implementation
52 return 1;
53 }
54
55 // Create Object
56 uint8_t exfs_mkobj(struct vfs_mountpoint *mp, char *path, uint8_t path_len, uint8_t otype)
57 {
58 // ToDo: Write implementation
59 return 1;
60 }
61
62 // Destroy Object
63 uint8_t exfs_rmobj(struct vfs_mountpoint *mp, char *path, uint8_t path_len)
64 {
65 // ToDo: Write implementation
66 return 1;
67 }
68
69 // Move Object
70 uint8_t exfs_mvobj(struct vfs_mountpoint *mp, char *src, uint8_t src_len, char *dst, uint8_t dst_len)
71 {
72 // ToDo: Write implementation
73 return 1;
74 }
75
76 // Open Handle
77 uint8_t exfs_open(struct vfs_mountpoint *mp, struct vfs_handle *h, char *path, uint8_t path_len)
78 {
79 struct exfs_handle_data *d;
80
81 // Acquire Handle Data Structure
82 d = (struct exfs_handle_data *)(h->data);
83
84 // ToDo: Write implementation
85 return 1;
86 }
87
88 // Close Handle
89 void exfs_close(struct vfs_mountpoint *mp, struct vfs_handle *h)
90 {
91 // ToDo: Write implementation
92 }
93
94 // Truncate File
95 uint8_t exfs_truncate(struct vfs_mountpoint *mp, struct vfs_handle *h, uint64_t size)
96 {
97 // ToDo: Write implementation
98 return 1;
99 }
100
101 // Read File
102 uint8_t exfs_read(struct vfs_mountpoint *mp, struct vfs_handle *h, void *data, uint16_t size, uint16_t *rd)
103 {
104 // ToDo: Write implementation
105 return 1;
106 }
107
108 // Write File
109 uint8_t exfs_write(struct vfs_mountpoint *mp, struct vfs_handle *h, void *data, uint16_t size, uint16_t *wr)
110 {
111 // ToDo: Write implementation
112 return 1;
113 }
114
115 // Read Directory
116 uint8_t exfs_readdir(struct vfs_mountpoint *mp, struct vfs_handle *h, struct vfs_dirent *e)
117 {
118 // ToDo: Write implementation
119 return 1;
120 }
121
122 // Initialization (register file system into VFS)
123 void exfs_init()
124 {
125 // Initialize File System Interface
126 vfs_register(&exfs, exfs_mount, exfs_unmount, exfs_mkobj, exfs_rmobj, exfs_mvobj, exfs_open, exfs_close, exfs_truncate, exfs_read, exfs_write, exfs_readdir, EXFS);
127 }
Substrate
Let's also create a small substrate to make our file system automatically register itself into the VFS:
# Provider for our File System
provide :exfs do |params|
# Use VFS
uses :vfs
# Provide EXFS
uses_global_header 'exfs/exfs.h' # Replace this with a header file containing the definition of our 'init' function
register_code section: :init, code: "exfs_init();"
end
# Register Filesystem
register_filesystem :exfs