summaryrefslogtreecommitdiff
path: root/kernel/fs/ext2.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/fs/ext2.c')
-rw-r--r--kernel/fs/ext2.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/kernel/fs/ext2.c b/kernel/fs/ext2.c
index f2e7ba7..04108f4 100644
--- a/kernel/fs/ext2.c
+++ b/kernel/fs/ext2.c
@@ -78,20 +78,27 @@ void ext2_read_block(u32 block, void *address, size_t size, size_t offset) {
cached_read_block(block, address, size, offset);
}
-void ext2_write_block(u32 block, void *address, size_t size, size_t offset) {
- // Invalidate a old cache
+void ext2_write_block(u32 block, u8 *address, size_t size, size_t offset) {
+ assert(offset + size <= block_byte_size);
+ int cache_index = -1;
for (int i = 0; i < NUM_BLOCK_CACHE; i++) {
if (cache[i].block_num == block) {
- cache[i].block_num = 0;
+ cache_index = i;
break;
}
}
+ if (-1 != cache_index) {
+ memcpy(cache[cache_index].block + offset, address, size);
+ raw_vfs_pwrite(mount_fd, cache[cache_index].block, block_byte_size,
+ block * block_byte_size);
+ return;
+ }
raw_vfs_pwrite(mount_fd, address, size, block * block_byte_size + offset);
}
void write_group_descriptor(u32 group_index, bgdt_t *block_group) {
int starting_block = (1024 == block_byte_size) ? 2 : 1;
- ext2_write_block(starting_block, block_group, sizeof(bgdt_t),
+ ext2_write_block(starting_block, (u8 *)block_group, sizeof(bgdt_t),
group_index * sizeof(bgdt_t));
}
@@ -418,10 +425,8 @@ int get_free_inode(int allocate) {
void write_to_indirect_block(u32 indirect_block, u32 index, u32 new_block) {
index %= INDIRECT_BLOCK_CAPACITY;
- u32 buffer[INDIRECT_BLOCK_CAPACITY];
- ext2_read_block(indirect_block, buffer, sizeof(buffer), 0);
- buffer[index] = new_block;
- ext2_write_block(indirect_block, buffer, sizeof(buffer), 0);
+ ext2_write_block(indirect_block, (u8 *)&new_block, sizeof(u32),
+ index * sizeof(u32));
}
int ext2_allocate_block(inode_t *inode, u32 index) {
@@ -455,8 +460,7 @@ int ext2_allocate_block(inode_t *inode, u32 index) {
inode->double_indirect_block_pointer = n;
}
- u32 value = get_singly_block_index(inode->double_indirect_block_pointer,
- index / INDIRECT_BLOCK_CAPACITY);
+ u32 value;
if (0 == (index % INDIRECT_BLOCK_CAPACITY)) {
int n = get_free_block(1 /*true*/);
if (-1 == n) {
@@ -465,6 +469,9 @@ int ext2_allocate_block(inode_t *inode, u32 index) {
write_to_indirect_block(inode->double_indirect_block_pointer,
index / INDIRECT_BLOCK_CAPACITY, n);
value = n;
+ } else {
+ value = get_singly_block_index(inode->double_indirect_block_pointer,
+ index / INDIRECT_BLOCK_CAPACITY);
}
write_to_indirect_block(value, index, b);