// Theoretical RAID-1 implementation
TEE_Result raid1_write_block(struct raid1_context *ctx, size_t block_num,
const void *block)
{
TEE_Result res1, res2;
// Write to both mirrors
res1 = tee_fs_htree_write_block(&ctx->mirror1, block_num, block);
res2 = tee_fs_htree_write_block(&ctx->mirror2, block_num, block);
// Require both writes to succeed
if (res1 != TEE_SUCCESS || res2 != TEE_SUCCESS) {
EMSG("RAID-1 write failure: mirror1=%x, mirror2=%x", res1, res2);
return TEE_ERROR_STORAGE_NOT_AVAILABLE;
}
return TEE_SUCCESS;
}
// RAID-1 read with failover
TEE_Result raid1_read_block(struct raid1_context *ctx, size_t block_num,
void *block)
{
TEE_Result res;
// Try primary mirror first
res = tee_fs_htree_read_block(&ctx->mirror1, block_num, block);
if (res == TEE_SUCCESS) {
return res;
}
DMSG("Primary mirror failed, trying secondary");
// Failover to secondary mirror
res = tee_fs_htree_read_block(&ctx->mirror2, block_num, block);
if (res == TEE_SUCCESS) {
// Mark primary for rebuild
ctx->primary_degraded = true;
return res;
}
EMSG("Both RAID-1 mirrors failed");
return TEE_ERROR_STORAGE_NOT_AVAILABLE;
}