Volume::Ummount() now use the NO_WRITES mode for remove_cached_device_blocks()

if the volume is read-only.
Some style changes.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@1600 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2002-10-22 17:46:12 +00:00
parent 4c7e1fff2f
commit 05f02d9b9a
2 changed files with 93 additions and 43 deletions
@@ -65,6 +65,8 @@ Volume::Panic()
fFlags |= VOLUME_READ_ONLY; fFlags |= VOLUME_READ_ONLY;
#ifdef USER #ifdef USER
debugger("BFS panics!"); debugger("BFS panics!");
#elif defined(DEBUG)
kernel_debugger("BFS panics!");
#endif #endif
} }
@@ -189,7 +191,7 @@ Volume::Unmount()
delete fIndicesNode; delete fIndicesNode;
remove_cached_device_blocks(fDevice,ALLOW_WRITES); remove_cached_device_blocks(fDevice, IsReadOnly() ? NO_WRITES : ALLOW_WRITES);
close(fDevice); close(fDevice);
return B_OK; return B_OK;
@@ -266,7 +268,8 @@ Volume::WriteSuperBlock()
void void
Volume::UpdateLiveQueries(Inode *inode,const char *attribute,int32 type,const uint8 *oldKey,size_t oldLength,const uint8 *newKey,size_t newLength) Volume::UpdateLiveQueries(Inode *inode, const char *attribute, int32 type, const uint8 *oldKey,
size_t oldLength, const uint8 *newKey, size_t newLength)
{ {
if (fQueryLock.Lock() < B_OK) if (fQueryLock.Lock() < B_OK)
return; return;
+62 -15
View File
@@ -41,9 +41,9 @@ class Volume {
status_t Unmount(); status_t Unmount();
bool IsValidSuperBlock(); bool IsValidSuperBlock();
bool IsReadOnly() const { return fFlags & VOLUME_READ_ONLY; } bool IsReadOnly() const;
void Panic(); void Panic();
Benaphore &Lock() { return fLock; } Benaphore &Lock();
block_run Root() const { return fSuperBlock.root_dir; } block_run Root() const { return fSuperBlock.root_dir; }
Inode *RootNode() const { return fRootNode; } Inode *RootNode() const { return fRootNode; }
@@ -79,30 +79,35 @@ class Volume {
status_t CreateIndicesRoot(Transaction *transaction); status_t CreateIndicesRoot(Transaction *transaction);
status_t AllocateForInode(Transaction *transaction,const Inode *parent,mode_t type,block_run &run); // block bitmap
status_t AllocateForInode(Transaction *transaction,const block_run *parent,mode_t type,block_run &run); BlockAllocator &Allocator();
status_t Allocate(Transaction *transaction,const Inode *inode,off_t numBlocks,block_run &run,uint16 minimum = 1); status_t AllocateForInode(Transaction *transaction, const Inode *parent,
mode_t type, block_run &run);
status_t AllocateForInode(Transaction *transaction, const block_run *parent,
mode_t type, block_run &run);
status_t Allocate(Transaction *transaction,const Inode *inode,
off_t numBlocks, block_run &run, uint16 minimum = 1);
status_t Free(Transaction *transaction, block_run run); status_t Free(Transaction *transaction, block_run run);
#ifdef DEBUG // cache access
BlockAllocator &Allocator() { return fBlockAllocator; }
#endif
BufferPool &Pool() { return fBufferPool; }
status_t Sync();
Journal *GetJournal(off_t /*refBlock*/) const { return fJournal; }
status_t WriteSuperBlock(); status_t WriteSuperBlock();
status_t WriteBlocks(off_t blockNumber, const uint8 *block, uint32 numBlocks); status_t WriteBlocks(off_t blockNumber, const uint8 *block, uint32 numBlocks);
void WriteCachedBlocksIfNecessary(); void WriteCachedBlocksIfNecessary();
status_t FlushDevice(); status_t FlushDevice();
void UpdateLiveQueries(Inode *inode,const char *attribute,int32 type,const uint8 *oldKey,size_t oldLength,const uint8 *newKey,size_t newLength); // queries
void UpdateLiveQueries(Inode *inode, const char *attribute, int32 type,
const uint8 *oldKey, size_t oldLength,
const uint8 *newKey, size_t newLength);
void AddQuery(Query *query); void AddQuery(Query *query);
void RemoveQuery(Query *query); void RemoveQuery(Query *query);
uint32 GetUniqueID() { return atomic_add(&fUniqueID,1); } status_t Sync();
Journal *GetJournal(off_t refBlock) const;
BufferPool &Pool();
uint32 GetUniqueID();
protected: protected:
nspace_id fID; nspace_id fID;
@@ -127,8 +132,30 @@ class Volume {
BufferPool fBufferPool; BufferPool fBufferPool;
}; };
// inline functions // inline functions
inline bool
Volume::IsReadOnly() const
{
return fFlags & VOLUME_READ_ONLY;
}
inline Benaphore &
Volume::Lock()
{
return fLock;
}
inline BlockAllocator &
Volume::Allocator()
{
return fBlockAllocator;
}
inline status_t inline status_t
Volume::AllocateForInode(Transaction *transaction, const block_run *parent, mode_t type, block_run &run) Volume::AllocateForInode(Transaction *transaction, const block_run *parent, mode_t type, block_run &run)
{ {
@@ -177,4 +204,24 @@ Volume::FlushDevice()
} }
inline Journal *
Volume::GetJournal(off_t /*refBlock*/) const
{
return fJournal;
}
inline BufferPool &
Volume::Pool()
{
return fBufferPool;
}
inline uint32
Volume::GetUniqueID()
{
return atomic_add(&fUniqueID, 1);
}
#endif /* VOLUME_H */ #endif /* VOLUME_H */