Files
libaaruformat/docs/html/erasure_8c.html

927 lines
83 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.18.0"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>libaaruformat: src/erasure.c File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="dynsections.js"></script>
<script type="text/javascript" src="codefolding.js"></script>
<script type="text/javascript" src="clipboard.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript" src="cookie.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">libaaruformat<span id="projectnumber">&#160;1.0</span>
</div>
<div id="projectbrief">Aaru Data Preservation Suite - Format Library</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.18.0 -->
<script type="text/javascript">
let searchBox = new SearchBox("searchBox", "search/",'.html');
</script>
<script type="text/javascript">
document.addEventListener('DOMContentLoaded', codefold.init);
</script>
<script type="application/json" id="doxygen-config">
{
"relPath": "",
"generateTreeView": true,
"searchEngine": true,
"serverBasedSearch": false,
"disableIndex": false,
"dynamicMenus": true,
"fullSidebar": false
}
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<div id="main-nav-mobile">
<div class="sm sm-dox"><input id="main-menu-state" type="checkbox"/>
<label class="main-menu-btn" for="main-menu-state">
<span class="main-menu-btn-icon"></span> Toggle main menu visibility</label>
<span id="searchBoxPos1"></span>
</div>
</div><!-- main-nav-mobile -->
<div id="main-nav">
<ul class="sm sm-dox" id="main-menu">
<li id="searchBoxPos2">
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<span id="MSearchSelect" class="search-icon"><span class="search-icon-dropdown"></span></span>
<input type="text" id="MSearchField" value="" placeholder="Search" accesskey="S"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><div id="MSearchCloseImg" class="close-icon"></div></a>
</span>
</div>
</li>
</ul>
</div><!-- main-nav -->
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
document.addEventListener('DOMContentLoaded',() => { initNavTree('erasure_8c.html','',''); });
</script>
<div id="container">
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">erasure.c File Reference</div></div>
</div><!--header-->
<div class="contents">
<p>Erasure coding setup, parity accumulation, and write-path integration.
<a href="#details">More...</a></p>
<div class="textblock"><code>#include &lt;stdlib.h&gt;</code><br />
<code>#include &lt;string.h&gt;</code><br />
<code>#include &quot;<a class="el" href="aaruformat_8h_source.html">aaruformat.h</a>&quot;</code><br />
<code>#include &quot;<a class="el" href="context_8h_source.html">aaruformat/context.h</a>&quot;</code><br />
<code>#include &quot;<a class="el" href="consts_8h_source.html">aaruformat/consts.h</a>&quot;</code><br />
<code>#include &quot;<a class="el" href="enums_8h_source.html">aaruformat/enums.h</a>&quot;</code><br />
<code>#include &quot;<a class="el" href="errors_8h_source.html">aaruformat/errors.h</a>&quot;</code><br />
<code>#include &quot;<a class="el" href="data_8h_source.html">aaruformat/structs/data.h</a>&quot;</code><br />
<code>#include &quot;<a class="el" href="ddt_8h_source.html">aaruformat/structs/ddt.h</a>&quot;</code><br />
<code>#include &quot;<a class="el" href="erasure_8h_source.html">aaruformat/structs/erasure.h</a>&quot;</code><br />
<code>#include &quot;<a class="el" href="index_8h_source.html">aaruformat/structs/index.h</a>&quot;</code><br />
<code>#include &quot;<a class="el" href="internal_8h_source.html">internal.h</a>&quot;</code><br />
<code>#include &quot;<a class="el" href="log_8h_source.html">log.h</a>&quot;</code><br />
<code>#include &quot;<a class="el" href="gf256_8h_source.html">lib/gf256.h</a>&quot;</code><br />
<code>#include &quot;<a class="el" href="reed__solomon_8h_source.html">lib/reed_solomon.h</a>&quot;</code><br />
</div>
<p><a href="erasure_8c_source.html">Go to the source code of this file.</a></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 id="header-nested-classes" class="groupheader"><a id="nested-classes" name="nested-classes"></a>
Data Structures</h2></td></tr>
<tr class="memitem:EcReadStripe" id="r_EcReadStripe"><td class="memItemLeft">struct &#160;</td><td class="memItemRight"><a class="el" href="structEcReadStripe.html">EcReadStripe</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">In-memory representation of one data stripe (parsed from ECMB). <a href="structEcReadStripe.html#details">More...</a><br /></td></tr>
<tr class="memitem:EcBlockLookupEntry" id="r_EcBlockLookupEntry"><td class="memItemLeft">struct &#160;</td><td class="memItemRight"><a class="el" href="structEcBlockLookupEntry.html">EcBlockLookupEntry</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Hash table entry mapping block file offset -&gt; stripe index + position. <a href="structEcBlockLookupEntry.html#details">More...</a><br /></td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 id="header-define-members" class="groupheader"><a id="define-members" name="define-members"></a>
Macros</h2></td></tr>
<tr class="memitem:a415f83d4f5fbce86adcec87aa368313c" id="r_a415f83d4f5fbce86adcec87aa368313c"><td class="memItemLeft">#define&#160;</td><td class="memItemRight"><a class="el" href="#a415f83d4f5fbce86adcec87aa368313c">WRITE_GROUP</a>(desc, desc_len, grp)</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 id="header-typedef-members" class="groupheader"><a id="typedef-members" name="typedef-members"></a>
Typedefs</h2></td></tr>
<tr class="memitem:a2f164deb906da3861ed577a951149a23" id="r_a2f164deb906da3861ed577a951149a23"><td class="memItemLeft">typedef struct EcReadStripe&#160;</td><td class="memItemRight"><a class="el" href="#a2f164deb906da3861ed577a951149a23">EcReadStripe</a></td></tr>
<tr class="memdesc:a2f164deb906da3861ed577a951149a23"><td class="mdescLeft">&#160;</td><td class="mdescRight">In-memory representation of one data stripe (parsed from ECMB). <br /></td></tr>
<tr class="memitem:a49845afc245ef4c7570c1a59b8e2c893" id="r_a49845afc245ef4c7570c1a59b8e2c893"><td class="memItemLeft">typedef struct EcBlockLookupEntry&#160;</td><td class="memItemRight"><a class="el" href="#a49845afc245ef4c7570c1a59b8e2c893">EcBlockLookupEntry</a></td></tr>
<tr class="memdesc:a49845afc245ef4c7570c1a59b8e2c893"><td class="mdescLeft">&#160;</td><td class="mdescRight">Hash table entry mapping block file offset -&gt; stripe index + position. <br /></td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 id="header-func-members" class="groupheader"><a id="func-members" name="func-members"></a>
Functions</h2></td></tr>
<tr class="memitem:aa258c90d05ad57fc4c378679e5187e48" id="r_aa258c90d05ad57fc4c378679e5187e48"><td class="memItemLeft">void&#160;</td><td class="memItemRight"><a class="el" href="#aa258c90d05ad57fc4c378679e5187e48">ec_flush_data_stripe</a> (<a class="el" href="structaaruformat__context.html">aaruformat_context</a> *ctx, uint32_t slot)</td></tr>
<tr class="memdesc:aa258c90d05ad57fc4c378679e5187e48"><td class="mdescLeft">&#160;</td><td class="mdescRight">Write M parity blocks for a completed data stripe slot and record the stripe descriptor. <br /></td></tr>
<tr class="memitem:a8b0f3ab93ca60ce00321ca28c2484c7c" id="r_a8b0f3ab93ca60ce00321ca28c2484c7c"><td class="memItemLeft">int32_t&#160;</td><td class="memItemRight"><a class="el" href="#a8b0f3ab93ca60ce00321ca28c2484c7c">aaruf_set_erasure_coding</a> (void *context, uint8_t algorithm, uint16_t K, uint16_t M)</td></tr>
<tr class="memdesc:a8b0f3ab93ca60ce00321ca28c2484c7c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Configure erasure coding for a newly created image. <br /></td></tr>
<tr class="memitem:a51fe2ca1a6eabf109f0cfc4b3223508b" id="r_a51fe2ca1a6eabf109f0cfc4b3223508b"><td class="memItemLeft">int32_t&#160;</td><td class="memItemRight"><a class="el" href="#a51fe2ca1a6eabf109f0cfc4b3223508b">aaruf_set_erasure_coding_auto</a> (void *context, uint8_t recovery_percent)</td></tr>
<tr class="memdesc:a51fe2ca1a6eabf109f0cfc4b3223508b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Configure erasure coding from a desired recovery percentage. <br /></td></tr>
<tr class="memitem:a676c380c73d5adf73afd7613ec06b29d" id="r_a676c380c73d5adf73afd7613ec06b29d"><td class="memItemLeft">void&#160;</td><td class="memItemRight"><a class="el" href="#a676c380c73d5adf73afd7613ec06b29d">ec_accumulate_data_block</a> (<a class="el" href="structaaruformat__context.html">aaruformat_context</a> *ctx, const <a class="el" href="structBlockHeader.html">BlockHeader</a> *block_header, const uint8_t *lzma_props, const uint8_t *payload, uint32_t payload_size, uint64_t file_offset)</td></tr>
<tr class="memdesc:a676c380c73d5adf73afd7613ec06b29d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Accumulate parity for a data block that was just written to disk. <br /></td></tr>
<tr class="memitem:aed80b4dc1f360dbac00a5f73d350bf1a" id="r_aed80b4dc1f360dbac00a5f73d350bf1a"><td class="memItemLeft">static void&#160;</td><td class="memItemRight"><a class="el" href="#aed80b4dc1f360dbac00a5f73d350bf1a">ec_write_batch_parity</a> (<a class="el" href="structaaruformat__context.html">aaruformat_context</a> *ctx, const uint64_t *offsets, const uint32_t *sizes, uint32_t block_count, uint8_t group_type, uint16_t parity_data_type, uint8_t **out_desc, size_t *out_desc_len, <a class="el" href="structStripeGroupDescriptor.html">StripeGroupDescriptor</a> *out_group)</td></tr>
<tr class="memdesc:aed80b4dc1f360dbac00a5f73d350bf1a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compute and write batch parity for a set of blocks already on disk. <br /></td></tr>
<tr class="memitem:a1222930aded868b0b0c4eeed13c237e2" id="r_a1222930aded868b0b0c4eeed13c237e2"><td class="memItemLeft">static void&#160;</td><td class="memItemRight"><a class="el" href="#a1222930aded868b0b0c4eeed13c237e2">ec_collect_blocks_by_type</a> (<a class="el" href="structaaruformat__context.html">aaruformat_context</a> *ctx, uint32_t block_type, uint64_t **out_offsets, uint32_t **out_sizes, uint32_t *out_count)</td></tr>
<tr class="memdesc:a1222930aded868b0b0c4eeed13c237e2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Collect file offsets and on-disk sizes for index entries matching a block type. <br /></td></tr>
<tr class="memitem:a38a12ac5d36e23b28d2f110906b14126" id="r_a38a12ac5d36e23b28d2f110906b14126"><td class="memItemLeft">void&#160;</td><td class="memItemRight"><a class="el" href="#a38a12ac5d36e23b28d2f110906b14126">ec_finalize</a> (<a class="el" href="structaaruformat__context.html">aaruformat_context</a> *ctx)</td></tr>
<tr class="memdesc:a38a12ac5d36e23b28d2f110906b14126"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flush all partial data stripes and write parity for all groups + ECMB + recovery footer. <br /></td></tr>
<tr class="memitem:a04ae581a91d9e77097ed4ebba627e371" id="r_a04ae581a91d9e77097ed4ebba627e371"><td class="memItemLeft">int32_t&#160;</td><td class="memItemRight"><a class="el" href="#a04ae581a91d9e77097ed4ebba627e371">ec_recover_raw_block</a> (<a class="el" href="structaaruformat__context.html">aaruformat_context</a> *ctx, uint64_t block_offset, uint8_t **recovered_data, uint32_t *recovered_size, void *stripes_ptr, uint32_t stripe_count, void *lookup_ptr, uint16_t group_K, uint16_t group_M, uint32_t group_shard_size)</td></tr>
<tr class="memdesc:a04ae581a91d9e77097ed4ebba627e371"><td class="mdescLeft">&#160;</td><td class="mdescRight">Attempt to recover a raw block at a given file offset using a specified stripe group. <br /></td></tr>
<tr class="memitem:aa17442a11d3d3ef4b51b5129eed19b45" id="r_aa17442a11d3d3ef4b51b5129eed19b45"><td class="memItemLeft">int32_t&#160;</td><td class="memItemRight"><a class="el" href="#aa17442a11d3d3ef4b51b5129eed19b45">ec_recover_meta_block</a> (<a class="el" href="structaaruformat__context.html">aaruformat_context</a> *ctx, uint64_t block_offset, uint8_t **recovered_data, uint32_t *recovered_size)</td></tr>
<tr class="memdesc:aa17442a11d3d3ef4b51b5129eed19b45"><td class="mdescLeft">&#160;</td><td class="mdescRight">Attempt to recover a metadata/media-tag block at a given file offset. <br /></td></tr>
<tr class="memitem:a41514b5f6f31a9a2207f2807da831e26" id="r_a41514b5f6f31a9a2207f2807da831e26"><td class="memItemLeft">int32_t&#160;</td><td class="memItemRight"><a class="el" href="#a41514b5f6f31a9a2207f2807da831e26">ec_recover_ddt_block</a> (<a class="el" href="structaaruformat__context.html">aaruformat_context</a> *ctx, uint64_t block_offset, uint8_t **recovered_data, uint32_t *recovered_size)</td></tr>
<tr class="memdesc:a41514b5f6f31a9a2207f2807da831e26"><td class="mdescLeft">&#160;</td><td class="mdescRight">Attempt to recover a DDT secondary block at a given file offset. <br /></td></tr>
<tr class="memitem:ae5fe558b49013df6e932278061a2ab53" id="r_ae5fe558b49013df6e932278061a2ab53"><td class="memItemLeft">void&#160;</td><td class="memItemRight"><a class="el" href="#ae5fe558b49013df6e932278061a2ab53">ec_free</a> (<a class="el" href="structaaruformat__context.html">aaruformat_context</a> *ctx)</td></tr>
<tr class="memdesc:ae5fe558b49013df6e932278061a2ab53"><td class="mdescLeft">&#160;</td><td class="mdescRight">Free all erasure coding state from the context. <br /></td></tr>
<tr class="memitem:a18f424702fcd85725ee26c1cf7e253db" id="r_a18f424702fcd85725ee26c1cf7e253db"><td class="memItemLeft">void&#160;</td><td class="memItemRight"><a class="el" href="#a18f424702fcd85725ee26c1cf7e253db">ec_load_ecmb</a> (<a class="el" href="structaaruformat__context.html">aaruformat_context</a> *ctx)</td></tr>
<tr class="memdesc:a18f424702fcd85725ee26c1cf7e253db"><td class="mdescLeft">&#160;</td><td class="mdescRight">Try to load the ECMB from the recovery footer at EOF. <br /></td></tr>
<tr class="memitem:a7a9ac507738cdf72e951f152edd4d233" id="r_a7a9ac507738cdf72e951f152edd4d233"><td class="memItemLeft">int32_t&#160;</td><td class="memItemRight"><a class="el" href="#a7a9ac507738cdf72e951f152edd4d233">ec_recover_data_block</a> (<a class="el" href="structaaruformat__context.html">aaruformat_context</a> *ctx, uint64_t block_offset, uint64_t offset, uint8_t *data, uint32_t *length, uint8_t sector_status)</td></tr>
<tr class="memdesc:a7a9ac507738cdf72e951f152edd4d233"><td class="mdescLeft">&#160;</td><td class="mdescRight">Attempt to recover a data block that failed decompression or CRC verification. <br /></td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 id="header-var-members" class="groupheader"><a id="var-members" name="var-members"></a>
Variables</h2></td></tr>
<tr class="memitem:a1883da545c74667f3438d8e48b195aa1" id="r_a1883da545c74667f3438d8e48b195aa1"><td class="memItemLeft">static UT_icd&#160;</td><td class="memItemRight"><a class="el" href="#a1883da545c74667f3438d8e48b195aa1">ec_stripe_icd</a> = {sizeof(uint8_t), NULL, NULL, NULL}</td></tr>
</table>
<a name="details" id="details"></a><h2 id="header-details" class="groupheader">Detailed Description</h2>
<div class="textblock"><p>Erasure coding setup, parity accumulation, and write-path integration. </p>
<p class="definition">Definition in file <a class="el" href="erasure_8c_source.html">erasure.c</a>.</p>
</div><a name="doc-define-members" id="doc-define-members"></a><h2 id="header-doc-define-members" class="groupheader">Macro Definition Documentation</h2>
<a id="a415f83d4f5fbce86adcec87aa368313c" name="a415f83d4f5fbce86adcec87aa368313c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a415f83d4f5fbce86adcec87aa368313c">&#9670;&#160;</a></span>WRITE_GROUP</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define WRITE_GROUP</td>
<td>(</td>
<td class="paramtype"></td> <td class="paramname"><span class="paramname"><em>desc</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"></td> <td class="paramname"><span class="paramname"><em>desc_len</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"></td> <td class="paramname"><span class="paramname"><em>grp</em></span>&#160;)</td>
</tr>
</table>
</div><div class="memdoc">
<b>Value:</b><div class="fragment"><div class="line"><span class="keywordflow">if</span>(desc) { memcpy(wp, &amp;(grp), <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeGroupDescriptor.html">StripeGroupDescriptor</a>)); wp += <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeGroupDescriptor.html">StripeGroupDescriptor</a>); \</div>
<div class="line"> memcpy(wp, (desc), (desc_len)); wp += (desc_len); }</div>
<div class="ttc" id="astructStripeGroupDescriptor_html"><div class="ttname"><a href="structStripeGroupDescriptor.html">StripeGroupDescriptor</a></div><div class="ttdoc">Describes one protection group within the ECMB payload.</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00068">erasure.h:69</a></div></div>
</div><!-- fragment -->
<p class="reference">Referenced by <a class="el" href="erasure_8c_source.html#l00585">ec_finalize()</a>.</p>
</div>
</div>
<a name="doc-typedef-members" id="doc-typedef-members"></a><h2 id="header-doc-typedef-members" class="groupheader">Typedef Documentation</h2>
<a id="a49845afc245ef4c7570c1a59b8e2c893" name="a49845afc245ef4c7570c1a59b8e2c893"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a49845afc245ef4c7570c1a59b8e2c893">&#9670;&#160;</a></span>EcBlockLookupEntry</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef struct EcBlockLookupEntry EcBlockLookupEntry</td>
</tr>
</table>
</div><div class="memdoc">
<p>Hash table entry mapping block file offset -&gt; stripe index + position. </p>
</div>
</div>
<a id="a2f164deb906da3861ed577a951149a23" name="a2f164deb906da3861ed577a951149a23"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a2f164deb906da3861ed577a951149a23">&#9670;&#160;</a></span>EcReadStripe</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef struct EcReadStripe EcReadStripe</td>
</tr>
</table>
</div><div class="memdoc">
<p>In-memory representation of one data stripe (parsed from ECMB). </p>
</div>
</div>
<a name="doc-func-members" id="doc-func-members"></a><h2 id="header-doc-func-members" class="groupheader">Function Documentation</h2>
<a id="a8b0f3ab93ca60ce00321ca28c2484c7c" name="a8b0f3ab93ca60ce00321ca28c2484c7c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a8b0f3ab93ca60ce00321ca28c2484c7c">&#9670;&#160;</a></span>aaruf_set_erasure_coding()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">int32_t aaruf_set_erasure_coding </td>
<td>(</td>
<td class="paramtype">void *</td> <td class="paramname"><span class="paramname"><em>context</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t</td> <td class="paramname"><span class="paramname"><em>algorithm</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint16_t</td> <td class="paramname"><span class="paramname"><em>K</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint16_t</td> <td class="paramname"><span class="paramname"><em>M</em></span>&#160;)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Configure erasure coding for a newly created image. </p>
<p>Must be called after <a class="el" href="decls_8h.html#a7065a9fefcaabfecc4184528f01ef013" title="Creates a new AaruFormat image file.">aaruf_create()</a> and before the first <a class="el" href="decls_8h.html#a4b8cd2bb5fd9e2c670a0a13695c6f9e3" title="Writes a sector to the AaruFormat image.">aaruf_write_sector()</a>. Allocates K interleaved stripe slots, each with M parity buffers.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">context</td><td>Opaque context from <a class="el" href="decls_8h.html#a7065a9fefcaabfecc4184528f01ef013" title="Creates a new AaruFormat image file.">aaruf_create()</a>. </td></tr>
<tr><td class="paramname">algorithm</td><td><a class="el" href="enums_8h.html#a83c99da65804eb80cfb955eb9a15ef5e" title="Erasure coding algorithms supported by the ECMB.">ErasureCodingAlgorithm</a> (0=XOR, 1=RS). </td></tr>
<tr><td class="paramname">K</td><td>Data blocks per stripe (&gt;= 1). </td></tr>
<tr><td class="paramname">M</td><td>Parity blocks per stripe (&gt;= 1). </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>AARUF_STATUS_OK on success, error code otherwise. </dd></dl>
<p class="definition">Definition at line <a class="el" href="erasure_8c_source.html#l00082">82</a> of file <a class="el" href="erasure_8c_source.html">erasure.c</a>.</p>
<p class="reference">References <a class="el" href="decls_8h_source.html#l00046">AARU_CALL</a>, <a class="el" href="decls_8h_source.html#l00055">AARU_EXPORT</a>, <a class="el" href="enums_8h_source.html#l00319">AARU_FEATURE_ROCOMPAT_ERASURE</a>, <a class="el" href="consts_8h_source.html#l00064">AARU_MAGIC</a>, <a class="el" href="errors_8h_source.html#l00065">AARUF_ERROR_INCORRECT_DATA_SIZE</a>, <a class="el" href="errors_8h_source.html#l00048">AARUF_ERROR_NOT_ENOUGH_MEMORY</a>, <a class="el" href="errors_8h_source.html#l00061">AARUF_READ_ONLY</a>, <a class="el" href="erasure_8c_source.html#l00082">aaruf_set_erasure_coding()</a>, <a class="el" href="enums_8h_source.html#l00237">AARUF_STATUS_INVALID_CONTEXT</a>, <a class="el" href="errors_8h_source.html#l00082">AARUF_STATUS_OK</a>, <a class="el" href="context_8h_source.html#l00388">aaruformat_context::ec_algorithm</a>, <a class="el" href="context_8h_source.html#l00394">aaruformat_context::ec_data_block_offsets</a>, <a class="el" href="context_8h_source.html#l00395">aaruformat_context::ec_data_block_sizes</a>, <a class="el" href="context_8h_source.html#l00393">aaruformat_context::ec_data_parity</a>, <a class="el" href="context_8h_source.html#l00396">aaruformat_context::ec_data_shard_crcs</a>, <a class="el" href="context_8h_source.html#l00391">aaruformat_context::ec_data_shard_size</a>, <a class="el" href="context_8h_source.html#l00397">aaruformat_context::ec_data_stripe_counts</a>, <a class="el" href="context_8h_source.html#l00399">aaruformat_context::ec_data_stripes</a>, <a class="el" href="context_8h_source.html#l00400">aaruformat_context::ec_enabled</a>, <a class="el" href="context_8h_source.html#l00389">aaruformat_context::ec_K</a>, <a class="el" href="context_8h_source.html#l00390">aaruformat_context::ec_M</a>, <a class="el" href="context_8h_source.html#l00392">aaruformat_context::ec_rs_ctx</a>, <a class="el" href="erasure_8c_source.html#l00065">ec_stripe_icd</a>, <a class="el" href="context_8h_source.html#l00398">aaruformat_context::ec_total_data_blocks</a>, <a class="el" href="header_8h_source.html#l00122">AaruHeaderV2::featureCompatibleRo</a>, <a class="el" href="context_8h_source.html#l00181">aaruformat_context::header</a>, <a class="el" href="context_8h_source.html#l00302">aaruformat_context::is_writing</a>, <a class="el" href="enums_8h_source.html#l00328">kErasureCodingXor</a>, <a class="el" href="context_8h_source.html#l00180">aaruformat_context::magic</a>, <a class="el" href="reed__solomon_8c_source.html#l00150">rs_create()</a>, <a class="el" href="reed__solomon_8c_source.html#l00201">rs_free()</a>, and <a class="el" href="log_8h_source.html#l00025">TRACE</a>.</p>
<p class="reference">Referenced by <a class="el" href="erasure_8c_source.html#l00082">aaruf_set_erasure_coding()</a>, and <a class="el" href="erasure_8c_source.html#l00174">aaruf_set_erasure_coding_auto()</a>.</p>
</div>
</div>
<a id="a51fe2ca1a6eabf109f0cfc4b3223508b" name="a51fe2ca1a6eabf109f0cfc4b3223508b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a51fe2ca1a6eabf109f0cfc4b3223508b">&#9670;&#160;</a></span>aaruf_set_erasure_coding_auto()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">int32_t aaruf_set_erasure_coding_auto </td>
<td>(</td>
<td class="paramtype">void *</td> <td class="paramname"><span class="paramname"><em>context</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t</td> <td class="paramname"><span class="paramname"><em>recovery_percent</em></span>&#160;)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Configure erasure coding from a desired recovery percentage. </p>
<p>Computes K and M from the requested percentage of data that should be recoverable. Higher recovery percentages produce higher M values (more parity blocks = better burst-corruption tolerance).</p>
<p>Strategy: M = max(2, min(8, round(20 * percent / 100))) K = M * 100 / percent</p>
<p>This keeps K roughly constant (~16–40) while scaling M monotonically with the requested recovery level:</p>
<p>1% → RS(200, 2) M=2, minimum burst tolerance 5% → RS(40, 2) M=2 10% → RS(20, 2) M=2 15% → RS(20, 3) M=3, burst tolerance grows 25% → RS(20, 5) M=5 50% → RS(16, 8) M=8 (capped), strong burst tolerance 100% → RS(8, 8) M=8 (capped), maximum protection</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">context</td><td>Opaque context from <a class="el" href="decls_8h.html#a7065a9fefcaabfecc4184528f01ef013" title="Creates a new AaruFormat image file.">aaruf_create()</a>. </td></tr>
<tr><td class="paramname">recovery_percent</td><td>Desired recoverable percentage (1..100). </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>AARUF_STATUS_OK on success, error code otherwise. </dd></dl>
<p class="definition">Definition at line <a class="el" href="erasure_8c_source.html#l00174">174</a> of file <a class="el" href="erasure_8c_source.html">erasure.c</a>.</p>
<p class="reference">References <a class="el" href="decls_8h_source.html#l00046">AARU_CALL</a>, <a class="el" href="decls_8h_source.html#l00055">AARU_EXPORT</a>, <a class="el" href="errors_8h_source.html#l00065">AARUF_ERROR_INCORRECT_DATA_SIZE</a>, <a class="el" href="erasure_8c_source.html#l00082">aaruf_set_erasure_coding()</a>, <a class="el" href="erasure_8c_source.html#l00174">aaruf_set_erasure_coding_auto()</a>, <a class="el" href="enums_8h_source.html#l00329">kErasureCodingRsVandermonde</a>, and <a class="el" href="log_8h_source.html#l00025">TRACE</a>.</p>
<p class="reference">Referenced by <a class="el" href="erasure_8c_source.html#l00174">aaruf_set_erasure_coding_auto()</a>.</p>
</div>
</div>
<a id="a676c380c73d5adf73afd7613ec06b29d" name="a676c380c73d5adf73afd7613ec06b29d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a676c380c73d5adf73afd7613ec06b29d">&#9670;&#160;</a></span>ec_accumulate_data_block()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void ec_accumulate_data_block </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structaaruformat__context.html">aaruformat_context</a> *</td> <td class="paramname"><span class="paramname"><em>ctx</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="structBlockHeader.html">BlockHeader</a> *</td> <td class="paramname"><span class="paramname"><em>block_header</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const uint8_t *</td> <td class="paramname"><span class="paramname"><em>lzma_props</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const uint8_t *</td> <td class="paramname"><span class="paramname"><em>payload</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint32_t</td> <td class="paramname"><span class="paramname"><em>payload_size</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint64_t</td> <td class="paramname"><span class="paramname"><em>file_offset</em></span>&#160;)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Accumulate parity for a data block that was just written to disk. </p>
<p>Called from <a class="el" href="internal_8h.html#a2402812f5e04ba16765208c0b70fa6c5" title="Finalizes and writes the current data block to the AaruFormat image file.">aaruf_close_current_block()</a> after writing <a class="el" href="structBlockHeader.html" title="Header preceding the compressed data payload of a data block (BlockType::DataBlock).">BlockHeader</a> + payload to the file but before freeing the compressed data buffer.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">ctx</td><td>Context with EC enabled. </td></tr>
<tr><td class="paramname">block_header</td><td>Pointer to the <a class="el" href="structBlockHeader.html" title="Header preceding the compressed data payload of a data block (BlockType::DataBlock).">BlockHeader</a> that was written. </td></tr>
<tr><td class="paramname">lzma_props</td><td>LZMA properties (may be NULL if not LZMA). </td></tr>
<tr><td class="paramname">payload</td><td>Compressed payload data (or uncompressed if no compression). </td></tr>
<tr><td class="paramname">payload_size</td><td>Size of the payload data. </td></tr>
<tr><td class="paramname">file_offset</td><td>File offset where the block was written. </td></tr>
</table>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="erasure_8c_source.html#l00209">209</a> of file <a class="el" href="erasure_8c_source.html">erasure.c</a>.</p>
<p class="reference">References <a class="el" href="crc64_8c_source.html#l00160">aaruf_crc64_data()</a>, <a class="el" href="data_8h_source.html#l00074">BlockHeader::compression</a>, <a class="el" href="erasure_8c_source.html#l00209">ec_accumulate_data_block()</a>, <a class="el" href="context_8h_source.html#l00394">aaruformat_context::ec_data_block_offsets</a>, <a class="el" href="context_8h_source.html#l00395">aaruformat_context::ec_data_block_sizes</a>, <a class="el" href="context_8h_source.html#l00393">aaruformat_context::ec_data_parity</a>, <a class="el" href="context_8h_source.html#l00396">aaruformat_context::ec_data_shard_crcs</a>, <a class="el" href="context_8h_source.html#l00391">aaruformat_context::ec_data_shard_size</a>, <a class="el" href="context_8h_source.html#l00397">aaruformat_context::ec_data_stripe_counts</a>, <a class="el" href="context_8h_source.html#l00400">aaruformat_context::ec_enabled</a>, <a class="el" href="erasure_8c_source.html#l00323">ec_flush_data_stripe()</a>, <a class="el" href="context_8h_source.html#l00389">aaruformat_context::ec_K</a>, <a class="el" href="context_8h_source.html#l00390">aaruformat_context::ec_M</a>, <a class="el" href="context_8h_source.html#l00392">aaruformat_context::ec_rs_ctx</a>, <a class="el" href="context_8h_source.html#l00398">aaruformat_context::ec_total_data_blocks</a>, <a class="el" href="enums_8h_source.html#l00034">kCompressionLzma</a>, <a class="el" href="consts_8h_source.html#l00086">LZMA_PROPERTIES_LENGTH</a>, <a class="el" href="reed__solomon_8c_source.html#l00213">rs_encode_incremental()</a>, <a class="el" href="reed__solomon_8c_source.html#l00208">rs_get_coefficient()</a>, and <a class="el" href="log_8h_source.html#l00025">TRACE</a>.</p>
<p class="reference">Referenced by <a class="el" href="write_8c_source.html#l01569">aaruf_close_current_block()</a>, and <a class="el" href="erasure_8c_source.html#l00209">ec_accumulate_data_block()</a>.</p>
</div>
</div>
<a id="a1222930aded868b0b0c4eeed13c237e2" name="a1222930aded868b0b0c4eeed13c237e2"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a1222930aded868b0b0c4eeed13c237e2">&#9670;&#160;</a></span>ec_collect_blocks_by_type()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">void ec_collect_blocks_by_type </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structaaruformat__context.html">aaruformat_context</a> *</td> <td class="paramname"><span class="paramname"><em>ctx</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint32_t</td> <td class="paramname"><span class="paramname"><em>block_type</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint64_t **</td> <td class="paramname"><span class="paramname"><em>out_offsets</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint32_t **</td> <td class="paramname"><span class="paramname"><em>out_sizes</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint32_t *</td> <td class="paramname"><span class="paramname"><em>out_count</em></span>&#160;)</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel static">static</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Collect file offsets and on-disk sizes for index entries matching a block type. </p>
<p class="definition">Definition at line <a class="el" href="erasure_8c_source.html#l00537">537</a> of file <a class="el" href="erasure_8c_source.html">erasure.c</a>.</p>
<p class="reference">References <a class="el" href="internal_8h_source.html#l00046">aaruf_fseek()</a>, <a class="el" href="index_8h_source.html#l00110">IndexEntry::blockType</a>, <a class="el" href="data_8h_source.html#l00076">BlockHeader::cmpLength</a>, <a class="el" href="ddt_8h_source.html#l00159">DdtHeader2::cmpLength</a>, <a class="el" href="enums_8h_source.html#l00166">DeDuplicationTable2</a>, <a class="el" href="enums_8h_source.html#l00168">DeDuplicationTableSecondary</a>, <a class="el" href="erasure_8c_source.html#l00537">ec_collect_blocks_by_type()</a>, <a class="el" href="context_8h_source.html#l00182">aaruformat_context::imageStream</a>, <a class="el" href="context_8h_source.html#l00262">aaruformat_context::index_entries</a>, and <a class="el" href="index_8h_source.html#l00112">IndexEntry::offset</a>.</p>
<p class="reference">Referenced by <a class="el" href="erasure_8c_source.html#l00537">ec_collect_blocks_by_type()</a>, and <a class="el" href="erasure_8c_source.html#l00585">ec_finalize()</a>.</p>
</div>
</div>
<a id="a38a12ac5d36e23b28d2f110906b14126" name="a38a12ac5d36e23b28d2f110906b14126"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a38a12ac5d36e23b28d2f110906b14126">&#9670;&#160;</a></span>ec_finalize()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void ec_finalize </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structaaruformat__context.html">aaruformat_context</a> *</td> <td class="paramname"><span class="paramname"><em>ctx</em></span></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Flush all partial data stripes and write parity for all groups + ECMB + recovery footer. </p>
<p class="definition">Definition at line <a class="el" href="erasure_8c_source.html#l00585">585</a> of file <a class="el" href="erasure_8c_source.html">erasure.c</a>.</p>
<p class="reference">References <a class="el" href="consts_8h_source.html#l00119">AARU_RECOVERY_FOOTER_MAGIC</a>, <a class="el" href="crc64_8c_source.html#l00160">aaruf_crc64_data()</a>, <a class="el" href="internal_8h_source.html#l00046">aaruf_fseek()</a>, <a class="el" href="internal_8h_source.html#l00052">aaruf_ftell()</a>, <a class="el" href="erasure_8h_source.html#l00052">ErasureCodingMapHeader::algorithm</a>, <a class="el" href="erasure_8h_source.html#l00121">AaruRecoveryFooter::backupHeader</a>, <a class="el" href="ddt_8h_source.html#l00154">DdtHeader2::blockAlignmentShift</a>, <a class="el" href="index_8h_source.html#l00110">IndexEntry::blockType</a>, <a class="el" href="erasure_8h_source.html#l00057">ErasureCodingMapHeader::cmpCrc64</a>, <a class="el" href="data_8h_source.html#l00076">BlockHeader::cmpLength</a>, <a class="el" href="erasure_8h_source.html#l00055">ErasureCodingMapHeader::cmpLength</a>, <a class="el" href="erasure_8h_source.html#l00054">ErasureCodingMapHeader::compression</a>, <a class="el" href="erasure_8h_source.html#l00058">ErasureCodingMapHeader::crc64</a>, <a class="el" href="enums_8h_source.html#l00164">DataBlock</a>, <a class="el" href="index_8h_source.html#l00111">IndexEntry::dataType</a>, <a class="el" href="enums_8h_source.html#l00165">DeDuplicationTable</a>, <a class="el" href="enums_8h_source.html#l00166">DeDuplicationTable2</a>, <a class="el" href="enums_8h_source.html#l00168">DeDuplicationTableSecondary</a>, <a class="el" href="context_8h_source.html#l00388">aaruformat_context::ec_algorithm</a>, <a class="el" href="erasure_8c_source.html#l00537">ec_collect_blocks_by_type()</a>, <a class="el" href="context_8h_source.html#l00391">aaruformat_context::ec_data_shard_size</a>, <a class="el" href="context_8h_source.html#l00397">aaruformat_context::ec_data_stripe_counts</a>, <a class="el" href="context_8h_source.html#l00399">aaruformat_context::ec_data_stripes</a>, <a class="el" href="context_8h_source.html#l00400">aaruformat_context::ec_enabled</a>, <a class="el" href="erasure_8c_source.html#l00585">ec_finalize()</a>, <a class="el" href="erasure_8c_source.html#l00323">ec_flush_data_stripe()</a>, <a class="el" href="context_8h_source.html#l00389">aaruformat_context::ec_K</a>, <a class="el" href="context_8h_source.html#l00390">aaruformat_context::ec_M</a>, <a class="el" href="erasure_8c_source.html#l00439">ec_write_batch_parity()</a>, <a class="el" href="erasure_8h_source.html#l00119">AaruRecoveryFooter::ecmbLength</a>, <a class="el" href="erasure_8h_source.html#l00118">AaruRecoveryFooter::ecmbOffset</a>, <a class="el" href="index_8h_source.html#l00095">IndexHeader3::entries</a>, <a class="el" href="enums_8h_source.html#l00187">ErasureCodingMapBlock</a>, <a class="el" href="erasure_8h_source.html#l00122">AaruRecoveryFooter::footerMagic</a>, <a class="el" href="erasure_8h_source.html#l00070">StripeGroupDescriptor::groupType</a>, <a class="el" href="context_8h_source.html#l00181">aaruformat_context::header</a>, <a class="el" href="erasure_8h_source.html#l00120">AaruRecoveryFooter::headerCrc64</a>, <a class="el" href="erasure_8h_source.html#l00051">ErasureCodingMapHeader::identifier</a>, <a class="el" href="context_8h_source.html#l00182">aaruformat_context::imageStream</a>, <a class="el" href="context_8h_source.html#l00262">aaruformat_context::index_entries</a>, <a class="el" href="enums_8h_source.html#l00169">IndexBlock</a>, <a class="el" href="enums_8h_source.html#l00170">IndexBlock2</a>, <a class="el" href="enums_8h_source.html#l00171">IndexBlock3</a>, <a class="el" href="header_8h_source.html#l00115">AaruHeaderV2::indexOffset</a>, <a class="el" href="erasure_8h_source.html#l00075">StripeGroupDescriptor::interleaveDepth</a>, <a class="el" href="erasure_8h_source.html#l00071">StripeGroupDescriptor::K</a>, <a class="el" href="enums_8h_source.html#l00033">kCompressionNone</a>, <a class="el" href="enums_8h_source.html#l00151">kDataTypeErasureParity</a>, <a class="el" href="enums_8h_source.html#l00152">kDataTypeErasureParityDdt</a>, <a class="el" href="enums_8h_source.html#l00153">kDataTypeErasureParityDdtPrimary</a>, <a class="el" href="enums_8h_source.html#l00155">kDataTypeErasureParityIndex</a>, <a class="el" href="enums_8h_source.html#l00154">kDataTypeErasureParityMeta</a>, <a class="el" href="enums_8h_source.html#l00048">kDataTypeUserData</a>, <a class="el" href="enums_8h_source.html#l00338">kECGroupData</a>, <a class="el" href="enums_8h_source.html#l00340">kECGroupDdtPrimary</a>, <a class="el" href="enums_8h_source.html#l00339">kECGroupDdtSecondary</a>, <a class="el" href="enums_8h_source.html#l00342">kECGroupIndex</a>, <a class="el" href="enums_8h_source.html#l00341">kECGroupMetadata</a>, <a class="el" href="erasure_8h_source.html#l00056">ErasureCodingMapHeader::length</a>, <a class="el" href="erasure_8h_source.html#l00072">StripeGroupDescriptor::M</a>, <a class="el" href="index_8h_source.html#l00112">IndexEntry::offset</a>, <a class="el" href="erasure_8h_source.html#l00073">StripeGroupDescriptor::shardSize</a>, <a class="el" href="erasure_8h_source.html#l00074">StripeGroupDescriptor::stripeCount</a>, <a class="el" href="erasure_8h_source.html#l00053">ErasureCodingMapHeader::stripeGroupCount</a>, <a class="el" href="log_8h_source.html#l00025">TRACE</a>, <a class="el" href="context_8h_source.html#l00195">aaruformat_context::user_data_ddt_header</a>, and <a class="el" href="#a415f83d4f5fbce86adcec87aa368313c">WRITE_GROUP</a>.</p>
<p class="reference">Referenced by <a class="el" href="close__write_8c_source.html#l05555">aaruf_finalize_write()</a>, and <a class="el" href="erasure_8c_source.html#l00585">ec_finalize()</a>.</p>
</div>
</div>
<a id="aa258c90d05ad57fc4c378679e5187e48" name="aa258c90d05ad57fc4c378679e5187e48"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aa258c90d05ad57fc4c378679e5187e48">&#9670;&#160;</a></span>ec_flush_data_stripe()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void ec_flush_data_stripe </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structaaruformat__context.html">aaruformat_context</a> *</td> <td class="paramname"><span class="paramname"><em>ctx</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint32_t</td> <td class="paramname"><span class="paramname"><em>slot</em></span>&#160;)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Write M parity blocks for a completed data stripe slot and record the stripe descriptor. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">ctx</td><td>Context with EC enabled. </td></tr>
<tr><td class="paramname">slot</td><td>Stripe slot index (0 .. K-1). </td></tr>
</table>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="erasure_8c_source.html#l00323">323</a> of file <a class="el" href="erasure_8c_source.html">erasure.c</a>.</p>
<p class="reference">References <a class="el" href="crc64_8c_source.html#l00160">aaruf_crc64_data()</a>, <a class="el" href="internal_8h_source.html#l00046">aaruf_fseek()</a>, <a class="el" href="internal_8h_source.html#l00052">aaruf_ftell()</a>, <a class="el" href="ddt_8h_source.html#l00154">DdtHeader2::blockAlignmentShift</a>, <a class="el" href="data_8h_source.html#l00078">BlockHeader::cmpCrc64</a>, <a class="el" href="data_8h_source.html#l00076">BlockHeader::cmpLength</a>, <a class="el" href="data_8h_source.html#l00074">BlockHeader::compression</a>, <a class="el" href="data_8h_source.html#l00079">BlockHeader::crc64</a>, <a class="el" href="enums_8h_source.html#l00164">DataBlock</a>, <a class="el" href="context_8h_source.html#l00354">aaruformat_context::dirty_index_block</a>, <a class="el" href="context_8h_source.html#l00394">aaruformat_context::ec_data_block_offsets</a>, <a class="el" href="context_8h_source.html#l00395">aaruformat_context::ec_data_block_sizes</a>, <a class="el" href="context_8h_source.html#l00393">aaruformat_context::ec_data_parity</a>, <a class="el" href="context_8h_source.html#l00396">aaruformat_context::ec_data_shard_crcs</a>, <a class="el" href="context_8h_source.html#l00391">aaruformat_context::ec_data_shard_size</a>, <a class="el" href="context_8h_source.html#l00397">aaruformat_context::ec_data_stripe_counts</a>, <a class="el" href="context_8h_source.html#l00399">aaruformat_context::ec_data_stripes</a>, <a class="el" href="erasure_8c_source.html#l00323">ec_flush_data_stripe()</a>, <a class="el" href="context_8h_source.html#l00389">aaruformat_context::ec_K</a>, <a class="el" href="context_8h_source.html#l00390">aaruformat_context::ec_M</a>, <a class="el" href="data_8h_source.html#l00072">BlockHeader::identifier</a>, <a class="el" href="context_8h_source.html#l00182">aaruformat_context::imageStream</a>, <a class="el" href="context_8h_source.html#l00262">aaruformat_context::index_entries</a>, <a class="el" href="enums_8h_source.html#l00033">kCompressionNone</a>, <a class="el" href="enums_8h_source.html#l00151">kDataTypeErasureParity</a>, <a class="el" href="data_8h_source.html#l00077">BlockHeader::length</a>, <a class="el" href="context_8h_source.html#l00292">aaruformat_context::next_block_position</a>, <a class="el" href="erasure_8h_source.html#l00089">StripeDataBlockEntry::offset</a>, <a class="el" href="erasure_8h_source.html#l00100">StripeParityBlockEntry::offset</a>, <a class="el" href="erasure_8h_source.html#l00090">StripeDataBlockEntry::onDiskSize</a>, <a class="el" href="data_8h_source.html#l00075">BlockHeader::sectorSize</a>, <a class="el" href="erasure_8h_source.html#l00091">StripeDataBlockEntry::shardCrc64</a>, <a class="el" href="data_8h_source.html#l00073">BlockHeader::type</a>, and <a class="el" href="context_8h_source.html#l00195">aaruformat_context::user_data_ddt_header</a>.</p>
<p class="reference">Referenced by <a class="el" href="erasure_8c_source.html#l00209">ec_accumulate_data_block()</a>, <a class="el" href="erasure_8c_source.html#l00585">ec_finalize()</a>, and <a class="el" href="erasure_8c_source.html#l00323">ec_flush_data_stripe()</a>.</p>
</div>
</div>
<a id="ae5fe558b49013df6e932278061a2ab53" name="ae5fe558b49013df6e932278061a2ab53"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae5fe558b49013df6e932278061a2ab53">&#9670;&#160;</a></span>ec_free()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void ec_free </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structaaruformat__context.html">aaruformat_context</a> *</td> <td class="paramname"><span class="paramname"><em>ctx</em></span></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Free all erasure coding state from the context. </p>
<p>Called from <a class="el" href="decls_8h.html#a6823e139f81a9dfd08efcb0e9b213a49" title="Close an Aaru image context, flushing pending data structures and releasing resources.">aaruf_close()</a>.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">ctx</td><td>Context. </td></tr>
</table>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="erasure_8c_source.html#l00934">934</a> of file <a class="el" href="erasure_8c_source.html">erasure.c</a>.</p>
<p class="reference">References <a class="el" href="context_8h_source.html#l00405">aaruformat_context::ec_block_lookup</a>, <a class="el" href="context_8h_source.html#l00394">aaruformat_context::ec_data_block_offsets</a>, <a class="el" href="context_8h_source.html#l00395">aaruformat_context::ec_data_block_sizes</a>, <a class="el" href="context_8h_source.html#l00393">aaruformat_context::ec_data_parity</a>, <a class="el" href="context_8h_source.html#l00396">aaruformat_context::ec_data_shard_crcs</a>, <a class="el" href="context_8h_source.html#l00397">aaruformat_context::ec_data_stripe_counts</a>, <a class="el" href="context_8h_source.html#l00399">aaruformat_context::ec_data_stripes</a>, <a class="el" href="context_8h_source.html#l00417">aaruformat_context::ec_ddt_block_lookup</a>, <a class="el" href="context_8h_source.html#l00413">aaruformat_context::ec_ddt_stripe_count</a>, <a class="el" href="context_8h_source.html#l00412">aaruformat_context::ec_ddt_stripes</a>, <a class="el" href="context_8h_source.html#l00400">aaruformat_context::ec_enabled</a>, <a class="el" href="erasure_8c_source.html#l00934">ec_free()</a>, <a class="el" href="context_8h_source.html#l00389">aaruformat_context::ec_K</a>, <a class="el" href="context_8h_source.html#l00390">aaruformat_context::ec_M</a>, <a class="el" href="context_8h_source.html#l00411">aaruformat_context::ec_meta_block_lookup</a>, <a class="el" href="context_8h_source.html#l00407">aaruformat_context::ec_meta_stripe_count</a>, <a class="el" href="context_8h_source.html#l00406">aaruformat_context::ec_meta_stripes</a>, <a class="el" href="context_8h_source.html#l00404">aaruformat_context::ec_read_stripe_count</a>, <a class="el" href="context_8h_source.html#l00403">aaruformat_context::ec_read_stripes</a>, <a class="el" href="context_8h_source.html#l00418">aaruformat_context::ec_recovery_available</a>, <a class="el" href="context_8h_source.html#l00392">aaruformat_context::ec_rs_ctx</a>, and <a class="el" href="reed__solomon_8c_source.html#l00201">rs_free()</a>.</p>
<p class="reference">Referenced by <a class="el" href="close_8c_source.html#l00080">aaruf_close()</a>, and <a class="el" href="erasure_8c_source.html#l00934">ec_free()</a>.</p>
</div>
</div>
<a id="a18f424702fcd85725ee26c1cf7e253db" name="a18f424702fcd85725ee26c1cf7e253db"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a18f424702fcd85725ee26c1cf7e253db">&#9670;&#160;</a></span>ec_load_ecmb()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void ec_load_ecmb </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structaaruformat__context.html">aaruformat_context</a> *</td> <td class="paramname"><span class="paramname"><em>ctx</em></span></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Try to load the ECMB from the recovery footer at EOF. </p>
<p>Reads the last 160 bytes, checks for footerMagic, parses ECMB, and populates the ec_read_* fields and block lookup hashmap. Called from <a class="el" href="decls_8h.html#a5cea94dcb9c08a646f7f7160ec8418de" title="Opens an existing AaruFormat image file.">aaruf_open()</a>. </p>
<p class="definition">Definition at line <a class="el" href="erasure_8c_source.html#l01046">1046</a> of file <a class="el" href="erasure_8c_source.html">erasure.c</a>.</p>
<p class="reference">References <a class="el" href="consts_8h_source.html#l00119">AARU_RECOVERY_FOOTER_MAGIC</a>, <a class="el" href="crc64_8c_source.html#l00160">aaruf_crc64_data()</a>, <a class="el" href="internal_8h_source.html#l00046">aaruf_fseek()</a>, <a class="el" href="internal_8h_source.html#l00052">aaruf_ftell()</a>, <a class="el" href="lzma_8c_source.html#l00039">aaruf_lzma_decode_buffer()</a>, <a class="el" href="zstd_8c_source.html#l00034">aaruf_zstd_decode_buffer()</a>, <a class="el" href="erasure_8c_source.html#l00048">EcReadStripe::actual_k</a>, <a class="el" href="erasure_8h_source.html#l00052">ErasureCodingMapHeader::algorithm</a>, <a class="el" href="erasure_8c_source.html#l00056">EcBlockLookupEntry::block_offset</a>, <a class="el" href="erasure_8h_source.html#l00055">ErasureCodingMapHeader::cmpLength</a>, <a class="el" href="erasure_8h_source.html#l00054">ErasureCodingMapHeader::compression</a>, <a class="el" href="erasure_8h_source.html#l00058">ErasureCodingMapHeader::crc64</a>, <a class="el" href="erasure_8c_source.html#l00049">EcReadStripe::data_entries</a>, <a class="el" href="context_8h_source.html#l00388">aaruformat_context::ec_algorithm</a>, <a class="el" href="context_8h_source.html#l00405">aaruformat_context::ec_block_lookup</a>, <a class="el" href="context_8h_source.html#l00391">aaruformat_context::ec_data_shard_size</a>, <a class="el" href="context_8h_source.html#l00417">aaruformat_context::ec_ddt_block_lookup</a>, <a class="el" href="context_8h_source.html#l00414">aaruformat_context::ec_ddt_K</a>, <a class="el" href="context_8h_source.html#l00415">aaruformat_context::ec_ddt_M</a>, <a class="el" href="context_8h_source.html#l00416">aaruformat_context::ec_ddt_shard_size</a>, <a class="el" href="context_8h_source.html#l00413">aaruformat_context::ec_ddt_stripe_count</a>, <a class="el" href="context_8h_source.html#l00412">aaruformat_context::ec_ddt_stripes</a>, <a class="el" href="context_8h_source.html#l00389">aaruformat_context::ec_K</a>, <a class="el" href="erasure_8c_source.html#l01046">ec_load_ecmb()</a>, <a class="el" href="context_8h_source.html#l00390">aaruformat_context::ec_M</a>, <a class="el" href="context_8h_source.html#l00411">aaruformat_context::ec_meta_block_lookup</a>, <a class="el" href="context_8h_source.html#l00408">aaruformat_context::ec_meta_K</a>, <a class="el" href="context_8h_source.html#l00409">aaruformat_context::ec_meta_M</a>, <a class="el" href="context_8h_source.html#l00410">aaruformat_context::ec_meta_shard_size</a>, <a class="el" href="context_8h_source.html#l00407">aaruformat_context::ec_meta_stripe_count</a>, <a class="el" href="context_8h_source.html#l00406">aaruformat_context::ec_meta_stripes</a>, <a class="el" href="context_8h_source.html#l00404">aaruformat_context::ec_read_stripe_count</a>, <a class="el" href="context_8h_source.html#l00403">aaruformat_context::ec_read_stripes</a>, <a class="el" href="context_8h_source.html#l00418">aaruformat_context::ec_recovery_available</a>, <a class="el" href="context_8h_source.html#l00392">aaruformat_context::ec_rs_ctx</a>, <a class="el" href="erasure_8h_source.html#l00118">AaruRecoveryFooter::ecmbOffset</a>, <a class="el" href="enums_8h_source.html#l00187">ErasureCodingMapBlock</a>, <a class="el" href="erasure_8h_source.html#l00122">AaruRecoveryFooter::footerMagic</a>, <a class="el" href="erasure_8h_source.html#l00070">StripeGroupDescriptor::groupType</a>, <a class="el" href="erasure_8h_source.html#l00051">ErasureCodingMapHeader::identifier</a>, <a class="el" href="context_8h_source.html#l00182">aaruformat_context::imageStream</a>, <a class="el" href="erasure_8h_source.html#l00071">StripeGroupDescriptor::K</a>, <a class="el" href="enums_8h_source.html#l00034">kCompressionLzma</a>, <a class="el" href="enums_8h_source.html#l00033">kCompressionNone</a>, <a class="el" href="enums_8h_source.html#l00037">kCompressionZstd</a>, <a class="el" href="enums_8h_source.html#l00338">kECGroupData</a>, <a class="el" href="enums_8h_source.html#l00339">kECGroupDdtSecondary</a>, <a class="el" href="enums_8h_source.html#l00341">kECGroupMetadata</a>, <a class="el" href="erasure_8h_source.html#l00056">ErasureCodingMapHeader::length</a>, <a class="el" href="consts_8h_source.html#l00086">LZMA_PROPERTIES_LENGTH</a>, <a class="el" href="erasure_8h_source.html#l00072">StripeGroupDescriptor::M</a>, <a class="el" href="erasure_8h_source.html#l00089">StripeDataBlockEntry::offset</a>, <a class="el" href="erasure_8h_source.html#l00100">StripeParityBlockEntry::offset</a>, <a class="el" href="erasure_8c_source.html#l00050">EcReadStripe::parity_offsets</a>, <a class="el" href="erasure_8c_source.html#l00058">EcBlockLookupEntry::position</a>, <a class="el" href="reed__solomon_8c_source.html#l00150">rs_create()</a>, <a class="el" href="erasure_8h_source.html#l00073">StripeGroupDescriptor::shardSize</a>, <a class="el" href="erasure_8c_source.html#l00057">EcBlockLookupEntry::stripe_index</a>, <a class="el" href="erasure_8h_source.html#l00074">StripeGroupDescriptor::stripeCount</a>, <a class="el" href="erasure_8h_source.html#l00053">ErasureCodingMapHeader::stripeGroupCount</a>, and <a class="el" href="log_8h_source.html#l00025">TRACE</a>.</p>
<p class="reference">Referenced by <a class="el" href="open_8c_source.html#l00236">aaruf_open()</a>, and <a class="el" href="erasure_8c_source.html#l01046">ec_load_ecmb()</a>.</p>
</div>
</div>
<a id="a7a9ac507738cdf72e951f152edd4d233" name="a7a9ac507738cdf72e951f152edd4d233"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a7a9ac507738cdf72e951f152edd4d233">&#9670;&#160;</a></span>ec_recover_data_block()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">int32_t ec_recover_data_block </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structaaruformat__context.html">aaruformat_context</a> *</td> <td class="paramname"><span class="paramname"><em>ctx</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint64_t</td> <td class="paramname"><span class="paramname"><em>block_offset</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint64_t</td> <td class="paramname"><span class="paramname"><em>offset</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t *</td> <td class="paramname"><span class="paramname"><em>data</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint32_t *</td> <td class="paramname"><span class="paramname"><em>length</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t</td> <td class="paramname"><span class="paramname"><em>sector_status</em></span>&#160;)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Attempt to recover a data block that failed decompression or CRC verification. </p>
<p>Looks up the block's stripe via the ECMB, reads surviving stripe members + parity, RS-decodes the erased shard, and decompresses the recovered block.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">ctx</td><td>Context with ec_recovery_available == true. </td></tr>
<tr><td class="paramname">block_offset</td><td>File offset of the corrupted block. </td></tr>
<tr><td class="paramname">offset</td><td>Sector offset within the block. </td></tr>
<tr><td class="paramname">data</td><td>Output buffer for the recovered sector. </td></tr>
<tr><td class="paramname">length</td><td>Output: bytes written to data. </td></tr>
<tr><td class="paramname">sector_status</td><td>Sector status from DDT. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>AARUF_STATUS_OK on success, negative error code on failure. </dd></dl>
<p class="definition">Definition at line <a class="el" href="erasure_8c_source.html#l01303">1303</a> of file <a class="el" href="erasure_8c_source.html">erasure.c</a>.</p>
<p class="reference">References <a class="el" href="crc64_8c_source.html#l00160">aaruf_crc64_data()</a>, <a class="el" href="errors_8h_source.html#l00056">AARUF_ERROR_CANNOT_DECOMPRESS_BLOCK</a>, <a class="el" href="errors_8h_source.html#l00048">AARUF_ERROR_NOT_ENOUGH_MEMORY</a>, <a class="el" href="flac_8c_source.html#l00048">aaruf_flac_decode_redbook_buffer()</a>, <a class="el" href="internal_8h_source.html#l00046">aaruf_fseek()</a>, <a class="el" href="lzma_8c_source.html#l00039">aaruf_lzma_decode_buffer()</a>, <a class="el" href="errors_8h_source.html#l00082">AARUF_STATUS_OK</a>, <a class="el" href="zstd_8c_source.html#l00034">aaruf_zstd_decode_buffer()</a>, <a class="el" href="erasure_8c_source.html#l00048">EcReadStripe::actual_k</a>, <a class="el" href="lru_8c_source.html#l00068">add_to_cache_uint64()</a>, <a class="el" href="context_8h_source.html#l00267">aaruformat_context::block_cache</a>, <a class="el" href="context_8h_source.html#l00266">aaruformat_context::block_header_cache</a>, <a class="el" href="data_8h_source.html#l00076">BlockHeader::cmpLength</a>, <a class="el" href="data_8h_source.html#l00074">BlockHeader::compression</a>, <a class="el" href="data_8h_source.html#l00079">BlockHeader::crc64</a>, <a class="el" href="erasure_8c_source.html#l00049">EcReadStripe::data_entries</a>, <a class="el" href="context_8h_source.html#l00405">aaruformat_context::ec_block_lookup</a>, <a class="el" href="context_8h_source.html#l00391">aaruformat_context::ec_data_shard_size</a>, <a class="el" href="context_8h_source.html#l00389">aaruformat_context::ec_K</a>, <a class="el" href="context_8h_source.html#l00390">aaruformat_context::ec_M</a>, <a class="el" href="context_8h_source.html#l00403">aaruformat_context::ec_read_stripes</a>, <a class="el" href="erasure_8c_source.html#l01303">ec_recover_data_block()</a>, <a class="el" href="context_8h_source.html#l00418">aaruformat_context::ec_recovery_available</a>, <a class="el" href="context_8h_source.html#l00419">aaruformat_context::ec_recovery_in_progress</a>, <a class="el" href="context_8h_source.html#l00392">aaruformat_context::ec_rs_ctx</a>, <a class="el" href="context_8h_source.html#l00182">aaruformat_context::imageStream</a>, <a class="el" href="enums_8h_source.html#l00035">kCompressionFlac</a>, <a class="el" href="enums_8h_source.html#l00034">kCompressionLzma</a>, <a class="el" href="enums_8h_source.html#l00033">kCompressionNone</a>, <a class="el" href="enums_8h_source.html#l00037">kCompressionZstd</a>, <a class="el" href="data_8h_source.html#l00077">BlockHeader::length</a>, <a class="el" href="consts_8h_source.html#l00086">LZMA_PROPERTIES_LENGTH</a>, <a class="el" href="erasure_8h_source.html#l00089">StripeDataBlockEntry::offset</a>, <a class="el" href="erasure_8h_source.html#l00090">StripeDataBlockEntry::onDiskSize</a>, <a class="el" href="erasure_8c_source.html#l00050">EcReadStripe::parity_offsets</a>, <a class="el" href="erasure_8c_source.html#l00058">EcBlockLookupEntry::position</a>, <a class="el" href="reed__solomon_8c_source.html#l00218">rs_decode()</a>, <a class="el" href="data_8h_source.html#l00075">BlockHeader::sectorSize</a>, <a class="el" href="erasure_8h_source.html#l00091">StripeDataBlockEntry::shardCrc64</a>, and <a class="el" href="erasure_8c_source.html#l00057">EcBlockLookupEntry::stripe_index</a>.</p>
<p class="reference">Referenced by <a class="el" href="read_8c_source.html#l00352">aaruf_read_sector()</a>, and <a class="el" href="erasure_8c_source.html#l01303">ec_recover_data_block()</a>.</p>
</div>
</div>
<a id="a41514b5f6f31a9a2207f2807da831e26" name="a41514b5f6f31a9a2207f2807da831e26"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a41514b5f6f31a9a2207f2807da831e26">&#9670;&#160;</a></span>ec_recover_ddt_block()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">int32_t ec_recover_ddt_block </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structaaruformat__context.html">aaruformat_context</a> *</td> <td class="paramname"><span class="paramname"><em>ctx</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint64_t</td> <td class="paramname"><span class="paramname"><em>block_offset</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t **</td> <td class="paramname"><span class="paramname"><em>recovered_data</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint32_t *</td> <td class="paramname"><span class="paramname"><em>recovered_size</em></span>&#160;)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Attempt to recover a DDT secondary block at a given file offset. </p>
<p class="definition">Definition at line <a class="el" href="erasure_8c_source.html#l00918">918</a> of file <a class="el" href="erasure_8c_source.html">erasure.c</a>.</p>
<p class="reference">References <a class="el" href="errors_8h_source.html#l00046">AARUF_ERROR_CANNOT_READ_BLOCK</a>, <a class="el" href="context_8h_source.html#l00417">aaruformat_context::ec_ddt_block_lookup</a>, <a class="el" href="context_8h_source.html#l00414">aaruformat_context::ec_ddt_K</a>, <a class="el" href="context_8h_source.html#l00415">aaruformat_context::ec_ddt_M</a>, <a class="el" href="context_8h_source.html#l00416">aaruformat_context::ec_ddt_shard_size</a>, <a class="el" href="context_8h_source.html#l00413">aaruformat_context::ec_ddt_stripe_count</a>, <a class="el" href="context_8h_source.html#l00412">aaruformat_context::ec_ddt_stripes</a>, <a class="el" href="erasure_8c_source.html#l00918">ec_recover_ddt_block()</a>, and <a class="el" href="erasure_8c_source.html#l00827">ec_recover_raw_block()</a>.</p>
<p class="reference">Referenced by <a class="el" href="ddt__v2_8c_source.html#l00663">decode_ddt_entry_v2()</a>, and <a class="el" href="erasure_8c_source.html#l00918">ec_recover_ddt_block()</a>.</p>
</div>
</div>
<a id="aa17442a11d3d3ef4b51b5129eed19b45" name="aa17442a11d3d3ef4b51b5129eed19b45"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aa17442a11d3d3ef4b51b5129eed19b45">&#9670;&#160;</a></span>ec_recover_meta_block()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">int32_t ec_recover_meta_block </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structaaruformat__context.html">aaruformat_context</a> *</td> <td class="paramname"><span class="paramname"><em>ctx</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint64_t</td> <td class="paramname"><span class="paramname"><em>block_offset</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t **</td> <td class="paramname"><span class="paramname"><em>recovered_data</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint32_t *</td> <td class="paramname"><span class="paramname"><em>recovered_size</em></span>&#160;)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Attempt to recover a metadata/media-tag block at a given file offset. </p>
<p>Convenience wrapper around ec_recover_raw_block using the metadata group. </p>
<p class="definition">Definition at line <a class="el" href="erasure_8c_source.html#l00909">909</a> of file <a class="el" href="erasure_8c_source.html">erasure.c</a>.</p>
<p class="reference">References <a class="el" href="errors_8h_source.html#l00046">AARUF_ERROR_CANNOT_READ_BLOCK</a>, <a class="el" href="context_8h_source.html#l00411">aaruformat_context::ec_meta_block_lookup</a>, <a class="el" href="context_8h_source.html#l00408">aaruformat_context::ec_meta_K</a>, <a class="el" href="context_8h_source.html#l00409">aaruformat_context::ec_meta_M</a>, <a class="el" href="context_8h_source.html#l00410">aaruformat_context::ec_meta_shard_size</a>, <a class="el" href="context_8h_source.html#l00407">aaruformat_context::ec_meta_stripe_count</a>, <a class="el" href="context_8h_source.html#l00406">aaruformat_context::ec_meta_stripes</a>, <a class="el" href="erasure_8c_source.html#l00909">ec_recover_meta_block()</a>, and <a class="el" href="erasure_8c_source.html#l00827">ec_recover_raw_block()</a>.</p>
<p class="reference">Referenced by <a class="el" href="erasure_8c_source.html#l00909">ec_recover_meta_block()</a>, <a class="el" href="data_8c_source.html#l00073">process_data_block()</a>, <a class="el" href="optical_8c_source.html#l00116">process_tracks_block()</a>, and <a class="el" href="blocks_2dpm_8c_source.html#l00083">recover_dpm_block()</a>.</p>
</div>
</div>
<a id="a04ae581a91d9e77097ed4ebba627e371" name="a04ae581a91d9e77097ed4ebba627e371"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a04ae581a91d9e77097ed4ebba627e371">&#9670;&#160;</a></span>ec_recover_raw_block()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">int32_t ec_recover_raw_block </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structaaruformat__context.html">aaruformat_context</a> *</td> <td class="paramname"><span class="paramname"><em>ctx</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint64_t</td> <td class="paramname"><span class="paramname"><em>block_offset</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t **</td> <td class="paramname"><span class="paramname"><em>recovered_data</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint32_t *</td> <td class="paramname"><span class="paramname"><em>recovered_size</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">void *</td> <td class="paramname"><span class="paramname"><em>stripes</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint32_t</td> <td class="paramname"><span class="paramname"><em>stripe_count</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">void *</td> <td class="paramname"><span class="paramname"><em>lookup</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint16_t</td> <td class="paramname"><span class="paramname"><em>group_K</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint16_t</td> <td class="paramname"><span class="paramname"><em>group_M</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint32_t</td> <td class="paramname"><span class="paramname"><em>group_shard_size</em></span>&#160;)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Attempt to recover a raw block at a given file offset using a specified stripe group. </p>
<p>Reads surviving stripe members + parity, RS-decodes the erased shard, returns the recovered raw on-disk bytes.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">ctx</td><td>Context. </td></tr>
<tr><td class="paramname">block_offset</td><td>File offset of the corrupted block. </td></tr>
<tr><td class="paramname">recovered_data</td><td>Output: malloc'd buffer with recovered bytes (caller frees). NULL on failure. </td></tr>
<tr><td class="paramname">recovered_size</td><td>Output: size of recovered data. </td></tr>
<tr><td class="paramname">stripes</td><td><a class="el" href="structEcReadStripe.html" title="In-memory representation of one data stripe (parsed from ECMB).">EcReadStripe</a> array for the group. </td></tr>
<tr><td class="paramname">stripe_count</td><td>Number of stripes. </td></tr>
<tr><td class="paramname">lookup</td><td>Block lookup hashmap for the group. </td></tr>
<tr><td class="paramname">group_K</td><td>K for this group. </td></tr>
<tr><td class="paramname">group_M</td><td>M for this group. </td></tr>
<tr><td class="paramname">group_shard_size</td><td>Shard size for this group. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>0 on success, negative on failure. </dd></dl>
<p class="definition">Definition at line <a class="el" href="erasure_8c_source.html#l00827">827</a> of file <a class="el" href="erasure_8c_source.html">erasure.c</a>.</p>
<p class="reference">References <a class="el" href="crc64_8c_source.html#l00160">aaruf_crc64_data()</a>, <a class="el" href="errors_8h_source.html#l00046">AARUF_ERROR_CANNOT_READ_BLOCK</a>, <a class="el" href="errors_8h_source.html#l00048">AARUF_ERROR_NOT_ENOUGH_MEMORY</a>, <a class="el" href="internal_8h_source.html#l00046">aaruf_fseek()</a>, <a class="el" href="errors_8h_source.html#l00082">AARUF_STATUS_OK</a>, <a class="el" href="erasure_8c_source.html#l00048">EcReadStripe::actual_k</a>, <a class="el" href="erasure_8c_source.html#l00049">EcReadStripe::data_entries</a>, <a class="el" href="erasure_8c_source.html#l00827">ec_recover_raw_block()</a>, <a class="el" href="context_8h_source.html#l00418">aaruformat_context::ec_recovery_available</a>, <a class="el" href="context_8h_source.html#l00419">aaruformat_context::ec_recovery_in_progress</a>, <a class="el" href="context_8h_source.html#l00182">aaruformat_context::imageStream</a>, <a class="el" href="data_8h_source.html#l00077">BlockHeader::length</a>, <a class="el" href="erasure_8h_source.html#l00089">StripeDataBlockEntry::offset</a>, <a class="el" href="erasure_8h_source.html#l00090">StripeDataBlockEntry::onDiskSize</a>, <a class="el" href="erasure_8c_source.html#l00050">EcReadStripe::parity_offsets</a>, <a class="el" href="erasure_8c_source.html#l00058">EcBlockLookupEntry::position</a>, <a class="el" href="reed__solomon_8c_source.html#l00150">rs_create()</a>, <a class="el" href="reed__solomon_8c_source.html#l00218">rs_decode()</a>, <a class="el" href="reed__solomon_8c_source.html#l00201">rs_free()</a>, <a class="el" href="erasure_8h_source.html#l00091">StripeDataBlockEntry::shardCrc64</a>, and <a class="el" href="erasure_8c_source.html#l00057">EcBlockLookupEntry::stripe_index</a>.</p>
<p class="reference">Referenced by <a class="el" href="erasure_8c_source.html#l00918">ec_recover_ddt_block()</a>, <a class="el" href="erasure_8c_source.html#l00909">ec_recover_meta_block()</a>, and <a class="el" href="erasure_8c_source.html#l00827">ec_recover_raw_block()</a>.</p>
</div>
</div>
<a id="aed80b4dc1f360dbac00a5f73d350bf1a" name="aed80b4dc1f360dbac00a5f73d350bf1a"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aed80b4dc1f360dbac00a5f73d350bf1a">&#9670;&#160;</a></span>ec_write_batch_parity()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">void ec_write_batch_parity </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structaaruformat__context.html">aaruformat_context</a> *</td> <td class="paramname"><span class="paramname"><em>ctx</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const uint64_t *</td> <td class="paramname"><span class="paramname"><em>offsets</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const uint32_t *</td> <td class="paramname"><span class="paramname"><em>sizes</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint32_t</td> <td class="paramname"><span class="paramname"><em>block_count</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t</td> <td class="paramname"><span class="paramname"><em>group_type</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint16_t</td> <td class="paramname"><span class="paramname"><em>parity_data_type</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t **</td> <td class="paramname"><span class="paramname"><em>out_desc</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">size_t *</td> <td class="paramname"><span class="paramname"><em>out_desc_len</em></span>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structStripeGroupDescriptor.html">StripeGroupDescriptor</a> *</td> <td class="paramname"><span class="paramname"><em>out_group</em></span>&#160;)</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel static">static</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Compute and write batch parity for a set of blocks already on disk. </p>
<p>Reads each block's on-disk bytes from file, computes RS parity, writes M parity DLBKs, returns serialized stripe descriptor bytes. </p>
<p class="definition">Definition at line <a class="el" href="erasure_8c_source.html#l00439">439</a> of file <a class="el" href="erasure_8c_source.html">erasure.c</a>.</p>
<p class="reference">References <a class="el" href="crc64_8c_source.html#l00160">aaruf_crc64_data()</a>, <a class="el" href="internal_8h_source.html#l00046">aaruf_fseek()</a>, <a class="el" href="internal_8h_source.html#l00052">aaruf_ftell()</a>, <a class="el" href="ddt_8h_source.html#l00154">DdtHeader2::blockAlignmentShift</a>, <a class="el" href="data_8h_source.html#l00078">BlockHeader::cmpCrc64</a>, <a class="el" href="data_8h_source.html#l00076">BlockHeader::cmpLength</a>, <a class="el" href="data_8h_source.html#l00074">BlockHeader::compression</a>, <a class="el" href="data_8h_source.html#l00079">BlockHeader::crc64</a>, <a class="el" href="enums_8h_source.html#l00164">DataBlock</a>, <a class="el" href="context_8h_source.html#l00354">aaruformat_context::dirty_index_block</a>, <a class="el" href="context_8h_source.html#l00390">aaruformat_context::ec_M</a>, <a class="el" href="erasure_8c_source.html#l00439">ec_write_batch_parity()</a>, <a class="el" href="erasure_8h_source.html#l00070">StripeGroupDescriptor::groupType</a>, <a class="el" href="data_8h_source.html#l00072">BlockHeader::identifier</a>, <a class="el" href="context_8h_source.html#l00182">aaruformat_context::imageStream</a>, <a class="el" href="context_8h_source.html#l00262">aaruformat_context::index_entries</a>, <a class="el" href="erasure_8h_source.html#l00075">StripeGroupDescriptor::interleaveDepth</a>, <a class="el" href="erasure_8h_source.html#l00071">StripeGroupDescriptor::K</a>, <a class="el" href="enums_8h_source.html#l00033">kCompressionNone</a>, <a class="el" href="data_8h_source.html#l00077">BlockHeader::length</a>, <a class="el" href="erasure_8h_source.html#l00072">StripeGroupDescriptor::M</a>, <a class="el" href="erasure_8h_source.html#l00089">StripeDataBlockEntry::offset</a>, <a class="el" href="erasure_8h_source.html#l00100">StripeParityBlockEntry::offset</a>, <a class="el" href="erasure_8h_source.html#l00090">StripeDataBlockEntry::onDiskSize</a>, <a class="el" href="reed__solomon_8c_source.html#l00150">rs_create()</a>, <a class="el" href="reed__solomon_8c_source.html#l00213">rs_encode_incremental()</a>, <a class="el" href="reed__solomon_8c_source.html#l00201">rs_free()</a>, <a class="el" href="reed__solomon_8c_source.html#l00208">rs_get_coefficient()</a>, <a class="el" href="erasure_8h_source.html#l00091">StripeDataBlockEntry::shardCrc64</a>, <a class="el" href="erasure_8h_source.html#l00073">StripeGroupDescriptor::shardSize</a>, <a class="el" href="erasure_8h_source.html#l00074">StripeGroupDescriptor::stripeCount</a>, <a class="el" href="data_8h_source.html#l00073">BlockHeader::type</a>, and <a class="el" href="context_8h_source.html#l00195">aaruformat_context::user_data_ddt_header</a>.</p>
<p class="reference">Referenced by <a class="el" href="erasure_8c_source.html#l00585">ec_finalize()</a>, and <a class="el" href="erasure_8c_source.html#l00439">ec_write_batch_parity()</a>.</p>
</div>
</div>
<a name="doc-var-members" id="doc-var-members"></a><h2 id="header-doc-var-members" class="groupheader">Variable Documentation</h2>
<a id="a1883da545c74667f3438d8e48b195aa1" name="a1883da545c74667f3438d8e48b195aa1"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a1883da545c74667f3438d8e48b195aa1">&#9670;&#160;</a></span>ec_stripe_icd</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">UT_icd ec_stripe_icd = {sizeof(uint8_t), NULL, NULL, NULL}</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel static">static</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="erasure_8c_source.html#l00065">65</a> of file <a class="el" href="erasure_8c_source.html">erasure.c</a>.</p>
<p class="reference">Referenced by <a class="el" href="erasure_8c_source.html#l00082">aaruf_set_erasure_coding()</a>.</p>
</div>
</div>
</div><!-- contents -->
</div><!-- doc-content -->
<div id="page-nav" class="page-nav-panel">
<div id="page-nav-resize-handle"></div>
<div id="page-nav-tree">
<div id="page-nav-contents">
</div><!-- page-nav-contents -->
</div><!-- page-nav-tree -->
</div><!-- page-nav -->
</div><!-- container -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a href="erasure_8c.html">erasure.c</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.18.0 </li>
</ul>
</div>
</body>
</html>