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

Implement utime() along with a naive /bin/touch.

This synchronous approach to inodes is silly, obviously. I need to rework
it so that the in-memory CoreInode object is the canonical inode, and then
we just need a sync() that flushes pending changes to disk.
This commit is contained in:
Andreas Kling 2018-12-19 21:14:55 +01:00
parent e03d341615
commit 038d8641f9
22 changed files with 122 additions and 22 deletions

View file

@ -716,16 +716,18 @@ bool Ext2FS::modify_link_count(InodeIndex inode, int delta)
return write_ext2_inode(inode, *e2inode);
}
bool Ext2FS::set_mtime(InodeIdentifier inode, dword timestamp)
int Ext2FS::set_atime_and_mtime(InodeIdentifier inode, dword atime, dword mtime)
{
ASSERT(inode.fsid() == id());
auto e2inode = lookup_ext2_inode(inode.index());
if (!e2inode)
return false;
return -EIO;
kprintf("changing inode %u mtime from %u to %u\n", inode.index(), e2inode->i_mtime, timestamp);
e2inode->i_mtime = timestamp;
dbgprintf("changing inode %u atime from %u to %u\n", inode.index(), e2inode->i_atime, atime);
dbgprintf("changing inode %u mtime from %u to %u\n", inode.index(), e2inode->i_mtime, mtime);
e2inode->i_mtime = mtime;
e2inode->i_atime = atime;
return write_ext2_inode(inode.index(), *e2inode);
}

View file

@ -72,7 +72,7 @@ private:
virtual InodeIdentifier root_inode() const override;
virtual bool write_inode(InodeIdentifier, const ByteBuffer&) override;
virtual InodeMetadata inode_metadata(InodeIdentifier) const override;
virtual bool set_mtime(InodeIdentifier, dword timestamp) override;
virtual int set_atime_and_mtime(InodeIdentifier, dword atime, dword mtime) override;
virtual InodeIdentifier create_inode(InodeIdentifier parentInode, const String& name, Unix::mode_t, unsigned size, int& error) override;
virtual ssize_t read_inode_bytes(InodeIdentifier, Unix::off_t offset, size_t count, byte* buffer, FileDescriptor*) const override;
virtual InodeIdentifier create_directory(InodeIdentifier parentInode, const String& name, Unix::mode_t, int& error) override;

View file

@ -288,3 +288,17 @@ FileDescriptor::FileDescriptor(FIFO& fifo, FIFO::Direction direction)
{
m_fifo->open(direction);
}
int FileDescriptor::set_atime_and_mtime(time_t atime, time_t mtime)
{
if (!m_vnode || !m_vnode->core_inode())
return -EBADF;
return m_vnode->core_inode()->set_atime_and_mtime(atime, mtime);
}
int FileDescriptor::set_ctime(time_t ctime)
{
(void) ctime;
// FIXME: Implement.
ASSERT_NOT_REACHED();
}

View file

@ -64,13 +64,15 @@ public:
ByteBuffer& generator_cache() { return m_generator_cache; }
int set_atime_and_mtime(time_t, time_t);
int set_ctime(time_t);
private:
friend class VFS;
explicit FileDescriptor(RetainPtr<Vnode>&&);
FileDescriptor(FIFO&, FIFO::Direction);
RetainPtr<Vnode> m_vnode;
RetainPtr<CoreInode> m_inode;
Unix::off_t m_current_offset { 0 };

View file

@ -127,3 +127,8 @@ FS::DirectoryEntry::DirectoryEntry(const char* n, size_t nl, InodeIdentifier i,
CoreInode::~CoreInode()
{
}
int CoreInode::set_atime_and_mtime(Unix::time_t atime, Unix::time_t mtime)
{
return fs().set_atime_and_mtime(identifier(), atime, mtime);
}

View file

@ -44,7 +44,7 @@ public:
byte fileType { 0 };
};
virtual bool set_mtime(InodeIdentifier, dword timestamp) = 0;
virtual int set_atime_and_mtime(InodeIdentifier, dword atime, dword mtime) = 0;
virtual InodeIdentifier create_inode(InodeIdentifier parentInode, const String& name, Unix::mode_t, unsigned size, int& error) = 0;
virtual InodeIdentifier create_directory(InodeIdentifier parentInode, const String& name, Unix::mode_t, int& error) = 0;
@ -85,6 +85,8 @@ public:
virtual InodeIdentifier lookup(const String& name) = 0;
virtual String reverse_lookup(InodeIdentifier) = 0;
int set_atime_and_mtime(Unix::time_t atime, Unix::time_t mtime);
protected:
CoreInode(FS& fs, unsigned index)
: m_fs(fs)

View file

@ -146,11 +146,12 @@ InodeMetadata SynthFS::inode_metadata(InodeIdentifier inode) const
return (*it).value->m_metadata;
}
bool SynthFS::set_mtime(InodeIdentifier, dword timestamp)
int SynthFS::set_atime_and_mtime(InodeIdentifier, dword atime, dword mtime)
{
(void) timestamp;
(void) atime;
(void) mtime;
kprintf("FIXME: Implement SyntheticFileSystem::setModificationTime().\n");
return false;
return -ENOTIMPL;
}
InodeIdentifier SynthFS::create_inode(InodeIdentifier parentInode, const String& name, Unix::mode_t mode, unsigned size, int& error)

View file

@ -16,7 +16,7 @@ public:
virtual InodeIdentifier root_inode() const override;
virtual bool write_inode(InodeIdentifier, const ByteBuffer&) override;
virtual InodeMetadata inode_metadata(InodeIdentifier) const override;
virtual bool set_mtime(InodeIdentifier, dword timestamp) override;
virtual int set_atime_and_mtime(InodeIdentifier, dword atime, dword mtime) override;
virtual InodeIdentifier create_inode(InodeIdentifier parentInode, const String& name, Unix::mode_t, unsigned size, int& error) override;
virtual ssize_t read_inode_bytes(InodeIdentifier, Unix::off_t offset, size_t count, byte* buffer, FileDescriptor*) const override;
virtual InodeIdentifier create_directory(InodeIdentifier parentInode, const String& name, Unix::mode_t, int& error) override;

View file

@ -264,6 +264,11 @@ typedef signed_qword off_t;
typedef ::time_t time_t;
#endif
struct utimbuf {
time_t actime;
time_t modtime;
};
typedef dword blksize_t;
typedef dword blkcnt_t;

View file

@ -252,15 +252,6 @@ void VFS::traverse_directory_inode(CoreInode& dir_inode, Function<bool(const FS:
});
}
bool VFS::touch(const String& path)
{
int error;
auto inode = resolve_path(path, root_inode_id(), error);
if (!inode.is_valid())
return false;
return inode.fs()->set_mtime(inode, ktime(nullptr));
}
RetainPtr<FileDescriptor> VFS::open(CharacterDevice& device, int options)
{
// FIXME: Respect options.