feat: page caching layer for vfs
[lunaix-os.git] / lunaix-os / kernel / fs / fsm.c
1 /**
2  * @file fsm.c File system manager
3  * @author Lunaixsky (zelong56@gmail.com)
4  * @brief
5  * @version 0.1
6  * @date 2022-07-19
7  *
8  * @copyright Copyright (c) 2022
9  *
10  */
11 #include <klibc/string.h>
12 #include <lunaix/ds/hashtable.h>
13 #include <lunaix/fs.h>
14
15 #define HASH_BUCKET_BITS 4
16 #define HASH_BUCKET_NUM (1 << HASH_BUCKET_BITS)
17
18 DECLARE_HASHTABLE(fs_registry, HASH_BUCKET_NUM);
19
20 void
21 fsm_init()
22 {
23     hashtable_init(fs_registry);
24 }
25
26 void
27 fsm_register(struct filesystem* fs)
28 {
29     hstr_rehash(&fs->fs_name, HSTR_FULL_HASH);
30     hashtable_hash_in(fs_registry, &fs->fs_list, fs->fs_name.hash);
31 }
32
33 struct filesystem*
34 fsm_get(const char* fs_name)
35 {
36     struct filesystem *pos, *next;
37     struct hstr str = HSTR(fs_name, 0);
38     hstr_rehash(&str, HSTR_FULL_HASH);
39
40     hashtable_hash_foreach(fs_registry, str.hash, pos, next, fs_list)
41     {
42         if (pos->fs_name.hash == str.hash) {
43             return pos;
44         }
45     }
46
47     return NULL;
48 }