diff options
author | dzwdz | 2024-05-11 20:55:10 +0200 |
---|---|---|
committer | dzwdz | 2024-05-11 20:55:10 +0200 |
commit | ec3d2400db15e6911138d88f95cae141a9da2130 (patch) | |
tree | 243ae2e52a428529bb050caaed332185c465a7d5 /src/kernel | |
parent | e4ebea27b2f339706da76a3e79cb63ea9ed97c38 (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.c | 12 | ||||
-rw-r--r-- | src/kernel/syscalls.c | 36 |
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 |