bfs_tools: Disk is now using a BBufferIO.

* Automatic whitespace cleanup.
This commit is contained in:
Axel Dörfler
2012-12-02 21:03:43 +01:00
parent 91d335e0b7
commit fd919c2c1a
2 changed files with 33 additions and 27 deletions
+27 -24
View File
@@ -95,6 +95,7 @@ Cache<block_run>::Cacheable *BlockRunCache::NewCacheable(block_run run)
Disk::Disk(const char *deviceName, bool rawMode, off_t start, off_t stop) Disk::Disk(const char *deviceName, bool rawMode, off_t start, off_t stop)
: :
fBufferedFile(NULL),
fRawDiskOffset(0), fRawDiskOffset(0),
fSize(0LL), fSize(0LL),
fCache(this), fCache(this),
@@ -121,6 +122,7 @@ Disk::Disk(const char *deviceName, bool rawMode, off_t start, off_t stop)
//fprintf(stderr,"Could not open file: %s\n",strerror(fFile.InitCheck())); //fprintf(stderr,"Could not open file: %s\n",strerror(fFile.InitCheck()));
return; return;
} }
fBufferedFile = new BBufferIO(&fFile, 1024 * 1024, false);
int device = open(deviceName, O_RDONLY); int device = open(deviceName, O_RDONLY);
if (device < B_OK) { if (device < B_OK) {
@@ -153,7 +155,7 @@ Disk::Disk(const char *deviceName, bool rawMode, off_t start, off_t stop)
return; return;
} }
if (fFile.ReadAt(512 + fRawDiskOffset, &fSuperBlock, if (fBufferedFile->ReadAt(512 + fRawDiskOffset, &fSuperBlock,
sizeof(disk_super_block)) < 1) sizeof(disk_super_block)) < 1)
fprintf(stderr,"Disk: Could not read super block\n"); fprintf(stderr,"Disk: Could not read super block\n");
@@ -163,6 +165,7 @@ Disk::Disk(const char *deviceName, bool rawMode, off_t start, off_t stop)
Disk::~Disk() Disk::~Disk()
{ {
delete fBufferedFile;
} }
@@ -171,7 +174,7 @@ status_t Disk::InitCheck()
status_t status = fFile.InitCheck(); status_t status = fFile.InitCheck();
if (status == B_OK) if (status == B_OK)
return fSize == 0LL ? B_ERROR : B_OK; return fSize == 0LL ? B_ERROR : B_OK;
return status; return status;
} }
@@ -201,7 +204,7 @@ uint8 *Disk::ReadBlockRun(block_run run)
CacheableBlockRun *entry = (CacheableBlockRun *)fCache.Get(run); CacheableBlockRun *entry = (CacheableBlockRun *)fCache.Get(run);
if (entry) if (entry)
return entry->Data(); return entry->Data();
return NULL; return NULL;
} }
@@ -234,7 +237,7 @@ Disk::DumpBootBlockToFile()
// #pragma mark - Superblock recovery methods // #pragma mark - Superblock recovery methods
status_t status_t
Disk::ScanForSuperBlock(off_t start, off_t stop) Disk::ScanForSuperBlock(off_t start, off_t stop)
{ {
printf("Disk size %Ld bytes, %.2f GB\n", fSize, 1.0 * fSize / (1024*1024*1024)); printf("Disk size %Ld bytes, %.2f GB\n", fSize, 1.0 * fSize / (1024*1024*1024));
@@ -256,7 +259,7 @@ Disk::ScanForSuperBlock(off_t start, off_t stop)
if (((offset-start) % (blockSize * 100)) == 0) if (((offset-start) % (blockSize * 100)) == 0)
printf(" %12Ld, %.2f GB %s1A\n",offset,1.0 * offset / (1024*1024*1024),escape); printf(" %12Ld, %.2f GB %s1A\n",offset,1.0 * offset / (1024*1024*1024),escape);
ssize_t bytes = fFile.ReadAt(offset, buffer, blockSize + 1024); ssize_t bytes = fBufferedFile->ReadAt(offset, buffer, blockSize + 1024);
if (bytes < B_OK) if (bytes < B_OK)
{ {
fprintf(stderr,"Could not read from device: %s\n", strerror(bytes)); fprintf(stderr,"Could not read from device: %s\n", strerror(bytes));
@@ -322,7 +325,7 @@ Disk::ScanForSuperBlock(off_t start, off_t stop)
// ToDo: free the other disk infos // ToDo: free the other disk infos
fRawDiskOffset = info->offset; fRawDiskOffset = info->offset;
fFile.Seek(fRawDiskOffset, SEEK_SET); fBufferedFile->Seek(fRawDiskOffset, SEEK_SET);
if (ValidateSuperBlock(info->super_block)) if (ValidateSuperBlock(info->super_block))
fSize = info->super_block.block_size * info->super_block.block_size; fSize = info->super_block.block_size * info->super_block.block_size;
@@ -382,7 +385,7 @@ Disk::RecreateSuperBlock()
printf("\tblock size = %ld\n",BlockSize()); printf("\tblock size = %ld\n",BlockSize());
strcpy(fSuperBlock.name,"recovered"); strcpy(fSuperBlock.name,"recovered");
fSuperBlock.magic1 = SUPER_BLOCK_MAGIC1; fSuperBlock.magic1 = SUPER_BLOCK_MAGIC1;
fSuperBlock.fs_byte_order = SUPER_BLOCK_FS_LENDIAN; fSuperBlock.fs_byte_order = SUPER_BLOCK_FS_LENDIAN;
fSuperBlock.block_shift = get_shift(BlockSize()); fSuperBlock.block_shift = get_shift(BlockSize());
@@ -422,7 +425,7 @@ Disk::RecreateSuperBlock()
GetNextSpecialInode(buffer,&offset,offset + 32LL * 65536 * BlockSize(),true); GetNextSpecialInode(buffer,&offset,offset + 32LL * 65536 * BlockSize(),true);
if (fValidOffset == 0LL) if (fValidOffset == 0LL)
{ {
fprintf(stderr,"FATAL ERROR: Could not find valid inode!\n"); fprintf(stderr,"FATAL ERROR: Could not find valid inode!\n");
return B_ERROR; return B_ERROR;
} }
@@ -439,7 +442,7 @@ Disk::RecreateSuperBlock()
fSuperBlock.num_ags = divide_roundup(fSuperBlock.num_blocks,allocationGroupSize); fSuperBlock.num_ags = divide_roundup(fSuperBlock.num_blocks,allocationGroupSize);
// calculate rest of log area // calculate rest of log area
fSuperBlock.log_blocks.allocation_group = fLogStart / allocationGroupSize; fSuperBlock.log_blocks.allocation_group = fLogStart / allocationGroupSize;
fSuperBlock.log_blocks.start = fLogStart - fSuperBlock.log_blocks.allocation_group * allocationGroupSize; fSuperBlock.log_blocks.start = fLogStart - fSuperBlock.log_blocks.allocation_group * allocationGroupSize;
fSuperBlock.log_blocks.length = LogSize(); // assumed length of 2048 blocks fSuperBlock.log_blocks.length = LogSize(); // assumed length of 2048 blocks
@@ -488,7 +491,7 @@ Disk::DetermineBlockSize()
// read a quarter of the drive at maximum // read a quarter of the drive at maximum
for (; offset < (fSize >> 2); offset += 1024) { for (; offset < (fSize >> 2); offset += 1024) {
if (fFile.ReadAt(offset, buffer, sizeof(buffer)) < B_OK) { if (fBufferedFile->ReadAt(offset, buffer, sizeof(buffer)) < B_OK) {
fprintf(stderr, "could not read from device (offset = %Ld, " fprintf(stderr, "could not read from device (offset = %Ld, "
"size = %ld)!\n", offset, sizeof(buffer)); "size = %ld)!\n", offset, sizeof(buffer));
status = B_IO_ERROR; status = B_IO_ERROR;
@@ -547,7 +550,7 @@ Disk::GetNextSpecialInode(char *buffer, off_t *_offset, off_t end,
bfs_inode *inode = (bfs_inode *)buffer; bfs_inode *inode = (bfs_inode *)buffer;
for (; offset < end; offset += BlockSize()) { for (; offset < end; offset += BlockSize()) {
if (fFile.ReadAt(offset, buffer, 1024) < B_OK) { if (fBufferedFile->ReadAt(offset, buffer, 1024) < B_OK) {
fprintf(stderr,"could not read from device (offset = %Ld, size = %d)!\n",offset,1024); fprintf(stderr,"could not read from device (offset = %Ld, size = %d)!\n",offset,1024);
*_offset = offset; *_offset = offset;
return B_IO_ERROR; return B_IO_ERROR;
@@ -565,7 +568,7 @@ Disk::GetNextSpecialInode(char *buffer, off_t *_offset, off_t end,
&& offset >= (BlockSize() * (fLogStart + LogSize()))) { && offset >= (BlockSize() * (fLogStart + LogSize()))) {
fValidBlockRun = inode->inode_num; fValidBlockRun = inode->inode_num;
fValidOffset = offset; fValidOffset = offset;
if (skipAfterValidInode) if (skipAfterValidInode)
return B_OK; return B_OK;
} }
@@ -653,31 +656,31 @@ Disk::ScanForIndexAndRoot(bfs_inode *indexDir,bfs_inode *rootDir)
if (!root) { if (!root) {
printf("WARNING: Could not find root node at common places!\n"); printf("WARNING: Could not find root node at common places!\n");
printf("\tScanning log area for root node\n"); printf("\tScanning log area for root node\n");
off_t logOffset = ToOffset(fSuperBlock.log_blocks); off_t logOffset = ToOffset(fSuperBlock.log_blocks);
if (GetNextSpecialInode(buffer,&logOffset,logOffset + LogSize() * BlockSize()) == B_OK) if (GetNextSpecialInode(buffer,&logOffset,logOffset + LogSize() * BlockSize()) == B_OK)
{ {
SaveInode(inode,&indices,indexDir,&root,rootDir); SaveInode(inode,&indices,indexDir,&root,rootDir);
printf("root node at: 0x%Lx (DiskProbe)\n",logOffset / 512); printf("root node at: 0x%Lx (DiskProbe)\n",logOffset / 512);
//fFile.ReadAt(logOffset + BlockSize(),buffer,1024); //fBufferedFile->ReadAt(logOffset + BlockSize(),buffer,1024);
//if (*(uint32 *)buffer == BPLUSTREE_MAGIC) //if (*(uint32 *)buffer == BPLUSTREE_MAGIC)
//{ //{
// puts("\t\tnext block in log contains a bplustree!"); // puts("\t\tnext block in log contains a bplustree!");
//} //}
} }
} }
/*if (!root) /*if (!root)
{ {
char txt[64]; char txt[64];
printf("Should I perform a deeper search (that will take some time) (Y/N) [N]? "); printf("Should I perform a deeper search (that will take some time) (Y/N) [N]? ");
gets(txt); gets(txt);
if (!strcasecmp("y",txt)) if (!strcasecmp("y",txt))
{ {
// search not so common places for the root node (all places) // search not so common places for the root node (all places)
if (indices) if (indices)
offset += BlockSize(); // the block after the indices inode offset += BlockSize(); // the block after the indices inode
else else
@@ -700,28 +703,28 @@ Disk::ScanForIndexAndRoot(bfs_inode *indexDir,bfs_inode *rootDir)
ssize_t ssize_t
Disk::Read(void *buffer, size_t size) Disk::Read(void *buffer, size_t size)
{ {
return fFile.Read(buffer, size); return fBufferedFile->Read(buffer, size);
} }
ssize_t ssize_t
Disk::Write(const void *buffer, size_t size) Disk::Write(const void *buffer, size_t size)
{ {
return fFile.Write(buffer, size); return fBufferedFile->Write(buffer, size);
} }
ssize_t ssize_t
Disk::ReadAt(off_t pos, void *buffer, size_t size) Disk::ReadAt(off_t pos, void *buffer, size_t size)
{ {
return fFile.ReadAt(pos + fRawDiskOffset, buffer, size); return fBufferedFile->ReadAt(pos + fRawDiskOffset, buffer, size);
} }
ssize_t ssize_t
Disk::WriteAt(off_t pos, const void *buffer, size_t size) Disk::WriteAt(off_t pos, const void *buffer, size_t size)
{ {
return fFile.WriteAt(pos + fRawDiskOffset, buffer, size); return fBufferedFile->WriteAt(pos + fRawDiskOffset, buffer, size);
} }
@@ -731,14 +734,14 @@ Disk::Seek(off_t position, uint32 seekMode)
// ToDo: only correct for seekMode == SEEK_SET, right?? // ToDo: only correct for seekMode == SEEK_SET, right??
if (seekMode != SEEK_SET) if (seekMode != SEEK_SET)
puts("OH NO, I AM BROKEN!"); puts("OH NO, I AM BROKEN!");
return fFile.Seek(position + fRawDiskOffset, seekMode); return fBufferedFile->Seek(position + fRawDiskOffset, seekMode);
} }
off_t off_t
Disk::Position() const Disk::Position() const
{ {
return fFile.Position() - fRawDiskOffset; return fBufferedFile->Position() - fRawDiskOffset;
} }
+6 -3
View File
@@ -6,6 +6,7 @@
*/ */
#include <BufferIO.h>
#include <File.h> #include <File.h>
#include <Path.h> #include <Path.h>
@@ -23,9 +24,9 @@ class BlockRunCache : public Cache<block_run>
public: public:
BlockRunCache(Disk *disk); BlockRunCache(Disk *disk);
// ~BlockRunCache(); // ~BlockRunCache();
virtual Cacheable *NewCacheable(block_run run); virtual Cacheable *NewCacheable(block_run run);
protected: protected:
Disk *fDisk; Disk *fDisk;
}; };
@@ -91,7 +92,9 @@ class Disk : public BPositionIO
status_t LoadBootBlock(); status_t LoadBootBlock();
protected:
BFile fFile; BFile fFile;
BBufferIO* fBufferedFile;
BPath fPath; BPath fPath;
off_t fRawDiskOffset; off_t fRawDiskOffset;
off_t fSize; off_t fSize;
@@ -101,7 +104,7 @@ class Disk : public BPositionIO
block_run fValidBlockRun; block_run fValidBlockRun;
off_t fValidOffset; off_t fValidOffset;
off_t fLogStart; off_t fLogStart;
BlockRunCache fCache; BlockRunCache fCache;
bool fRawMode; bool fRawMode;