summaryrefslogtreecommitdiff
path: root/kernel/fs/shm.c
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2024-04-11 17:22:00 +0200
committerAnton Kling <anton@kling.gg>2024-04-11 17:23:39 +0200
commitca082f686fd2dc7ee6f0284421f6212d6d4acee8 (patch)
tree493b1047661174816f0d1d300952e40e2846b24b /kernel/fs/shm.c
parente25a47fcc4db09ab9b845a691297da67243e6049 (diff)
bug fixes
Diffstat (limited to 'kernel/fs/shm.c')
-rw-r--r--kernel/fs/shm.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/kernel/fs/shm.c b/kernel/fs/shm.c
index 7eec825..2a2995b 100644
--- a/kernel/fs/shm.c
+++ b/kernel/fs/shm.c
@@ -54,9 +54,17 @@ vfs_vm_object_t *shm_get_vm_object(u64 length, u64 offset, vfs_fd_t *fd) {
int shm_ftruncate(vfs_fd_t *fd, size_t length) {
vfs_vm_object_t *p = fd->inode->internal_object;
+ if (p->real_pointer) {
+ u8 *mem_region = p->real_pointer;
+ mmu_free_address_range(mem_region, align_page(p->size), NULL);
+ }
+
+ p->real_pointer = mmu_find_unallocated_virtual_range(NULL, length);
+ mmu_allocate_region(p->real_pointer, length, MMU_FLAG_RW, NULL);
p->size = length;
- p->real_pointer = krealloc(p->real_pointer, length + 0x2000);
- p->virtual_object = align_page(p->real_pointer);
+
+ p->virtual_object = p->real_pointer;
+
int n = (uintptr_t)align_page((void *)(u32)length) / 0x1000;
p->object = krealloc(p->object, sizeof(void *) * n);
for (int i = 0; i < n; i++) {
@@ -72,8 +80,6 @@ int shm_open(const char *name, int oflag, mode_t mode) {
vfs_vm_object_t *internal_object =
hashmap_get_entry(shared_memory_objects, name);
if (!internal_object) {
- // if (!(oflag & O_CREAT))
- // return -EMFILE;
internal_object = kcalloc(1, sizeof(vfs_vm_object_t));
hashmap_add_entry(shared_memory_objects, name, internal_object, NULL, 0);
}