bfsinfo: Added double indirect block output.

This commit is contained in:
Axel Dörfler
2013-05-14 22:47:48 +02:00
parent c9e66680b9
commit 90f195890f
+70 -6
View File
@@ -79,7 +79,7 @@ dump_indirect_stream(Disk &disk, bfs_inode *node, bool showOffsets)
if (runs[i].IsZero())
return;
printf(" indirect[%02" B_PRId32 "] = ", i);
printf(" indirect[%04" B_PRId32 "] = ", i);
char buffer[256];
if (showOffsets)
@@ -94,6 +94,68 @@ dump_indirect_stream(Disk &disk, bfs_inode *node, bool showOffsets)
}
void
dump_double_indirect_stream(Disk& disk, bfs_inode* node, bool showOffsets)
{
if (node->data.max_double_indirect_range == 0)
return;
int32 bytes = node->data.double_indirect.length * disk.BlockSize();
int32 count = bytes / sizeof(block_run);
block_run runs[count];
off_t offset = node->data.max_indirect_range;
ssize_t bytesRead = disk.ReadAt(disk.ToOffset(node->data.double_indirect),
(uint8*)runs, bytes);
if (bytesRead < bytes) {
fprintf(stderr, "couldn't read double indirect runs: %s\n",
strerror(bytesRead));
return;
}
puts("double indirect stream:");
for (int32 i = 0; i < count; i++) {
if (runs[i].IsZero())
return;
printf(" double_indirect[%02" B_PRId32 "] = ", i);
dump_block_run("", runs[i], "");
int32 indirectBytes = runs[i].length * disk.BlockSize();
int32 indirectCount = indirectBytes / sizeof(block_run);
block_run indirectRuns[indirectCount];
bytesRead = disk.ReadAt(disk.ToOffset(runs[i]), (uint8*)indirectRuns,
indirectBytes);
if (bytesRead < indirectBytes) {
fprintf(stderr, "couldn't read double indirect runs: %s\n",
strerror(bytesRead));
continue;
}
for (int32 j = 0; j < indirectCount; j++) {
if (indirectRuns[j].IsZero())
break;
printf(" [%04" B_PRId32 "] = ", j);
char buffer[256];
if (showOffsets)
snprintf(buffer, sizeof(buffer), " %16" B_PRIdOFF, offset);
else
buffer[0] = '\0';
dump_block_run("", indirectRuns[j], buffer);
offset += indirectRuns[j].length * disk.BlockSize();
}
}
}
block_run
parseBlockRun(Disk &disk, char *first, char *last)
{
@@ -235,6 +297,7 @@ main(int argc, char **argv)
}
char buffer[disk.BlockSize()];
bfs_inode* bfsInode = (bfs_inode*)buffer;
block_run run;
Inode *inode = NULL;
@@ -253,7 +316,7 @@ main(int argc, char **argv)
return -1;
}
inode = Inode::Factory(&disk, (bfs_inode *)buffer, false);
inode = Inode::Factory(&disk, bfsInode, false);
if (inode == NULL || inode->InitCheck() < B_OK) {
fprintf(stderr,"Not a valid inode!\n");
delete inode;
@@ -264,13 +327,14 @@ main(int argc, char **argv)
if (dumpInode) {
printf("Inode at block %" B_PRIdOFF ":\n------------------------------"
"-----------\n", disk.ToBlock(run));
dump_inode(inode, (bfs_inode *)buffer, showOffsets);
dump_indirect_stream(disk, (bfs_inode *)buffer, showOffsets);
dump_inode(inode, bfsInode, showOffsets);
dump_indirect_stream(disk, bfsInode, showOffsets);
dump_double_indirect_stream(disk, bfsInode, showOffsets);
dump_small_data(inode);
putchar('\n');
}
if (dumpBTree && inode) {
if (dumpBTree && inode != NULL) {
printf("B+Tree at block %" B_PRIdOFF ":\n-----------------------------"
"------------\n", disk.ToBlock(run));
if (inode->IsDirectory() || inode->IsAttributeDirectory()) {
@@ -280,7 +344,7 @@ main(int argc, char **argv)
fprintf(stderr, "Inode is not a directory!\n");
}
if (validateBTree && inode) {
if (validateBTree && inode != NULL) {
printf("Validating B+Tree at block %" B_PRIdOFF ":\n------------------"
"-----------------------\n", disk.ToBlock(run));
if (inode->IsDirectory() || inode->IsAttributeDirectory()) {