summaryrefslogtreecommitdiff
path: root/Kernel/FileSystem
diff options
context:
space:
mode:
authorLiav A <liavalb@gmail.com>2021-12-23 20:08:18 +0200
committerAndreas Kling <kling@serenityos.org>2021-12-23 23:02:39 +0100
commit9eb08bdb0f7460eb9874a5d16f6f3808f3d8a8f0 (patch)
tree79c20875f3cd0977fc809964f2e5f7a771ce1428 /Kernel/FileSystem
parent6d149400534643d2d4549853b257c136c3a8d47c (diff)
downloadserenity-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.cpp8
-rw-r--r--Kernel/FileSystem/DevTmpFS.h8
-rw-r--r--Kernel/FileSystem/DeviceFileTypes.h16
-rw-r--r--Kernel/FileSystem/InodeMetadata.h13
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 };
};
}