diff options
author | Liav A <liavalb@gmail.com> | 2021-12-23 20:08:18 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-12-23 23:02:39 +0100 |
commit | 9eb08bdb0f7460eb9874a5d16f6f3808f3d8a8f0 (patch) | |
tree | 79c20875f3cd0977fc809964f2e5f7a771ce1428 /Kernel/FileSystem | |
parent | 6d149400534643d2d4549853b257c136c3a8d47c (diff) | |
download | serenity-9eb08bdb0f7460eb9874a5d16f6f3808f3d8a8f0.zip |
Kernel: Make major and minor numbers to be DistinctNumerics
This helps avoid confusion in general, and make constructors, methods
and code patterns much more clean and understandable.
Diffstat (limited to 'Kernel/FileSystem')
-rw-r--r-- | Kernel/FileSystem/DevTmpFS.cpp | 8 | ||||
-rw-r--r-- | Kernel/FileSystem/DevTmpFS.h | 8 | ||||
-rw-r--r-- | Kernel/FileSystem/DeviceFileTypes.h | 16 | ||||
-rw-r--r-- | Kernel/FileSystem/InodeMetadata.h | 13 |
4 files changed, 31 insertions, 14 deletions
diff --git a/Kernel/FileSystem/DevTmpFS.cpp b/Kernel/FileSystem/DevTmpFS.cpp index 26cb558b2d..420ccf4ca3 100644 --- a/Kernel/FileSystem/DevTmpFS.cpp +++ b/Kernel/FileSystem/DevTmpFS.cpp @@ -48,7 +48,7 @@ DevTmpFSInode::DevTmpFSInode(DevTmpFS& fs) { } -DevTmpFSInode::DevTmpFSInode(DevTmpFS& fs, unsigned major_number, unsigned minor_number) +DevTmpFSInode::DevTmpFSInode(DevTmpFS& fs, MajorNumber major_number, MinorNumber minor_number) : Inode(fs, fs.allocate_inode_index()) , m_major_number(major_number) , m_minor_number(minor_number) @@ -263,8 +263,8 @@ ErrorOr<NonnullRefPtr<Inode>> DevTmpFSDirectoryInode::create_child(StringView na } if (metadata.is_device()) { auto name_kstring = TRY(KString::try_create(name)); - unsigned major = major_from_encoded_device(device_mode); - unsigned minor = minor_from_encoded_device(device_mode); + auto major = major_from_encoded_device(device_mode); + auto minor = minor_from_encoded_device(device_mode); auto new_device_inode = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) DevTmpFSDeviceInode(fs(), major, minor, is_block_device(mode), move(name_kstring)))); TRY(new_device_inode->chmod(mode)); m_nodes.append(*new_device_inode); @@ -298,7 +298,7 @@ ErrorOr<void> DevTmpFSRootDirectoryInode::chown(UserID, GroupID) return EPERM; } -DevTmpFSDeviceInode::DevTmpFSDeviceInode(DevTmpFS& fs, unsigned major_number, unsigned minor_number, bool block_device, NonnullOwnPtr<KString> name) +DevTmpFSDeviceInode::DevTmpFSDeviceInode(DevTmpFS& fs, MajorNumber major_number, MinorNumber minor_number, bool block_device, NonnullOwnPtr<KString> name) : DevTmpFSInode(fs, major_number, minor_number) , m_name(move(name)) , m_block_device(block_device) diff --git a/Kernel/FileSystem/DevTmpFS.h b/Kernel/FileSystem/DevTmpFS.h index 1c8599461b..c3d872fc4a 100644 --- a/Kernel/FileSystem/DevTmpFS.h +++ b/Kernel/FileSystem/DevTmpFS.h @@ -47,7 +47,7 @@ public: protected: explicit DevTmpFSInode(DevTmpFS&); - DevTmpFSInode(DevTmpFS&, unsigned, unsigned); + DevTmpFSInode(DevTmpFS&, MajorNumber, MinorNumber); virtual ErrorOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override; virtual ErrorOr<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override; virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView name) override; @@ -64,8 +64,8 @@ protected: mode_t m_mode { 0600 }; UserID m_uid { 0 }; GroupID m_gid { 0 }; - const unsigned m_major_number { 0 }; - const unsigned m_minor_number { 0 }; + const MajorNumber m_major_number { 0 }; + const MinorNumber m_minor_number { 0 }; enum class Type { BlockDevice, @@ -90,7 +90,7 @@ public: virtual ~DevTmpFSDeviceInode() override; private: - DevTmpFSDeviceInode(DevTmpFS&, unsigned, unsigned, bool, NonnullOwnPtr<KString> name); + DevTmpFSDeviceInode(DevTmpFS&, MajorNumber, MinorNumber, bool, NonnullOwnPtr<KString> name); // ^DevTmpFSInode virtual Type node_type() const override { return m_block_device ? Type::BlockDevice : Type::CharacterDevice; } diff --git a/Kernel/FileSystem/DeviceFileTypes.h b/Kernel/FileSystem/DeviceFileTypes.h new file mode 100644 index 0000000000..aba01e973b --- /dev/null +++ b/Kernel/FileSystem/DeviceFileTypes.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2021, Liav A. <liavalb@hotmail.co.il> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include <AK/Types.h> + +namespace Kernel { + +TYPEDEF_DISTINCT_ORDERED_ID(unsigned, MajorNumber); +TYPEDEF_DISTINCT_ORDERED_ID(unsigned, MinorNumber); + +} diff --git a/Kernel/FileSystem/InodeMetadata.h b/Kernel/FileSystem/InodeMetadata.h index 95bfba8367..1dc23b6d72 100644 --- a/Kernel/FileSystem/InodeMetadata.h +++ b/Kernel/FileSystem/InodeMetadata.h @@ -8,6 +8,7 @@ #include <AK/Error.h> #include <AK/Span.h> +#include <Kernel/FileSystem/DeviceFileTypes.h> #include <Kernel/FileSystem/InodeIdentifier.h> #include <Kernel/Forward.h> #include <Kernel/UnixTypes.h> @@ -16,12 +17,12 @@ namespace Kernel { class Process; -constexpr u32 encoded_device(unsigned major, unsigned minor) +constexpr u64 encoded_device(MajorNumber major, MinorNumber minor) { - return (minor & 0xff) | (major << 8) | ((minor & ~0xff) << 12); + return (minor.value() & 0xff) | (major.value() << 8) | ((minor.value() & ~0xff) << 12); } -static inline unsigned int major_from_encoded_device(dev_t dev) { return (dev & 0xfff00u) >> 8u; } -static inline unsigned int minor_from_encoded_device(dev_t dev) { return (dev & 0xffu) | ((dev >> 12u) & 0xfff00u); } +static inline MajorNumber major_from_encoded_device(dev_t dev) { return (dev & 0xfff00u) >> 8u; } +static inline MinorNumber minor_from_encoded_device(dev_t dev) { return (dev & 0xffu) | ((dev >> 12u) & 0xfff00u); } inline bool is_directory(mode_t mode) { return (mode & S_IFMT) == S_IFDIR; } inline bool is_character_device(mode_t mode) { return (mode & S_IFMT) == S_IFCHR; } @@ -122,8 +123,8 @@ struct InodeMetadata { time_t dtime { 0 }; blkcnt_t block_count { 0 }; blksize_t block_size { 0 }; - unsigned major_device { 0 }; - unsigned minor_device { 0 }; + MajorNumber major_device { 0 }; + MinorNumber minor_device { 0 }; }; } |