PatchworkOS
Loading...
Searching...
No Matches
inode.c
Go to the documentation of this file.
1#include <kernel/fs/inode.h>
2
3#include <kernel/fs/vfs.h>
6
7#include <stdlib.h>
8
9static void inode_free(inode_t* inode)
10{
11 if (inode == NULL)
12 {
13 return;
14 }
15
16 vfs_remove_inode(inode);
17
18 if (inode->ops != NULL && inode->ops->cleanup != NULL)
19 {
20 inode->ops->cleanup(inode);
21 }
22
23 if (inode->superblock != NULL)
24 {
25 if (inode->superblock->ops != NULL && inode->superblock->ops->freeInode != NULL)
26 {
27 inode->superblock->ops->freeInode(inode->superblock, inode);
28 }
29 DEREF(inode->superblock);
30
31 if (inode->superblock->ops == NULL || inode->superblock->ops->freeInode == NULL)
32 {
33 free(inode);
34 }
35
36 return;
37 }
38
39 free(inode);
40}
41
43 const file_ops_t* fileOps)
44{
45 if (superblock == NULL)
46 {
47 errno = EINVAL;
48 return NULL;
49 }
50
51 inode_t* inode;
52 if (superblock->ops != NULL && superblock->ops->allocInode != NULL)
53 {
54 inode = superblock->ops->allocInode(superblock);
55 }
56 else
57 {
58 inode = malloc(sizeof(inode_t));
59 }
60
61 if (inode == NULL)
62 {
63 return NULL;
64 }
65
66 ref_init(&inode->ref, inode_free);
67 map_entry_init(&inode->mapEntry);
68 inode->number = number;
69 inode->type = type;
70 inode->flags = INODE_NONE;
71 inode->linkCount = 1;
72 inode->size = 0;
73 inode->blocks = 0;
75 inode->modifyTime = inode->accessTime;
76 inode->changeTime = inode->accessTime;
77 inode->createTime = inode->accessTime;
78 inode->private = NULL;
79 inode->superblock = REF(superblock);
80 inode->ops = ops;
81 inode->fileOps = fileOps;
82 mutex_init(&inode->mutex);
83
84 if (vfs_add_inode(inode) == ERR)
85 {
86 DEREF(inode);
87 return NULL;
88 }
89
90 return inode;
91}
92
94{
95 if (inode == NULL)
96 {
97 return;
98 }
99
100 MUTEX_SCOPE(&inode->mutex);
101
102 inode->accessTime = timer_unix_epoch();
103 // TODO: Sync to disk.
104}
105
107{
108 if (inode == NULL)
109 {
110 return;
111 }
112
113 MUTEX_SCOPE(&inode->mutex);
114 inode->modifyTime = timer_unix_epoch();
115 inode->changeTime = inode->modifyTime;
116 // TODO: Sync to disk.
117}
118
120{
121 if (inode == NULL)
122 {
123 return;
124 }
125
126 MUTEX_SCOPE(&inode->mutex);
127 inode->changeTime = timer_unix_epoch();
128 // TODO: Sync to disk.
129}
130
132{
133 if (inode == NULL)
134 {
135 return;
136 }
137
138 if (inode->ops != NULL && inode->ops->truncate != NULL)
139 {
140 MUTEX_SCOPE(&inode->mutex);
142 inode->ops->truncate(inode);
143 }
144}
#define assert(expression)
Definition assert.h:29
void inode_notify_change(inode_t *inode)
Notify the inode that its metadata has changed.
Definition inode.c:119
void inode_notify_modify(inode_t *inode)
Notify the inode that its content has been modified.
Definition inode.c:106
void inode_notify_access(inode_t *inode)
Notify the inode that it has been accessed.
Definition inode.c:93
void inode_truncate(inode_t *inode)
Truncate the inode.
Definition inode.c:131
inode_t * inode_new(superblock_t *superblock, inode_number_t number, inode_type_t type, const inode_ops_t *ops, const file_ops_t *fileOps)
Create a new inode.
Definition inode.c:42
@ INODE_NONE
None.
Definition inode.h:44
void vfs_remove_inode(inode_t *inode)
Remove an inode from the inode cache.
Definition vfs.c:312
uint64_t vfs_add_inode(inode_t *inode)
Add a inode to the inode cache.
Definition vfs.c:275
void mutex_init(mutex_t *mtx)
Initializes a mutex.
Definition mutex.c:12
#define MUTEX_SCOPE(mutex)
Acquires a mutex for the reminder of the current scope.
Definition mutex.h:23
time_t timer_unix_epoch(void)
The unix epoch.
Definition timer.c:86
void map_entry_init(map_entry_t *entry)
Initialize a map entry.
Definition map.c:71
static void ref_init(ref_t *ref, void *free)
Initialize a reference counter.
Definition ref.h:92
#define REF(ptr)
Increment reference count.
Definition ref.h:65
#define DEREF(ptr)
Decrement reference count.
Definition ref.h:80
#define EINVAL
Invalid argument.
Definition errno.h:142
#define errno
Error number variable.
Definition errno.h:27
inode_type_t
Inode type enum.
Definition io.h:344
uint64_t inode_number_t
Inode number enum.
Definition io.h:353
#define NULL
Pointer error value.
Definition NULL.h:23
#define ERR
Integer error value.
Definition ERR.h:17
static void inode_free(inode_t *inode)
Definition inode.c:9
static socket_family_ops_t ops
Definition local.c:505
static file_ops_t fileOps
Definition ramfs.c:99
#define RFLAGS_INTERRUPT_ENABLE
Definition regs.h:32
static uint64_t rflags_read()
Definition regs.h:78
_PUBLIC void * malloc(size_t size)
Definition malloc.c:5
_PUBLIC void free(void *ptr)
Definition free.c:11
File operations structure.
Definition file.h:57
void(* cleanup)(inode_t *inode)
Definition inode.h:98
void(* truncate)(inode_t *target)
Definition inode.h:92
Inode structure.
Definition inode.h:54
uint64_t blocks
Definition inode.h:61
mutex_t mutex
Definition inode.h:70
ref_t ref
Definition inode.h:55
time_t accessTime
Unix time stamp for the last inode access.
Definition inode.h:62
time_t createTime
Unix time stamp for the inode creation.
Definition inode.h:65
time_t modifyTime
Unix time stamp for last file content alteration.
Definition inode.h:63
void * private
Definition inode.h:66
inode_type_t type
Constant after creation.
Definition inode.h:57
inode_number_t number
Constant after creation.
Definition inode.h:56
superblock_t * superblock
Constant after creation.
Definition inode.h:67
const inode_ops_t * ops
Constant after creation.
Definition inode.h:68
uint64_t size
Definition inode.h:60
inode_flags_t flags
Definition inode.h:58
time_t changeTime
Unix time stamp for the last file metadata alteration.
Definition inode.h:64
uint64_t linkCount
Definition inode.h:59
const file_ops_t * fileOps
Constant after creation.
Definition inode.h:69
map_entry_t mapEntry
Protected by the inodeCache lock.
Definition inode.h:71
void(* freeInode)(superblock_t *superblock, inode_t *inode)
Definition superblock.h:80
inode_t *(* allocInode)(superblock_t *superblock)
Definition superblock.h:76
Superblock structure.
Definition superblock.h:44
const superblock_ops_t * ops
Definition superblock.h:52