bfsinfo: Added double indirect block output.
This commit is contained in:
@@ -79,7 +79,7 @@ dump_indirect_stream(Disk &disk, bfs_inode *node, bool showOffsets)
|
|||||||
if (runs[i].IsZero())
|
if (runs[i].IsZero())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
printf(" indirect[%02" B_PRId32 "] = ", i);
|
printf(" indirect[%04" B_PRId32 "] = ", i);
|
||||||
|
|
||||||
char buffer[256];
|
char buffer[256];
|
||||||
if (showOffsets)
|
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
|
block_run
|
||||||
parseBlockRun(Disk &disk, char *first, char *last)
|
parseBlockRun(Disk &disk, char *first, char *last)
|
||||||
{
|
{
|
||||||
@@ -235,6 +297,7 @@ main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char buffer[disk.BlockSize()];
|
char buffer[disk.BlockSize()];
|
||||||
|
bfs_inode* bfsInode = (bfs_inode*)buffer;
|
||||||
block_run run;
|
block_run run;
|
||||||
Inode *inode = NULL;
|
Inode *inode = NULL;
|
||||||
|
|
||||||
@@ -253,7 +316,7 @@ main(int argc, char **argv)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
inode = Inode::Factory(&disk, (bfs_inode *)buffer, false);
|
inode = Inode::Factory(&disk, bfsInode, false);
|
||||||
if (inode == NULL || inode->InitCheck() < B_OK) {
|
if (inode == NULL || inode->InitCheck() < B_OK) {
|
||||||
fprintf(stderr,"Not a valid inode!\n");
|
fprintf(stderr,"Not a valid inode!\n");
|
||||||
delete inode;
|
delete inode;
|
||||||
@@ -264,13 +327,14 @@ main(int argc, char **argv)
|
|||||||
if (dumpInode) {
|
if (dumpInode) {
|
||||||
printf("Inode at block %" B_PRIdOFF ":\n------------------------------"
|
printf("Inode at block %" B_PRIdOFF ":\n------------------------------"
|
||||||
"-----------\n", disk.ToBlock(run));
|
"-----------\n", disk.ToBlock(run));
|
||||||
dump_inode(inode, (bfs_inode *)buffer, showOffsets);
|
dump_inode(inode, bfsInode, showOffsets);
|
||||||
dump_indirect_stream(disk, (bfs_inode *)buffer, showOffsets);
|
dump_indirect_stream(disk, bfsInode, showOffsets);
|
||||||
|
dump_double_indirect_stream(disk, bfsInode, showOffsets);
|
||||||
dump_small_data(inode);
|
dump_small_data(inode);
|
||||||
putchar('\n');
|
putchar('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dumpBTree && inode) {
|
if (dumpBTree && inode != NULL) {
|
||||||
printf("B+Tree at block %" B_PRIdOFF ":\n-----------------------------"
|
printf("B+Tree at block %" B_PRIdOFF ":\n-----------------------------"
|
||||||
"------------\n", disk.ToBlock(run));
|
"------------\n", disk.ToBlock(run));
|
||||||
if (inode->IsDirectory() || inode->IsAttributeDirectory()) {
|
if (inode->IsDirectory() || inode->IsAttributeDirectory()) {
|
||||||
@@ -280,7 +344,7 @@ main(int argc, char **argv)
|
|||||||
fprintf(stderr, "Inode is not a directory!\n");
|
fprintf(stderr, "Inode is not a directory!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (validateBTree && inode) {
|
if (validateBTree && inode != NULL) {
|
||||||
printf("Validating B+Tree at block %" B_PRIdOFF ":\n------------------"
|
printf("Validating B+Tree at block %" B_PRIdOFF ":\n------------------"
|
||||||
"-----------------------\n", disk.ToBlock(run));
|
"-----------------------\n", disk.ToBlock(run));
|
||||||
if (inode->IsDirectory() || inode->IsAttributeDirectory()) {
|
if (inode->IsDirectory() || inode->IsAttributeDirectory()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user