summaryrefslogtreecommitdiff
path: root/src/kernel/vfs
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/vfs')
-rw-r--r--src/kernel/vfs/request.c7
-rw-r--r--src/kernel/vfs/request.h6
2 files changed, 7 insertions, 6 deletions
diff --git a/src/kernel/vfs/request.c b/src/kernel/vfs/request.c
index dfbd5cd..7c677cc 100644
--- a/src/kernel/vfs/request.c
+++ b/src/kernel/vfs/request.c
@@ -29,7 +29,9 @@ void vfsreq_create(struct vfs_request req_) {
vfs_backend_tryaccept(req->backend);
}
-void vfsreq_finish(struct vfs_request *req, int ret, int flags, struct process *handler) {
+void vfsreq_finish(struct vfs_request *req, char __user *stored, int ret,
+ int flags, struct process *handler)
+{
if (req->type == VFSOP_OPEN && ret >= 0) {
// TODO write tests for caller getting killed while opening a file
if (!req->caller) panic_unimplemented();
@@ -43,8 +45,7 @@ void vfsreq_finish(struct vfs_request *req, int ret, int flags, struct process *
struct handle *backing = handle_init(HANDLE_FILE);
backing->backend = req->backend;
req->backend->refcount++;
- // TODO file ids can only be 31bit long, so they can't be pointers
- backing->file_id = ret;
+ backing->file_id = stored;
req->caller->handles[handle] = backing;
} else {
/* delegating - moving a handle to the caller */
diff --git a/src/kernel/vfs/request.h b/src/kernel/vfs/request.h
index 7d36a5d..29f1ee9 100644
--- a/src/kernel/vfs/request.h
+++ b/src/kernel/vfs/request.h
@@ -47,7 +47,7 @@ struct vfs_request {
size_t len;
} output;
- int id; // handle.file.id
+ void __user *id; // handle.file.id
int offset;
int flags;
@@ -59,10 +59,10 @@ struct vfs_request {
/** Assigns the vfs_request to the caller, and dispatches the call */
void vfsreq_create(struct vfs_request);
-void vfsreq_finish(struct vfs_request*, int ret, int flags, struct process *handler);
+void vfsreq_finish(struct vfs_request*, char __user *stored, int ret, int flags, struct process *handler);
static inline void vfsreq_finish_short(struct vfs_request *req, int ret) {
- vfsreq_finish(req, ret, 0, NULL);
+ vfsreq_finish(req, (void __user *)ret, ret, 0, NULL);
}
/** Try to accept an enqueued request */