git-svn-id: https://profuse.googlecode.com/svn/branches/v2@206 aa027e90-d47c-11dd-86d7-074df07e0730

This commit is contained in:
ksherlock 2010-03-21 22:27:20 +00:00
parent 07f1244834
commit 82167f07f9
2 changed files with 40 additions and 6 deletions

View File

@ -8,7 +8,6 @@
#include <Cache/MappedBlockCache.h> #include <Cache/MappedBlockCache.h>
#include <ProFUSE/Exception.h> #include <ProFUSE/Exception.h>
#include <ProFUSE/auto.h>
@ -48,18 +47,51 @@ void MappedBlockCache::unload(unsigned block, int flags)
#undef __METHOD__ #undef __METHOD__
#define __METHOD__ "MappedBlockCache::unload" #define __METHOD__ "MappedBlockCache::unload"
// kBlockCommitNow implies kBlockDirty.
if (flags & kBlockCommitNow) if (flags & kBlockCommitNow)
{ {
_dirty = true; sync(block)
sync();
return; return;
} }
if (flags & kBlockDirty) _dirty = true; if (flags & kBlockDirty) _dirty = true;
} }
// sync everything.
void MappedBlockCache::sync() void MappedBlockCache::sync()
{ {
_device->sync(); _device->sync();
_dirty = false; _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;
}

View File

@ -1,7 +1,7 @@
#ifndef __MAPPED_BLOCK_CACHE_H__ #ifndef __MAPPED_BLOCK_CACHE_H__
#define __MAPPED_BLOCK_CACHE_H__ #define __MAPPED_BLOCK_CACHE_H__
#include <BlockCache.h> #include <Cache/BlockCache.h>
namespace Device { namespace Device {
@ -11,7 +11,7 @@ class MappedBlockCache : public BlockCache {
MappedBlockCache(BlockDevice *, void *data); MappedBlockCache(BlockDevice *, void *data);
virtual ~MappedBlockCache(); virtual ~MappedBlockCache();
virtual void sync() = 0; virtual void sync();
virtual void write(unsigned block, const void *vp); virtual void write(unsigned block, const void *vp);
@ -20,7 +20,9 @@ class MappedBlockCache : public BlockCache {
virtual void markDirty(unsigned block); virtual void markDirty(unsigned block);
private: private:
void *_data; void sync(block);
uint8_t *_data;
bool _dirty; bool _dirty;
}; };