MOS Source Code
Loading...
Searching...
No Matches
memfd.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-3.0-or-later
2
3#include "mos/ipc/memfd.hpp"
4
10#include "mos/io/io.hpp"
11#include "mos/misc/setup.hpp"
12#include "mos/syslog/printk.hpp"
13#include "mos/types.hpp"
14
15#include <mos/allocator.hpp>
17#include <mos_stdlib.hpp>
18#include <stdio.h>
19
20struct memfd_t : mos::NamedType<"memfd">
21{
22 int unused;
23};
24
26
28
29static void memfd_file_release(file_t *file)
30{
31 dentry_detach(file->dentry);
32}
33
34static const file_ops_t memfd_file_ops = {
35 .read = vfs_generic_read,
36 .write = vfs_generic_write,
37 .release = memfd_file_release,
38};
39
41{
43 if (!memfd)
44 {
45 pr_emerg("Failed to allocate memfd");
46 return -ENOMEM;
47 }
48
50
51 if (!memfd_root_dentry->inode->ops->newfile(memfd_root_dentry->inode, dentry, FILE_TYPE_REGULAR, (PERM_READ | PERM_WRITE) & PERM_OWNER))
52 {
53 pr_emerg("Failed to create file for memfd");
54 delete memfd;
55 delete dentry;
56 return -ENOMEM;
57 }
58
59 auto file = vfs_do_open_dentry(dentry, true, true, true, false, false);
60 if (file.isErr())
61 {
62 pr_emerg("Failed to open file for memfd");
63 delete memfd;
64 delete dentry;
65 return file.getErr();
66 }
67
69 file->private_data = memfd;
70 file->dentry->inode->file_ops = &memfd_file_ops;
71 inode_unlink(memfd_root_dentry->inode, file->dentry);
72 return &file->io;
73}
74
75static void memfd_init()
76{
77 const auto result = fs_tmpfs.mount(&fs_tmpfs, "none", NULL);
78 if (result.isErr())
79 {
80 pr_emerg("Failed to mount tmpfs for memfd");
81 return;
82 }
83
84 memfd_root_dentry = result.get();
86 {
87 pr_emerg("Failed to mount memfd filesystem");
88 return;
89 }
90
91 memfd_root_dentry->is_mountpoint = true;
94}
95
#define PERM_WRITE
Definition fs_types.h:58
#define PERM_READ
Definition fs_types.h:57
#define PERM_OWNER
Definition fs_types.h:54
@ FILE_TYPE_REGULAR
Definition fs_types.h:15
void dentry_detach(dentry_t *d)
Detach the inode from a dentry.
Definition dentry.cpp:319
dentry_t * dentry_ref(dentry_t *dentry)
Increment the reference count of a dentry.
PtrResult< file_t > vfs_do_open_dentry(dentry_t *entry, bool created, bool read, bool write, bool exec, bool truncate)
Open an directory dentry.
Definition vfs.cpp:404
bool inode_unlink(inode_t *dir, dentry_t *dentry)
Unlink a dentry from its parent inode.
Definition inode.cpp:80
PtrResult< io_t > memfd_create(const char *name)
Definition memfd.cpp:40
static dentry_t * memfd_root_dentry
Definition memfd.cpp:27
static void memfd_file_release(file_t *file)
Definition memfd.cpp:29
static void memfd_init()
Definition memfd.cpp:75
static const file_ops_t memfd_file_ops
Definition memfd.cpp:34
filesystem_t fs_tmpfs
T * create(Args &&...args)
Definition allocator.hpp:10
#define NULL
Definition pb_syshdr.h:46
#define pr_emerg(fmt,...)
Definition printk.hpp:39
#define MOS_INIT(_comp, _fn)
Definition setup.hpp:38
const char * name
Definition slab.cpp:35
dentry_t * dentry
int unused
Definition memfd.cpp:22
ssize_t vfs_generic_write(const file_t *file, const void *buf, size_t size, off_t offset)
dentry_t * dentry_get_from_parent(superblock_t *sb, dentry_t *parent, mos::string_view name)
Create a new dentry with the given name and parent.
Definition vfs_utils.cpp:37
ssize_t vfs_generic_read(const file_t *file, void *buf, size_t size, off_t offset)
Definition vfs_utils.cpp:93