PatchworkOS
Loading...
Searching...
No Matches
superblock.c
Go to the documentation of this file.
2
3#include <kernel/fs/vfs.h>
4#include <kernel/mem/pmm.h>
5
6#include <stdlib.h>
7
8static void superblock_free(superblock_t* superblock)
9{
10 if (superblock == NULL)
11 {
12 return;
13 }
14
15 assert(atomic_load(&superblock->mountCount) == 0);
16
17 vfs_remove_superblock(superblock);
18
19 if (superblock->ops != NULL && superblock->ops->cleanup != NULL)
20 {
21 superblock->ops->cleanup(superblock);
22 }
23
24 if (superblock->root != NULL)
25 {
26 DEREF(superblock->root);
27 }
28
29 free(superblock);
30}
31
32superblock_t* superblock_new(const filesystem_t* fs, const char* deviceName, const superblock_ops_t* ops,
34{
35 superblock_t* superblock = malloc(sizeof(superblock_t));
36 if (superblock == NULL)
37 {
38 return NULL;
39 }
40
41 ref_init(&superblock->ref, superblock_free);
42 list_entry_init(&superblock->entry);
43 superblock->id = vfs_get_new_id();
44 superblock->blockSize = PAGE_SIZE;
45 superblock->maxFileSize = UINT64_MAX;
46 superblock->private = NULL;
47 superblock->root = NULL;
48 superblock->ops = ops;
49 superblock->dentryOps = dentryOps;
50 strncpy(superblock->deviceName, deviceName, MAX_NAME - 1);
51 superblock->deviceName[MAX_NAME - 1] = '\0';
52 superblock->fs = fs;
53 atomic_init(&superblock->mountCount, 0);
54 return superblock;
55}
56
58{
59 atomic_fetch_add(&superblock->mountCount, 1);
60}
61
63{
64 if (atomic_fetch_sub(&superblock->mountCount, 1) == 1)
65 {
66 if (superblock->ops != NULL && superblock->ops->unmount != NULL)
67 {
68 superblock->ops->unmount(superblock);
69 }
70 }
71}
#define MAX_NAME
Maximum length of names.
Definition MAX_NAME.h:11
#define assert(expression)
Definition assert.h:29
void superblock_inc_mount_count(superblock_t *superblock)
Increment the mount count of a superblock.
Definition superblock.c:57
superblock_t * superblock_new(const filesystem_t *fs, const char *deviceName, const superblock_ops_t *ops, const dentry_ops_t *dentryOps)
Create a new superblock.
Definition superblock.c:32
void superblock_dec_mount_count(superblock_t *superblock)
Decrement the mount count of a superblock.
Definition superblock.c:62
uint64_t vfs_get_new_id(void)
Generates a new unique ID.
Definition vfs.c:97
void vfs_remove_superblock(superblock_t *superblock)
Remove a superblock from the superblock list.
Definition vfs.c:301
static void ref_init(ref_t *ref, void *free)
Initialize a reference counter.
Definition ref.h:92
#define DEREF(ptr)
Decrement reference count.
Definition ref.h:80
static void list_entry_init(list_entry_t *entry)
Initializes a list entry.
Definition list.h:184
#define PAGE_SIZE
Memory page size.
Definition proc.h:140
#define NULL
Pointer error value.
Definition NULL.h:23
static socket_family_ops_t ops
Definition local.c:505
static dentry_ops_t dentryOps
Definition ramfs.c:229
#define atomic_fetch_sub(object, operand)
Definition stdatomic.h:286
#define atomic_load(object)
Definition stdatomic.h:288
#define atomic_fetch_add(object, operand)
Definition stdatomic.h:283
#define atomic_init(obj, value)
Definition stdatomic.h:75
#define UINT64_MAX
Definition stdint.h:74
_PUBLIC void * malloc(size_t size)
Definition malloc.c:5
_PUBLIC void free(void *ptr)
Definition free.c:11
_PUBLIC char * strncpy(char *_RESTRICT s1, const char *_RESTRICT s2, size_t n)
Definition strncpy.c:3
Dentry operations structure.
Definition dentry.h:70
Filesystem structure, represents a filesystem type, e.g. fat32, ramfs, sysfs, etc.
Definition vfs.h:45
Superblock operations structure.
Definition superblock.h:70
void(* cleanup)(superblock_t *superblock)
Definition superblock.h:85
void(* unmount)(superblock_t *superblock)
Definition superblock.h:89
Superblock structure.
Definition superblock.h:44
uint64_t blockSize
Definition superblock.h:48
uint64_t maxFileSize
Definition superblock.h:49
const superblock_ops_t * ops
Definition superblock.h:52
atomic_uint64_t mountCount
Definition superblock.h:62
const filesystem_t * fs
Definition superblock.h:54
list_entry_t entry
Definition superblock.h:46
dentry_t * root
Definition superblock.h:51
const dentry_ops_t * dentryOps
Definition superblock.h:53
superblock_id_t id
Definition superblock.h:47
char deviceName[MAX_NAME]
Definition superblock.h:55
void * private
Definition superblock.h:50
static void superblock_free(superblock_t *superblock)
Definition superblock.c:8