summaryrefslogtreecommitdiff
path: root/src/kernel/handle.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/handle.c')
-rw-r--r--src/kernel/handle.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/src/kernel/handle.c b/src/kernel/handle.c
index 91832a0..f5255c0 100644
--- a/src/kernel/handle.c
+++ b/src/kernel/handle.c
@@ -16,19 +16,22 @@ void handle_close(struct handle *h) {
assert(h->refcount > 0);
if (--(h->refcount) > 0) return;
- if (h->type == HANDLE_FILE) {
- vfs_request_create((struct vfs_request) {
- .type = VFSOP_CLOSE,
- .id = h->file.id,
- .caller = NULL,
- .backend = h->file.backend,
- });
+ switch (h->type) {
+ case HANDLE_FILE:
+ vfs_request_create((struct vfs_request) {
+ .type = VFSOP_CLOSE,
+ .id = h->file.id,
+ .caller = NULL,
+ .backend = h->file.backend,
+ });
+ vfs_backend_refdown(h->file.backend);
+ break;
+ case HANDLE_FS_FRONT:
+ vfs_backend_refdown(h->fs.backend);
+ break;
+ case HANDLE_INVALID: panic_invalid_state();
}
- // TODO handle close(HANDLE_FS_FRONT)
-
- // TODO count allocations and frees
-
// TODO sanity check to check if refcount is true. handle_sanity?
// TODO tests which would catch premature frees