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

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.
This commit is contained in:
Liav A 2021-12-23 20:08:18 +02:00 committed by Andreas Kling
parent 6d14940053
commit 9eb08bdb0f
24 changed files with 70 additions and 52 deletions

View file

@ -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)

View file

@ -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; }

View file

@ -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);
}

View file

@ -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 };
};
}