3#include "pedigree/kernel/LockGuard.h"
4#include "pedigree/kernel/process/TerminationDeferral.h"
5#include "pedigree/kernel/syscallError.h"
6#include "pedigree/kernel/time/Time.h"
7#include "pedigree/kernel/utilities/assert.h"
12class MemFdFilesystem final :
public RamFs {
15 setProcessOwnership(
false);
19MemFdFilesystem filesystem;
20uintptr_t nextInode = 0;
23MemFdFile::MemFdFile(
const String& name,
bool allowSealing,
size_t uid,
size_t gid)
24 :
RamFile(name, __atomic_add_fetch(&nextInode, uintptr_t(1), __ATOMIC_RELAXED), &filesystem,
26 m_Seals(allowSealing ? 0 : LinuxMemFd::Seal) {
31 initial.permissions = 0777;
32 initial.accessed = initial.modified = initial.changed = Time::getTime();
33 updateAttributes(initial, Owner |
Group | Permissions | AccessTime | ModifyTime | ChangeTime);
37 return file && file->getFilesystem() == &filesystem ?
static_cast<MemFdFile*
>(file) : nullptr;
41 Attributes attributes = RamFile::getAttributes();
46int MemFdFile::getSeals() {
48 return static_cast<int>(m_Seals);
51int MemFdFile::addSeals(
unsigned seals) {
52 if (seals & ~LinuxMemFd::AllSeals) {
53 SYSCALL_ERROR(InvalidArgument);
64 if (previous & LinuxMemFd::Seal) {
65 SYSCALL_ERROR(NotEnoughPermissions);
71 if ((seals & LinuxMemFd::Write) && !(previous & LinuxMemFd::Write) &&
73 SYSCALL_ERROR(DeviceBusy);
85 if (shared && (m_Seals & (LinuxMemFd::Write | LinuxMemFd::FutureWrite))) {
87 SYSCALL_ERROR(NotEnoughPermissions);
95bool MemFdFile::prepareWrite(uint64_t location, uint64_t size) {
98 if (m_Seals & (LinuxMemFd::Write | LinuxMemFd::FutureWrite)) {
99 SYSCALL_ERROR(NotEnoughPermissions);
102 const uint64_t currentSize = getSize();
103 if ((m_Seals & LinuxMemFd::Grow) && (location > currentSize || size > currentSize - location)) {
104 SYSCALL_ERROR(NotEnoughPermissions);
107 return RamFile::prepareWrite(location, size);
110bool MemFdFile::allowResize(
size_t oldSize,
size_t newSize) {
111 if ((newSize < oldSize && (m_Seals & LinuxMemFd::Shrink)) ||
112 (newSize > oldSize && (m_Seals & LinuxMemFd::Grow))) {
113 SYSCALL_ERROR(NotEnoughPermissions);
Memory-mapped file interface.
bool allowMapping(bool shared, bool writeRequested, bool &mayWrite) override
static MemoryMapManager & instance()
bool hasSharedWriteCapability(File *backing)