mirror of
https://github.com/RGBCube/serenity
synced 2025-07-23 12:47:41 +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:
parent
cae33305b0
commit
7a1d09ef1a
3 changed files with 17 additions and 3 deletions
|
@ -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--;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 };
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue