diff --git a/Kernel/FileSystem/DevFS.cpp b/Kernel/FileSystem/DevFS.cpp index 4321f92218..48534b9406 100644 --- a/Kernel/FileSystem/DevFS.cpp +++ b/Kernel/FileSystem/DevFS.cpp @@ -30,8 +30,11 @@ DevFS::DevFS() void DevFS::notify_new_device(Device& device) { + auto name = KString::try_create(device.device_name()); + VERIFY(name); + Locker locker(m_lock); - auto new_device_inode = adopt_ref(*new DevFSDeviceInode(*this, device)); + auto new_device_inode = adopt_ref(*new DevFSDeviceInode(*this, device, name.release_nonnull())); m_nodes.append(new_device_inode); m_root_inode->m_devices.append(new_device_inode); } @@ -335,14 +338,17 @@ KResultOr DevFSRootDirectoryInode::directory_entry_count() const return m_devices.size() + DevFSDirectoryInode::directory_entry_count().value(); } -DevFSDeviceInode::DevFSDeviceInode(DevFS& fs, const Device& device) +DevFSDeviceInode::DevFSDeviceInode(DevFS& fs, Device const& device, NonnullOwnPtr name) : DevFSInode(fs) , m_attached_device(device) + , m_name(move(name)) { } + DevFSDeviceInode::~DevFSDeviceInode() { } + KResult DevFSDeviceInode::chown(uid_t uid, gid_t gid) { Locker locker(m_inode_lock); @@ -353,10 +359,7 @@ KResult DevFSDeviceInode::chown(uid_t uid, gid_t gid) StringView DevFSDeviceInode::name() const { - Locker locker(m_inode_lock); - if (m_cached_name.is_null() || m_cached_name.is_empty()) - const_cast(*this).m_cached_name = m_attached_device->device_name(); - return m_cached_name; + return m_name->view(); } KResultOr DevFSDeviceInode::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, FileDescription* description) const diff --git a/Kernel/FileSystem/DevFS.h b/Kernel/FileSystem/DevFS.h index a0782f6ac9..4ffd625269 100644 --- a/Kernel/FileSystem/DevFS.h +++ b/Kernel/FileSystem/DevFS.h @@ -73,8 +73,7 @@ public: virtual ~DevFSDeviceInode() override; private: - String determine_name() const; - DevFSDeviceInode(DevFS&, const Device&); + DevFSDeviceInode(DevFS&, Device const&, NonnullOwnPtr name); // ^Inode virtual KResultOr read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override; virtual InodeMetadata metadata() const override; @@ -82,7 +81,7 @@ private: virtual KResult chown(uid_t, gid_t) override; NonnullRefPtr m_attached_device; - String m_cached_name; + NonnullOwnPtr m_name; uid_t m_uid { 0 }; gid_t m_gid { 0 };