diff --git a/Cache/MappedBlockCache.cpp b/Cache/MappedBlockCache.cpp index d8a8da4..103f846 100644 --- a/Cache/MappedBlockCache.cpp +++ b/Cache/MappedBlockCache.cpp @@ -8,7 +8,6 @@ #include #include -#include @@ -48,18 +47,51 @@ void MappedBlockCache::unload(unsigned block, int flags) #undef __METHOD__ #define __METHOD__ "MappedBlockCache::unload" + // kBlockCommitNow implies kBlockDirty. if (flags & kBlockCommitNow) { - _dirty = true; - sync(); + sync(block) return; } if (flags & kBlockDirty) _dirty = true; } +// sync everything. void MappedBlockCache::sync() { _device->sync(); _dirty = false; } + +/* + * + * sync an individual page. + * + */ +void MappedBlockCache::sync(unsigned block) +{ +#undef __METHOD__ +#define __METHOD__ "MappedBlockCache::sync" + + + int pageSize = ::getpagesize(); + + void *start = (_data + block * 512) % pagesize; + void *end = (_data + 512 + block * 512) % pagesize; + + if (::msync(start, pagesize, MS_SYNC) != 0) + throw POSIXException(__METHOD__ ": msync", errno); + + if (start != end) + { + if (::msync(end, pagesize, MS_SYNC) != 0) + throw POSIXException(__METHOD__ ": msync", errno); + } +} + +void MappedBlockCache::markDirty(unsigned block) +{ + _dirty = true; +} + diff --git a/Cache/MappedBlockCache.h b/Cache/MappedBlockCache.h index 319a584..c10a362 100644 --- a/Cache/MappedBlockCache.h +++ b/Cache/MappedBlockCache.h @@ -1,7 +1,7 @@ #ifndef __MAPPED_BLOCK_CACHE_H__ #define __MAPPED_BLOCK_CACHE_H__ -#include +#include namespace Device { @@ -11,7 +11,7 @@ class MappedBlockCache : public BlockCache { MappedBlockCache(BlockDevice *, void *data); virtual ~MappedBlockCache(); - virtual void sync() = 0; + virtual void sync(); virtual void write(unsigned block, const void *vp); @@ -20,7 +20,9 @@ class MappedBlockCache : public BlockCache { virtual void markDirty(unsigned block); private: - void *_data; + void sync(block); + + uint8_t *_data; bool _dirty; };