diff --git a/Cache/BlockCache.cpp b/Cache/BlockCache.cpp index 24f80d7..f9327fa 100644 --- a/Cache/BlockCache.cpp +++ b/Cache/BlockCache.cpp @@ -58,3 +58,18 @@ BlockCache *BlockCache::Create(BlockDevice *device) return device->createBlockCache(); } + + +void BlockCache::zeroBlock(unsigned block) +{ + /* + void *address = acquire(block); + std::memset(address, 0, 512); + release(block, true); + */ + + uint8_t buffer[512]; + + std::memset(buffer, 0, 512); + write(block, buffer); +} diff --git a/Cache/BlockCache.h b/Cache/BlockCache.h index 1ee6d40..c4587d1 100644 --- a/Cache/BlockCache.h +++ b/Cache/BlockCache.h @@ -36,6 +36,9 @@ public: virtual void release(unsigned block, int flags) = 0 ; virtual void markDirty(unsigned block) = 0; + + virtual void zeroBlock(unsigned block); + void release(unsigned block) { release(block, 0); } void release(unsigned block, bool dirty) { diff --git a/Cache/ConcreteBlockCache.cpp b/Cache/ConcreteBlockCache.cpp index 7fdbba5..a966117 100644 --- a/Cache/ConcreteBlockCache.cpp +++ b/Cache/ConcreteBlockCache.cpp @@ -148,6 +148,8 @@ void ConcreteBlockCache::write(unsigned block, const void *bp) setLast(e); } + + void ConcreteBlockCache::markDirty(unsigned block) { Entry *e = findEntry(block); diff --git a/Cache/ConcreteBlockCache.h b/Cache/ConcreteBlockCache.h index 2560b8e..de46b8b 100644 --- a/Cache/ConcreteBlockCache.h +++ b/Cache/ConcreteBlockCache.h @@ -20,6 +20,7 @@ public: virtual void release(unsigned block, int flags); virtual void markDirty(unsigned block); + private: struct Entry { diff --git a/Cache/MappedBlockCache.cpp b/Cache/MappedBlockCache.cpp index 459e9fa..ba17efe 100644 --- a/Cache/MappedBlockCache.cpp +++ b/Cache/MappedBlockCache.cpp @@ -69,6 +69,14 @@ void MappedBlockCache::write(unsigned block, const void *vp) } +void MappedBlockCache::zeroBlock(unsigned block) +{ + _dirty = true; + std::memset(_data + block * 512, 0, 512); +} + + + // sync everything. void MappedBlockCache::sync() { diff --git a/Cache/MappedBlockCache.h b/Cache/MappedBlockCache.h index fac9504..951a974 100644 --- a/Cache/MappedBlockCache.h +++ b/Cache/MappedBlockCache.h @@ -14,6 +14,8 @@ class MappedBlockCache : public BlockCache { virtual void sync(); virtual void write(unsigned block, const void *vp); + virtual void zeroBlock(unsigned block); + virtual void *acquire(unsigned block); virtual void release(unsigned block, int flags); diff --git a/Pascal/File.h b/Pascal/File.h index 6b7608c..a3c5b7c 100644 --- a/Pascal/File.h +++ b/Pascal/File.h @@ -78,6 +78,9 @@ class VolumeEntry : public Entry { public: + static unsigned ValidName(const char *); + + // create new VolumeEntry(const char *name, Device::BlockDevice *); @@ -103,8 +106,8 @@ public: void readBlock(unsigned block, void *); void writeBlock(unsigned block, void *); - - unsigned static ValidName(const char *); + void sync(); + protected: virtual void writeDirectoryEntry(LittleEndian::IOBuffer *); diff --git a/Pascal/VolumeEntry.cpp b/Pascal/VolumeEntry.cpp index 4109212..f76311a 100644 --- a/Pascal/VolumeEntry.cpp +++ b/Pascal/VolumeEntry.cpp @@ -77,9 +77,10 @@ VolumeEntry::VolumeEntry(const char *name, Device::BlockDevice *device) _cache = BlockCache::Create(device); _device = device; + for (unsigned i = 2; i < 6; ++i) { - device->zeroBlock(i); + _cache->zeroBlock(i); } void *vp = _cache->acquire(2); @@ -89,6 +90,7 @@ VolumeEntry::VolumeEntry(const char *name, Device::BlockDevice *device) _cache->release(2, true); + _cache->sync(); } @@ -216,6 +218,10 @@ void VolumeEntry::writeBlock(unsigned block, void *buffer) } +void VolumeEntry::sync() +{ + _cache->sync(); +} void VolumeEntry::writeDirectoryEntry(IOBuffer *b) {