1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-23 13:17:36 +00:00

Kernel: Closing a file descriptor should not always close the file

When there is more than one file descriptor for a file closing
one of them should not close the underlying file.

Previously this relied on the file's ref_count() but at least
for sockets this didn't work reliably.
This commit is contained in:
Gunnar Beutner 2021-04-30 10:33:33 +02:00 committed by Andreas Kling
parent cae33305b0
commit 7a1d09ef1a
3 changed files with 17 additions and 3 deletions

View file

@ -43,4 +43,15 @@ KResultOr<Region*> File::mmap(Process&, FileDescription&, const Range&, u64, int
return ENODEV; return ENODEV;
} }
KResult File::attach(FileDescription&)
{
m_attach_count++;
return KSuccess;
}
void File::detach(FileDescription&)
{
m_attach_count--;
}
} }

View file

@ -82,8 +82,8 @@ public:
virtual bool can_read(const FileDescription&, size_t) const = 0; virtual bool can_read(const FileDescription&, size_t) const = 0;
virtual bool can_write(const FileDescription&, size_t) const = 0; virtual bool can_write(const FileDescription&, size_t) const = 0;
virtual KResult attach(FileDescription&) { return KSuccess; } virtual KResult attach(FileDescription&);
virtual void detach(FileDescription&) { } virtual void detach(FileDescription&);
virtual void did_seek(FileDescription&, off_t) { } virtual void did_seek(FileDescription&, off_t) { }
virtual KResultOr<size_t> read(FileDescription&, u64, UserOrKernelBuffer&, size_t) = 0; virtual KResultOr<size_t> read(FileDescription&, u64, UserOrKernelBuffer&, size_t) = 0;
virtual KResultOr<size_t> write(FileDescription&, u64, const UserOrKernelBuffer&, size_t) = 0; virtual KResultOr<size_t> write(FileDescription&, u64, const UserOrKernelBuffer&, size_t) = 0;
@ -112,6 +112,8 @@ public:
virtual FileBlockCondition& block_condition() { return m_block_condition; } virtual FileBlockCondition& block_condition() { return m_block_condition; }
size_t attach_count() const { return m_attach_count; }
protected: protected:
File(); File();
@ -138,6 +140,7 @@ private:
} }
FileBlockCondition m_block_condition; FileBlockCondition m_block_condition;
size_t m_attach_count { 0 };
}; };
} }

View file

@ -288,7 +288,7 @@ MasterPTY* FileDescription::master_pty()
KResult FileDescription::close() KResult FileDescription::close()
{ {
if (m_file->ref_count() > 1) if (m_file->attach_count() > 0)
return KSuccess; return KSuccess;
return m_file->close(); return m_file->close();
} }