PatchworkOS  966e257
A non-POSIX operating system.
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>
7
8#include <stdlib.h>
9
10static void inode_free(inode_t* inode)
11{
12 if (inode == NULL)
13 {
14 return;
15 }
16
17 if (inode->ops != NULL && inode->ops->cleanup != NULL)
18 {
19 inode->ops->cleanup(inode);
20 }
21
22 if (inode->superblock != NULL)
23 {
24 if (inode->superblock->ops != NULL && inode->superblock->ops->freeInode != NULL)
25 {
26 inode->superblock->ops->freeInode(inode->superblock, inode);
27 }
28 UNREF(inode->superblock);
29
30 if (inode->superblock->ops == NULL || inode->superblock->ops->freeInode == NULL)
31 {
32 free(inode);
33 }
34
35 return;
36 }
37
38 free(inode);
39}
40
42 const file_ops_t* fileOps)
43{
44 if (superblock == NULL)
45 {
46 errno = EINVAL;
47 return NULL;
48 }
49
50 inode_t* inode;
51 if (superblock->ops != NULL && superblock->ops->allocInode != NULL)
52 {
53 inode = superblock->ops->allocInode(superblock);
54 }
55 else
56 {
57 inode = malloc(sizeof(inode_t));
58 }
59
60 if (inode == NULL)
61 {
62 return NULL;
63 }
64
65 ref_init(&inode->ref, inode_free);
66 inode->number = number;
67 inode->type = type;
68 inode->flags = INODE_NONE;
69 atomic_init(&inode->dentryCount, 0);
70 inode->size = 0;
71 inode->blocks = 0;
72 inode->accessTime = clock_epoch();
73 inode->modifyTime = inode->accessTime;
74 inode->changeTime = inode->accessTime;
75 inode->createTime = inode->accessTime;
76 inode->private = NULL;
77 inode->superblock = REF(superblock);
78 inode->ops = ops;
79 inode->fileOps = fileOps;
80 mutex_init(&inode->mutex);
81
82 return inode;
83}
84
86{
87 if (inode == NULL)
88 {
89 return;
90 }
91
92 MUTEX_SCOPE(&inode->mutex);
93
94 inode->accessTime = clock_epoch();
95}
96
98{
99 if (inode == NULL)
100 {
101 return;
102 }
103
104 MUTEX_SCOPE(&inode->mutex);
105 inode->modifyTime = clock_epoch();
106 inode->changeTime = inode->modifyTime;
107}
108
110{
111 if (inode == NULL)
112 {
113 return;
114 }
115
116 MUTEX_SCOPE(&inode->mutex);
117 inode->changeTime = clock_epoch();
118}
119
121{
122 if (inode == NULL)
123 {
124 return;
125 }
126
127 if (inode->ops != NULL && inode->ops->truncate != NULL)
128 {
129 MUTEX_SCOPE(&inode->mutex);
131 inode->ops->truncate(inode);
132 }
133}
#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:109
void inode_notify_modify(inode_t *inode)
Notify the inode that its content has been modified.
Definition inode.c:97
void inode_notify_access(inode_t *inode)
Notify the inode that it has been accessed.
Definition inode.c:85
void inode_truncate(inode_t *inode)
Truncate the inode.
Definition inode.c:120
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:41
@ INODE_NONE
None.
Definition inode.h:46
time_t clock_epoch(void)
Retrieve the seconds since the unix epoch.
Definition clock.c:119
void mutex_init(mutex_t *mtx)
Initializes a mutex.
Definition mutex.c:14
#define MUTEX_SCOPE(mutex)
Acquires a mutex for the reminder of the current scope.
Definition mutex.h:23
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 UNREF(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:313
uint64_t inode_number_t
Inode number enum.
Definition io.h:322
#define NULL
Pointer error value.
Definition NULL.h:23
static void inode_free(inode_t *inode)
Definition inode.c:10
static socket_family_ops_t ops
Definition local.c:505
static file_ops_t fileOps
Definition ramfs.c:84
#define RFLAGS_INTERRUPT_ENABLE
Definition regs.h:32
static uint64_t rflags_read()
Definition regs.h:78
#define atomic_init(obj, value)
Definition stdatomic.h:75
_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:54
Inode operations structure.
Definition inode.h:82
void(* cleanup)(inode_t *inode)
Cleanup function called when the inode is being freed.
Definition inode.h:134
void(* truncate)(inode_t *target)
Set the inode size to zero.
Definition inode.h:110
Inode structure.
Definition inode.h:56
uint64_t blocks
Definition inode.h:63
mutex_t mutex
Definition inode.h:72
ref_t ref
Definition inode.h:57
time_t accessTime
Unix time stamp for the last inode access.
Definition inode.h:64
time_t createTime
Unix time stamp for the inode creation.
Definition inode.h:67
time_t modifyTime
Unix time stamp for last file content alteration.
Definition inode.h:65
void * private
Definition inode.h:68
inode_type_t type
Constant after creation.
Definition inode.h:59
inode_number_t number
Constant after creation.
Definition inode.h:58
superblock_t * superblock
Constant after creation.
Definition inode.h:69
const inode_ops_t * ops
Constant after creation.
Definition inode.h:70
uint64_t size
Definition inode.h:62
inode_flags_t flags
Definition inode.h:60
time_t changeTime
Unix time stamp for the last file metadata alteration.
Definition inode.h:66
const file_ops_t * fileOps
Constant after creation.
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