2 * @file fsm.c File system manager
3 * @author Lunaixsky (zelong56@gmail.com)
8 * @copyright Copyright (c) 2022
11 #include <klibc/string.h>
12 #include <lunaix/ds/hashtable.h>
13 #include <lunaix/fs.h>
14 #include <lunaix/mm/valloc.h>
16 #include <lunaix/fs/twimap.h>
17 #include <lunaix/fs/twifs.h>
19 #define HASH_BUCKET_BITS 4
20 #define HASH_BUCKET_NUM (1 << HASH_BUCKET_BITS)
22 DEFINE_LLIST(fs_flatlist);
23 DECLARE_HASHTABLE(fs_registry, HASH_BUCKET_NUM);
28 hashtable_init(fs_registry);
34 fsm_register(struct filesystem* fs)
36 hstr_rehash(&fs->fs_name, HSTR_FULL_HASH);
37 hashtable_hash_in(fs_registry, &fs->fs_list, fs->fs_name.hash);
38 llist_append(&fs_flatlist, &fs->fs_flat);
42 fsm_get(const char* fs_name)
44 struct filesystem *pos, *next;
45 struct hstr str = HSTR(fs_name, 0);
46 hstr_rehash(&str, HSTR_FULL_HASH);
48 hashtable_hash_foreach(fs_registry, str.hash, pos, next, fs_list)
50 if (pos->fs_name.hash == str.hash) {
59 fsm_new_fs(char* name, size_t name_len)
61 struct filesystem* fs = vzalloc(sizeof(*fs));
62 if (name_len == (size_t)-1) {
63 name_len = strlen(name);
65 fs->fs_name = HHSTR(name, name_len, 0);
70 fsm_itbegin(struct fs_iter* iterator)
72 iterator->fs = list_entry(&fs_flatlist, struct filesystem, fs_flat);
76 fsm_itnext(struct fs_iter* iterator)
78 iterator->fs = list_next(iterator->fs, struct filesystem, fs_flat);
79 return &iterator->fs->fs_flat != &fs_flatlist;
83 __twimap_read_fstab(struct twimap *mapping)
85 struct filesystem *pos, *n;
86 llist_for_each(pos, n, &fs_flatlist, fs_flat)
88 twimap_printf(mapping, "%s %d\n", pos->fs_name.value, pos->types);
95 twimap_export_value(NULL, fstab, FSACL_ugR, NULL);
97 EXPORT_TWIFS_PLUGIN(fstab, fstab_twifs_plugin);