sizeof(ino_index));
checksum = ext4_crc32c(checksum, &ino_gen,
sizeof(ino_gen));
- /* Finally calculate crc32 checksum against
+ /* Finally calculate crc32 checksum against
* the entire extent block up to the checksum field */
checksum = ext4_crc32c(checksum, eh,
EXT4_EXTENT_TAIL_OFFSET(eh));
#define ext4_ext_block_csum(...) 0
#endif
-/*
- * BIG FAT NOTES:
- * Currently we do not verify the checksum of extent
- * (only the case in ext4_extent.c)
- */
-
static void ext4_extent_block_csum_set(struct ext4_inode_ref *inode_ref,
struct ext4_extent_header *eh)
{
struct ext4_extent_tail *tail;
+ if (!ext4_sb_feature_ro_com(&inode_ref->fs->sb,
+ EXT4_FRO_COM_METADATA_CSUM))
+ return;
if (to_le16(eh->depth) < ext_depth(inode_ref->inode)) {
tail = find_ext4_extent_tail(eh);
}
}
+#if CONFIG_META_CSUM_ENABLE
+static bool
+ext4_extent_verify_block_csum(struct ext4_inode_ref *inode_ref,
+ struct ext4_block *block)
+{
+ struct ext4_extent_header *eh;
+ struct ext4_extent_tail *tail;
+ eh = (struct ext4_extent_header *)block->data;
+ if (!ext4_sb_feature_ro_com(&inode_ref->fs->sb,
+ EXT4_FRO_COM_METADATA_CSUM))
+ return true;
+
+ if (to_le16(eh->depth) < ext_depth(inode_ref->inode)) {
+ tail = find_ext4_extent_tail(eh);
+ return tail->et_checksum ==
+ to_le32(ext4_ext_block_csum(inode_ref, eh));
+ }
+
+ return true;
+}
+#else
+#define ext4_extent_verify_block_csum(...) true
+#endif
+
/**@brief Binary search in extent index node.
* @param header Extent header of index node
* @param index Output value - found index will be set here
int rc = ext4_block_get(inode_ref->fs->bdev, &block, child);
if (rc != EOK)
return rc;
+ if (!ext4_extent_verify_block_csum(inode_ref,
+ &block)) {
+ ext4_dbg(DEBUG_EXTENT,
+ DBG_WARN "Extent block checksum failed."
+ "Blocknr: %" PRIu64"\n",
+ child);
+ }
header = (struct ext4_extent_header *)block.data;
}
if (rc != EOK)
goto cleanup;
+ if (!ext4_extent_verify_block_csum(inode_ref,
+ &block)) {
+ ext4_dbg(DEBUG_EXTENT,
+ DBG_WARN "Extent block checksum failed."
+ "Blocknr: %" PRIu64"\n",
+ fblock);
+ }
+
pos++;
eh = (struct ext4_extent_header *)block.data;
if (rc != EOK)
return rc;
+ if (!ext4_extent_verify_block_csum(inode_ref,
+ &block)) {
+ ext4_dbg(DEBUG_EXTENT,
+ DBG_WARN "Extent block checksum failed."
+ "Blocknr: %" PRIu64"\n",
+ fblock);
+ }
+
struct ext4_extent_header *header = (void *)block.data;
if (ext4_extent_header_get_depth(header)) {
ext4_extent_header_set_entries_count(path_ptr->header, entries);
ext4_extent_block_csum_set(inode_ref, path_ptr->header);
- path_ptr->block.dirty = true;
+ ext4_bcache_set_dirty(path_ptr->block.buf);
/* If leaf node is empty, parent entry must be modified */
bool remove_parent_record = false;
ext4_extent_header_set_entries_count(path_ptr->header, entries);
ext4_extent_block_csum_set(inode_ref, path_ptr->header);
- path_ptr->block.dirty = true;
+ ext4_bcache_set_dirty(path_ptr->block.buf);
/* Free the node if it is empty */
if ((entries == 0) && (path_ptr != path)) {
struct ext4_block block;
rc =
- ext4_block_get(inode_ref->fs->bdev, &block, fblock);
+ ext4_block_get_noread(inode_ref->fs->bdev, &block, fblock);
if (rc != EOK) {
ext4_balloc_free_block(inode_ref, fblock);
return rc;
ext4_extent_header_set_generation(path_ptr->header, 0);
ext4_extent_block_csum_set(inode_ref, path_ptr->header);
- path_ptr->block.dirty = true;
+ ext4_bcache_set_dirty(path_ptr->block.buf);
/* Jump to the preceding item */
path_ptr--;
ext4_extent_header_set_entries_count(path_ptr->header,
entries + 1);
ext4_extent_block_csum_set(inode_ref, path_ptr->header);
- path_ptr->block.dirty = true;
+ ext4_bcache_set_dirty(path_ptr->block.buf);
/* No more splitting needed */
return EOK;
return rc;
struct ext4_block block;
- rc = ext4_block_get(inode_ref->fs->bdev, &block, new_fblock);
+ rc = ext4_block_get_noread(inode_ref->fs->bdev, &block, new_fblock);
if (rc != EOK)
return rc;
limit);
ext4_extent_block_csum_set(inode_ref, old_root->header);
- old_root->block.dirty = true;
+ ext4_bcache_set_dirty(old_root->block.buf);
/* Re-initialize new root metadata */
new_root->depth = root_depth + 1;
/* Since new_root belongs to on-disk inode,
* we don't do checksum here */
- new_root->block.dirty = true;
+ ext4_bcache_set_dirty(new_root->block.buf);
} else {
if (path->depth) {
path->index =
ext4_extent_header_set_entries_count(path->header, entries + 1);
/* Since new_root belongs to on-disk inode,
* we don't do checksum here */
- path->block.dirty = true;
+ ext4_bcache_set_dirty(path->block.buf);
}
return EOK;
}
ext4_extent_block_csum_set(inode_ref, path_ptr->header);
- path_ptr->block.dirty = true;
+ ext4_bcache_set_dirty(path_ptr->block.buf);
goto finish;
} else {
}
ext4_extent_block_csum_set(inode_ref, path_ptr->header);
- path_ptr->block.dirty = true;
+ ext4_bcache_set_dirty(path_ptr->block.buf);
goto finish;
}
}
ext4_extent_block_csum_set(inode_ref, path_ptr->header);
- path_ptr->block.dirty = true;
+ ext4_bcache_set_dirty(path_ptr->block.buf);
finish:
/* Set return values */