mirror of
https://github.com/RGBCube/serenity
synced 2025-05-25 18:15:09 +00:00
Ext2FS: The max current block count of a file is size/block_size
Turns out that i_blocks does not take block list holes into account.
This commit is contained in:
parent
b298c01e92
commit
b6887bd9cd
2 changed files with 7 additions and 5 deletions
|
@ -407,11 +407,10 @@ Vector<Ext2FS::BlockIndex> Ext2FS::block_list_for_inode_impl(const ext2_inode& e
|
||||||
LOCKER(m_lock);
|
LOCKER(m_lock);
|
||||||
unsigned entries_per_block = EXT2_ADDR_PER_BLOCK(&super_block());
|
unsigned entries_per_block = EXT2_ADDR_PER_BLOCK(&super_block());
|
||||||
|
|
||||||
// NOTE: i_blocks is number of 512-byte blocks, not number of fs-blocks.
|
unsigned block_count = ceil_div(e2inode.i_size, block_size());
|
||||||
unsigned block_count = e2inode.i_blocks / (block_size() / 512);
|
|
||||||
|
|
||||||
#ifdef EXT2_DEBUG
|
#ifdef EXT2_DEBUG
|
||||||
dbgprintf("Ext2FS::block_list_for_inode(): i_size=%u, i_blocks=%u, block_count=%u\n", e2inode.i_size, block_count);
|
dbgprintf("Ext2FS::block_list_for_inode(): i_size=%u, i_blocks=%u, block_count=%u\n", e2inode.i_size, e2inode.i_blocks, block_count);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
unsigned blocks_remaining = block_count;
|
unsigned blocks_remaining = block_count;
|
||||||
|
@ -687,9 +686,11 @@ ssize_t Ext2FSInode::read_bytes(off_t offset, ssize_t count, u8* buffer, FileDes
|
||||||
u8 block[max_block_size];
|
u8 block[max_block_size];
|
||||||
|
|
||||||
for (int bi = first_block_logical_index; remaining_count && bi <= last_block_logical_index; ++bi) {
|
for (int bi = first_block_logical_index; remaining_count && bi <= last_block_logical_index; ++bi) {
|
||||||
bool success = fs().read_block(m_block_list[bi], block, description);
|
auto block_index = m_block_list[bi];
|
||||||
|
ASSERT(block_index);
|
||||||
|
bool success = fs().read_block(block_index, block, description);
|
||||||
if (!success) {
|
if (!success) {
|
||||||
kprintf("ext2fs: read_bytes: read_block(%u) failed (lbi: %u)\n", m_block_list[bi], bi);
|
kprintf("ext2fs: read_bytes: read_block(%u) failed (lbi: %u)\n", block_index, bi);
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -139,6 +139,7 @@ private:
|
||||||
GroupIndex group_index_from_inode(InodeIndex) const;
|
GroupIndex group_index_from_inode(InodeIndex) const;
|
||||||
GroupIndex group_index_from_block_index(BlockIndex) const;
|
GroupIndex group_index_from_block_index(BlockIndex) const;
|
||||||
|
|
||||||
|
Vector<BlockIndex> block_list_for_inode_impl(const ext2_inode&, bool include_block_list_blocks = false) const;
|
||||||
Vector<BlockIndex> block_list_for_inode(const ext2_inode&, bool include_block_list_blocks = false) const;
|
Vector<BlockIndex> block_list_for_inode(const ext2_inode&, bool include_block_list_blocks = false) const;
|
||||||
bool write_block_list_for_inode(InodeIndex, ext2_inode&, const Vector<BlockIndex>&);
|
bool write_block_list_for_inode(InodeIndex, ext2_inode&, const Vector<BlockIndex>&);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue