Import backup from 2004-12-23
This commit is contained in:
parent
55b7429d4e
commit
b40a68f581
@ -87,12 +87,51 @@ int ext2_read_inode_block(vfs_mount_t *mount, ext2_open_inode_t *open_inode, voi
|
|||||||
// TODO: get the block number, read it to block
|
// TODO: get the block number, read it to block
|
||||||
}
|
}
|
||||||
|
|
||||||
// block_index is a relative block number - the block number of the file
|
// transform open_inode->block (a relative block number) to an absolute block number for the filesystem
|
||||||
// this needs to be transformed into an absolute block number for the entire disk
|
u32_t ext2_block_number(vfs_mount_t *mount, ext2_open_inode_t *open_inode)
|
||||||
u32_t ext2_block_number(vfs_mount_t *mount, ext2_open_inode_t *open_inode, u32_t block_index)
|
|
||||||
{
|
{
|
||||||
// TODO: convert block_index to block number using open_inode fields
|
// TODO: convert block_index to block number using open_inode fields
|
||||||
return 0;
|
if (open_inode->block < 12)
|
||||||
|
return open_inode->inode.i_block[open_inode->block];
|
||||||
|
ext2_super_block_t *super = mount->super;
|
||||||
|
int pointersPerBlock = 256 << super->s_log_block_size;
|
||||||
|
if (open_inode->block_pointers && // there is a block pointers cache block allocated
|
||||||
|
(open_inode->block >= open_inode->block_pointers_start) && // and the block number is in it
|
||||||
|
(open_inode->block < (open_inode->block_pointers_start + pointersPerBlock)))
|
||||||
|
return open_inode->block_pointers[open_inode->block - open_inode->block_pointers_start];
|
||||||
|
u32_t rel_block = open_inode->block - 12;
|
||||||
|
if (!open_inode->block_pointers)
|
||||||
|
open_inode->block_pointers = kmalloc(pointersPerBlock << 2);
|
||||||
|
if (rel_block < pointersPerBlock) // indirect block in i_block[12]
|
||||||
|
{
|
||||||
|
block_read(mount->major, mount->minor, ext2_FSToDiskBlock(open_inode->inode.i_block[12], super),
|
||||||
|
1 << super->s_log_block_size, open_inode->block_pointers);
|
||||||
|
open_inode->block_pointers_start = 12;
|
||||||
|
return open_inode->block_pointers[rel_block];
|
||||||
|
}
|
||||||
|
rel_block -= pointersPerBlock;
|
||||||
|
if (rel_block < (pointersPerBlock * pointersPerBlock)) // double-indirect block in i_block[13]
|
||||||
|
{
|
||||||
|
block_read(mount->major, mount->minor, ext2_FSToDiskBlock(open_inode->inode.i_block[13], super),
|
||||||
|
1 << super->s_log_block_size, open_inode->block_pointers);
|
||||||
|
u32_t real_block = open_inode->block_pointers[rel_block / pointersPerBlock];
|
||||||
|
block_read(mount->major, mount->minor, ext2_FSToDiskBlock(real_block, super),
|
||||||
|
1 << super->s_log_block_size, open_inode->block_pointers);
|
||||||
|
open_inode->block_pointers_start = 12 + pointersPerBlock + rel_block - (rel_block % pointersPerBlock);
|
||||||
|
return open_inode->block_pointers[rel_block % pointersPerBlock];
|
||||||
|
}
|
||||||
|
rel_block -= pointersPerBlock * pointersPerBlock;
|
||||||
|
// TODO: triple-indirect block in i_block[14]
|
||||||
|
block_read(mount->major, mount->minor, ext2_FSToDiskBlock(open_inode->inode.i_block[14], super),
|
||||||
|
1 << super->s_log_block_size, open_inode->block_pointers);
|
||||||
|
u32_t block_1 = open_inode->block_pointers[rel_block / (pointersPerBlock * pointersPerBlock)];
|
||||||
|
block_read(mount->major, mount->minor, ext2_FSToDiskBlock(block_1, super),
|
||||||
|
1 << super->s_log_block_size, open_inode->block_pointers);
|
||||||
|
u32_t block_2 = open_inode->block_pointers[rel_block / (pointersPerBlock * pointersPerBlock)];
|
||||||
|
block_read(mount->major, mount->minor, ext2_FSToDiskBlock(block_1, super),
|
||||||
|
1 << super->s_log_block_size, open_inode->block_pointers);
|
||||||
|
open_inode->block_pointers_start = 12 + pointersPerBlock + rel_block - (rel_block % pointersPerBlock);
|
||||||
|
return open_inode->block_pointers[rel_block % pointersPerBlock];
|
||||||
}
|
}
|
||||||
|
|
||||||
int ext2_close_inode(vfs_mount_t *mount, ext2_open_inode_t *open_inode)
|
int ext2_close_inode(vfs_mount_t *mount, ext2_open_inode_t *open_inode)
|
||||||
|
@ -156,7 +156,9 @@ inline u32_t ext2_FSToDiskBlock(u32_t block, ext2_super_block_t *super);
|
|||||||
int ext2_stat(vfs_mount_t *mount, char *file, vfs_stat_t *stat);
|
int ext2_stat(vfs_mount_t *mount, char *file, vfs_stat_t *stat);
|
||||||
ext2_open_inode_t *ext2_open_inode(vfs_mount_t *mount, u32_t inode_number);
|
ext2_open_inode_t *ext2_open_inode(vfs_mount_t *mount, u32_t inode_number);
|
||||||
int ext2_close_inode(vfs_mount_t *mount, ext2_open_inode_t *open_inode);
|
int ext2_close_inode(vfs_mount_t *mount, ext2_open_inode_t *open_inode);
|
||||||
int ext2_read_inode_block(vfs_mount_t *mount, ext2_open_inode_t *open_inode, void *block_index);
|
int ext2_read_inode_block(vfs_mount_t *mount, ext2_open_inode_t *open_inode, void *block);
|
||||||
|
u32_t ext2_block_number(vfs_mount_t *mount, ext2_open_inode_t *open_inode);
|
||||||
|
|
||||||
|
|
||||||
void ext2_dump_root(vfs_mount_t *mount);
|
void ext2_dump_root(vfs_mount_t *mount);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user