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:
parent
6d14940053
commit
9eb08bdb0f
24 changed files with 70 additions and 52 deletions
|
@ -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)
|
||||
|
|
|
@ -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; }
|
||||
|
||||
|
|
16
Kernel/FileSystem/DeviceFileTypes.h
Normal file
16
Kernel/FileSystem/DeviceFileTypes.h
Normal 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);
|
||||
|
||||
}
|
|
@ -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 };
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue