From 4b1656aa37f0a05c8293ebb843774331b9bdfd91 Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Tue, 24 Dec 2013 15:00:01 +0100 Subject: [PATCH] Write the directory cluster back to the disk --- kernel/include/disks.hpp | 1 + kernel/src/disks.cpp | 10 ++++++++++ kernel/src/fat32.cpp | 6 +++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/kernel/include/disks.hpp b/kernel/include/disks.hpp index 8e9fbe40..ec40e433 100644 --- a/kernel/include/disks.hpp +++ b/kernel/include/disks.hpp @@ -58,6 +58,7 @@ const char* disk_type_to_string(disk_type type); const char* partition_type_to_string(partition_type type); bool read_sectors(const disk_descriptor& disk, uint64_t start, uint8_t count, void* destination); +bool write_sectors(const disk_descriptor& disk, uint64_t start, uint8_t count, void* destination); std::unique_heap_array partitions(const disk_descriptor& disk); bool partition_exists(const disk_descriptor& disk, uint64_t uuid); diff --git a/kernel/src/disks.cpp b/kernel/src/disks.cpp index d78911e6..8ed69524 100644 --- a/kernel/src/disks.cpp +++ b/kernel/src/disks.cpp @@ -122,6 +122,16 @@ bool disks::read_sectors(const disk_descriptor& disk, uint64_t start, uint8_t co } } +bool disks::write_sectors(const disk_descriptor& disk, uint64_t start, uint8_t count, void* destination){ + switch(disk.type){ + case disk_type::ATA: + return ata::write_sectors(*static_cast(disk.descriptor), start, count, destination); + + default: + return false; + } +} + std::unique_heap_array disks::partitions(const disk_descriptor& disk){ std::unique_ptr boot_record(new boot_record_t()); diff --git a/kernel/src/fat32.cpp b/kernel/src/fat32.cpp index 58acb445..4df91243 100644 --- a/kernel/src/fat32.cpp +++ b/kernel/src/fat32.cpp @@ -515,7 +515,11 @@ bool fat32::mkdir(dd disk, const disks::partition_descriptor& partition, const s new_directory_entry.cluster_high = 0; new_directory_entry.cluster_low = 0; - //TODO Write the sector to the disk + if(!write_sectors(disk, cluster_lba(cluster_number.second), fat_bs->sectors_per_cluster, directory_cluster.get())){ + return false; + } + + return true; } return false;