forked from Bananymous/banan-os
Kernel/LibC: Implement {,f}statvfs
This commit is contained in:
@@ -11,6 +11,18 @@ namespace Kernel
|
||||
class Ext2FS final : public FileSystem
|
||||
{
|
||||
public:
|
||||
virtual unsigned long bsize() const override;
|
||||
virtual unsigned long frsize() const override;
|
||||
virtual fsblkcnt_t blocks() const override;
|
||||
virtual fsblkcnt_t bfree() const override;
|
||||
virtual fsblkcnt_t bavail() const override;
|
||||
virtual fsfilcnt_t files() const override;
|
||||
virtual fsfilcnt_t ffree() const override;
|
||||
virtual fsfilcnt_t favail() const override;
|
||||
virtual unsigned long fsid() const override;
|
||||
virtual unsigned long flag() const override;
|
||||
virtual unsigned long namemax() const override;
|
||||
|
||||
class BlockBufferWrapper
|
||||
{
|
||||
BAN_NON_COPYABLE(BlockBufferWrapper);
|
||||
|
||||
@@ -29,6 +29,8 @@ namespace Kernel
|
||||
virtual dev_t dev() const override { return 0; }
|
||||
virtual dev_t rdev() const override { return 0; }
|
||||
|
||||
virtual const FileSystem* filesystem() const override;
|
||||
|
||||
protected:
|
||||
virtual BAN::ErrorOr<BAN::RefPtr<Inode>> find_inode_impl(BAN::StringView) override;
|
||||
virtual BAN::ErrorOr<size_t> list_next_inodes_impl(off_t, struct dirent*, size_t) override;
|
||||
|
||||
@@ -20,6 +20,18 @@ namespace Kernel
|
||||
};
|
||||
|
||||
public:
|
||||
virtual unsigned long bsize() const override;
|
||||
virtual unsigned long frsize() const override;
|
||||
virtual fsblkcnt_t blocks() const override;
|
||||
virtual fsblkcnt_t bfree() const override;
|
||||
virtual fsblkcnt_t bavail() const override;
|
||||
virtual fsfilcnt_t files() const override;
|
||||
virtual fsfilcnt_t ffree() const override;
|
||||
virtual fsfilcnt_t favail() const override;
|
||||
virtual unsigned long fsid() const override;
|
||||
virtual unsigned long flag() const override;
|
||||
virtual unsigned long namemax() const override;
|
||||
|
||||
static BAN::ErrorOr<bool> probe(BAN::RefPtr<BlockDevice>);
|
||||
static BAN::ErrorOr<BAN::RefPtr<FATFS>> create(BAN::RefPtr<BlockDevice>);
|
||||
|
||||
@@ -45,13 +57,15 @@ namespace Kernel
|
||||
|
||||
// TODO: These probably should be constant variables
|
||||
uint32_t root_sector_count() const { return BAN::Math::div_round_up<uint32_t>(m_bpb.root_entry_count * 32, m_bpb.bytes_per_sector); }
|
||||
uint32_t fat_sector_count() const { return m_bpb.fat_size16 ? m_bpb.fat_size16 : m_bpb.ext_32.fat_size32; }
|
||||
uint32_t fat_size() const { return m_bpb.fat_size16 ? m_bpb.fat_size16 : m_bpb.ext_32.fat_size32; }
|
||||
uint32_t total_sector_count() const { return m_bpb.total_sectors16 ? m_bpb.total_sectors16 : m_bpb.total_sectors32; }
|
||||
uint32_t data_sector_count() const { return total_sector_count() - (m_bpb.reserved_sector_count + (m_bpb.number_of_fats * fat_sector_count()) + root_sector_count()); }
|
||||
uint32_t data_sector_count() const { return total_sector_count() - (m_bpb.reserved_sector_count + (m_bpb.number_of_fats * fat_size()) + root_sector_count()); }
|
||||
uint32_t cluster_count() const { return data_sector_count() / m_bpb.sectors_per_cluster; }
|
||||
uint32_t first_data_sector() const { return m_bpb.reserved_sector_count + (m_bpb.number_of_fats * fat_sector_count()) + root_sector_count(); }
|
||||
uint32_t first_data_sector() const { return m_bpb.reserved_sector_count + (m_bpb.number_of_fats * fat_size()) + root_sector_count(); }
|
||||
uint32_t first_fat_sector() const { return m_bpb.reserved_sector_count; }
|
||||
|
||||
uint8_t bits_per_fat_entry() const { return static_cast<uint8_t>(m_type); }
|
||||
|
||||
private:
|
||||
BAN::RefPtr<BlockDevice> m_block_device;
|
||||
BAN::RefPtr<FATInode> m_root_inode;
|
||||
|
||||
@@ -29,6 +29,8 @@ namespace Kernel
|
||||
virtual dev_t dev() const override { return 0; }
|
||||
virtual dev_t rdev() const override { return 0; }
|
||||
|
||||
virtual const FileSystem* filesystem() const override;
|
||||
|
||||
const FAT::DirectoryEntry& entry() const { return m_entry; }
|
||||
|
||||
protected:
|
||||
|
||||
@@ -9,6 +9,18 @@ namespace Kernel
|
||||
class FileSystem : public BAN::RefCounted<FileSystem>
|
||||
{
|
||||
public:
|
||||
virtual unsigned long bsize() const = 0;
|
||||
virtual unsigned long frsize() const = 0;
|
||||
virtual fsblkcnt_t blocks() const = 0;
|
||||
virtual fsblkcnt_t bfree() const = 0;
|
||||
virtual fsblkcnt_t bavail() const = 0;
|
||||
virtual fsfilcnt_t files() const = 0;
|
||||
virtual fsfilcnt_t ffree() const = 0;
|
||||
virtual fsfilcnt_t favail() const = 0;
|
||||
virtual unsigned long fsid() const = 0;
|
||||
virtual unsigned long flag() const = 0;
|
||||
virtual unsigned long namemax() const = 0;
|
||||
|
||||
virtual ~FileSystem() {}
|
||||
|
||||
static BAN::ErrorOr<BAN::RefPtr<FileSystem>> from_block_device(BAN::RefPtr<BlockDevice>);
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
namespace Kernel
|
||||
{
|
||||
|
||||
class FileSystem;
|
||||
|
||||
class FileBackedRegion;
|
||||
class SharedFileData;
|
||||
|
||||
@@ -86,6 +88,8 @@ namespace Kernel
|
||||
virtual bool is_pipe() const { return false; }
|
||||
virtual bool is_tty() const { return false; }
|
||||
|
||||
virtual const FileSystem* filesystem() const = 0;
|
||||
|
||||
// Directory API
|
||||
BAN::ErrorOr<BAN::RefPtr<Inode>> find_inode(BAN::StringView);
|
||||
BAN::ErrorOr<size_t> list_next_inodes(off_t, struct dirent* list, size_t list_size);
|
||||
|
||||
@@ -30,6 +30,8 @@ namespace Kernel
|
||||
virtual dev_t dev() const override { return 0; } // FIXME
|
||||
virtual dev_t rdev() const override { return 0; } // FIXME
|
||||
|
||||
virtual const FileSystem* filesystem() const override { return nullptr; }
|
||||
|
||||
protected:
|
||||
virtual BAN::ErrorOr<size_t> read_impl(off_t, BAN::ByteSpan) override;
|
||||
virtual BAN::ErrorOr<size_t> write_impl(off_t, BAN::ConstByteSpan) override;
|
||||
|
||||
@@ -44,6 +44,8 @@ namespace Kernel
|
||||
dev_t dev() const final override { ASSERT_NOT_REACHED(); }
|
||||
dev_t rdev() const final override { ASSERT_NOT_REACHED(); }
|
||||
|
||||
const FileSystem* filesystem() const final override { return nullptr; }
|
||||
|
||||
protected:
|
||||
Socket(const Info& info)
|
||||
: m_info(info)
|
||||
|
||||
@@ -40,6 +40,19 @@ namespace Kernel
|
||||
static constexpr size_t no_page_limit = SIZE_MAX;
|
||||
|
||||
public:
|
||||
// FIXME: basically all of these :)
|
||||
virtual unsigned long bsize() const override { return PAGE_SIZE; }
|
||||
virtual unsigned long frsize() const override { return PAGE_SIZE; }
|
||||
virtual fsblkcnt_t blocks() const override { return m_max_pages; }
|
||||
virtual fsblkcnt_t bfree() const override { return m_max_pages - m_used_pages; }
|
||||
virtual fsblkcnt_t bavail() const override { return m_max_pages - m_used_pages; }
|
||||
virtual fsfilcnt_t files() const override { return PAGE_SIZE * blocks() / sizeof(TmpDirectoryEntry); }
|
||||
virtual fsfilcnt_t ffree() const override { return PAGE_SIZE * bfree() / sizeof(TmpDirectoryEntry); }
|
||||
virtual fsfilcnt_t favail() const override { return PAGE_SIZE * bavail() / sizeof(TmpDirectoryEntry); }
|
||||
virtual unsigned long fsid() const override { return reinterpret_cast<uintptr_t>(this); }
|
||||
virtual unsigned long flag() const override { return 0; }
|
||||
virtual unsigned long namemax() const override { return PAGE_SIZE; }
|
||||
|
||||
static BAN::ErrorOr<TmpFileSystem*> create(size_t max_pages, mode_t, uid_t, gid_t);
|
||||
~TmpFileSystem();
|
||||
|
||||
|
||||
@@ -42,6 +42,8 @@ namespace Kernel
|
||||
static BAN::ErrorOr<BAN::RefPtr<TmpInode>> create_from_existing(TmpFileSystem&, ino_t, const TmpInodeInfo&);
|
||||
~TmpInode();
|
||||
|
||||
virtual const FileSystem* filesystem() const override;
|
||||
|
||||
protected:
|
||||
TmpInode(TmpFileSystem&, ino_t, const TmpInodeInfo&);
|
||||
|
||||
|
||||
@@ -8,9 +8,22 @@
|
||||
namespace Kernel
|
||||
{
|
||||
|
||||
class VirtualFileSystem : public FileSystem
|
||||
class VirtualFileSystem final : public FileSystem
|
||||
{
|
||||
public:
|
||||
virtual unsigned long bsize() const override { return 0; }
|
||||
virtual unsigned long frsize() const override { return 0; }
|
||||
virtual fsblkcnt_t blocks() const override { return 0; }
|
||||
virtual fsblkcnt_t bfree() const override { return 0; }
|
||||
virtual fsblkcnt_t bavail() const override { return 0; }
|
||||
virtual fsfilcnt_t files() const override { return 0; }
|
||||
virtual fsfilcnt_t ffree() const override { return 0; }
|
||||
virtual fsfilcnt_t favail() const override { return 0; }
|
||||
virtual unsigned long fsid() const override { return 0; }
|
||||
virtual unsigned long flag() const override { return 0; }
|
||||
virtual unsigned long namemax() const override { return 0; }
|
||||
|
||||
|
||||
static void initialize(BAN::StringView);
|
||||
static VirtualFileSystem& get();
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#include <sys/mman.h>
|
||||
#include <sys/select.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/statvfs.h>
|
||||
#include <sys/time.h>
|
||||
#include <termios.h>
|
||||
|
||||
@@ -147,6 +148,7 @@ namespace Kernel
|
||||
BAN::ErrorOr<long> sys_fsync(int fd);
|
||||
|
||||
BAN::ErrorOr<long> sys_fstatat(int fd, const char* path, struct stat* buf, int flag);
|
||||
BAN::ErrorOr<long> sys_fstatvfsat(int fd, const char* path, struct statvfs* buf);
|
||||
|
||||
BAN::ErrorOr<long> sys_realpath(const char* path, char* buffer);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user