* Build fix (bfs_inode::InitCheck() is now const), and cleanup.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35494 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2009, Axel Dörfler, [email protected].
|
||||
* Copyright 2003-2010, Axel Dörfler, [email protected].
|
||||
* This file may be used under the terms of the MIT License.
|
||||
*/
|
||||
|
||||
@@ -36,7 +36,8 @@ class CachedBlock {
|
||||
uint8* Block() const { return fBlock; }
|
||||
off_t BlockNumber() const { return fBlockNumber; }
|
||||
uint32 BlockSize() const { return fVolume.BlockSize(); }
|
||||
uint32 BlockShift() const { return fVolume.BlockShift(); }
|
||||
uint32 BlockShift() const
|
||||
{ return fVolume.BlockShift(); }
|
||||
|
||||
private:
|
||||
Volume& fVolume;
|
||||
@@ -89,7 +90,8 @@ CachedBlock::SetTo(off_t block)
|
||||
}
|
||||
|
||||
fBlockNumber = block;
|
||||
if (read_pos(fVolume.Device(), block << BlockShift(), fBlock, BlockSize()) < (ssize_t)BlockSize())
|
||||
if (read_pos(fVolume.Device(), block << BlockShift(), fBlock, BlockSize())
|
||||
< (ssize_t)BlockSize())
|
||||
return NULL;
|
||||
|
||||
return fBlock;
|
||||
@@ -110,7 +112,8 @@ Stream::Stream(Volume &volume, block_run run)
|
||||
:
|
||||
fVolume(volume)
|
||||
{
|
||||
if (read_pos(volume.Device(), volume.ToOffset(run), this, sizeof(bfs_inode)) != sizeof(bfs_inode))
|
||||
if (read_pos(volume.Device(), volume.ToOffset(run), this, sizeof(bfs_inode))
|
||||
!= sizeof(bfs_inode))
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -119,7 +122,8 @@ Stream::Stream(Volume &volume, off_t id)
|
||||
:
|
||||
fVolume(volume)
|
||||
{
|
||||
if (read_pos(volume.Device(), volume.ToOffset(id), this, sizeof(bfs_inode)) != sizeof(bfs_inode))
|
||||
if (read_pos(volume.Device(), volume.ToOffset(id), this, sizeof(bfs_inode))
|
||||
!= sizeof(bfs_inode))
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -197,7 +201,8 @@ Stream::FindBlockRun(off_t pos, block_run &run, off_t &offset)
|
||||
// find matching block run
|
||||
|
||||
if (data.MaxDirectRange() > 0 && pos >= data.MaxDirectRange()) {
|
||||
if (data.MaxDoubleIndirectRange() > 0 && pos >= data.MaxIndirectRange()) {
|
||||
if (data.MaxDoubleIndirectRange() > 0
|
||||
&& pos >= data.MaxIndirectRange()) {
|
||||
// access to double indirect blocks
|
||||
|
||||
CachedBlock cached(fVolume);
|
||||
@@ -221,13 +226,14 @@ Stream::FindBlockRun(off_t pos, block_run &run, off_t &offset)
|
||||
|
||||
int32 current = (start % indirectSize) / directSize;
|
||||
|
||||
indirect = (block_run *)cached.SetTo(
|
||||
fVolume.ToBlock(indirect[index % runsPerBlock]) + current / runsPerBlock);
|
||||
indirect = (block_run*)cached.SetTo(fVolume.ToBlock(indirect[
|
||||
index % runsPerBlock]) + current / runsPerBlock);
|
||||
if (indirect == NULL)
|
||||
return B_ERROR;
|
||||
|
||||
run = indirect[current % runsPerBlock];
|
||||
offset = data.MaxIndirectRange() + (index * indirectSize) + (current * directSize);
|
||||
offset = data.MaxIndirectRange() + (index * indirectSize)
|
||||
+ (current * directSize);
|
||||
//printf("\tfCurrent = %ld, fRunFileOffset = %Ld, fRunBlockEnd = %Ld, fRun = %ld,%d\n",fCurrent,fRunFileOffset,fRunBlockEnd,fRun.allocation_group,fRun.start);
|
||||
} else {
|
||||
// access to indirect blocks
|
||||
@@ -248,10 +254,12 @@ Stream::FindBlockRun(off_t pos, block_run &run, off_t &offset)
|
||||
if (indirect[current].IsZero())
|
||||
break;
|
||||
|
||||
runBlockEnd += indirect[current].Length() << cached.BlockShift();
|
||||
runBlockEnd
|
||||
+= indirect[current].Length() << cached.BlockShift();
|
||||
if (runBlockEnd > pos) {
|
||||
run = indirect[current];
|
||||
offset = runBlockEnd - (run.Length() << cached.BlockShift());
|
||||
offset = runBlockEnd -
|
||||
(run.Length() << cached.BlockShift());
|
||||
//printf("reading from indirect block: %ld,%d\n",fRun.allocation_group,fRun.start);
|
||||
//printf("### indirect-run[%ld] = (%ld,%d,%d), offset = %Ld\n",fCurrent,fRun.allocation_group,fRun.start,fRun.length,fRunFileOffset);
|
||||
return fVolume.ValidateBlockRun(run);
|
||||
@@ -319,8 +327,10 @@ Stream::ReadAt(off_t pos, uint8 *buffer, size_t *_length)
|
||||
|
||||
// pos % block_size == (pos - offset) % block_size, offset % block_size == 0
|
||||
if (pos % blockSize != 0) {
|
||||
run.start = HOST_ENDIAN_TO_BFS_INT16(run.Start() + ((pos - offset) >> blockShift));
|
||||
run.length = HOST_ENDIAN_TO_BFS_INT16(run.Length() - ((pos - offset) >> blockShift));
|
||||
run.start = HOST_ENDIAN_TO_BFS_INT16(run.Start()
|
||||
+ ((pos - offset) >> blockShift));
|
||||
run.length = HOST_ENDIAN_TO_BFS_INT16(run.Length()
|
||||
- ((pos - offset) >> blockShift));
|
||||
|
||||
CachedBlock cached(fVolume, run);
|
||||
if ((block = cached.Block()) == NULL) {
|
||||
@@ -355,8 +365,10 @@ Stream::ReadAt(off_t pos, uint8 *buffer, size_t *_length)
|
||||
|
||||
while (length > 0) {
|
||||
// offset is the offset to the current pos in the block_run
|
||||
run.start = HOST_ENDIAN_TO_BFS_INT16(run.Start() + ((pos - offset) >> blockShift));
|
||||
run.length = HOST_ENDIAN_TO_BFS_INT16(run.Length() - ((pos - offset) >> blockShift));
|
||||
run.start = HOST_ENDIAN_TO_BFS_INT16(run.Start()
|
||||
+ ((pos - offset) >> blockShift));
|
||||
run.length = HOST_ENDIAN_TO_BFS_INT16(run.Length()
|
||||
- ((pos - offset) >> blockShift));
|
||||
|
||||
if (uint32(run.Length() << blockShift) > length) {
|
||||
if (length < blockSize) {
|
||||
@@ -373,7 +385,8 @@ Stream::ReadAt(off_t pos, uint8 *buffer, size_t *_length)
|
||||
partial = true;
|
||||
}
|
||||
|
||||
if (read_pos(fVolume.Device(), fVolume.ToOffset(run), buffer + bytesRead, run.Length() << fVolume.BlockShift()) < B_OK) {
|
||||
if (read_pos(fVolume.Device(), fVolume.ToOffset(run), buffer + bytesRead,
|
||||
run.Length() << fVolume.BlockShift()) < B_OK) {
|
||||
*_length = bytesRead;
|
||||
return B_BAD_VALUE;
|
||||
}
|
||||
@@ -424,9 +437,9 @@ Stream::NodeFactory(Volume &volume, off_t id)
|
||||
|
||||
|
||||
status_t
|
||||
bfs_inode::InitCheck(Volume *volume)
|
||||
bfs_inode::InitCheck(Volume* volume) const
|
||||
{
|
||||
if (Flags() & INODE_NOT_READY) {
|
||||
if ((Flags() & INODE_NOT_READY) != 0) {
|
||||
// the other fields may not yet contain valid values
|
||||
return B_BUSY;
|
||||
}
|
||||
@@ -447,9 +460,8 @@ bfs_inode::InitCheck(Volume *volume)
|
||||
|| attributes.Start() > (1L << volume->AllocationGroupShift()))
|
||||
return B_BAD_DATA;
|
||||
|
||||
// ToDo: Add some tests to check the integrity of the other stuff here,
|
||||
// TODO: Add some tests to check the integrity of the other stuff here,
|
||||
// especially for the data_stream!
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user