summaryrefslogtreecommitdiff
path: root/src/kernel
diff options
context:
space:
mode:
authordzwdz2024-05-11 20:55:10 +0200
committerdzwdz2024-05-11 20:55:10 +0200
commitec3d2400db15e6911138d88f95cae141a9da2130 (patch)
tree243ae2e52a428529bb050caaed332185c465a7d5 /src/kernel
parente4ebea27b2f339706da76a3e79cb63ea9ed97c38 (diff)
kernel: remove HANDLE_NULLFS
It was a dumb hack that wasn't even necessary - an error when mounting should shadow over the mountpoint anyways.
Diffstat (limited to 'src/kernel')
-rw-r--r--src/kernel/handleset.c12
-rw-r--r--src/kernel/syscalls.c36
2 files changed, 21 insertions, 27 deletions
diff --git a/src/kernel/handleset.c b/src/kernel/handleset.c
index b52eaa0..a25f5c7 100644
--- a/src/kernel/handleset.c
+++ b/src/kernel/handleset.c
@@ -55,15 +55,7 @@ hs_findfree(HandleSet *hs, hid_t start)
Handle *
hs_get(HandleSet *hs, hid_t id)
{
- if (id == HANDLE_NULLFS) {
- // TODO get rid of this stupid hack
- static Handle h = (Handle){
- .type = HANDLE_FS_FRONT,
- .backend = NULL,
- .refcount = 2, /* never free */
- };
- return &h;
- } else if (0 <= id && id < HANDLE_MAX) {
+ if (0 <= id && id < HANDLE_MAX) {
return hs->h[id];
} else {
return NULL;
@@ -107,7 +99,7 @@ Handle *
hs_take(HandleSet *hs, hid_t hid)
{
if (hid < 0 || hid >= HANDLE_MAX) {
- return hs_get(hs, hid); // TODO can't this cause HANDLE_NULLFS to be freed?
+ return NULL;
}
Handle *h = hs->h[hid];
hs->h[hid] = NULL;
diff --git a/src/kernel/syscalls.c b/src/kernel/syscalls.c
index da6b48f..9b0746a 100644
--- a/src/kernel/syscalls.c
+++ b/src/kernel/syscalls.c
@@ -63,7 +63,7 @@ hid_t _sys_open(const char __user *path, long len, int flags) {
if (flags & ~(OPEN_RW | OPEN_CREATE)) SYSCALL_RETURN(-ENOSYS);
if (PATH_MAX < len)
- SYSCALL_RETURN(-1);
+ SYSCALL_RETURN(-ENAMETOOLONG);
/* Doesn't check for free handles. Another thread could use up all
* handles in the meantime anyways, or free some up. */
@@ -86,16 +86,16 @@ hid_t _sys_open(const char __user *path, long len, int flags) {
}
vfsreq_create((VfsReq) {
- .type = VFSOP_OPEN,
- .input = {
- .kern = true,
- .buf_kern = path_buf,
- .len = len,
- },
- .caller = proc_cur,
- .backend = mount->backend,
- .flags = flags,
- });
+ .type = VFSOP_OPEN,
+ .input = {
+ .kern = true,
+ .buf_kern = path_buf,
+ .len = len,
+ },
+ .caller = proc_cur,
+ .backend = mount->backend,
+ .flags = flags,
+ });
return -1; // dummy
fail:
kfree(path_buf);
@@ -125,12 +125,14 @@ long _sys_mount(hid_t hid, const char __user *path, long len) {
}
Handle *handle = hs_get(proc_cur->hs, hid);
- if (!handle || handle->type != HANDLE_FS_FRONT)
- goto fail;
- backend = handle->backend;
- if (backend) {
- assert(backend->usehcnt);
- backend->usehcnt++;
+ if (handle && handle->type == HANDLE_FS_FRONT) {
+ backend = handle->backend;
+ if (backend) {
+ assert(backend->usehcnt);
+ backend->usehcnt++;
+ }
+ } else {
+ backend = NULL;
}
// append to mount list