Files
libaaruformat/docs/html/erasure_8c_source.html

1605 lines
342 KiB
HTML
Raw Permalink 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.16.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>libaaruformat: src/erasure.c Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.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.16.1 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search/",'.html');
</script>
<script type="text/javascript">
$(function() { codefold.init(); });
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search',true);
$(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</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" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(function(){initNavTree('erasure_8c_source.html','',''); });
</script>
<div id="container">
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</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</div></div>
</div><!--header-->
<div class="contents">
<a href="erasure_8c.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/*</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"> * This file is part of the Aaru Data Preservation Suite.</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment"> * Copyright (c) 2019-2026 Natalia Portillo.</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment"> *</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment"> * This library is free software; you can redistribute it and/or modify</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment"> * it under the terms of the GNU Lesser General Public License as</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment"> * published by the Free Software Foundation; either version 2.1 of the</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment"> * License, or (at your option) any later version.</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment"> *</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment"> * This library is distributed in the hope that it will be useful, but</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment"> * WITHOUT ANY WARRANTY; without even the implied warranty of</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="comment"> * Lesser General Public License for more details.</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="comment"> *</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="comment"> * You should have received a copy of the GNU Lesser General Public</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="comment"> * License along with this library; if not, see &lt;http://www.gnu.org/licenses/&gt;.</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="comment"> */</span></div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span></div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span> </div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="preprocessor">#include &lt;stdlib.h&gt;</span></div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span><span class="preprocessor">#include &lt;string.h&gt;</span></div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span> </div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span><span class="preprocessor">#include &quot;<a class="code" href="aaruformat_8h.html">aaruformat.h</a>&quot;</span></div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span><span class="preprocessor">#include &quot;<a class="code" href="context_8h.html">aaruformat/context.h</a>&quot;</span></div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span><span class="preprocessor">#include &quot;<a class="code" href="consts_8h.html">aaruformat/consts.h</a>&quot;</span></div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span><span class="preprocessor">#include &quot;<a class="code" href="enums_8h.html">aaruformat/enums.h</a>&quot;</span></div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span><span class="preprocessor">#include &quot;<a class="code" href="errors_8h.html">aaruformat/errors.h</a>&quot;</span></div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span><span class="preprocessor">#include &quot;<a class="code" href="data_8h.html">aaruformat/structs/data.h</a>&quot;</span></div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span><span class="preprocessor">#include &quot;<a class="code" href="ddt_8h.html">aaruformat/structs/ddt.h</a>&quot;</span></div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span><span class="preprocessor">#include &quot;<a class="code" href="erasure_8h.html">aaruformat/structs/erasure.h</a>&quot;</span></div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span><span class="preprocessor">#include &quot;<a class="code" href="index_8h.html">aaruformat/structs/index.h</a>&quot;</span></div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span><span class="preprocessor">#include &quot;<a class="code" href="internal_8h.html">internal.h</a>&quot;</span></div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span><span class="preprocessor">#include &quot;<a class="code" href="log_8h.html">log.h</a>&quot;</span></div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span><span class="preprocessor">#include &quot;<a class="code" href="gf256_8h.html">lib/gf256.h</a>&quot;</span></div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span><span class="preprocessor">#include &quot;<a class="code" href="reed__solomon_8h.html">lib/reed_solomon.h</a>&quot;</span></div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span> </div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span><span class="comment">/* =========================================================================</span></div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span><span class="comment"> * Read-path structures (not in on-disk format, internal only)</span></div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span><span class="comment"> * ========================================================================= */</span></div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span></div>
<div class="foldopen" id="foldopen00046" data-start="{" data-end="};">
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"><a class="line" href="structEcReadStripe.html"> 46</a></span><span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code hl_struct" href="structEcReadStripe.html">EcReadStripe</a></div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span>{</div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"><a class="line" href="structEcReadStripe.html#a80b525ebfe07bff2cb08bf97ce633e2f"> 48</a></span> uint16_t <a class="code hl_variable" href="structEcReadStripe.html#a80b525ebfe07bff2cb08bf97ce633e2f">actual_k</a>; </div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"><a class="line" href="structEcReadStripe.html#a196073177bb5753b30b17ad495af7b97"> 49</a></span> <a class="code hl_struct" href="structStripeDataBlockEntry.html">StripeDataBlockEntry</a> *<a class="code hl_variable" href="structEcReadStripe.html#a196073177bb5753b30b17ad495af7b97">data_entries</a>; </div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"><a class="line" href="structEcReadStripe.html#ac88d41411a685f4b7fbecb69d179ec3f"> 50</a></span> uint64_t *<a class="code hl_variable" href="structEcReadStripe.html#ac88d41411a685f4b7fbecb69d179ec3f">parity_offsets</a>; </div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"><a class="line" href="erasure_8c.html#a2f164deb906da3861ed577a951149a23"> 51</a></span>} <a class="code hl_struct" href="structEcReadStripe.html">EcReadStripe</a>;</div>
</div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span></div>
<div class="foldopen" id="foldopen00054" data-start="{" data-end="};">
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"><a class="line" href="structEcBlockLookupEntry.html"> 54</a></span><span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code hl_struct" href="structEcBlockLookupEntry.html">EcBlockLookupEntry</a></div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span>{</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"><a class="line" href="structEcBlockLookupEntry.html#a13a8928f4f9cc3d0d7a30b1d0530c016"> 56</a></span> uint64_t <a class="code hl_variable" href="structEcBlockLookupEntry.html#a13a8928f4f9cc3d0d7a30b1d0530c016">block_offset</a>; </div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"><a class="line" href="structEcBlockLookupEntry.html#aedeac38371118113a77e02cc65512320"> 57</a></span> uint32_t <a class="code hl_variable" href="structEcBlockLookupEntry.html#aedeac38371118113a77e02cc65512320">stripe_index</a>; </div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"><a class="line" href="structEcBlockLookupEntry.html#a8645b89803f927a7608a6f8d30d74292"> 58</a></span> uint16_t <a class="code hl_variable" href="structEcBlockLookupEntry.html#a8645b89803f927a7608a6f8d30d74292">position</a>; </div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"><a class="line" href="structEcBlockLookupEntry.html#aafe5aa886cf56f4dbcc9c7426792e61c"> 59</a></span> UT_hash_handle <a class="code hl_variable" href="structEcBlockLookupEntry.html#aafe5aa886cf56f4dbcc9c7426792e61c">hh</a>;</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"><a class="line" href="erasure_8c.html#a49845afc245ef4c7570c1a59b8e2c893"> 60</a></span>} <a class="code hl_struct" href="structEcBlockLookupEntry.html">EcBlockLookupEntry</a>;</div>
</div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> </div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span><span class="comment">/* UT_array icd for completed stripe descriptors.</span></div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span><span class="comment"> * Each descriptor is a variable-length blob serialized in-place. We store</span></div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span><span class="comment"> * them as flat byte buffers since the size per stripe depends on K and M. */</span></div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"><a class="line" href="erasure_8c.html#a1883da545c74667f3438d8e48b195aa1"> 65</a></span><span class="keyword">static</span> UT_icd <a class="code hl_variable" href="erasure_8c.html#a1883da545c74667f3438d8e48b195aa1">ec_stripe_icd</a> = {<span class="keyword">sizeof</span>(uint8_t), NULL, NULL, NULL};</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> </div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span><span class="comment">/* Forward declarations */</span></div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span><span class="keywordtype">void</span> <a class="code hl_function" href="erasure_8c.html#aa258c90d05ad57fc4c378679e5187e48">ec_flush_data_stripe</a>(<a class="code hl_struct" href="structaaruformat__context.html">aaruformat_context</a> *ctx, uint32_t slot);</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span></div>
<div class="foldopen" id="foldopen00082" data-start="{" data-end="}">
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"><a class="line" href="decls_8h.html#a8b0f3ab93ca60ce00321ca28c2484c7c"> 82</a></span><a class="code hl_define" href="decls_8h.html#a9001412c35f3c92d3a9320d27b0d97f9">AARU_EXPORT</a> int32_t <a class="code hl_define" href="decls_8h.html#a018e0da1c1f7e4f6187a982c0e40e056">AARU_CALL</a> <a class="code hl_function" href="erasure_8c.html#a8b0f3ab93ca60ce00321ca28c2484c7c">aaruf_set_erasure_coding</a>(<span class="keywordtype">void</span> *context, uint8_t algorithm, uint16_t <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a>, uint16_t M)</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span>{</div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> <a class="code hl_define" href="log_8h.html#a21cc0459b78d5f2d7bd737e5aae1278a">TRACE</a>(<span class="stringliteral">&quot;Entering aaruf_set_erasure_coding(%p, %u, %u, %u)&quot;</span>, context, algorithm, <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a>, M);</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> </div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> <span class="keywordflow">if</span>(context == NULL) <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="enums_8h.html#af887903d155851fe30d08053c4b2c1b8a2ee503de2bb99eb6a677fd9871a9c44d">AARUF_STATUS_INVALID_CONTEXT</a>;</div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> </div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> <a class="code hl_struct" href="structaaruformat__context.html">aaruformat_context</a> *ctx = (<a class="code hl_struct" href="structaaruformat__context.html">aaruformat_context</a> *)context;</div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> <span class="keywordflow">if</span>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a7dc0a0fe0bf6223ff4587fd01c360b76">magic</a> != <a class="code hl_define" href="consts_8h.html#a3c3ba66fe2b547655c9e4b16a1ba519a">AARU_MAGIC</a>) <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="enums_8h.html#af887903d155851fe30d08053c4b2c1b8a2ee503de2bb99eb6a677fd9871a9c44d">AARUF_STATUS_INVALID_CONTEXT</a>;</div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> <span class="keywordflow">if</span>(!ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a6f61f9ea20f4e3b791a0d6388dd43651">is_writing</a>) <span class="keywordflow">return</span> <a class="code hl_define" href="errors_8h.html#a1df49eaa19eaa14891b6aaab966a9bc6">AARUF_READ_ONLY</a>;</div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> </div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> <span class="comment">/* Validate parameters */</span></div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> <span class="keywordflow">if</span>(<a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a> == 0 || M == 0) <span class="keywordflow">return</span> <a class="code hl_define" href="errors_8h.html#a8fc3ecb14777e72bebad62084b6caf16">AARUF_ERROR_INCORRECT_DATA_SIZE</a>;</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> <span class="keywordflow">if</span>((uint32_t)<a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a> + M &gt; 255) <span class="keywordflow">return</span> <a class="code hl_define" href="errors_8h.html#a8fc3ecb14777e72bebad62084b6caf16">AARUF_ERROR_INCORRECT_DATA_SIZE</a>;</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> <span class="keywordflow">if</span>(algorithm == <a class="code hl_enumvalue" href="enums_8h.html#a83c99da65804eb80cfb955eb9a15ef5ead3ee61b96379729331df2b6ed04a95a0">kErasureCodingXor</a> &amp;&amp; M != 1) <span class="keywordflow">return</span> <a class="code hl_define" href="errors_8h.html#a8fc3ecb14777e72bebad62084b6caf16">AARUF_ERROR_INCORRECT_DATA_SIZE</a>;</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> </div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> <span class="comment">/* Compute data shard size: max possible on-disk block size.</span></div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span><span class="comment"> * = sizeof(BlockHeader) + LZMA_PROPERTIES_LENGTH + (1 &lt;&lt; dataShift) * sectorSize</span></div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span><span class="comment"> * This is the worst case: uncompressed block + LZMA properties header. */</span></div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> uint32_t sectors_per_block = 1U &lt;&lt; ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a04c5fb367458a6e9dd0a50b39f6edec2">user_data_ddt_header</a>.<a class="code hl_variable" href="structDdtHeader2.html#ad9a2beb3a79bc6c239ba04fe341e0cde">dataShift</a>;</div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> uint32_t max_payload = sectors_per_block * ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a78edd22a0d4a0cbbbbdb783b3df4ba5a">current_block_header</a>.<a class="code hl_variable" href="structBlockHeader.html#a5bd50f95c8c1f91e5013a1a154690beb">sectorSize</a>;</div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> <span class="keywordflow">if</span>(max_payload == 0) max_payload = sectors_per_block * 512; <span class="comment">/* fallback if sectorSize not yet set */</span></div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> uint32_t shard_size = (uint32_t)<span class="keyword">sizeof</span>(<a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a>) + <a class="code hl_define" href="consts_8h.html#a25fd08252b97a0230d3efc899bddd240">LZMA_PROPERTIES_LENGTH</a> + max_payload;</div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> </div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> <span class="comment">/* Create RS codec */</span></div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> <a class="code hl_struct" href="structrs__context.html">rs_context</a> *rs = <a class="code hl_function" href="reed__solomon_8c.html#a68a7b13ef6443640abc2818a3bd7d5bf">rs_create</a>(<a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a>, M);</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> <span class="keywordflow">if</span>(!rs) <span class="keywordflow">return</span> <a class="code hl_define" href="errors_8h.html#a35a771e3648bf971a004d4b2be9b5ec4">AARUF_ERROR_NOT_ENOUGH_MEMORY</a>;</div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> </div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> <span class="comment">/* Allocate K stripe slots × M parity buffers */</span></div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> uint8_t **parity = (uint8_t **)calloc((<span class="keywordtype">size_t</span>)<a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a> * M, <span class="keyword">sizeof</span>(uint8_t *));</div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> <span class="keywordflow">if</span>(!parity) { <a class="code hl_function" href="reed__solomon_8c.html#a5eed1476ef3e8666f011b529337b8518">rs_free</a>(rs); <span class="keywordflow">return</span> <a class="code hl_define" href="errors_8h.html#a35a771e3648bf971a004d4b2be9b5ec4">AARUF_ERROR_NOT_ENOUGH_MEMORY</a>; }</div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> </div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; (uint32_t)<a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a> * M; i++)</div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> {</div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> parity[i] = (uint8_t *)calloc(1, shard_size);</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> <span class="keywordflow">if</span>(!parity[i])</div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> {</div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> <span class="keywordflow">for</span>(uint32_t j = 0; j &lt; i; j++) free(parity[j]);</div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> free(parity);</div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> <a class="code hl_function" href="reed__solomon_8c.html#a5eed1476ef3e8666f011b529337b8518">rs_free</a>(rs);</div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> <span class="keywordflow">return</span> <a class="code hl_define" href="errors_8h.html#a35a771e3648bf971a004d4b2be9b5ec4">AARUF_ERROR_NOT_ENOUGH_MEMORY</a>;</div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> }</div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> }</div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> </div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> <span class="comment">/* Allocate tracking arrays (K entries per slot × K slots) */</span></div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> uint64_t *offsets = (uint64_t *)calloc((<span class="keywordtype">size_t</span>)<a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a> * <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a>, <span class="keyword">sizeof</span>(uint64_t));</div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> uint32_t *sizes = (uint32_t *)calloc((<span class="keywordtype">size_t</span>)<a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a> * <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a>, <span class="keyword">sizeof</span>(uint32_t));</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> uint64_t *crcs = (uint64_t *)calloc((<span class="keywordtype">size_t</span>)<a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a> * <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a>, <span class="keyword">sizeof</span>(uint64_t));</div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> uint16_t *counts = (uint16_t *)calloc(<a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a>, <span class="keyword">sizeof</span>(uint16_t));</div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> </div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> <span class="keywordflow">if</span>(!offsets || !sizes || !crcs || !counts)</div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> {</div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> free(offsets); free(sizes); free(crcs); free(counts);</div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; (uint32_t)<a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a> * M; i++) free(parity[i]);</div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> free(parity);</div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> <a class="code hl_function" href="reed__solomon_8c.html#a5eed1476ef3e8666f011b529337b8518">rs_free</a>(rs);</div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> <span class="keywordflow">return</span> <a class="code hl_define" href="errors_8h.html#a35a771e3648bf971a004d4b2be9b5ec4">AARUF_ERROR_NOT_ENOUGH_MEMORY</a>;</div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> }</div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> </div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> <span class="comment">/* Initialize completed stripes array */</span></div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> UT_array *stripes = NULL;</div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> utarray_new(stripes, &amp;<a class="code hl_variable" href="erasure_8c.html#a1883da545c74667f3438d8e48b195aa1">ec_stripe_icd</a>);</div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> </div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> <span class="comment">/* Store in context */</span></div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a25448606ea0870a817f4a2b6c94f7698">ec_algorithm</a> = algorithm;</div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aece272b6ba4a3451e5f56be5a1e5c7c5">ec_K</a> = <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a>;</div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a9c7a7eafdd48b8d0cbdbb46d28cfceaa">ec_M</a> = M;</div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a3dd804f91ba84019bd5a23226fa7d608">ec_data_shard_size</a> = shard_size;</div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a231115c6a202af9b0b846dcd9894435d">ec_rs_ctx</a> = rs;</div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ac11104550371641bb95b74c83ed8b748">ec_data_parity</a> = parity;</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a9a68ea472d082df95246171eaab070d0">ec_data_block_offsets</a> = offsets;</div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a0562ac6ba169471d3d83482342d68ff2">ec_data_block_sizes</a> = sizes;</div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a0306814ea46f136a21ffdbf5504744d2">ec_data_shard_crcs</a> = crcs;</div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aa8301e298630675bb060fde6fa6e401a">ec_data_stripe_counts</a> = counts;</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a9b5df0512665a9b31fbfff6dc912b6eb">ec_total_data_blocks</a> = 0;</div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a682d900c0f7dc71bc4820e09609f1615">ec_data_stripes</a> = stripes;</div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ac08b99bdbcd7a208e6893d59f0e02a17">ec_enabled</a> = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> </div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> <span class="comment">/* Set feature flag so old readers know parity data exists */</span></div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a670dec8d59407989fefc361dc26c6832">header</a>.<a class="code hl_variable" href="structAaruHeaderV2.html#a9dae72bee3d161760dbbe389e4a70444">featureCompatibleRo</a> |= <a class="code hl_enumvalue" href="enums_8h.html#a8224cd67a8e4e3d365e0371899c7065fa8b803843c50589f197b6461d1c74ea9b">AARU_FEATURE_ROCOMPAT_ERASURE</a>;</div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> </div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> <a class="code hl_define" href="log_8h.html#a21cc0459b78d5f2d7bd737e5aae1278a">TRACE</a>(<span class="stringliteral">&quot;Erasure coding configured: algorithm=%u K=%u M=%u shard_size=%u&quot;</span>, algorithm, <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a>, M, shard_size);</div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> <a class="code hl_define" href="log_8h.html#a21cc0459b78d5f2d7bd737e5aae1278a">TRACE</a>(<span class="stringliteral">&quot;Exiting aaruf_set_erasure_coding() = 0&quot;</span>);</div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> <span class="keywordflow">return</span> <a class="code hl_define" href="errors_8h.html#a1d6e49f7e8a1fa489efa0a582e90b5de">AARUF_STATUS_OK</a>;</div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span>}</div>
</div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span></div>
<div class="foldopen" id="foldopen00193" data-start="{" data-end="}">
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"><a class="line" href="decls_8h.html#a51fe2ca1a6eabf109f0cfc4b3223508b"> 193</a></span><a class="code hl_define" href="decls_8h.html#a9001412c35f3c92d3a9320d27b0d97f9">AARU_EXPORT</a> int32_t <a class="code hl_define" href="decls_8h.html#a018e0da1c1f7e4f6187a982c0e40e056">AARU_CALL</a> <a class="code hl_function" href="erasure_8c.html#a51fe2ca1a6eabf109f0cfc4b3223508b">aaruf_set_erasure_coding_auto</a>(<span class="keywordtype">void</span> *context, uint8_t recovery_percent)</div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span>{</div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> <a class="code hl_define" href="log_8h.html#a21cc0459b78d5f2d7bd737e5aae1278a">TRACE</a>(<span class="stringliteral">&quot;Entering aaruf_set_erasure_coding_auto(%p, %u)&quot;</span>, context, recovery_percent);</div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> </div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> <span class="keywordflow">if</span>(recovery_percent == 0 || recovery_percent &gt; 100)</div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> <span class="keywordflow">return</span> <a class="code hl_define" href="errors_8h.html#a8fc3ecb14777e72bebad62084b6caf16">AARUF_ERROR_INCORRECT_DATA_SIZE</a>;</div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> </div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> <span class="comment">/* M scales with recovery percentage: more recovery = more parity blocks.</span></div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span><span class="comment"> * Target K ≈ 20 (reasonable stripe size), so M ≈ 20 * percent / 100.</span></div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span><span class="comment"> * Clamp to [2, 8]: minimum M=2 for RS burst tolerance, max M=8 for memory. */</span></div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> uint16_t M = (uint16_t)((20 * (uint32_t)recovery_percent + 50) / 100); <span class="comment">/* rounded */</span></div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> <span class="keywordflow">if</span>(M &lt; 2) M = 2;</div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> <span class="keywordflow">if</span>(M &gt; 8) M = 8;</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> </div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> uint16_t <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a> = (uint16_t)(M * 100 / recovery_percent);</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> <span class="keywordflow">if</span>(<a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a> &lt; 1) <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a> = 1;</div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> <span class="keywordflow">if</span>(<a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a> + M &gt; 255) <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a> = 255 - M;</div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> </div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> <a class="code hl_define" href="log_8h.html#a21cc0459b78d5f2d7bd737e5aae1278a">TRACE</a>(<span class="stringliteral">&quot;Auto EC: recovery_percent=%u -&gt; K=%u M=%u&quot;</span>, recovery_percent, <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a>, M);</div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> <span class="keywordflow">return</span> <a class="code hl_function" href="erasure_8c.html#a8b0f3ab93ca60ce00321ca28c2484c7c">aaruf_set_erasure_coding</a>(context, <a class="code hl_enumvalue" href="enums_8h.html#a83c99da65804eb80cfb955eb9a15ef5ea80cd481d5fe067366bbde7db7cab4e22">kErasureCodingRsVandermonde</a>, <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a>, M);</div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span>}</div>
</div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span></div>
<div class="foldopen" id="foldopen00228" data-start="{" data-end="}">
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"><a class="line" href="erasure__internal_8h.html#a676c380c73d5adf73afd7613ec06b29d"> 228</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="erasure_8c.html#a676c380c73d5adf73afd7613ec06b29d">ec_accumulate_data_block</a>(<a class="code hl_struct" href="structaaruformat__context.html">aaruformat_context</a> *ctx, <span class="keyword">const</span> <a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a> *block_header, <span class="keyword">const</span> uint8_t *lzma_props,</div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> <span class="keyword">const</span> uint8_t *payload, uint32_t payload_size, uint64_t file_offset)</div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span>{</div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span> <span class="keywordflow">if</span>(!ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ac08b99bdbcd7a208e6893d59f0e02a17">ec_enabled</a>) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> </div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> <span class="keyword">const</span> uint16_t <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a> = ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aece272b6ba4a3451e5f56be5a1e5c7c5">ec_K</a>;</div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> <span class="keyword">const</span> uint16_t M = ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a9c7a7eafdd48b8d0cbdbb46d28cfceaa">ec_M</a>;</div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span> <span class="keyword">const</span> uint32_t shard = ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a3dd804f91ba84019bd5a23226fa7d608">ec_data_shard_size</a>;</div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> </div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span> <span class="comment">/* Determine which stripe slot this block goes to (interleaved round-robin) */</span></div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span> uint32_t slot = ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a9b5df0512665a9b31fbfff6dc912b6eb">ec_total_data_blocks</a> % <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a>;</div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span> </div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span> <span class="comment">/* Position within this slot&#39;s stripe */</span></div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span> uint16_t pos = ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aa8301e298630675bb060fde6fa6e401a">ec_data_stripe_counts</a>[slot];</div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span> </div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span> <span class="comment">/* Build on-disk shard in a temp buffer:</span></div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span><span class="comment"> * [BlockHeader] [LZMA props if LZMA] [payload]</span></div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span><span class="comment"> * Remaining bytes to shard_size are implicitly zero (parity buffers were calloc&#39;d) */</span></div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span> uint32_t actual_size = (uint32_t)<span class="keyword">sizeof</span>(<a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a>);</div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno"> 247</span> <span class="keywordflow">if</span>(block_header-&gt;<a class="code hl_variable" href="structBlockHeader.html#ad68963422fd2a5f6d0e0be751cbef559">compression</a> == <a class="code hl_enumvalue" href="enums_8h.html#affec749ed88365143745313ae9168263a66b049c2b816874ab71b06cebf5afcd7">kCompressionLzma</a> &amp;&amp; lzma_props)</div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno"> 248</span> actual_size += <a class="code hl_define" href="consts_8h.html#a25fd08252b97a0230d3efc899bddd240">LZMA_PROPERTIES_LENGTH</a>;</div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno"> 249</span> actual_size += payload_size;</div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno"> 250</span> </div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno"> 251</span> <span class="comment">/* We need a temporary flat copy of the on-disk representation for CRC64 and parity accumulation */</span></div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"> 252</span> uint8_t *shard_buf = (uint8_t *)calloc(1, shard);</div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno"> 253</span> <span class="keywordflow">if</span>(!shard_buf) <span class="keywordflow">return</span>; <span class="comment">/* Best effort — if OOM, skip parity for this block */</span></div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno"> 254</span> </div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno"> 255</span> <span class="comment">/* Copy BlockHeader */</span></div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"> 256</span> memcpy(shard_buf, block_header, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a>));</div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</span> uint32_t offset = <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a>);</div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno"> 258</span> </div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno"> 259</span> <span class="comment">/* Copy LZMA properties if applicable */</span></div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno"> 260</span> <span class="keywordflow">if</span>(block_header-&gt;<a class="code hl_variable" href="structBlockHeader.html#ad68963422fd2a5f6d0e0be751cbef559">compression</a> == <a class="code hl_enumvalue" href="enums_8h.html#affec749ed88365143745313ae9168263a66b049c2b816874ab71b06cebf5afcd7">kCompressionLzma</a> &amp;&amp; lzma_props)</div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"> 261</span> {</div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno"> 262</span> memcpy(shard_buf + offset, lzma_props, <a class="code hl_define" href="consts_8h.html#a25fd08252b97a0230d3efc899bddd240">LZMA_PROPERTIES_LENGTH</a>);</div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno"> 263</span> offset += <a class="code hl_define" href="consts_8h.html#a25fd08252b97a0230d3efc899bddd240">LZMA_PROPERTIES_LENGTH</a>;</div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno"> 264</span> }</div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"> 265</span> </div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"> 266</span> <span class="comment">/* Copy payload */</span></div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"> 267</span> memcpy(shard_buf + offset, payload, payload_size);</div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno"> 268</span> </div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno"> 269</span> <span class="comment">/* Compute CRC64 of the zero-padded shard */</span></div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno"> 270</span> uint64_t shard_crc = <a class="code hl_function" href="decls_8h.html#a0fee4834bf0747bcd933c4e754aa4692">aaruf_crc64_data</a>(shard_buf, shard);</div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno"> 271</span> </div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno"> 272</span> <span class="comment">/* Record tracking info */</span></div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno"> 273</span> <span class="keywordtype">size_t</span> tracking_idx = (size_t)slot * <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a> + pos;</div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno"> 274</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a9a68ea472d082df95246171eaab070d0">ec_data_block_offsets</a>[tracking_idx] = file_offset;</div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno"> 275</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a0562ac6ba169471d3d83482342d68ff2">ec_data_block_sizes</a>[tracking_idx] = actual_size;</div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno"> 276</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a0306814ea46f136a21ffdbf5504744d2">ec_data_shard_crcs</a>[tracking_idx] = shard_crc;</div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span> </div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span> <span class="comment">/* Accumulate into parity buffers for this slot */</span></div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"> 279</span> <span class="keywordflow">for</span>(uint16_t m = 0; m &lt; M; m++)</div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span> {</div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span> uint8_t coeff = <a class="code hl_function" href="reed__solomon_8c.html#ada549b6a6028807b96d975bba70bea2d">rs_get_coefficient</a>((<a class="code hl_struct" href="structrs__context.html">rs_context</a> *)ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a231115c6a202af9b0b846dcd9894435d">ec_rs_ctx</a>, m, pos);</div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno"> 282</span> <span class="keywordtype">size_t</span> parity_idx = (size_t)slot * M + m;</div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"> 283</span> <a class="code hl_function" href="reed__solomon_8c.html#ab02dd67e8f4b96de007048f30649adb1">rs_encode_incremental</a>(coeff, shard_buf, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ac11104550371641bb95b74c83ed8b748">ec_data_parity</a>[parity_idx], shard);</div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno"> 284</span> }</div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno"> 285</span> </div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno"> 286</span> free(shard_buf);</div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno"> 287</span> </div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno"> 288</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aa8301e298630675bb060fde6fa6e401a">ec_data_stripe_counts</a>[slot]++;</div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno"> 289</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a9b5df0512665a9b31fbfff6dc912b6eb">ec_total_data_blocks</a>++;</div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno"> 290</span> </div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno"> 291</span> <span class="comment">/* Check if this stripe slot is full → write parity blocks */</span></div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno"> 292</span> <span class="keywordflow">if</span>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aa8301e298630675bb060fde6fa6e401a">ec_data_stripe_counts</a>[slot] == <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a>)</div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno"> 293</span> {</div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno"> 294</span> <a class="code hl_function" href="erasure_8c.html#aa258c90d05ad57fc4c378679e5187e48">ec_flush_data_stripe</a>(ctx, slot);</div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno"> 295</span> }</div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno"> 296</span>}</div>
</div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno"> 297</span></div>
<div class="foldopen" id="foldopen00304" data-start="{" data-end="}">
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno"><a class="line" href="erasure__internal_8h.html#aa258c90d05ad57fc4c378679e5187e48"> 304</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="erasure_8c.html#aa258c90d05ad57fc4c378679e5187e48">ec_flush_data_stripe</a>(<a class="code hl_struct" href="structaaruformat__context.html">aaruformat_context</a> *ctx, uint32_t slot)</div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno"> 305</span>{</div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"> 306</span> <span class="keyword">const</span> uint16_t <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a> = ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aece272b6ba4a3451e5f56be5a1e5c7c5">ec_K</a>;</div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno"> 307</span> <span class="keyword">const</span> uint16_t M = ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a9c7a7eafdd48b8d0cbdbb46d28cfceaa">ec_M</a>;</div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno"> 308</span> <span class="keyword">const</span> uint32_t shard = ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a3dd804f91ba84019bd5a23226fa7d608">ec_data_shard_size</a>;</div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno"> 309</span> uint16_t actual_k = ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aa8301e298630675bb060fde6fa6e401a">ec_data_stripe_counts</a>[slot];</div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno"> 310</span> </div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno"> 311</span> <span class="keywordflow">if</span>(actual_k == 0) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno"> 312</span> </div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"> 313</span> <span class="comment">/* Build and serialize stripe descriptor:</span></div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno"> 314</span><span class="comment"> * [actualK: uint16_t]</span></div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno"> 315</span><span class="comment"> * [actualK × StripeDataBlockEntry: offset(8) + onDiskSize(4) + shardCrc64(8) = 20 bytes each]</span></div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno"> 316</span><span class="comment"> * [M × StripeParityBlockEntry: offset(8) = 8 bytes each]</span></div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno"> 317</span><span class="comment"> */</span></div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno"> 318</span> <span class="keywordtype">size_t</span> desc_data_size = <span class="keyword">sizeof</span>(uint16_t) + (<span class="keywordtype">size_t</span>)actual_k * <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeDataBlockEntry.html">StripeDataBlockEntry</a>) +</div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno"> 319</span> (<span class="keywordtype">size_t</span>)M * <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeParityBlockEntry.html">StripeParityBlockEntry</a>);</div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"> 320</span> uint8_t *desc = (uint8_t *)calloc(1, desc_data_size);</div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno"> 321</span> <span class="keywordflow">if</span>(!desc) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"> 322</span> </div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno"> 323</span> uint8_t *p = desc;</div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno"> 324</span> </div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno"> 325</span> <span class="comment">/* Write actualK */</span></div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno"> 326</span> memcpy(p, &amp;actual_k, <span class="keyword">sizeof</span>(uint16_t)); p += <span class="keyword">sizeof</span>(uint16_t);</div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno"> 327</span> </div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno"> 328</span> <span class="comment">/* Write data block entries */</span></div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno"> 329</span> <span class="keywordflow">for</span>(uint16_t k = 0; k &lt; actual_k; k++)</div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno"> 330</span> {</div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno"> 331</span> <span class="keywordtype">size_t</span> idx = (size_t)slot * <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a> + k;</div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno"> 332</span> <a class="code hl_struct" href="structStripeDataBlockEntry.html">StripeDataBlockEntry</a> entry;</div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno"> 333</span> entry.<a class="code hl_variable" href="structStripeDataBlockEntry.html#a7aac714b3d98b543e792537fd7c8d3fc">offset</a> = ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a9a68ea472d082df95246171eaab070d0">ec_data_block_offsets</a>[idx];</div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno"> 334</span> entry.<a class="code hl_variable" href="structStripeDataBlockEntry.html#a3351d43103f9f7fbd9f4486161a1656d">onDiskSize</a> = ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a0562ac6ba169471d3d83482342d68ff2">ec_data_block_sizes</a>[idx];</div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno"> 335</span> entry.<a class="code hl_variable" href="structStripeDataBlockEntry.html#af85494afc772fe1469927c826e24a1b2">shardCrc64</a> = ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a0306814ea46f136a21ffdbf5504744d2">ec_data_shard_crcs</a>[idx];</div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno"> 336</span> memcpy(p, &amp;entry, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeDataBlockEntry.html">StripeDataBlockEntry</a>)); p += <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeDataBlockEntry.html">StripeDataBlockEntry</a>);</div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno"> 337</span> }</div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno"> 338</span> </div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno"> 339</span> <span class="comment">/* Write M parity blocks to disk */</span></div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno"> 340</span> uint64_t alignment_mask = (1ULL &lt;&lt; ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a04c5fb367458a6e9dd0a50b39f6edec2">user_data_ddt_header</a>.<a class="code hl_variable" href="structDdtHeader2.html#aa67b097c3a20f926ede495d27152f1c0">blockAlignmentShift</a>) - 1;</div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno"> 341</span> </div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno"> 342</span> <span class="keywordflow">for</span>(uint16_t m = 0; m &lt; M; m++)</div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno"> 343</span> {</div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno"> 344</span> <span class="keywordtype">size_t</span> parity_idx = (size_t)slot * M + m;</div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno"> 345</span> uint8_t *parity_data = ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ac11104550371641bb95b74c83ed8b748">ec_data_parity</a>[parity_idx];</div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno"> 346</span> </div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno"> 347</span> <span class="comment">/* Compress the parity shard using the same settings as data blocks */</span></div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno"> 348</span> <a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a> parity_header;</div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno"> 349</span> memset(&amp;parity_header, 0, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a>));</div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno"> 350</span> parity_header.<a class="code hl_variable" href="structBlockHeader.html#a3b03f118fb2dc3dcef3f87a82238e358">identifier</a> = <a class="code hl_enumvalue" href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3a5a0811c5ee97536aef900cecb8787713">DataBlock</a>;</div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno"> 351</span> parity_header.<a class="code hl_variable" href="structBlockHeader.html#ac31ad48f3362a43175c94ec2e30662ad">type</a> = <a class="code hl_enumvalue" href="enums_8h.html#ad8ed01ff3ff33333d8e19db4d2818bb6adb8752d43e2e151c60d90bb2962d16a6">kDataTypeErasureParity</a>;</div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno"> 352</span> parity_header.<a class="code hl_variable" href="structBlockHeader.html#ad68963422fd2a5f6d0e0be751cbef559">compression</a> = <a class="code hl_enumvalue" href="enums_8h.html#affec749ed88365143745313ae9168263a6925460497824fd20caa5ba1925cde84">kCompressionNone</a>;</div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno"> 353</span> parity_header.<a class="code hl_variable" href="structBlockHeader.html#a5bd50f95c8c1f91e5013a1a154690beb">sectorSize</a> = 0;</div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno"> 354</span> parity_header.<a class="code hl_variable" href="structBlockHeader.html#a1f9f3204a10090709b28d0df4bb547e5">length</a> = shard;</div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno"> 355</span> parity_header.<a class="code hl_variable" href="structBlockHeader.html#a0ee87beb4362823260f70a87ac17379f">cmpLength</a> = shard;</div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno"> 356</span> parity_header.<a class="code hl_variable" href="structBlockHeader.html#ab4d9e3a871e0c7f12a881017dac4ca12">crc64</a> = <a class="code hl_function" href="decls_8h.html#a0fee4834bf0747bcd933c4e754aa4692">aaruf_crc64_data</a>(parity_data, shard);</div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno"> 357</span> parity_header.<a class="code hl_variable" href="structBlockHeader.html#a8ff40eae6c49f0d9b49825f75e1e2bf8">cmpCrc64</a> = parity_header.<a class="code hl_variable" href="structBlockHeader.html#ab4d9e3a871e0c7f12a881017dac4ca12">crc64</a>;</div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno"> 358</span> </div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno"> 359</span> <span class="comment">/* Try compression */</span></div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno"> 360</span> uint8_t *cmp_buf = NULL;</div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno"> 361</span> <span class="keywordtype">size_t</span> cmp_size = 0;</div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno"> 362</span> </div>
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno"> 363</span> <span class="keywordflow">if</span>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a130daf19dbed426f1c4c6f82691bc054">compression_enabled</a>)</div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno"> 364</span> {</div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno"> 365</span> cmp_buf = (uint8_t *)malloc((<span class="keywordtype">size_t</span>)shard * 2);</div>
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno"> 366</span> <span class="keywordflow">if</span>(cmp_buf)</div>
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno"> 367</span> {</div>
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno"> 368</span> <span class="keywordflow">if</span>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ad027cde303f65d3ccc5b18a879692782">use_zstd</a>)</div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno"> 369</span> {</div>
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno"> 370</span> cmp_size = <a class="code hl_function" href="decls_8h.html#a3950b73c924a7096bb2313e0858a315a">aaruf_zstd_encode_buffer</a>(cmp_buf, (<span class="keywordtype">size_t</span>)shard * 2, parity_data, shard,</div>
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno"> 371</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a9f694f685458e2142e116da91727de38">zstd_level</a>, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#abd11e50d05e8f007bf084a586bad0fe9">num_threads</a>);</div>
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno"> 372</span> <span class="keywordflow">if</span>(cmp_size &gt; 0 &amp;&amp; cmp_size &lt; shard)</div>
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno"> 373</span> {</div>
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno"> 374</span> parity_header.<a class="code hl_variable" href="structBlockHeader.html#ad68963422fd2a5f6d0e0be751cbef559">compression</a> = <a class="code hl_enumvalue" href="enums_8h.html#affec749ed88365143745313ae9168263a6ee0deaccf9cd167806cc479afffc0cc">kCompressionZstd</a>;</div>
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno"> 375</span> parity_header.<a class="code hl_variable" href="structBlockHeader.html#a0ee87beb4362823260f70a87ac17379f">cmpLength</a> = (uint32_t)cmp_size;</div>
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno"> 376</span> parity_header.<a class="code hl_variable" href="structBlockHeader.html#a8ff40eae6c49f0d9b49825f75e1e2bf8">cmpCrc64</a> = <a class="code hl_function" href="decls_8h.html#a0fee4834bf0747bcd933c4e754aa4692">aaruf_crc64_data</a>(cmp_buf, (uint32_t)cmp_size);</div>
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno"> 377</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a9cf4d3d7117a279de4c178eb7af217d6">has_zstd_blocks</a> = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno"> 378</span> }</div>
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno"> 379</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno"> 380</span> {</div>
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno"> 381</span> free(cmp_buf);</div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno"> 382</span> cmp_buf = NULL;</div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno"> 383</span> }</div>
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno"> 384</span> }</div>
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno"> 385</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno"> 386</span> {</div>
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno"> 387</span> <span class="keywordtype">size_t</span> dst_size = (size_t)shard * 2;</div>
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno"> 388</span> <span class="keywordtype">size_t</span> props_size = <a class="code hl_define" href="consts_8h.html#a25fd08252b97a0230d3efc899bddd240">LZMA_PROPERTIES_LENGTH</a>;</div>
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno"> 389</span> uint8_t lzma_props[<a class="code hl_define" href="consts_8h.html#a25fd08252b97a0230d3efc899bddd240">LZMA_PROPERTIES_LENGTH</a>] = {0};</div>
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno"> 390</span> <a class="code hl_function" href="decls_8h.html#a0e69fad529047d6fe9440b1fc66c3f85">aaruf_lzma_encode_buffer</a>(cmp_buf, &amp;dst_size, parity_data, shard, lzma_props, &amp;props_size, 9,</div>
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno"> 391</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#adc67f6a6ef1602648bb064d47eb1fe88">lzma_dict_size</a>, 4, 0, 2, 273, <a class="code hl_define" href="internal_8h.html#a96247194f6c1e4090020e2a3691f8c9d">LZMA_THREADS</a>(ctx));</div>
<div class="line"><a id="l00392" name="l00392"></a><span class="lineno"> 392</span> <span class="keywordflow">if</span>(dst_size + <a class="code hl_define" href="consts_8h.html#a25fd08252b97a0230d3efc899bddd240">LZMA_PROPERTIES_LENGTH</a> &lt; shard)</div>
<div class="line"><a id="l00393" name="l00393"></a><span class="lineno"> 393</span> {</div>
<div class="line"><a id="l00394" name="l00394"></a><span class="lineno"> 394</span> parity_header.<a class="code hl_variable" href="structBlockHeader.html#ad68963422fd2a5f6d0e0be751cbef559">compression</a> = <a class="code hl_enumvalue" href="enums_8h.html#affec749ed88365143745313ae9168263a66b049c2b816874ab71b06cebf5afcd7">kCompressionLzma</a>;</div>
<div class="line"><a id="l00395" name="l00395"></a><span class="lineno"> 395</span> parity_header.<a class="code hl_variable" href="structBlockHeader.html#a0ee87beb4362823260f70a87ac17379f">cmpLength</a> = (uint32_t)(dst_size + <a class="code hl_define" href="consts_8h.html#a25fd08252b97a0230d3efc899bddd240">LZMA_PROPERTIES_LENGTH</a>);</div>
<div class="line"><a id="l00396" name="l00396"></a><span class="lineno"> 396</span> parity_header.<a class="code hl_variable" href="structBlockHeader.html#a8ff40eae6c49f0d9b49825f75e1e2bf8">cmpCrc64</a> = <a class="code hl_function" href="decls_8h.html#a0fee4834bf0747bcd933c4e754aa4692">aaruf_crc64_data</a>(cmp_buf, (uint32_t)dst_size);</div>
<div class="line"><a id="l00397" name="l00397"></a><span class="lineno"> 397</span> </div>
<div class="line"><a id="l00398" name="l00398"></a><span class="lineno"> 398</span> <span class="comment">/* Write: header + lzma_props + compressed data */</span></div>
<div class="line"><a id="l00399" name="l00399"></a><span class="lineno"> 399</span> <a class="code hl_function" href="internal_8h.html#a60c57e3b2e8e233d0be91f3690bf077c">aaruf_fseek</a>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>, 0, SEEK_END);</div>
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno"> 400</span> uint64_t parity_offset = (uint64_t)<a class="code hl_function" href="internal_8h.html#a697ee4ab2c7adc710e56b0ef868596d7">aaruf_ftell</a>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>);</div>
<div class="line"><a id="l00401" name="l00401"></a><span class="lineno"> 401</span> parity_offset = (parity_offset + alignment_mask) &amp; ~alignment_mask;</div>
<div class="line"><a id="l00402" name="l00402"></a><span class="lineno"> 402</span> <a class="code hl_function" href="internal_8h.html#a60c57e3b2e8e233d0be91f3690bf077c">aaruf_fseek</a>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>, (<a class="code hl_typedef" href="internal_8h.html#afb4a123eeae51c668333248fb666e0f2">aaru_off_t</a>)parity_offset, SEEK_SET);</div>
<div class="line"><a id="l00403" name="l00403"></a><span class="lineno"> 403</span> </div>
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno"> 404</span> fwrite(&amp;parity_header, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a>), 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>);</div>
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno"> 405</span> fwrite(lzma_props, <a class="code hl_define" href="consts_8h.html#a25fd08252b97a0230d3efc899bddd240">LZMA_PROPERTIES_LENGTH</a>, 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>);</div>
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno"> 406</span> fwrite(cmp_buf, dst_size, 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>);</div>
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno"> 407</span> free(cmp_buf);</div>
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno"> 408</span> </div>
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno"> 409</span> <span class="comment">/* Record parity offset in descriptor */</span></div>
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno"> 410</span> <a class="code hl_struct" href="structStripeParityBlockEntry.html">StripeParityBlockEntry</a> pentry;</div>
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno"> 411</span> pentry.<a class="code hl_variable" href="structStripeParityBlockEntry.html#a4222801a62acbce61990ee79faf26050">offset</a> = parity_offset;</div>
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno"> 412</span> memcpy(p, &amp;pentry, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeParityBlockEntry.html">StripeParityBlockEntry</a>)); p += <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeParityBlockEntry.html">StripeParityBlockEntry</a>);</div>
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno"> 413</span> </div>
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno"> 414</span> <span class="comment">/* Add index entry */</span></div>
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno"> 415</span> <a class="code hl_struct" href="structIndexEntry.html">IndexEntry</a> ie = {.blockType = <a class="code hl_enumvalue" href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3a5a0811c5ee97536aef900cecb8787713">DataBlock</a>, .dataType = <a class="code hl_enumvalue" href="enums_8h.html#ad8ed01ff3ff33333d8e19db4d2818bb6adb8752d43e2e151c60d90bb2962d16a6">kDataTypeErasureParity</a>,</div>
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno"> 416</span> .offset = parity_offset};</div>
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno"> 417</span> utarray_push_back(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab97a719a5b4186695b67143db7376152">index_entries</a>, &amp;ie);</div>
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno"> 418</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a63616c8450e9e1853e0645714fe310cb">dirty_index_block</a> = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno"> 419</span> </div>
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno"> 420</span> <span class="comment">/* Update next_block_position */</span></div>
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno"> 421</span> uint64_t total = <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a>) + parity_header.<a class="code hl_variable" href="structBlockHeader.html#a0ee87beb4362823260f70a87ac17379f">cmpLength</a>;</div>
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno"> 422</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a939b702f75e80062bc635add4c3ab142">next_block_position</a> = (parity_offset + total + alignment_mask) &amp; ~alignment_mask;</div>
<div class="line"><a id="l00423" name="l00423"></a><span class="lineno"> 423</span> </div>
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno"> 424</span> <span class="comment">/* Reset parity buffer */</span></div>
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno"> 425</span> memset(parity_data, 0, shard);</div>
<div class="line"><a id="l00426" name="l00426"></a><span class="lineno"> 426</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno"> 427</span> }</div>
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno"> 428</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno"> 429</span> {</div>
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno"> 430</span> free(cmp_buf);</div>
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno"> 431</span> cmp_buf = NULL;</div>
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno"> 432</span> }</div>
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno"> 433</span> }</div>
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno"> 434</span> }</div>
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno"> 435</span> }</div>
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno"> 436</span> </div>
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno"> 437</span> <span class="comment">/* Write uncompressed (or compressed non-LZMA) parity */</span></div>
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno"> 438</span> <a class="code hl_function" href="internal_8h.html#a60c57e3b2e8e233d0be91f3690bf077c">aaruf_fseek</a>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>, 0, SEEK_END);</div>
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno"> 439</span> uint64_t parity_offset = (uint64_t)<a class="code hl_function" href="internal_8h.html#a697ee4ab2c7adc710e56b0ef868596d7">aaruf_ftell</a>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>);</div>
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno"> 440</span> parity_offset = (parity_offset + alignment_mask) &amp; ~alignment_mask;</div>
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno"> 441</span> <a class="code hl_function" href="internal_8h.html#a60c57e3b2e8e233d0be91f3690bf077c">aaruf_fseek</a>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>, (<a class="code hl_typedef" href="internal_8h.html#afb4a123eeae51c668333248fb666e0f2">aaru_off_t</a>)parity_offset, SEEK_SET);</div>
<div class="line"><a id="l00442" name="l00442"></a><span class="lineno"> 442</span> </div>
<div class="line"><a id="l00443" name="l00443"></a><span class="lineno"> 443</span> fwrite(&amp;parity_header, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a>), 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>);</div>
<div class="line"><a id="l00444" name="l00444"></a><span class="lineno"> 444</span> <span class="keywordflow">if</span>(cmp_buf)</div>
<div class="line"><a id="l00445" name="l00445"></a><span class="lineno"> 445</span> {</div>
<div class="line"><a id="l00446" name="l00446"></a><span class="lineno"> 446</span> fwrite(cmp_buf, cmp_size, 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>);</div>
<div class="line"><a id="l00447" name="l00447"></a><span class="lineno"> 447</span> free(cmp_buf);</div>
<div class="line"><a id="l00448" name="l00448"></a><span class="lineno"> 448</span> }</div>
<div class="line"><a id="l00449" name="l00449"></a><span class="lineno"> 449</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno"> 450</span> {</div>
<div class="line"><a id="l00451" name="l00451"></a><span class="lineno"> 451</span> fwrite(parity_data, shard, 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>);</div>
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno"> 452</span> }</div>
<div class="line"><a id="l00453" name="l00453"></a><span class="lineno"> 453</span> </div>
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno"> 454</span> <span class="comment">/* Record parity offset in descriptor */</span></div>
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno"> 455</span> <a class="code hl_struct" href="structStripeParityBlockEntry.html">StripeParityBlockEntry</a> pentry;</div>
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno"> 456</span> pentry.<a class="code hl_variable" href="structStripeParityBlockEntry.html#a4222801a62acbce61990ee79faf26050">offset</a> = parity_offset;</div>
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno"> 457</span> memcpy(p, &amp;pentry, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeParityBlockEntry.html">StripeParityBlockEntry</a>)); p += <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeParityBlockEntry.html">StripeParityBlockEntry</a>);</div>
<div class="line"><a id="l00458" name="l00458"></a><span class="lineno"> 458</span> </div>
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno"> 459</span> <span class="comment">/* Add index entry */</span></div>
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno"> 460</span> <a class="code hl_struct" href="structIndexEntry.html">IndexEntry</a> ie = {.blockType = <a class="code hl_enumvalue" href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3a5a0811c5ee97536aef900cecb8787713">DataBlock</a>, .dataType = <a class="code hl_enumvalue" href="enums_8h.html#ad8ed01ff3ff33333d8e19db4d2818bb6adb8752d43e2e151c60d90bb2962d16a6">kDataTypeErasureParity</a>, .offset = parity_offset};</div>
<div class="line"><a id="l00461" name="l00461"></a><span class="lineno"> 461</span> utarray_push_back(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab97a719a5b4186695b67143db7376152">index_entries</a>, &amp;ie);</div>
<div class="line"><a id="l00462" name="l00462"></a><span class="lineno"> 462</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a63616c8450e9e1853e0645714fe310cb">dirty_index_block</a> = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00463" name="l00463"></a><span class="lineno"> 463</span> </div>
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno"> 464</span> <span class="comment">/* Update next_block_position */</span></div>
<div class="line"><a id="l00465" name="l00465"></a><span class="lineno"> 465</span> uint64_t total = <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a>) + parity_header.<a class="code hl_variable" href="structBlockHeader.html#a0ee87beb4362823260f70a87ac17379f">cmpLength</a>;</div>
<div class="line"><a id="l00466" name="l00466"></a><span class="lineno"> 466</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a939b702f75e80062bc635add4c3ab142">next_block_position</a> = (parity_offset + total + alignment_mask) &amp; ~alignment_mask;</div>
<div class="line"><a id="l00467" name="l00467"></a><span class="lineno"> 467</span> </div>
<div class="line"><a id="l00468" name="l00468"></a><span class="lineno"> 468</span> <span class="comment">/* Reset parity buffer */</span></div>
<div class="line"><a id="l00469" name="l00469"></a><span class="lineno"> 469</span> memset(parity_data, 0, shard);</div>
<div class="line"><a id="l00470" name="l00470"></a><span class="lineno"> 470</span> }</div>
<div class="line"><a id="l00471" name="l00471"></a><span class="lineno"> 471</span> </div>
<div class="line"><a id="l00472" name="l00472"></a><span class="lineno"> 472</span> <span class="comment">/* Store the completed stripe descriptor */</span></div>
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno"> 473</span> <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; desc_data_size; i++)</div>
<div class="line"><a id="l00474" name="l00474"></a><span class="lineno"> 474</span> utarray_push_back(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a682d900c0f7dc71bc4820e09609f1615">ec_data_stripes</a>, &amp;desc[i]);</div>
<div class="line"><a id="l00475" name="l00475"></a><span class="lineno"> 475</span> </div>
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno"> 476</span> free(desc);</div>
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno"> 477</span> </div>
<div class="line"><a id="l00478" name="l00478"></a><span class="lineno"> 478</span> <span class="comment">/* Reset stripe slot tracking */</span></div>
<div class="line"><a id="l00479" name="l00479"></a><span class="lineno"> 479</span> <span class="keywordflow">for</span>(uint16_t k = 0; k &lt; <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a>; k++)</div>
<div class="line"><a id="l00480" name="l00480"></a><span class="lineno"> 480</span> {</div>
<div class="line"><a id="l00481" name="l00481"></a><span class="lineno"> 481</span> <span class="keywordtype">size_t</span> idx = (size_t)slot * <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a> + k;</div>
<div class="line"><a id="l00482" name="l00482"></a><span class="lineno"> 482</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a9a68ea472d082df95246171eaab070d0">ec_data_block_offsets</a>[idx] = 0;</div>
<div class="line"><a id="l00483" name="l00483"></a><span class="lineno"> 483</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a0562ac6ba169471d3d83482342d68ff2">ec_data_block_sizes</a>[idx] = 0;</div>
<div class="line"><a id="l00484" name="l00484"></a><span class="lineno"> 484</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a0306814ea46f136a21ffdbf5504744d2">ec_data_shard_crcs</a>[idx] = 0;</div>
<div class="line"><a id="l00485" name="l00485"></a><span class="lineno"> 485</span> }</div>
<div class="line"><a id="l00486" name="l00486"></a><span class="lineno"> 486</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aa8301e298630675bb060fde6fa6e401a">ec_data_stripe_counts</a>[slot] = 0;</div>
<div class="line"><a id="l00487" name="l00487"></a><span class="lineno"> 487</span>}</div>
</div>
<div class="line"><a id="l00488" name="l00488"></a><span class="lineno"> 488</span></div>
<div class="foldopen" id="foldopen00495" data-start="{" data-end="}">
<div class="line"><a id="l00495" name="l00495"></a><span class="lineno"><a class="line" href="erasure_8c.html#aed80b4dc1f360dbac00a5f73d350bf1a"> 495</a></span><span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code hl_function" href="erasure_8c.html#aed80b4dc1f360dbac00a5f73d350bf1a">ec_write_batch_parity</a>(<a class="code hl_struct" href="structaaruformat__context.html">aaruformat_context</a> *ctx,</div>
<div class="line"><a id="l00496" name="l00496"></a><span class="lineno"> 496</span> <span class="keyword">const</span> uint64_t *offsets, <span class="keyword">const</span> uint32_t *sizes,</div>
<div class="line"><a id="l00497" name="l00497"></a><span class="lineno"> 497</span> uint32_t block_count, uint8_t group_type,</div>
<div class="line"><a id="l00498" name="l00498"></a><span class="lineno"> 498</span> uint16_t parity_data_type,</div>
<div class="line"><a id="l00499" name="l00499"></a><span class="lineno"> 499</span> uint8_t **out_desc, <span class="keywordtype">size_t</span> *out_desc_len,</div>
<div class="line"><a id="l00500" name="l00500"></a><span class="lineno"> 500</span> <a class="code hl_struct" href="structStripeGroupDescriptor.html">StripeGroupDescriptor</a> *out_group)</div>
<div class="line"><a id="l00501" name="l00501"></a><span class="lineno"> 501</span>{</div>
<div class="line"><a id="l00502" name="l00502"></a><span class="lineno"> 502</span> *out_desc = NULL;</div>
<div class="line"><a id="l00503" name="l00503"></a><span class="lineno"> 503</span> *out_desc_len = 0;</div>
<div class="line"><a id="l00504" name="l00504"></a><span class="lineno"> 504</span> <span class="keywordflow">if</span>(block_count == 0) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00505" name="l00505"></a><span class="lineno"> 505</span> </div>
<div class="line"><a id="l00506" name="l00506"></a><span class="lineno"> 506</span> <span class="keyword">const</span> uint16_t M = ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a9c7a7eafdd48b8d0cbdbb46d28cfceaa">ec_M</a>;</div>
<div class="line"><a id="l00507" name="l00507"></a><span class="lineno"> 507</span> uint16_t actual_k = (uint16_t)(block_count &gt; (uint32_t)(255 - M) ? 255 - M : block_count);</div>
<div class="line"><a id="l00508" name="l00508"></a><span class="lineno"> 508</span> </div>
<div class="line"><a id="l00509" name="l00509"></a><span class="lineno"> 509</span> uint32_t shard_size = 0;</div>
<div class="line"><a id="l00510" name="l00510"></a><span class="lineno"> 510</span> <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; actual_k; i++)</div>
<div class="line"><a id="l00511" name="l00511"></a><span class="lineno"> 511</span> <span class="keywordflow">if</span>(sizes[i] &gt; shard_size) shard_size = sizes[i];</div>
<div class="line"><a id="l00512" name="l00512"></a><span class="lineno"> 512</span> </div>
<div class="line"><a id="l00513" name="l00513"></a><span class="lineno"> 513</span> <a class="code hl_struct" href="structrs__context.html">rs_context</a> *rs = <a class="code hl_function" href="reed__solomon_8c.html#a68a7b13ef6443640abc2818a3bd7d5bf">rs_create</a>(actual_k, M);</div>
<div class="line"><a id="l00514" name="l00514"></a><span class="lineno"> 514</span> <span class="keywordflow">if</span>(!rs) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00515" name="l00515"></a><span class="lineno"> 515</span> </div>
<div class="line"><a id="l00516" name="l00516"></a><span class="lineno"> 516</span> uint8_t **parity = (uint8_t **)calloc(M, <span class="keyword">sizeof</span>(uint8_t *));</div>
<div class="line"><a id="l00517" name="l00517"></a><span class="lineno"> 517</span> <span class="keywordflow">if</span>(!parity) { <a class="code hl_function" href="reed__solomon_8c.html#a5eed1476ef3e8666f011b529337b8518">rs_free</a>(rs); <span class="keywordflow">return</span>; }</div>
<div class="line"><a id="l00518" name="l00518"></a><span class="lineno"> 518</span> <span class="keywordflow">for</span>(uint16_t m = 0; m &lt; M; m++)</div>
<div class="line"><a id="l00519" name="l00519"></a><span class="lineno"> 519</span> {</div>
<div class="line"><a id="l00520" name="l00520"></a><span class="lineno"> 520</span> parity[m] = (uint8_t *)calloc(1, shard_size);</div>
<div class="line"><a id="l00521" name="l00521"></a><span class="lineno"> 521</span> <span class="keywordflow">if</span>(!parity[m]) { <span class="keywordflow">for</span>(uint16_t j = 0; j &lt; m; j++) free(parity[j]); free(parity); <a class="code hl_function" href="reed__solomon_8c.html#a5eed1476ef3e8666f011b529337b8518">rs_free</a>(rs); <span class="keywordflow">return</span>; }</div>
<div class="line"><a id="l00522" name="l00522"></a><span class="lineno"> 522</span> }</div>
<div class="line"><a id="l00523" name="l00523"></a><span class="lineno"> 523</span> </div>
<div class="line"><a id="l00524" name="l00524"></a><span class="lineno"> 524</span> <span class="keywordtype">size_t</span> desc_size = <span class="keyword">sizeof</span>(uint16_t) + (<span class="keywordtype">size_t</span>)actual_k * <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeDataBlockEntry.html">StripeDataBlockEntry</a>) +</div>
<div class="line"><a id="l00525" name="l00525"></a><span class="lineno"> 525</span> (<span class="keywordtype">size_t</span>)M * <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeParityBlockEntry.html">StripeParityBlockEntry</a>);</div>
<div class="line"><a id="l00526" name="l00526"></a><span class="lineno"> 526</span> uint8_t *desc = (uint8_t *)calloc(1, desc_size);</div>
<div class="line"><a id="l00527" name="l00527"></a><span class="lineno"> 527</span> <span class="keywordflow">if</span>(!desc) { <span class="keywordflow">for</span>(uint16_t m = 0; m &lt; M; m++) free(parity[m]); free(parity); <a class="code hl_function" href="reed__solomon_8c.html#a5eed1476ef3e8666f011b529337b8518">rs_free</a>(rs); <span class="keywordflow">return</span>; }</div>
<div class="line"><a id="l00528" name="l00528"></a><span class="lineno"> 528</span> </div>
<div class="line"><a id="l00529" name="l00529"></a><span class="lineno"> 529</span> uint8_t *dp = desc;</div>
<div class="line"><a id="l00530" name="l00530"></a><span class="lineno"> 530</span> memcpy(dp, &amp;actual_k, <span class="keyword">sizeof</span>(uint16_t)); dp += <span class="keyword">sizeof</span>(uint16_t);</div>
<div class="line"><a id="l00531" name="l00531"></a><span class="lineno"> 531</span> </div>
<div class="line"><a id="l00532" name="l00532"></a><span class="lineno"> 532</span> uint8_t *shard_buf = (uint8_t *)calloc(1, shard_size);</div>
<div class="line"><a id="l00533" name="l00533"></a><span class="lineno"> 533</span> <span class="keywordflow">if</span>(!shard_buf) { free(desc); <span class="keywordflow">for</span>(uint16_t m = 0; m &lt; M; m++) free(parity[m]); free(parity); <a class="code hl_function" href="reed__solomon_8c.html#a5eed1476ef3e8666f011b529337b8518">rs_free</a>(rs); <span class="keywordflow">return</span>; }</div>
<div class="line"><a id="l00534" name="l00534"></a><span class="lineno"> 534</span> </div>
<div class="line"><a id="l00535" name="l00535"></a><span class="lineno"> 535</span> <span class="keywordflow">for</span>(uint16_t k = 0; k &lt; actual_k; k++)</div>
<div class="line"><a id="l00536" name="l00536"></a><span class="lineno"> 536</span> {</div>
<div class="line"><a id="l00537" name="l00537"></a><span class="lineno"> 537</span> memset(shard_buf, 0, shard_size);</div>
<div class="line"><a id="l00538" name="l00538"></a><span class="lineno"> 538</span> <a class="code hl_function" href="internal_8h.html#a60c57e3b2e8e233d0be91f3690bf077c">aaruf_fseek</a>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>, (<a class="code hl_typedef" href="internal_8h.html#afb4a123eeae51c668333248fb666e0f2">aaru_off_t</a>)offsets[k], SEEK_SET);</div>
<div class="line"><a id="l00539" name="l00539"></a><span class="lineno"> 539</span> uint32_t read_size = sizes[k] &gt; shard_size ? shard_size : sizes[k];</div>
<div class="line"><a id="l00540" name="l00540"></a><span class="lineno"> 540</span> fread(shard_buf, read_size, 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>);</div>
<div class="line"><a id="l00541" name="l00541"></a><span class="lineno"> 541</span> </div>
<div class="line"><a id="l00542" name="l00542"></a><span class="lineno"> 542</span> uint64_t shard_crc = <a class="code hl_function" href="decls_8h.html#a0fee4834bf0747bcd933c4e754aa4692">aaruf_crc64_data</a>(shard_buf, shard_size);</div>
<div class="line"><a id="l00543" name="l00543"></a><span class="lineno"> 543</span> </div>
<div class="line"><a id="l00544" name="l00544"></a><span class="lineno"> 544</span> <a class="code hl_struct" href="structStripeDataBlockEntry.html">StripeDataBlockEntry</a> entry;</div>
<div class="line"><a id="l00545" name="l00545"></a><span class="lineno"> 545</span> entry.<a class="code hl_variable" href="structStripeDataBlockEntry.html#a7aac714b3d98b543e792537fd7c8d3fc">offset</a> = offsets[k]; entry.<a class="code hl_variable" href="structStripeDataBlockEntry.html#a3351d43103f9f7fbd9f4486161a1656d">onDiskSize</a> = sizes[k]; entry.<a class="code hl_variable" href="structStripeDataBlockEntry.html#af85494afc772fe1469927c826e24a1b2">shardCrc64</a> = shard_crc;</div>
<div class="line"><a id="l00546" name="l00546"></a><span class="lineno"> 546</span> memcpy(dp, &amp;entry, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeDataBlockEntry.html">StripeDataBlockEntry</a>)); dp += <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeDataBlockEntry.html">StripeDataBlockEntry</a>);</div>
<div class="line"><a id="l00547" name="l00547"></a><span class="lineno"> 547</span> </div>
<div class="line"><a id="l00548" name="l00548"></a><span class="lineno"> 548</span> <span class="keywordflow">for</span>(uint16_t m = 0; m &lt; M; m++)</div>
<div class="line"><a id="l00549" name="l00549"></a><span class="lineno"> 549</span> {</div>
<div class="line"><a id="l00550" name="l00550"></a><span class="lineno"> 550</span> uint8_t coeff = <a class="code hl_function" href="reed__solomon_8c.html#ada549b6a6028807b96d975bba70bea2d">rs_get_coefficient</a>(rs, m, k);</div>
<div class="line"><a id="l00551" name="l00551"></a><span class="lineno"> 551</span> <a class="code hl_function" href="reed__solomon_8c.html#ab02dd67e8f4b96de007048f30649adb1">rs_encode_incremental</a>(coeff, shard_buf, parity[m], shard_size);</div>
<div class="line"><a id="l00552" name="l00552"></a><span class="lineno"> 552</span> }</div>
<div class="line"><a id="l00553" name="l00553"></a><span class="lineno"> 553</span> }</div>
<div class="line"><a id="l00554" name="l00554"></a><span class="lineno"> 554</span> free(shard_buf);</div>
<div class="line"><a id="l00555" name="l00555"></a><span class="lineno"> 555</span> </div>
<div class="line"><a id="l00556" name="l00556"></a><span class="lineno"> 556</span> uint64_t alignment_mask = (1ULL &lt;&lt; ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a04c5fb367458a6e9dd0a50b39f6edec2">user_data_ddt_header</a>.<a class="code hl_variable" href="structDdtHeader2.html#aa67b097c3a20f926ede495d27152f1c0">blockAlignmentShift</a>) - 1;</div>
<div class="line"><a id="l00557" name="l00557"></a><span class="lineno"> 557</span> <span class="keywordflow">for</span>(uint16_t m = 0; m &lt; M; m++)</div>
<div class="line"><a id="l00558" name="l00558"></a><span class="lineno"> 558</span> {</div>
<div class="line"><a id="l00559" name="l00559"></a><span class="lineno"> 559</span> <a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a> ph;</div>
<div class="line"><a id="l00560" name="l00560"></a><span class="lineno"> 560</span> memset(&amp;ph, 0, <span class="keyword">sizeof</span>(ph));</div>
<div class="line"><a id="l00561" name="l00561"></a><span class="lineno"> 561</span> ph.<a class="code hl_variable" href="structBlockHeader.html#a3b03f118fb2dc3dcef3f87a82238e358">identifier</a> = <a class="code hl_enumvalue" href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3a5a0811c5ee97536aef900cecb8787713">DataBlock</a>; ph.<a class="code hl_variable" href="structBlockHeader.html#ac31ad48f3362a43175c94ec2e30662ad">type</a> = parity_data_type;</div>
<div class="line"><a id="l00562" name="l00562"></a><span class="lineno"> 562</span> ph.<a class="code hl_variable" href="structBlockHeader.html#ad68963422fd2a5f6d0e0be751cbef559">compression</a> = <a class="code hl_enumvalue" href="enums_8h.html#affec749ed88365143745313ae9168263a6925460497824fd20caa5ba1925cde84">kCompressionNone</a>;</div>
<div class="line"><a id="l00563" name="l00563"></a><span class="lineno"> 563</span> ph.<a class="code hl_variable" href="structBlockHeader.html#a1f9f3204a10090709b28d0df4bb547e5">length</a> = shard_size; ph.<a class="code hl_variable" href="structBlockHeader.html#a0ee87beb4362823260f70a87ac17379f">cmpLength</a> = shard_size;</div>
<div class="line"><a id="l00564" name="l00564"></a><span class="lineno"> 564</span> ph.<a class="code hl_variable" href="structBlockHeader.html#ab4d9e3a871e0c7f12a881017dac4ca12">crc64</a> = <a class="code hl_function" href="decls_8h.html#a0fee4834bf0747bcd933c4e754aa4692">aaruf_crc64_data</a>(parity[m], shard_size); ph.<a class="code hl_variable" href="structBlockHeader.html#a8ff40eae6c49f0d9b49825f75e1e2bf8">cmpCrc64</a> = ph.<a class="code hl_variable" href="structBlockHeader.html#ab4d9e3a871e0c7f12a881017dac4ca12">crc64</a>;</div>
<div class="line"><a id="l00565" name="l00565"></a><span class="lineno"> 565</span> </div>
<div class="line"><a id="l00566" name="l00566"></a><span class="lineno"> 566</span> uint8_t *write_data = parity[m];</div>
<div class="line"><a id="l00567" name="l00567"></a><span class="lineno"> 567</span> uint32_t write_size = shard_size;</div>
<div class="line"><a id="l00568" name="l00568"></a><span class="lineno"> 568</span> uint8_t *cmp_buf = NULL;</div>
<div class="line"><a id="l00569" name="l00569"></a><span class="lineno"> 569</span> uint8_t lzma_props_buf[<a class="code hl_define" href="consts_8h.html#a25fd08252b97a0230d3efc899bddd240">LZMA_PROPERTIES_LENGTH</a>] = {0};</div>
<div class="line"><a id="l00570" name="l00570"></a><span class="lineno"> 570</span> <span class="keywordtype">bool</span> used_lzma = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00571" name="l00571"></a><span class="lineno"> 571</span> </div>
<div class="line"><a id="l00572" name="l00572"></a><span class="lineno"> 572</span> <span class="comment">/* Try compression */</span></div>
<div class="line"><a id="l00573" name="l00573"></a><span class="lineno"> 573</span> <span class="keywordflow">if</span>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a130daf19dbed426f1c4c6f82691bc054">compression_enabled</a>)</div>
<div class="line"><a id="l00574" name="l00574"></a><span class="lineno"> 574</span> {</div>
<div class="line"><a id="l00575" name="l00575"></a><span class="lineno"> 575</span> cmp_buf = (uint8_t *)malloc((<span class="keywordtype">size_t</span>)shard_size * 2);</div>
<div class="line"><a id="l00576" name="l00576"></a><span class="lineno"> 576</span> <span class="keywordflow">if</span>(cmp_buf)</div>
<div class="line"><a id="l00577" name="l00577"></a><span class="lineno"> 577</span> {</div>
<div class="line"><a id="l00578" name="l00578"></a><span class="lineno"> 578</span> <span class="keywordflow">if</span>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ad027cde303f65d3ccc5b18a879692782">use_zstd</a>)</div>
<div class="line"><a id="l00579" name="l00579"></a><span class="lineno"> 579</span> {</div>
<div class="line"><a id="l00580" name="l00580"></a><span class="lineno"> 580</span> <span class="keywordtype">size_t</span> cmp_size = <a class="code hl_function" href="decls_8h.html#a3950b73c924a7096bb2313e0858a315a">aaruf_zstd_encode_buffer</a>(cmp_buf, (<span class="keywordtype">size_t</span>)shard_size * 2,</div>
<div class="line"><a id="l00581" name="l00581"></a><span class="lineno"> 581</span> parity[m], shard_size,</div>
<div class="line"><a id="l00582" name="l00582"></a><span class="lineno"> 582</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a9f694f685458e2142e116da91727de38">zstd_level</a>, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#abd11e50d05e8f007bf084a586bad0fe9">num_threads</a>);</div>
<div class="line"><a id="l00583" name="l00583"></a><span class="lineno"> 583</span> <span class="keywordflow">if</span>(cmp_size &gt; 0 &amp;&amp; cmp_size &lt; shard_size)</div>
<div class="line"><a id="l00584" name="l00584"></a><span class="lineno"> 584</span> {</div>
<div class="line"><a id="l00585" name="l00585"></a><span class="lineno"> 585</span> ph.<a class="code hl_variable" href="structBlockHeader.html#ad68963422fd2a5f6d0e0be751cbef559">compression</a> = <a class="code hl_enumvalue" href="enums_8h.html#affec749ed88365143745313ae9168263a6ee0deaccf9cd167806cc479afffc0cc">kCompressionZstd</a>;</div>
<div class="line"><a id="l00586" name="l00586"></a><span class="lineno"> 586</span> ph.<a class="code hl_variable" href="structBlockHeader.html#a0ee87beb4362823260f70a87ac17379f">cmpLength</a> = (uint32_t)cmp_size;</div>
<div class="line"><a id="l00587" name="l00587"></a><span class="lineno"> 587</span> ph.<a class="code hl_variable" href="structBlockHeader.html#a8ff40eae6c49f0d9b49825f75e1e2bf8">cmpCrc64</a> = <a class="code hl_function" href="decls_8h.html#a0fee4834bf0747bcd933c4e754aa4692">aaruf_crc64_data</a>(cmp_buf, (uint32_t)cmp_size);</div>
<div class="line"><a id="l00588" name="l00588"></a><span class="lineno"> 588</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a9cf4d3d7117a279de4c178eb7af217d6">has_zstd_blocks</a> = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00589" name="l00589"></a><span class="lineno"> 589</span> write_data = cmp_buf;</div>
<div class="line"><a id="l00590" name="l00590"></a><span class="lineno"> 590</span> write_size = (uint32_t)cmp_size;</div>
<div class="line"><a id="l00591" name="l00591"></a><span class="lineno"> 591</span> }</div>
<div class="line"><a id="l00592" name="l00592"></a><span class="lineno"> 592</span> <span class="keywordflow">else</span> { free(cmp_buf); cmp_buf = NULL; }</div>
<div class="line"><a id="l00593" name="l00593"></a><span class="lineno"> 593</span> }</div>
<div class="line"><a id="l00594" name="l00594"></a><span class="lineno"> 594</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00595" name="l00595"></a><span class="lineno"> 595</span> {</div>
<div class="line"><a id="l00596" name="l00596"></a><span class="lineno"> 596</span> <span class="keywordtype">size_t</span> dst_size = (size_t)shard_size * 2;</div>
<div class="line"><a id="l00597" name="l00597"></a><span class="lineno"> 597</span> <span class="keywordtype">size_t</span> props_size = <a class="code hl_define" href="consts_8h.html#a25fd08252b97a0230d3efc899bddd240">LZMA_PROPERTIES_LENGTH</a>;</div>
<div class="line"><a id="l00598" name="l00598"></a><span class="lineno"> 598</span> <a class="code hl_function" href="decls_8h.html#a0e69fad529047d6fe9440b1fc66c3f85">aaruf_lzma_encode_buffer</a>(cmp_buf, &amp;dst_size, parity[m], shard_size,</div>
<div class="line"><a id="l00599" name="l00599"></a><span class="lineno"> 599</span> lzma_props_buf, &amp;props_size, 9,</div>
<div class="line"><a id="l00600" name="l00600"></a><span class="lineno"> 600</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#adc67f6a6ef1602648bb064d47eb1fe88">lzma_dict_size</a>, 4, 0, 2, 273, <a class="code hl_define" href="internal_8h.html#a96247194f6c1e4090020e2a3691f8c9d">LZMA_THREADS</a>(ctx));</div>
<div class="line"><a id="l00601" name="l00601"></a><span class="lineno"> 601</span> <span class="keywordflow">if</span>(dst_size + <a class="code hl_define" href="consts_8h.html#a25fd08252b97a0230d3efc899bddd240">LZMA_PROPERTIES_LENGTH</a> &lt; shard_size)</div>
<div class="line"><a id="l00602" name="l00602"></a><span class="lineno"> 602</span> {</div>
<div class="line"><a id="l00603" name="l00603"></a><span class="lineno"> 603</span> ph.<a class="code hl_variable" href="structBlockHeader.html#ad68963422fd2a5f6d0e0be751cbef559">compression</a> = <a class="code hl_enumvalue" href="enums_8h.html#affec749ed88365143745313ae9168263a66b049c2b816874ab71b06cebf5afcd7">kCompressionLzma</a>;</div>
<div class="line"><a id="l00604" name="l00604"></a><span class="lineno"> 604</span> ph.<a class="code hl_variable" href="structBlockHeader.html#a0ee87beb4362823260f70a87ac17379f">cmpLength</a> = (uint32_t)(dst_size + <a class="code hl_define" href="consts_8h.html#a25fd08252b97a0230d3efc899bddd240">LZMA_PROPERTIES_LENGTH</a>);</div>
<div class="line"><a id="l00605" name="l00605"></a><span class="lineno"> 605</span> ph.<a class="code hl_variable" href="structBlockHeader.html#a8ff40eae6c49f0d9b49825f75e1e2bf8">cmpCrc64</a> = <a class="code hl_function" href="decls_8h.html#a0fee4834bf0747bcd933c4e754aa4692">aaruf_crc64_data</a>(cmp_buf, (uint32_t)dst_size);</div>
<div class="line"><a id="l00606" name="l00606"></a><span class="lineno"> 606</span> write_data = cmp_buf;</div>
<div class="line"><a id="l00607" name="l00607"></a><span class="lineno"> 607</span> write_size = (uint32_t)dst_size;</div>
<div class="line"><a id="l00608" name="l00608"></a><span class="lineno"> 608</span> used_lzma = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00609" name="l00609"></a><span class="lineno"> 609</span> }</div>
<div class="line"><a id="l00610" name="l00610"></a><span class="lineno"> 610</span> <span class="keywordflow">else</span> { free(cmp_buf); cmp_buf = NULL; }</div>
<div class="line"><a id="l00611" name="l00611"></a><span class="lineno"> 611</span> }</div>
<div class="line"><a id="l00612" name="l00612"></a><span class="lineno"> 612</span> }</div>
<div class="line"><a id="l00613" name="l00613"></a><span class="lineno"> 613</span> }</div>
<div class="line"><a id="l00614" name="l00614"></a><span class="lineno"> 614</span> </div>
<div class="line"><a id="l00615" name="l00615"></a><span class="lineno"> 615</span> <a class="code hl_function" href="internal_8h.html#a60c57e3b2e8e233d0be91f3690bf077c">aaruf_fseek</a>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>, 0, SEEK_END);</div>
<div class="line"><a id="l00616" name="l00616"></a><span class="lineno"> 616</span> uint64_t po = ((uint64_t)<a class="code hl_function" href="internal_8h.html#a697ee4ab2c7adc710e56b0ef868596d7">aaruf_ftell</a>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>) + alignment_mask) &amp; ~alignment_mask;</div>
<div class="line"><a id="l00617" name="l00617"></a><span class="lineno"> 617</span> <a class="code hl_function" href="internal_8h.html#a60c57e3b2e8e233d0be91f3690bf077c">aaruf_fseek</a>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>, (<a class="code hl_typedef" href="internal_8h.html#afb4a123eeae51c668333248fb666e0f2">aaru_off_t</a>)po, SEEK_SET);</div>
<div class="line"><a id="l00618" name="l00618"></a><span class="lineno"> 618</span> fwrite(&amp;ph, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a>), 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>);</div>
<div class="line"><a id="l00619" name="l00619"></a><span class="lineno"> 619</span> <span class="keywordflow">if</span>(used_lzma) fwrite(lzma_props_buf, <a class="code hl_define" href="consts_8h.html#a25fd08252b97a0230d3efc899bddd240">LZMA_PROPERTIES_LENGTH</a>, 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>);</div>
<div class="line"><a id="l00620" name="l00620"></a><span class="lineno"> 620</span> fwrite(write_data, write_size, 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>);</div>
<div class="line"><a id="l00621" name="l00621"></a><span class="lineno"> 621</span> free(cmp_buf);</div>
<div class="line"><a id="l00622" name="l00622"></a><span class="lineno"> 622</span> </div>
<div class="line"><a id="l00623" name="l00623"></a><span class="lineno"> 623</span> <a class="code hl_struct" href="structStripeParityBlockEntry.html">StripeParityBlockEntry</a> pe; pe.<a class="code hl_variable" href="structStripeParityBlockEntry.html#a4222801a62acbce61990ee79faf26050">offset</a> = po;</div>
<div class="line"><a id="l00624" name="l00624"></a><span class="lineno"> 624</span> memcpy(dp, &amp;pe, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeParityBlockEntry.html">StripeParityBlockEntry</a>)); dp += <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeParityBlockEntry.html">StripeParityBlockEntry</a>);</div>
<div class="line"><a id="l00625" name="l00625"></a><span class="lineno"> 625</span> </div>
<div class="line"><a id="l00626" name="l00626"></a><span class="lineno"> 626</span> <a class="code hl_struct" href="structIndexEntry.html">IndexEntry</a> ie = {.blockType = <a class="code hl_enumvalue" href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3a5a0811c5ee97536aef900cecb8787713">DataBlock</a>, .dataType = parity_data_type, .offset = po};</div>
<div class="line"><a id="l00627" name="l00627"></a><span class="lineno"> 627</span> utarray_push_back(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab97a719a5b4186695b67143db7376152">index_entries</a>, &amp;ie);</div>
<div class="line"><a id="l00628" name="l00628"></a><span class="lineno"> 628</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a63616c8450e9e1853e0645714fe310cb">dirty_index_block</a> = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00629" name="l00629"></a><span class="lineno"> 629</span> free(parity[m]);</div>
<div class="line"><a id="l00630" name="l00630"></a><span class="lineno"> 630</span> }</div>
<div class="line"><a id="l00631" name="l00631"></a><span class="lineno"> 631</span> free(parity); <a class="code hl_function" href="reed__solomon_8c.html#a5eed1476ef3e8666f011b529337b8518">rs_free</a>(rs);</div>
<div class="line"><a id="l00632" name="l00632"></a><span class="lineno"> 632</span> </div>
<div class="line"><a id="l00633" name="l00633"></a><span class="lineno"> 633</span> memset(out_group, 0, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeGroupDescriptor.html">StripeGroupDescriptor</a>));</div>
<div class="line"><a id="l00634" name="l00634"></a><span class="lineno"> 634</span> out_group-&gt;<a class="code hl_variable" href="structStripeGroupDescriptor.html#a6093f8c41fb1aa55c8367e2a92fe9f7f">groupType</a> = group_type; out_group-&gt;<a class="code hl_variable" href="structStripeGroupDescriptor.html#a46b938eb0fea65843e741c2cc240d14b">K</a> = actual_k; out_group-&gt;<a class="code hl_variable" href="structStripeGroupDescriptor.html#afd47dcff7fe194084c22dab9a6866c8b">M</a> = M;</div>
<div class="line"><a id="l00635" name="l00635"></a><span class="lineno"> 635</span> out_group-&gt;<a class="code hl_variable" href="structStripeGroupDescriptor.html#a2a457b42f8562c872b0b7e0f1b054ef5">shardSize</a> = shard_size; out_group-&gt;<a class="code hl_variable" href="structStripeGroupDescriptor.html#a9b737c4f6fda1894d51858d2a3d8d877">stripeCount</a> = 1; out_group-&gt;<a class="code hl_variable" href="structStripeGroupDescriptor.html#a747366878bf9d2d68b37fddc30346546">interleaveDepth</a> = 1;</div>
<div class="line"><a id="l00636" name="l00636"></a><span class="lineno"> 636</span> *out_desc = desc; *out_desc_len = desc_size;</div>
<div class="line"><a id="l00637" name="l00637"></a><span class="lineno"> 637</span>}</div>
</div>
<div class="line"><a id="l00638" name="l00638"></a><span class="lineno"> 638</span></div>
<div class="foldopen" id="foldopen00642" data-start="{" data-end="}">
<div class="line"><a id="l00642" name="l00642"></a><span class="lineno"><a class="line" href="erasure_8c.html#a1222930aded868b0b0c4eeed13c237e2"> 642</a></span><span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code hl_function" href="erasure_8c.html#a1222930aded868b0b0c4eeed13c237e2">ec_collect_blocks_by_type</a>(<a class="code hl_struct" href="structaaruformat__context.html">aaruformat_context</a> *ctx, uint32_t block_type,</div>
<div class="line"><a id="l00643" name="l00643"></a><span class="lineno"> 643</span> uint64_t **out_offsets, uint32_t **out_sizes, uint32_t *out_count)</div>
<div class="line"><a id="l00644" name="l00644"></a><span class="lineno"> 644</span>{</div>
<div class="line"><a id="l00645" name="l00645"></a><span class="lineno"> 645</span> *out_offsets = NULL; *out_sizes = NULL; *out_count = 0;</div>
<div class="line"><a id="l00646" name="l00646"></a><span class="lineno"> 646</span> uint32_t n = (uint32_t)utarray_len(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab97a719a5b4186695b67143db7376152">index_entries</a>);</div>
<div class="line"><a id="l00647" name="l00647"></a><span class="lineno"> 647</span> <span class="keywordflow">if</span>(n == 0) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00648" name="l00648"></a><span class="lineno"> 648</span> </div>
<div class="line"><a id="l00649" name="l00649"></a><span class="lineno"> 649</span> uint32_t count = 0;</div>
<div class="line"><a id="l00650" name="l00650"></a><span class="lineno"> 650</span> <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; n; i++)</div>
<div class="line"><a id="l00651" name="l00651"></a><span class="lineno"> 651</span> {</div>
<div class="line"><a id="l00652" name="l00652"></a><span class="lineno"> 652</span> <a class="code hl_struct" href="structIndexEntry.html">IndexEntry</a> *ie = (<a class="code hl_struct" href="structIndexEntry.html">IndexEntry</a> *)utarray_eltptr(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab97a719a5b4186695b67143db7376152">index_entries</a>, i);</div>
<div class="line"><a id="l00653" name="l00653"></a><span class="lineno"> 653</span> <span class="keywordflow">if</span>(ie-&gt;<a class="code hl_variable" href="structIndexEntry.html#a4b5c7115ac83019c3f77c6f047e5f75e">blockType</a> == block_type) count++;</div>
<div class="line"><a id="l00654" name="l00654"></a><span class="lineno"> 654</span> }</div>
<div class="line"><a id="l00655" name="l00655"></a><span class="lineno"> 655</span> <span class="keywordflow">if</span>(count == 0) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00656" name="l00656"></a><span class="lineno"> 656</span> </div>
<div class="line"><a id="l00657" name="l00657"></a><span class="lineno"> 657</span> uint64_t *offsets = (uint64_t *)malloc(count * <span class="keyword">sizeof</span>(uint64_t));</div>
<div class="line"><a id="l00658" name="l00658"></a><span class="lineno"> 658</span> uint32_t *sizes = (uint32_t *)malloc(count * <span class="keyword">sizeof</span>(uint32_t));</div>
<div class="line"><a id="l00659" name="l00659"></a><span class="lineno"> 659</span> <span class="keywordflow">if</span>(!offsets || !sizes) { free(offsets); free(sizes); <span class="keywordflow">return</span>; }</div>
<div class="line"><a id="l00660" name="l00660"></a><span class="lineno"> 660</span> </div>
<div class="line"><a id="l00661" name="l00661"></a><span class="lineno"> 661</span> uint32_t idx = 0;</div>
<div class="line"><a id="l00662" name="l00662"></a><span class="lineno"> 662</span> <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; n &amp;&amp; idx &lt; count; i++)</div>
<div class="line"><a id="l00663" name="l00663"></a><span class="lineno"> 663</span> {</div>
<div class="line"><a id="l00664" name="l00664"></a><span class="lineno"> 664</span> <a class="code hl_struct" href="structIndexEntry.html">IndexEntry</a> *ie = (<a class="code hl_struct" href="structIndexEntry.html">IndexEntry</a> *)utarray_eltptr(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab97a719a5b4186695b67143db7376152">index_entries</a>, i);</div>
<div class="line"><a id="l00665" name="l00665"></a><span class="lineno"> 665</span> <span class="keywordflow">if</span>(ie-&gt;<a class="code hl_variable" href="structIndexEntry.html#a4b5c7115ac83019c3f77c6f047e5f75e">blockType</a> != block_type) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00666" name="l00666"></a><span class="lineno"> 666</span> offsets[idx] = ie-&gt;<a class="code hl_variable" href="structIndexEntry.html#a854951a64192d7e4cdcfa6dd6fd2b3ea">offset</a>;</div>
<div class="line"><a id="l00667" name="l00667"></a><span class="lineno"> 667</span> <a class="code hl_function" href="internal_8h.html#a60c57e3b2e8e233d0be91f3690bf077c">aaruf_fseek</a>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>, (<a class="code hl_typedef" href="internal_8h.html#afb4a123eeae51c668333248fb666e0f2">aaru_off_t</a>)ie-&gt;<a class="code hl_variable" href="structIndexEntry.html#a854951a64192d7e4cdcfa6dd6fd2b3ea">offset</a>, SEEK_SET);</div>
<div class="line"><a id="l00668" name="l00668"></a><span class="lineno"> 668</span> <span class="keywordflow">if</span>(block_type == <a class="code hl_enumvalue" href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3aba4d0f50b26af1d0292daaa0d70feacf">DeDuplicationTable2</a> || block_type == <a class="code hl_enumvalue" href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3a76b6a78e4e765794c4cca2dde5bfc3fb">DeDuplicationTableSecondary</a>)</div>
<div class="line"><a id="l00669" name="l00669"></a><span class="lineno"> 669</span> {</div>
<div class="line"><a id="l00670" name="l00670"></a><span class="lineno"> 670</span> <a class="code hl_struct" href="structDdtHeader2.html">DdtHeader2</a> ddt_hdr;</div>
<div class="line"><a id="l00671" name="l00671"></a><span class="lineno"> 671</span> <span class="keywordflow">if</span>(fread(&amp;ddt_hdr, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structDdtHeader2.html">DdtHeader2</a>), 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>) == 1)</div>
<div class="line"><a id="l00672" name="l00672"></a><span class="lineno"> 672</span> sizes[idx] = (uint32_t)(<span class="keyword">sizeof</span>(<a class="code hl_struct" href="structDdtHeader2.html">DdtHeader2</a>) + ddt_hdr.<a class="code hl_variable" href="structDdtHeader2.html#aee50fc92a9151bd352808b28bccd5045">cmpLength</a>);</div>
<div class="line"><a id="l00673" name="l00673"></a><span class="lineno"> 673</span> <span class="keywordflow">else</span> sizes[idx] = <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structDdtHeader2.html">DdtHeader2</a>);</div>
<div class="line"><a id="l00674" name="l00674"></a><span class="lineno"> 674</span> }</div>
<div class="line"><a id="l00675" name="l00675"></a><span class="lineno"> 675</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00676" name="l00676"></a><span class="lineno"> 676</span> {</div>
<div class="line"><a id="l00677" name="l00677"></a><span class="lineno"> 677</span> <a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a> blk_hdr;</div>
<div class="line"><a id="l00678" name="l00678"></a><span class="lineno"> 678</span> <span class="keywordflow">if</span>(fread(&amp;blk_hdr, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a>), 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>) == 1)</div>
<div class="line"><a id="l00679" name="l00679"></a><span class="lineno"> 679</span> sizes[idx] = (uint32_t)(<span class="keyword">sizeof</span>(<a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a>) + blk_hdr.<a class="code hl_variable" href="structBlockHeader.html#a0ee87beb4362823260f70a87ac17379f">cmpLength</a>);</div>
<div class="line"><a id="l00680" name="l00680"></a><span class="lineno"> 680</span> <span class="keywordflow">else</span> sizes[idx] = <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a>);</div>
<div class="line"><a id="l00681" name="l00681"></a><span class="lineno"> 681</span> }</div>
<div class="line"><a id="l00682" name="l00682"></a><span class="lineno"> 682</span> idx++;</div>
<div class="line"><a id="l00683" name="l00683"></a><span class="lineno"> 683</span> }</div>
<div class="line"><a id="l00684" name="l00684"></a><span class="lineno"> 684</span> *out_offsets = offsets; *out_sizes = sizes; *out_count = idx;</div>
<div class="line"><a id="l00685" name="l00685"></a><span class="lineno"> 685</span>}</div>
</div>
<div class="line"><a id="l00686" name="l00686"></a><span class="lineno"> 686</span></div>
<div class="foldopen" id="foldopen00690" data-start="{" data-end="}">
<div class="line"><a id="l00690" name="l00690"></a><span class="lineno"><a class="line" href="erasure__internal_8h.html#a38a12ac5d36e23b28d2f110906b14126"> 690</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="erasure_8c.html#a38a12ac5d36e23b28d2f110906b14126">ec_finalize</a>(<a class="code hl_struct" href="structaaruformat__context.html">aaruformat_context</a> *ctx)</div>
<div class="line"><a id="l00691" name="l00691"></a><span class="lineno"> 691</span>{</div>
<div class="line"><a id="l00692" name="l00692"></a><span class="lineno"> 692</span> <span class="keywordflow">if</span>(!ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ac08b99bdbcd7a208e6893d59f0e02a17">ec_enabled</a>) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00693" name="l00693"></a><span class="lineno"> 693</span> </div>
<div class="line"><a id="l00694" name="l00694"></a><span class="lineno"> 694</span> <span class="keyword">const</span> uint16_t <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a> = ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aece272b6ba4a3451e5f56be5a1e5c7c5">ec_K</a>;</div>
<div class="line"><a id="l00695" name="l00695"></a><span class="lineno"> 695</span> <span class="keyword">const</span> uint16_t M = ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a9c7a7eafdd48b8d0cbdbb46d28cfceaa">ec_M</a>;</div>
<div class="line"><a id="l00696" name="l00696"></a><span class="lineno"> 696</span> </div>
<div class="line"><a id="l00697" name="l00697"></a><span class="lineno"> 697</span> <span class="comment">/* --- Group 0: Data blocks (flush partial stripes) --- */</span></div>
<div class="line"><a id="l00698" name="l00698"></a><span class="lineno"> 698</span> <span class="keywordflow">for</span>(uint16_t slot = 0; slot &lt; <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a>; slot++)</div>
<div class="line"><a id="l00699" name="l00699"></a><span class="lineno"> 699</span> <span class="keywordflow">if</span>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aa8301e298630675bb060fde6fa6e401a">ec_data_stripe_counts</a>[slot] &gt; 0)</div>
<div class="line"><a id="l00700" name="l00700"></a><span class="lineno"> 700</span> <a class="code hl_function" href="erasure_8c.html#aa258c90d05ad57fc4c378679e5187e48">ec_flush_data_stripe</a>(ctx, slot);</div>
<div class="line"><a id="l00701" name="l00701"></a><span class="lineno"> 701</span> </div>
<div class="line"><a id="l00702" name="l00702"></a><span class="lineno"> 702</span> uint32_t data_stripe_count = 0;</div>
<div class="line"><a id="l00703" name="l00703"></a><span class="lineno"> 703</span> {</div>
<div class="line"><a id="l00704" name="l00704"></a><span class="lineno"> 704</span> <span class="keywordtype">size_t</span> total_bytes = utarray_len(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a682d900c0f7dc71bc4820e09609f1615">ec_data_stripes</a>);</div>
<div class="line"><a id="l00705" name="l00705"></a><span class="lineno"> 705</span> uint8_t *base = (uint8_t *)utarray_front(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a682d900c0f7dc71bc4820e09609f1615">ec_data_stripes</a>);</div>
<div class="line"><a id="l00706" name="l00706"></a><span class="lineno"> 706</span> <span class="keywordtype">size_t</span> pos = 0;</div>
<div class="line"><a id="l00707" name="l00707"></a><span class="lineno"> 707</span> <span class="keywordflow">while</span>(base &amp;&amp; pos + <span class="keyword">sizeof</span>(uint16_t) &lt;= total_bytes)</div>
<div class="line"><a id="l00708" name="l00708"></a><span class="lineno"> 708</span> {</div>
<div class="line"><a id="l00709" name="l00709"></a><span class="lineno"> 709</span> uint16_t ak;</div>
<div class="line"><a id="l00710" name="l00710"></a><span class="lineno"> 710</span> memcpy(&amp;ak, base + pos, <span class="keyword">sizeof</span>(uint16_t));</div>
<div class="line"><a id="l00711" name="l00711"></a><span class="lineno"> 711</span> pos += <span class="keyword">sizeof</span>(uint16_t) + (<span class="keywordtype">size_t</span>)ak * <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeDataBlockEntry.html">StripeDataBlockEntry</a>) + (<span class="keywordtype">size_t</span>)M * <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeParityBlockEntry.html">StripeParityBlockEntry</a>);</div>
<div class="line"><a id="l00712" name="l00712"></a><span class="lineno"> 712</span> data_stripe_count++;</div>
<div class="line"><a id="l00713" name="l00713"></a><span class="lineno"> 713</span> }</div>
<div class="line"><a id="l00714" name="l00714"></a><span class="lineno"> 714</span> }</div>
<div class="line"><a id="l00715" name="l00715"></a><span class="lineno"> 715</span> </div>
<div class="line"><a id="l00716" name="l00716"></a><span class="lineno"> 716</span> <a class="code hl_struct" href="structStripeGroupDescriptor.html">StripeGroupDescriptor</a> data_group;</div>
<div class="line"><a id="l00717" name="l00717"></a><span class="lineno"> 717</span> memset(&amp;data_group, 0, <span class="keyword">sizeof</span>(data_group));</div>
<div class="line"><a id="l00718" name="l00718"></a><span class="lineno"> 718</span> data_group.<a class="code hl_variable" href="structStripeGroupDescriptor.html#a6093f8c41fb1aa55c8367e2a92fe9f7f">groupType</a> = <a class="code hl_enumvalue" href="enums_8h.html#a485c1f7093f3c3171ac27404bfb1b03eacca27cc435d2d572b6d740594da18db9">kECGroupData</a>; data_group.<a class="code hl_variable" href="structStripeGroupDescriptor.html#a46b938eb0fea65843e741c2cc240d14b">K</a> = <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a>; data_group.<a class="code hl_variable" href="structStripeGroupDescriptor.html#afd47dcff7fe194084c22dab9a6866c8b">M</a> = M;</div>
<div class="line"><a id="l00719" name="l00719"></a><span class="lineno"> 719</span> data_group.<a class="code hl_variable" href="structStripeGroupDescriptor.html#a2a457b42f8562c872b0b7e0f1b054ef5">shardSize</a> = ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a3dd804f91ba84019bd5a23226fa7d608">ec_data_shard_size</a>; data_group.<a class="code hl_variable" href="structStripeGroupDescriptor.html#a9b737c4f6fda1894d51858d2a3d8d877">stripeCount</a> = data_stripe_count;</div>
<div class="line"><a id="l00720" name="l00720"></a><span class="lineno"> 720</span> data_group.<a class="code hl_variable" href="structStripeGroupDescriptor.html#a747366878bf9d2d68b37fddc30346546">interleaveDepth</a> = <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a>;</div>
<div class="line"><a id="l00721" name="l00721"></a><span class="lineno"> 721</span> <span class="keywordtype">size_t</span> data_stripe_data_len = utarray_len(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a682d900c0f7dc71bc4820e09609f1615">ec_data_stripes</a>);</div>
<div class="line"><a id="l00722" name="l00722"></a><span class="lineno"> 722</span> </div>
<div class="line"><a id="l00723" name="l00723"></a><span class="lineno"> 723</span> <span class="comment">/* --- Group 1: DDT secondary --- */</span></div>
<div class="line"><a id="l00724" name="l00724"></a><span class="lineno"> 724</span> uint8_t *ddt_sec_desc = NULL; <span class="keywordtype">size_t</span> ddt_sec_desc_len = 0;</div>
<div class="line"><a id="l00725" name="l00725"></a><span class="lineno"> 725</span> <a class="code hl_struct" href="structStripeGroupDescriptor.html">StripeGroupDescriptor</a> ddt_sec_group; memset(&amp;ddt_sec_group, 0, <span class="keyword">sizeof</span>(ddt_sec_group));</div>
<div class="line"><a id="l00726" name="l00726"></a><span class="lineno"> 726</span> {</div>
<div class="line"><a id="l00727" name="l00727"></a><span class="lineno"> 727</span> uint64_t *off; uint32_t *sz; uint32_t cnt;</div>
<div class="line"><a id="l00728" name="l00728"></a><span class="lineno"> 728</span> <a class="code hl_function" href="erasure_8c.html#a1222930aded868b0b0c4eeed13c237e2">ec_collect_blocks_by_type</a>(ctx, <a class="code hl_enumvalue" href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3a76b6a78e4e765794c4cca2dde5bfc3fb">DeDuplicationTableSecondary</a>, &amp;off, &amp;sz, &amp;cnt);</div>
<div class="line"><a id="l00729" name="l00729"></a><span class="lineno"> 729</span> <span class="keywordflow">if</span>(cnt &gt; 0) { <a class="code hl_function" href="erasure_8c.html#aed80b4dc1f360dbac00a5f73d350bf1a">ec_write_batch_parity</a>(ctx, off, sz, cnt, <a class="code hl_enumvalue" href="enums_8h.html#a485c1f7093f3c3171ac27404bfb1b03eaf5acb726ee779a2e93b636a0bee14972">kECGroupDdtSecondary</a>, <a class="code hl_enumvalue" href="enums_8h.html#ad8ed01ff3ff33333d8e19db4d2818bb6a0415d7a4a6fe1e616eecc1a0465c8dd4">kDataTypeErasureParityDdt</a>, &amp;ddt_sec_desc, &amp;ddt_sec_desc_len, &amp;ddt_sec_group); free(off); free(sz); }</div>
<div class="line"><a id="l00730" name="l00730"></a><span class="lineno"> 730</span> }</div>
<div class="line"><a id="l00731" name="l00731"></a><span class="lineno"> 731</span> </div>
<div class="line"><a id="l00732" name="l00732"></a><span class="lineno"> 732</span> <span class="comment">/* --- Group 2: DDT primary --- */</span></div>
<div class="line"><a id="l00733" name="l00733"></a><span class="lineno"> 733</span> uint8_t *ddt_pri_desc = NULL; <span class="keywordtype">size_t</span> ddt_pri_desc_len = 0;</div>
<div class="line"><a id="l00734" name="l00734"></a><span class="lineno"> 734</span> <a class="code hl_struct" href="structStripeGroupDescriptor.html">StripeGroupDescriptor</a> ddt_pri_group; memset(&amp;ddt_pri_group, 0, <span class="keyword">sizeof</span>(ddt_pri_group));</div>
<div class="line"><a id="l00735" name="l00735"></a><span class="lineno"> 735</span> {</div>
<div class="line"><a id="l00736" name="l00736"></a><span class="lineno"> 736</span> uint64_t *off; uint32_t *sz; uint32_t cnt;</div>
<div class="line"><a id="l00737" name="l00737"></a><span class="lineno"> 737</span> <a class="code hl_function" href="erasure_8c.html#a1222930aded868b0b0c4eeed13c237e2">ec_collect_blocks_by_type</a>(ctx, <a class="code hl_enumvalue" href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3aba4d0f50b26af1d0292daaa0d70feacf">DeDuplicationTable2</a>, &amp;off, &amp;sz, &amp;cnt);</div>
<div class="line"><a id="l00738" name="l00738"></a><span class="lineno"> 738</span> <span class="keywordflow">if</span>(cnt &gt; 0) { <a class="code hl_function" href="erasure_8c.html#aed80b4dc1f360dbac00a5f73d350bf1a">ec_write_batch_parity</a>(ctx, off, sz, cnt, <a class="code hl_enumvalue" href="enums_8h.html#a485c1f7093f3c3171ac27404bfb1b03eaba5fd72984872e2da8f9adcee83c592a">kECGroupDdtPrimary</a>, <a class="code hl_enumvalue" href="enums_8h.html#ad8ed01ff3ff33333d8e19db4d2818bb6a08a4aa580854c87d64264258bb690bc3">kDataTypeErasureParityDdtPrimary</a>, &amp;ddt_pri_desc, &amp;ddt_pri_desc_len, &amp;ddt_pri_group); free(off); free(sz); }</div>
<div class="line"><a id="l00739" name="l00739"></a><span class="lineno"> 739</span> }</div>
<div class="line"><a id="l00740" name="l00740"></a><span class="lineno"> 740</span> </div>
<div class="line"><a id="l00741" name="l00741"></a><span class="lineno"> 741</span> <span class="comment">/* --- Group 3: Metadata (non-DDT, non-data, non-index, non-parity) --- */</span></div>
<div class="line"><a id="l00742" name="l00742"></a><span class="lineno"> 742</span> uint8_t *meta_desc = NULL; <span class="keywordtype">size_t</span> meta_desc_len = 0;</div>
<div class="line"><a id="l00743" name="l00743"></a><span class="lineno"> 743</span> <a class="code hl_struct" href="structStripeGroupDescriptor.html">StripeGroupDescriptor</a> meta_group; memset(&amp;meta_group, 0, <span class="keyword">sizeof</span>(meta_group));</div>
<div class="line"><a id="l00744" name="l00744"></a><span class="lineno"> 744</span> {</div>
<div class="line"><a id="l00745" name="l00745"></a><span class="lineno"> 745</span> uint32_t n = (uint32_t)utarray_len(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab97a719a5b4186695b67143db7376152">index_entries</a>);</div>
<div class="line"><a id="l00746" name="l00746"></a><span class="lineno"> 746</span> uint32_t count = 0;</div>
<div class="line"><a id="l00747" name="l00747"></a><span class="lineno"> 747</span> <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; n; i++)</div>
<div class="line"><a id="l00748" name="l00748"></a><span class="lineno"> 748</span> {</div>
<div class="line"><a id="l00749" name="l00749"></a><span class="lineno"> 749</span> <a class="code hl_struct" href="structIndexEntry.html">IndexEntry</a> *ie = (<a class="code hl_struct" href="structIndexEntry.html">IndexEntry</a> *)utarray_eltptr(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab97a719a5b4186695b67143db7376152">index_entries</a>, i);</div>
<div class="line"><a id="l00750" name="l00750"></a><span class="lineno"> 750</span> <span class="keywordflow">if</span>(ie-&gt;<a class="code hl_variable" href="structIndexEntry.html#a4b5c7115ac83019c3f77c6f047e5f75e">blockType</a> == <a class="code hl_enumvalue" href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3a5a0811c5ee97536aef900cecb8787713">DataBlock</a> &amp;&amp; (ie-&gt;<a class="code hl_variable" href="structIndexEntry.html#ae5d35082a756e0388efbf5fabbe93d10">dataType</a> == <a class="code hl_enumvalue" href="enums_8h.html#ad8ed01ff3ff33333d8e19db4d2818bb6ace86d5a01f2f20eab66f36b8af9676c2">kDataTypeUserData</a> ||</div>
<div class="line"><a id="l00751" name="l00751"></a><span class="lineno"> 751</span> (ie-&gt;<a class="code hl_variable" href="structIndexEntry.html#ae5d35082a756e0388efbf5fabbe93d10">dataType</a> &gt;= <a class="code hl_enumvalue" href="enums_8h.html#ad8ed01ff3ff33333d8e19db4d2818bb6adb8752d43e2e151c60d90bb2962d16a6">kDataTypeErasureParity</a> &amp;&amp; ie-&gt;<a class="code hl_variable" href="structIndexEntry.html#ae5d35082a756e0388efbf5fabbe93d10">dataType</a> &lt;= <a class="code hl_enumvalue" href="enums_8h.html#ad8ed01ff3ff33333d8e19db4d2818bb6a5069a00563fe1a94724c8f15f463419d">kDataTypeErasureParityIndex</a>))) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00752" name="l00752"></a><span class="lineno"> 752</span> <span class="keywordflow">if</span>(ie-&gt;<a class="code hl_variable" href="structIndexEntry.html#a4b5c7115ac83019c3f77c6f047e5f75e">blockType</a> == <a class="code hl_enumvalue" href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3aba4d0f50b26af1d0292daaa0d70feacf">DeDuplicationTable2</a> || ie-&gt;<a class="code hl_variable" href="structIndexEntry.html#a4b5c7115ac83019c3f77c6f047e5f75e">blockType</a> == <a class="code hl_enumvalue" href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3a76b6a78e4e765794c4cca2dde5bfc3fb">DeDuplicationTableSecondary</a> || ie-&gt;<a class="code hl_variable" href="structIndexEntry.html#a4b5c7115ac83019c3f77c6f047e5f75e">blockType</a> == <a class="code hl_enumvalue" href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3ac9f1e20a51c73f238aa322e180c42bd4">DeDuplicationTable</a>) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00753" name="l00753"></a><span class="lineno"> 753</span> <span class="keywordflow">if</span>(ie-&gt;<a class="code hl_variable" href="structIndexEntry.html#a4b5c7115ac83019c3f77c6f047e5f75e">blockType</a> == <a class="code hl_enumvalue" href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3ab8d63dc690b2ba82f066fdc31ab5adad">IndexBlock</a> || ie-&gt;<a class="code hl_variable" href="structIndexEntry.html#a4b5c7115ac83019c3f77c6f047e5f75e">blockType</a> == <a class="code hl_enumvalue" href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3a6ee3c4c583df36e3dfe796593c1e9439">IndexBlock2</a> || ie-&gt;<a class="code hl_variable" href="structIndexEntry.html#a4b5c7115ac83019c3f77c6f047e5f75e">blockType</a> == <a class="code hl_enumvalue" href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3a318acaf230a8ad091ef405caf7e4f411">IndexBlock3</a>) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00754" name="l00754"></a><span class="lineno"> 754</span> count++;</div>
<div class="line"><a id="l00755" name="l00755"></a><span class="lineno"> 755</span> }</div>
<div class="line"><a id="l00756" name="l00756"></a><span class="lineno"> 756</span> <span class="keywordflow">if</span>(count &gt; 0 &amp;&amp; count &lt;= (uint32_t)(255 - M))</div>
<div class="line"><a id="l00757" name="l00757"></a><span class="lineno"> 757</span> {</div>
<div class="line"><a id="l00758" name="l00758"></a><span class="lineno"> 758</span> uint64_t *off = (uint64_t *)malloc(count * <span class="keyword">sizeof</span>(uint64_t));</div>
<div class="line"><a id="l00759" name="l00759"></a><span class="lineno"> 759</span> uint32_t *sz = (uint32_t *)malloc(count * <span class="keyword">sizeof</span>(uint32_t));</div>
<div class="line"><a id="l00760" name="l00760"></a><span class="lineno"> 760</span> <span class="keywordflow">if</span>(off &amp;&amp; sz)</div>
<div class="line"><a id="l00761" name="l00761"></a><span class="lineno"> 761</span> {</div>
<div class="line"><a id="l00762" name="l00762"></a><span class="lineno"> 762</span> uint32_t idx = 0;</div>
<div class="line"><a id="l00763" name="l00763"></a><span class="lineno"> 763</span> <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; n &amp;&amp; idx &lt; count; i++)</div>
<div class="line"><a id="l00764" name="l00764"></a><span class="lineno"> 764</span> {</div>
<div class="line"><a id="l00765" name="l00765"></a><span class="lineno"> 765</span> <a class="code hl_struct" href="structIndexEntry.html">IndexEntry</a> *ie = (<a class="code hl_struct" href="structIndexEntry.html">IndexEntry</a> *)utarray_eltptr(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab97a719a5b4186695b67143db7376152">index_entries</a>, i);</div>
<div class="line"><a id="l00766" name="l00766"></a><span class="lineno"> 766</span> <span class="keywordflow">if</span>(ie-&gt;<a class="code hl_variable" href="structIndexEntry.html#a4b5c7115ac83019c3f77c6f047e5f75e">blockType</a> == <a class="code hl_enumvalue" href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3a5a0811c5ee97536aef900cecb8787713">DataBlock</a> &amp;&amp; (ie-&gt;<a class="code hl_variable" href="structIndexEntry.html#ae5d35082a756e0388efbf5fabbe93d10">dataType</a> == <a class="code hl_enumvalue" href="enums_8h.html#ad8ed01ff3ff33333d8e19db4d2818bb6ace86d5a01f2f20eab66f36b8af9676c2">kDataTypeUserData</a> ||</div>
<div class="line"><a id="l00767" name="l00767"></a><span class="lineno"> 767</span> (ie-&gt;<a class="code hl_variable" href="structIndexEntry.html#ae5d35082a756e0388efbf5fabbe93d10">dataType</a> &gt;= <a class="code hl_enumvalue" href="enums_8h.html#ad8ed01ff3ff33333d8e19db4d2818bb6adb8752d43e2e151c60d90bb2962d16a6">kDataTypeErasureParity</a> &amp;&amp; ie-&gt;<a class="code hl_variable" href="structIndexEntry.html#ae5d35082a756e0388efbf5fabbe93d10">dataType</a> &lt;= <a class="code hl_enumvalue" href="enums_8h.html#ad8ed01ff3ff33333d8e19db4d2818bb6a5069a00563fe1a94724c8f15f463419d">kDataTypeErasureParityIndex</a>))) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00768" name="l00768"></a><span class="lineno"> 768</span> <span class="keywordflow">if</span>(ie-&gt;<a class="code hl_variable" href="structIndexEntry.html#a4b5c7115ac83019c3f77c6f047e5f75e">blockType</a> == <a class="code hl_enumvalue" href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3aba4d0f50b26af1d0292daaa0d70feacf">DeDuplicationTable2</a> || ie-&gt;<a class="code hl_variable" href="structIndexEntry.html#a4b5c7115ac83019c3f77c6f047e5f75e">blockType</a> == <a class="code hl_enumvalue" href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3a76b6a78e4e765794c4cca2dde5bfc3fb">DeDuplicationTableSecondary</a> || ie-&gt;<a class="code hl_variable" href="structIndexEntry.html#a4b5c7115ac83019c3f77c6f047e5f75e">blockType</a> == <a class="code hl_enumvalue" href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3ac9f1e20a51c73f238aa322e180c42bd4">DeDuplicationTable</a>) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00769" name="l00769"></a><span class="lineno"> 769</span> <span class="keywordflow">if</span>(ie-&gt;<a class="code hl_variable" href="structIndexEntry.html#a4b5c7115ac83019c3f77c6f047e5f75e">blockType</a> == <a class="code hl_enumvalue" href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3ab8d63dc690b2ba82f066fdc31ab5adad">IndexBlock</a> || ie-&gt;<a class="code hl_variable" href="structIndexEntry.html#a4b5c7115ac83019c3f77c6f047e5f75e">blockType</a> == <a class="code hl_enumvalue" href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3a6ee3c4c583df36e3dfe796593c1e9439">IndexBlock2</a> || ie-&gt;<a class="code hl_variable" href="structIndexEntry.html#a4b5c7115ac83019c3f77c6f047e5f75e">blockType</a> == <a class="code hl_enumvalue" href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3a318acaf230a8ad091ef405caf7e4f411">IndexBlock3</a>) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00770" name="l00770"></a><span class="lineno"> 770</span> off[idx] = ie-&gt;<a class="code hl_variable" href="structIndexEntry.html#a854951a64192d7e4cdcfa6dd6fd2b3ea">offset</a>;</div>
<div class="line"><a id="l00771" name="l00771"></a><span class="lineno"> 771</span> <a class="code hl_function" href="internal_8h.html#a60c57e3b2e8e233d0be91f3690bf077c">aaruf_fseek</a>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>, (<a class="code hl_typedef" href="internal_8h.html#afb4a123eeae51c668333248fb666e0f2">aaru_off_t</a>)ie-&gt;<a class="code hl_variable" href="structIndexEntry.html#a854951a64192d7e4cdcfa6dd6fd2b3ea">offset</a>, SEEK_SET);</div>
<div class="line"><a id="l00772" name="l00772"></a><span class="lineno"> 772</span> <a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a> bh; <span class="keywordflow">if</span>(fread(&amp;bh, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a>), 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>) == 1)</div>
<div class="line"><a id="l00773" name="l00773"></a><span class="lineno"> 773</span> sz[idx] = (uint32_t)(<span class="keyword">sizeof</span>(<a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a>) + bh.<a class="code hl_variable" href="structBlockHeader.html#a0ee87beb4362823260f70a87ac17379f">cmpLength</a>); <span class="keywordflow">else</span> sz[idx] = <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a>);</div>
<div class="line"><a id="l00774" name="l00774"></a><span class="lineno"> 774</span> idx++;</div>
<div class="line"><a id="l00775" name="l00775"></a><span class="lineno"> 775</span> }</div>
<div class="line"><a id="l00776" name="l00776"></a><span class="lineno"> 776</span> <a class="code hl_function" href="erasure_8c.html#aed80b4dc1f360dbac00a5f73d350bf1a">ec_write_batch_parity</a>(ctx, off, sz, idx, <a class="code hl_enumvalue" href="enums_8h.html#a485c1f7093f3c3171ac27404bfb1b03ea5fb086c67288ffec790901b1026b3e0f">kECGroupMetadata</a>, <a class="code hl_enumvalue" href="enums_8h.html#ad8ed01ff3ff33333d8e19db4d2818bb6aa85ba79bd52a96a4ca058718351b06f5">kDataTypeErasureParityMeta</a>, &amp;meta_desc, &amp;meta_desc_len, &amp;meta_group);</div>
<div class="line"><a id="l00777" name="l00777"></a><span class="lineno"> 777</span> }</div>
<div class="line"><a id="l00778" name="l00778"></a><span class="lineno"> 778</span> free(off); free(sz);</div>
<div class="line"><a id="l00779" name="l00779"></a><span class="lineno"> 779</span> }</div>
<div class="line"><a id="l00780" name="l00780"></a><span class="lineno"> 780</span> }</div>
<div class="line"><a id="l00781" name="l00781"></a><span class="lineno"> 781</span> </div>
<div class="line"><a id="l00782" name="l00782"></a><span class="lineno"> 782</span> <span class="comment">/* --- Group 4: Index (K=1, M replicas) --- */</span></div>
<div class="line"><a id="l00783" name="l00783"></a><span class="lineno"> 783</span> uint8_t *idx_desc = NULL; <span class="keywordtype">size_t</span> idx_desc_len = 0;</div>
<div class="line"><a id="l00784" name="l00784"></a><span class="lineno"> 784</span> <a class="code hl_struct" href="structStripeGroupDescriptor.html">StripeGroupDescriptor</a> idx_group; memset(&amp;idx_group, 0, <span class="keyword">sizeof</span>(idx_group));</div>
<div class="line"><a id="l00785" name="l00785"></a><span class="lineno"> 785</span> <span class="keywordflow">if</span>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a670dec8d59407989fefc361dc26c6832">header</a>.<a class="code hl_variable" href="structAaruHeaderV2.html#a4ec4b1d593f5a0af19f6d7b8eaeada40">indexOffset</a> &gt; 0)</div>
<div class="line"><a id="l00786" name="l00786"></a><span class="lineno"> 786</span> {</div>
<div class="line"><a id="l00787" name="l00787"></a><span class="lineno"> 787</span> uint64_t io = ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a670dec8d59407989fefc361dc26c6832">header</a>.<a class="code hl_variable" href="structAaruHeaderV2.html#a4ec4b1d593f5a0af19f6d7b8eaeada40">indexOffset</a>;</div>
<div class="line"><a id="l00788" name="l00788"></a><span class="lineno"> 788</span> <a class="code hl_function" href="internal_8h.html#a60c57e3b2e8e233d0be91f3690bf077c">aaruf_fseek</a>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>, (<a class="code hl_typedef" href="internal_8h.html#afb4a123eeae51c668333248fb666e0f2">aaru_off_t</a>)io, SEEK_SET);</div>
<div class="line"><a id="l00789" name="l00789"></a><span class="lineno"> 789</span> <a class="code hl_struct" href="structIndexHeader3.html">IndexHeader3</a> ih;</div>
<div class="line"><a id="l00790" name="l00790"></a><span class="lineno"> 790</span> <span class="keywordflow">if</span>(fread(&amp;ih, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structIndexHeader3.html">IndexHeader3</a>), 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>) == 1)</div>
<div class="line"><a id="l00791" name="l00791"></a><span class="lineno"> 791</span> {</div>
<div class="line"><a id="l00792" name="l00792"></a><span class="lineno"> 792</span> uint32_t isz = (uint32_t)(<span class="keyword">sizeof</span>(<a class="code hl_struct" href="structIndexHeader3.html">IndexHeader3</a>) + ih.<a class="code hl_variable" href="structIndexHeader3.html#af05fe8e08e929aa0eab6b74638f22b74">entries</a> * <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structIndexEntry.html">IndexEntry</a>));</div>
<div class="line"><a id="l00793" name="l00793"></a><span class="lineno"> 793</span> <a class="code hl_function" href="erasure_8c.html#aed80b4dc1f360dbac00a5f73d350bf1a">ec_write_batch_parity</a>(ctx, &amp;io, &amp;isz, 1, <a class="code hl_enumvalue" href="enums_8h.html#a485c1f7093f3c3171ac27404bfb1b03ea85486aa10ff27c8196e2f063b097679e">kECGroupIndex</a>, <a class="code hl_enumvalue" href="enums_8h.html#ad8ed01ff3ff33333d8e19db4d2818bb6a5069a00563fe1a94724c8f15f463419d">kDataTypeErasureParityIndex</a>, &amp;idx_desc, &amp;idx_desc_len, &amp;idx_group);</div>
<div class="line"><a id="l00794" name="l00794"></a><span class="lineno"> 794</span> }</div>
<div class="line"><a id="l00795" name="l00795"></a><span class="lineno"> 795</span> }</div>
<div class="line"><a id="l00796" name="l00796"></a><span class="lineno"> 796</span> </div>
<div class="line"><a id="l00797" name="l00797"></a><span class="lineno"> 797</span> <span class="comment">/* --- Build ECMB with all groups --- */</span></div>
<div class="line"><a id="l00798" name="l00798"></a><span class="lineno"> 798</span> uint8_t group_count = 1; <span class="comment">/* data always present */</span></div>
<div class="line"><a id="l00799" name="l00799"></a><span class="lineno"> 799</span> <span class="keywordflow">if</span>(ddt_sec_desc) group_count++;</div>
<div class="line"><a id="l00800" name="l00800"></a><span class="lineno"> 800</span> <span class="keywordflow">if</span>(ddt_pri_desc) group_count++;</div>
<div class="line"><a id="l00801" name="l00801"></a><span class="lineno"> 801</span> <span class="keywordflow">if</span>(meta_desc) group_count++;</div>
<div class="line"><a id="l00802" name="l00802"></a><span class="lineno"> 802</span> <span class="keywordflow">if</span>(idx_desc) group_count++;</div>
<div class="line"><a id="l00803" name="l00803"></a><span class="lineno"> 803</span> </div>
<div class="line"><a id="l00804" name="l00804"></a><span class="lineno"> 804</span> <span class="keywordtype">size_t</span> payload_len = <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeGroupDescriptor.html">StripeGroupDescriptor</a>) + data_stripe_data_len;</div>
<div class="line"><a id="l00805" name="l00805"></a><span class="lineno"> 805</span> <span class="keywordflow">if</span>(ddt_sec_desc) payload_len += <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeGroupDescriptor.html">StripeGroupDescriptor</a>) + ddt_sec_desc_len;</div>
<div class="line"><a id="l00806" name="l00806"></a><span class="lineno"> 806</span> <span class="keywordflow">if</span>(ddt_pri_desc) payload_len += <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeGroupDescriptor.html">StripeGroupDescriptor</a>) + ddt_pri_desc_len;</div>
<div class="line"><a id="l00807" name="l00807"></a><span class="lineno"> 807</span> <span class="keywordflow">if</span>(meta_desc) payload_len += <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeGroupDescriptor.html">StripeGroupDescriptor</a>) + meta_desc_len;</div>
<div class="line"><a id="l00808" name="l00808"></a><span class="lineno"> 808</span> <span class="keywordflow">if</span>(idx_desc) payload_len += <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeGroupDescriptor.html">StripeGroupDescriptor</a>) + idx_desc_len;</div>
<div class="line"><a id="l00809" name="l00809"></a><span class="lineno"> 809</span> </div>
<div class="line"><a id="l00810" name="l00810"></a><span class="lineno"> 810</span> uint8_t *payload = (uint8_t *)malloc(payload_len);</div>
<div class="line"><a id="l00811" name="l00811"></a><span class="lineno"> 811</span> <span class="keywordflow">if</span>(!payload) { free(ddt_sec_desc); free(ddt_pri_desc); free(meta_desc); free(idx_desc); <span class="keywordflow">return</span>; }</div>
<div class="line"><a id="l00812" name="l00812"></a><span class="lineno"> 812</span> </div>
<div class="line"><a id="l00813" name="l00813"></a><span class="lineno"> 813</span> uint8_t *wp = payload;</div>
<div class="line"><a id="l00814" name="l00814"></a><span class="lineno"> 814</span> <span class="comment">/* Data group */</span></div>
<div class="line"><a id="l00815" name="l00815"></a><span class="lineno"> 815</span> memcpy(wp, &amp;data_group, <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"><a id="l00816" name="l00816"></a><span class="lineno"> 816</span> <span class="keywordflow">if</span>(data_stripe_data_len &gt; 0) { uint8_t *b = (uint8_t *)utarray_front(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a682d900c0f7dc71bc4820e09609f1615">ec_data_stripes</a>); <span class="keywordflow">if</span>(b) { memcpy(wp, b, data_stripe_data_len); wp += data_stripe_data_len; } }</div>
<div class="line"><a id="l00817" name="l00817"></a><span class="lineno"> 817</span> </div>
<div class="line"><a id="l00818" name="l00818"></a><span class="lineno"> 818</span><span class="preprocessor">#define WRITE_GROUP(desc, desc_len, grp) \</span></div>
<div class="line"><a id="l00819" name="l00819"></a><span class="lineno"> 819</span><span class="preprocessor"> if(desc) { memcpy(wp, &amp;(grp), sizeof(StripeGroupDescriptor)); wp += sizeof(StripeGroupDescriptor); \</span></div>
<div class="line"><a id="l00820" name="l00820"></a><span class="lineno"> 820</span><span class="preprocessor"> memcpy(wp, (desc), (desc_len)); wp += (desc_len); }</span></div>
<div class="line"><a id="l00821" name="l00821"></a><span class="lineno"> 821</span> </div>
<div class="line"><a id="l00822" name="l00822"></a><span class="lineno"> 822</span> <a class="code hl_define" href="erasure_8c.html#a415f83d4f5fbce86adcec87aa368313c">WRITE_GROUP</a>(ddt_sec_desc, ddt_sec_desc_len, ddt_sec_group)</div>
<div class="line"><a id="l00823" name="l00823"></a><span class="lineno"> 823</span> <a class="code hl_define" href="erasure_8c.html#a415f83d4f5fbce86adcec87aa368313c">WRITE_GROUP</a>(ddt_pri_desc, ddt_pri_desc_len, ddt_pri_group)</div>
<div class="line"><a id="l00824" name="l00824"></a><span class="lineno"> 824</span> <a class="code hl_define" href="erasure_8c.html#a415f83d4f5fbce86adcec87aa368313c">WRITE_GROUP</a>(meta_desc, meta_desc_len, meta_group)</div>
<div class="line"><a id="l00825" name="l00825"></a><span class="lineno"> 825</span> <a class="code hl_define" href="erasure_8c.html#a415f83d4f5fbce86adcec87aa368313c">WRITE_GROUP</a>(idx_desc, idx_desc_len, idx_group)</div>
<div class="line"><a id="l00826" name="l00826"></a><span class="lineno"> 826</span><span class="preprocessor">#undef WRITE_GROUP</span></div>
<div class="line"><a id="l00827" name="l00827"></a><span class="lineno"> 827</span> </div>
<div class="line"><a id="l00828" name="l00828"></a><span class="lineno"> 828</span> free(ddt_sec_desc); free(ddt_pri_desc); free(meta_desc); free(idx_desc);</div>
<div class="line"><a id="l00829" name="l00829"></a><span class="lineno"> 829</span> </div>
<div class="line"><a id="l00830" name="l00830"></a><span class="lineno"> 830</span> uint64_t payload_crc = <a class="code hl_function" href="decls_8h.html#a0fee4834bf0747bcd933c4e754aa4692">aaruf_crc64_data</a>(payload, (uint32_t)payload_len);</div>
<div class="line"><a id="l00831" name="l00831"></a><span class="lineno"> 831</span> </div>
<div class="line"><a id="l00832" name="l00832"></a><span class="lineno"> 832</span> <a class="code hl_struct" href="structErasureCodingMapHeader.html">ErasureCodingMapHeader</a> ecmb;</div>
<div class="line"><a id="l00833" name="l00833"></a><span class="lineno"> 833</span> memset(&amp;ecmb, 0, <span class="keyword">sizeof</span>(ecmb));</div>
<div class="line"><a id="l00834" name="l00834"></a><span class="lineno"> 834</span> ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#ac1cce17abac0be6beccb121d7a3b24b2">identifier</a> = <a class="code hl_enumvalue" href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3af9f5bd022e035b2a787279913a85cf19">ErasureCodingMapBlock</a>; ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#a174d1be87a00bda3012715de76423ec4">algorithm</a> = ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a25448606ea0870a817f4a2b6c94f7698">ec_algorithm</a>;</div>
<div class="line"><a id="l00835" name="l00835"></a><span class="lineno"> 835</span> ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#accae80e978eeccc7c026eb5ade721aae">stripeGroupCount</a> = group_count; ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#aaf860b67807c5bf871e52ae617a076ae">compression</a> = <a class="code hl_enumvalue" href="enums_8h.html#affec749ed88365143745313ae9168263a6925460497824fd20caa5ba1925cde84">kCompressionNone</a>;</div>
<div class="line"><a id="l00836" name="l00836"></a><span class="lineno"> 836</span> ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#ad52f12a467a76189e31b1c01fc0e6e65">length</a> = payload_len; ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#a2aa7763da110a8e7550e61bd6110f83d">cmpLength</a> = payload_len;</div>
<div class="line"><a id="l00837" name="l00837"></a><span class="lineno"> 837</span> ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#aa883d1e565b1856a7a16b2fcf8ee8b7d">crc64</a> = payload_crc; ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#aa686c5c90093d0ba86657c1f15f64a2d">cmpCrc64</a> = payload_crc;</div>
<div class="line"><a id="l00838" name="l00838"></a><span class="lineno"> 838</span> </div>
<div class="line"><a id="l00839" name="l00839"></a><span class="lineno"> 839</span> uint64_t alignment_mask = (1ULL &lt;&lt; ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a04c5fb367458a6e9dd0a50b39f6edec2">user_data_ddt_header</a>.<a class="code hl_variable" href="structDdtHeader2.html#aa67b097c3a20f926ede495d27152f1c0">blockAlignmentShift</a>) - 1;</div>
<div class="line"><a id="l00840" name="l00840"></a><span class="lineno"> 840</span> <a class="code hl_function" href="internal_8h.html#a60c57e3b2e8e233d0be91f3690bf077c">aaruf_fseek</a>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>, 0, SEEK_END);</div>
<div class="line"><a id="l00841" name="l00841"></a><span class="lineno"> 841</span> uint64_t ecmb_offset = ((uint64_t)<a class="code hl_function" href="internal_8h.html#a697ee4ab2c7adc710e56b0ef868596d7">aaruf_ftell</a>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>) + alignment_mask) &amp; ~alignment_mask;</div>
<div class="line"><a id="l00842" name="l00842"></a><span class="lineno"> 842</span> <a class="code hl_function" href="internal_8h.html#a60c57e3b2e8e233d0be91f3690bf077c">aaruf_fseek</a>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>, (<a class="code hl_typedef" href="internal_8h.html#afb4a123eeae51c668333248fb666e0f2">aaru_off_t</a>)ecmb_offset, SEEK_SET);</div>
<div class="line"><a id="l00843" name="l00843"></a><span class="lineno"> 843</span> fwrite(&amp;ecmb, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structErasureCodingMapHeader.html">ErasureCodingMapHeader</a>), 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>);</div>
<div class="line"><a id="l00844" name="l00844"></a><span class="lineno"> 844</span> fwrite(payload, payload_len, 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>);</div>
<div class="line"><a id="l00845" name="l00845"></a><span class="lineno"> 845</span> uint64_t ecmb_total = <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structErasureCodingMapHeader.html">ErasureCodingMapHeader</a>) + payload_len;</div>
<div class="line"><a id="l00846" name="l00846"></a><span class="lineno"> 846</span> </div>
<div class="line"><a id="l00847" name="l00847"></a><span class="lineno"> 847</span> <span class="comment">/* Duplicate ECMB */</span></div>
<div class="line"><a id="l00848" name="l00848"></a><span class="lineno"> 848</span> uint64_t ecmb2_offset = (ecmb_offset + ecmb_total + alignment_mask) &amp; ~alignment_mask;</div>
<div class="line"><a id="l00849" name="l00849"></a><span class="lineno"> 849</span> <a class="code hl_function" href="internal_8h.html#a60c57e3b2e8e233d0be91f3690bf077c">aaruf_fseek</a>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>, (<a class="code hl_typedef" href="internal_8h.html#afb4a123eeae51c668333248fb666e0f2">aaru_off_t</a>)ecmb2_offset, SEEK_SET);</div>
<div class="line"><a id="l00850" name="l00850"></a><span class="lineno"> 850</span> fwrite(&amp;ecmb, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structErasureCodingMapHeader.html">ErasureCodingMapHeader</a>), 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>);</div>
<div class="line"><a id="l00851" name="l00851"></a><span class="lineno"> 851</span> fwrite(payload, payload_len, 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>);</div>
<div class="line"><a id="l00852" name="l00852"></a><span class="lineno"> 852</span> free(payload);</div>
<div class="line"><a id="l00853" name="l00853"></a><span class="lineno"> 853</span> </div>
<div class="line"><a id="l00854" name="l00854"></a><span class="lineno"> 854</span> <span class="comment">/* Recovery footer */</span></div>
<div class="line"><a id="l00855" name="l00855"></a><span class="lineno"> 855</span> <a class="code hl_struct" href="structAaruRecoveryFooter.html">AaruRecoveryFooter</a> footer;</div>
<div class="line"><a id="l00856" name="l00856"></a><span class="lineno"> 856</span> memset(&amp;footer, 0, <span class="keyword">sizeof</span>(footer));</div>
<div class="line"><a id="l00857" name="l00857"></a><span class="lineno"> 857</span> footer.<a class="code hl_variable" href="structAaruRecoveryFooter.html#a67e4601f7be9a5f7e84cb3adfb98e68a">ecmbOffset</a> = ecmb_offset; footer.<a class="code hl_variable" href="structAaruRecoveryFooter.html#ad3f4ad3842317379eea5ad1bd3335482">ecmbLength</a> = ecmb_total;</div>
<div class="line"><a id="l00858" name="l00858"></a><span class="lineno"> 858</span> footer.<a class="code hl_variable" href="structAaruRecoveryFooter.html#a2a0e7425f369422c197cda6b4ff56033">headerCrc64</a> = <a class="code hl_function" href="decls_8h.html#a0fee4834bf0747bcd933c4e754aa4692">aaruf_crc64_data</a>((<span class="keyword">const</span> uint8_t *)&amp;ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a670dec8d59407989fefc361dc26c6832">header</a>, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structAaruHeaderV2.html">AaruHeaderV2</a>));</div>
<div class="line"><a id="l00859" name="l00859"></a><span class="lineno"> 859</span> memcpy(&amp;footer.<a class="code hl_variable" href="structAaruRecoveryFooter.html#afd53d818d8d4f4c23e4483bfea1701f5">backupHeader</a>, &amp;ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a670dec8d59407989fefc361dc26c6832">header</a>, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structAaruHeaderV2.html">AaruHeaderV2</a>));</div>
<div class="line"><a id="l00860" name="l00860"></a><span class="lineno"> 860</span> footer.<a class="code hl_variable" href="structAaruRecoveryFooter.html#a8d65cec53b91b52d2bafb7e76eef818a">footerMagic</a> = <a class="code hl_define" href="consts_8h.html#a1d7434dbf5927484a6d767b8a27c3cd4">AARU_RECOVERY_FOOTER_MAGIC</a>;</div>
<div class="line"><a id="l00861" name="l00861"></a><span class="lineno"> 861</span> </div>
<div class="line"><a id="l00862" name="l00862"></a><span class="lineno"> 862</span> <a class="code hl_function" href="internal_8h.html#a60c57e3b2e8e233d0be91f3690bf077c">aaruf_fseek</a>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>, 0, SEEK_END);</div>
<div class="line"><a id="l00863" name="l00863"></a><span class="lineno"> 863</span> fwrite(&amp;footer, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structAaruRecoveryFooter.html">AaruRecoveryFooter</a>), 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>);</div>
<div class="line"><a id="l00864" name="l00864"></a><span class="lineno"> 864</span> </div>
<div class="line"><a id="l00865" name="l00865"></a><span class="lineno"> 865</span> <a class="code hl_define" href="log_8h.html#a21cc0459b78d5f2d7bd737e5aae1278a">TRACE</a>(<span class="stringliteral">&quot;Wrote ECMB at offset %&quot;</span> PRIu64 <span class="stringliteral">&quot; (%u groups, %&quot;</span> PRIu64 <span class="stringliteral">&quot; bytes), footer at EOF&quot;</span>,</div>
<div class="line"><a id="l00866" name="l00866"></a><span class="lineno"> 866</span> ecmb_offset, group_count, ecmb_total);</div>
<div class="line"><a id="l00867" name="l00867"></a><span class="lineno"> 867</span>}</div>
</div>
<div class="line"><a id="l00868" name="l00868"></a><span class="lineno"> 868</span></div>
<div class="foldopen" id="foldopen00876" data-start="{" data-end="}">
<div class="line"><a id="l00876" name="l00876"></a><span class="lineno"><a class="line" href="erasure__internal_8h.html#ae5fe558b49013df6e932278061a2ab53"> 876</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="erasure_8c.html#ae5fe558b49013df6e932278061a2ab53">ec_free</a>(<a class="code hl_struct" href="structaaruformat__context.html">aaruformat_context</a> *ctx)</div>
<div class="line"><a id="l00877" name="l00877"></a><span class="lineno"> 877</span>{</div>
<div class="line"><a id="l00878" name="l00878"></a><span class="lineno"> 878</span> <span class="keywordflow">if</span>(!ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ac08b99bdbcd7a208e6893d59f0e02a17">ec_enabled</a>) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00879" name="l00879"></a><span class="lineno"> 879</span> </div>
<div class="line"><a id="l00880" name="l00880"></a><span class="lineno"> 880</span> <span class="keywordflow">if</span>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a231115c6a202af9b0b846dcd9894435d">ec_rs_ctx</a>)</div>
<div class="line"><a id="l00881" name="l00881"></a><span class="lineno"> 881</span> {</div>
<div class="line"><a id="l00882" name="l00882"></a><span class="lineno"> 882</span> <a class="code hl_function" href="reed__solomon_8c.html#a5eed1476ef3e8666f011b529337b8518">rs_free</a>((<a class="code hl_struct" href="structrs__context.html">rs_context</a> *)ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a231115c6a202af9b0b846dcd9894435d">ec_rs_ctx</a>);</div>
<div class="line"><a id="l00883" name="l00883"></a><span class="lineno"> 883</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a231115c6a202af9b0b846dcd9894435d">ec_rs_ctx</a> = NULL;</div>
<div class="line"><a id="l00884" name="l00884"></a><span class="lineno"> 884</span> }</div>
<div class="line"><a id="l00885" name="l00885"></a><span class="lineno"> 885</span> </div>
<div class="line"><a id="l00886" name="l00886"></a><span class="lineno"> 886</span> <span class="keywordflow">if</span>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ac11104550371641bb95b74c83ed8b748">ec_data_parity</a>)</div>
<div class="line"><a id="l00887" name="l00887"></a><span class="lineno"> 887</span> {</div>
<div class="line"><a id="l00888" name="l00888"></a><span class="lineno"> 888</span> <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; (uint32_t)ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aece272b6ba4a3451e5f56be5a1e5c7c5">ec_K</a> * ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a9c7a7eafdd48b8d0cbdbb46d28cfceaa">ec_M</a>; i++)</div>
<div class="line"><a id="l00889" name="l00889"></a><span class="lineno"> 889</span> free(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ac11104550371641bb95b74c83ed8b748">ec_data_parity</a>[i]);</div>
<div class="line"><a id="l00890" name="l00890"></a><span class="lineno"> 890</span> free(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ac11104550371641bb95b74c83ed8b748">ec_data_parity</a>);</div>
<div class="line"><a id="l00891" name="l00891"></a><span class="lineno"> 891</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ac11104550371641bb95b74c83ed8b748">ec_data_parity</a> = NULL;</div>
<div class="line"><a id="l00892" name="l00892"></a><span class="lineno"> 892</span> }</div>
<div class="line"><a id="l00893" name="l00893"></a><span class="lineno"> 893</span> </div>
<div class="line"><a id="l00894" name="l00894"></a><span class="lineno"> 894</span> free(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a9a68ea472d082df95246171eaab070d0">ec_data_block_offsets</a>); ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a9a68ea472d082df95246171eaab070d0">ec_data_block_offsets</a> = NULL;</div>
<div class="line"><a id="l00895" name="l00895"></a><span class="lineno"> 895</span> free(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a0562ac6ba169471d3d83482342d68ff2">ec_data_block_sizes</a>); ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a0562ac6ba169471d3d83482342d68ff2">ec_data_block_sizes</a> = NULL;</div>
<div class="line"><a id="l00896" name="l00896"></a><span class="lineno"> 896</span> free(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a0306814ea46f136a21ffdbf5504744d2">ec_data_shard_crcs</a>); ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a0306814ea46f136a21ffdbf5504744d2">ec_data_shard_crcs</a> = NULL;</div>
<div class="line"><a id="l00897" name="l00897"></a><span class="lineno"> 897</span> free(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aa8301e298630675bb060fde6fa6e401a">ec_data_stripe_counts</a>); ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aa8301e298630675bb060fde6fa6e401a">ec_data_stripe_counts</a> = NULL;</div>
<div class="line"><a id="l00898" name="l00898"></a><span class="lineno"> 898</span> </div>
<div class="line"><a id="l00899" name="l00899"></a><span class="lineno"> 899</span> <span class="keywordflow">if</span>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a682d900c0f7dc71bc4820e09609f1615">ec_data_stripes</a>)</div>
<div class="line"><a id="l00900" name="l00900"></a><span class="lineno"> 900</span> {</div>
<div class="line"><a id="l00901" name="l00901"></a><span class="lineno"> 901</span> utarray_free(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a682d900c0f7dc71bc4820e09609f1615">ec_data_stripes</a>);</div>
<div class="line"><a id="l00902" name="l00902"></a><span class="lineno"> 902</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a682d900c0f7dc71bc4820e09609f1615">ec_data_stripes</a> = NULL;</div>
<div class="line"><a id="l00903" name="l00903"></a><span class="lineno"> 903</span> }</div>
<div class="line"><a id="l00904" name="l00904"></a><span class="lineno"> 904</span> </div>
<div class="line"><a id="l00905" name="l00905"></a><span class="lineno"> 905</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ac08b99bdbcd7a208e6893d59f0e02a17">ec_enabled</a> = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00906" name="l00906"></a><span class="lineno"> 906</span> </div>
<div class="line"><a id="l00907" name="l00907"></a><span class="lineno"> 907</span> <span class="comment">/* Free read-path state */</span></div>
<div class="line"><a id="l00908" name="l00908"></a><span class="lineno"> 908</span> <span class="keywordflow">if</span>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aad3acc958f1b3e63fdeacfd349aff736">ec_read_stripes</a>)</div>
<div class="line"><a id="l00909" name="l00909"></a><span class="lineno"> 909</span> {</div>
<div class="line"><a id="l00910" name="l00910"></a><span class="lineno"> 910</span> <a class="code hl_struct" href="structEcReadStripe.html">EcReadStripe</a> *stripes = (<a class="code hl_struct" href="structEcReadStripe.html">EcReadStripe</a> *)ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aad3acc958f1b3e63fdeacfd349aff736">ec_read_stripes</a>;</div>
<div class="line"><a id="l00911" name="l00911"></a><span class="lineno"> 911</span> <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a3e230f326ef10eae2a496ca4532c8143">ec_read_stripe_count</a>; i++)</div>
<div class="line"><a id="l00912" name="l00912"></a><span class="lineno"> 912</span> {</div>
<div class="line"><a id="l00913" name="l00913"></a><span class="lineno"> 913</span> free(stripes[i].data_entries);</div>
<div class="line"><a id="l00914" name="l00914"></a><span class="lineno"> 914</span> free(stripes[i].parity_offsets);</div>
<div class="line"><a id="l00915" name="l00915"></a><span class="lineno"> 915</span> }</div>
<div class="line"><a id="l00916" name="l00916"></a><span class="lineno"> 916</span> free(stripes);</div>
<div class="line"><a id="l00917" name="l00917"></a><span class="lineno"> 917</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aad3acc958f1b3e63fdeacfd349aff736">ec_read_stripes</a> = NULL;</div>
<div class="line"><a id="l00918" name="l00918"></a><span class="lineno"> 918</span> }</div>
<div class="line"><a id="l00919" name="l00919"></a><span class="lineno"> 919</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a3e230f326ef10eae2a496ca4532c8143">ec_read_stripe_count</a> = 0;</div>
<div class="line"><a id="l00920" name="l00920"></a><span class="lineno"> 920</span> </div>
<div class="line"><a id="l00921" name="l00921"></a><span class="lineno"> 921</span> <span class="comment">/* Free block lookup hashmap */</span></div>
<div class="line"><a id="l00922" name="l00922"></a><span class="lineno"> 922</span> <span class="keywordflow">if</span>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aafe10b9028dcb7a53c5b05b8db2b2ba8">ec_block_lookup</a>)</div>
<div class="line"><a id="l00923" name="l00923"></a><span class="lineno"> 923</span> {</div>
<div class="line"><a id="l00924" name="l00924"></a><span class="lineno"> 924</span> <a class="code hl_struct" href="structEcBlockLookupEntry.html">EcBlockLookupEntry</a> *root = (<a class="code hl_struct" href="structEcBlockLookupEntry.html">EcBlockLookupEntry</a> *)ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aafe10b9028dcb7a53c5b05b8db2b2ba8">ec_block_lookup</a>;</div>
<div class="line"><a id="l00925" name="l00925"></a><span class="lineno"> 925</span> <a class="code hl_struct" href="structEcBlockLookupEntry.html">EcBlockLookupEntry</a> *entry, *tmp;</div>
<div class="line"><a id="l00926" name="l00926"></a><span class="lineno"> 926</span> HASH_ITER(hh, root, entry, tmp)</div>
<div class="line"><a id="l00927" name="l00927"></a><span class="lineno"> 927</span> {</div>
<div class="line"><a id="l00928" name="l00928"></a><span class="lineno"> 928</span> HASH_DEL(root, entry);</div>
<div class="line"><a id="l00929" name="l00929"></a><span class="lineno"> 929</span> free(entry);</div>
<div class="line"><a id="l00930" name="l00930"></a><span class="lineno"> 930</span> }</div>
<div class="line"><a id="l00931" name="l00931"></a><span class="lineno"> 931</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aafe10b9028dcb7a53c5b05b8db2b2ba8">ec_block_lookup</a> = NULL;</div>
<div class="line"><a id="l00932" name="l00932"></a><span class="lineno"> 932</span> }</div>
<div class="line"><a id="l00933" name="l00933"></a><span class="lineno"> 933</span> </div>
<div class="line"><a id="l00934" name="l00934"></a><span class="lineno"> 934</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#af7b4e0a80f76581b0cb1440d9a689f0f">ec_recovery_available</a> = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00935" name="l00935"></a><span class="lineno"> 935</span>}</div>
</div>
<div class="line"><a id="l00936" name="l00936"></a><span class="lineno"> 936</span> </div>
<div class="line"><a id="l00937" name="l00937"></a><span class="lineno"> 937</span><span class="comment">/* =========================================================================</span></div>
<div class="line"><a id="l00938" name="l00938"></a><span class="lineno"> 938</span><span class="comment"> * ECMB loading (read path)</span></div>
<div class="line"><a id="l00939" name="l00939"></a><span class="lineno"> 939</span><span class="comment"> * ========================================================================= */</span></div>
<div class="line"><a id="l00940" name="l00940"></a><span class="lineno"> 940</span> </div>
<div class="foldopen" id="foldopen00941" data-start="{" data-end="}">
<div class="line"><a id="l00941" name="l00941"></a><span class="lineno"><a class="line" href="erasure__internal_8h.html#a18f424702fcd85725ee26c1cf7e253db"> 941</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="erasure_8c.html#a18f424702fcd85725ee26c1cf7e253db">ec_load_ecmb</a>(<a class="code hl_struct" href="structaaruformat__context.html">aaruformat_context</a> *ctx)</div>
<div class="line"><a id="l00942" name="l00942"></a><span class="lineno"> 942</span>{</div>
<div class="line"><a id="l00943" name="l00943"></a><span class="lineno"> 943</span> <a class="code hl_define" href="log_8h.html#a21cc0459b78d5f2d7bd737e5aae1278a">TRACE</a>(<span class="stringliteral">&quot;Entering ec_load_ecmb(%p)&quot;</span>, (<span class="keywordtype">void</span> *)ctx);</div>
<div class="line"><a id="l00944" name="l00944"></a><span class="lineno"> 944</span> </div>
<div class="line"><a id="l00945" name="l00945"></a><span class="lineno"> 945</span> <span class="comment">/* Read recovery footer from last 160 bytes of file */</span></div>
<div class="line"><a id="l00946" name="l00946"></a><span class="lineno"> 946</span> <a class="code hl_function" href="internal_8h.html#a60c57e3b2e8e233d0be91f3690bf077c">aaruf_fseek</a>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>, 0, SEEK_END);</div>
<div class="line"><a id="l00947" name="l00947"></a><span class="lineno"> 947</span> int64_t file_size = <a class="code hl_function" href="internal_8h.html#a697ee4ab2c7adc710e56b0ef868596d7">aaruf_ftell</a>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>);</div>
<div class="line"><a id="l00948" name="l00948"></a><span class="lineno"> 948</span> <span class="keywordflow">if</span>(file_size &lt; (int64_t)<span class="keyword">sizeof</span>(<a class="code hl_struct" href="structAaruRecoveryFooter.html">AaruRecoveryFooter</a>))</div>
<div class="line"><a id="l00949" name="l00949"></a><span class="lineno"> 949</span> {</div>
<div class="line"><a id="l00950" name="l00950"></a><span class="lineno"> 950</span> <a class="code hl_define" href="log_8h.html#a21cc0459b78d5f2d7bd737e5aae1278a">TRACE</a>(<span class="stringliteral">&quot;File too small for recovery footer&quot;</span>);</div>
<div class="line"><a id="l00951" name="l00951"></a><span class="lineno"> 951</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00952" name="l00952"></a><span class="lineno"> 952</span> }</div>
<div class="line"><a id="l00953" name="l00953"></a><span class="lineno"> 953</span> </div>
<div class="line"><a id="l00954" name="l00954"></a><span class="lineno"> 954</span> <a class="code hl_function" href="internal_8h.html#a60c57e3b2e8e233d0be91f3690bf077c">aaruf_fseek</a>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>, (<a class="code hl_typedef" href="internal_8h.html#afb4a123eeae51c668333248fb666e0f2">aaru_off_t</a>)(file_size - (int64_t)<span class="keyword">sizeof</span>(<a class="code hl_struct" href="structAaruRecoveryFooter.html">AaruRecoveryFooter</a>)), SEEK_SET);</div>
<div class="line"><a id="l00955" name="l00955"></a><span class="lineno"> 955</span> </div>
<div class="line"><a id="l00956" name="l00956"></a><span class="lineno"> 956</span> <a class="code hl_struct" href="structAaruRecoveryFooter.html">AaruRecoveryFooter</a> footer;</div>
<div class="line"><a id="l00957" name="l00957"></a><span class="lineno"> 957</span> <span class="keywordflow">if</span>(fread(&amp;footer, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structAaruRecoveryFooter.html">AaruRecoveryFooter</a>), 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>) != 1)</div>
<div class="line"><a id="l00958" name="l00958"></a><span class="lineno"> 958</span> {</div>
<div class="line"><a id="l00959" name="l00959"></a><span class="lineno"> 959</span> <a class="code hl_define" href="log_8h.html#a21cc0459b78d5f2d7bd737e5aae1278a">TRACE</a>(<span class="stringliteral">&quot;Cannot read recovery footer&quot;</span>);</div>
<div class="line"><a id="l00960" name="l00960"></a><span class="lineno"> 960</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00961" name="l00961"></a><span class="lineno"> 961</span> }</div>
<div class="line"><a id="l00962" name="l00962"></a><span class="lineno"> 962</span> </div>
<div class="line"><a id="l00963" name="l00963"></a><span class="lineno"> 963</span> <span class="keywordflow">if</span>(footer.<a class="code hl_variable" href="structAaruRecoveryFooter.html#a8d65cec53b91b52d2bafb7e76eef818a">footerMagic</a> != <a class="code hl_define" href="consts_8h.html#a1d7434dbf5927484a6d767b8a27c3cd4">AARU_RECOVERY_FOOTER_MAGIC</a>)</div>
<div class="line"><a id="l00964" name="l00964"></a><span class="lineno"> 964</span> {</div>
<div class="line"><a id="l00965" name="l00965"></a><span class="lineno"> 965</span> <a class="code hl_define" href="log_8h.html#a21cc0459b78d5f2d7bd737e5aae1278a">TRACE</a>(<span class="stringliteral">&quot;Recovery footer magic mismatch: 0x%016&quot;</span> PRIx64, footer.<a class="code hl_variable" href="structAaruRecoveryFooter.html#a8d65cec53b91b52d2bafb7e76eef818a">footerMagic</a>);</div>
<div class="line"><a id="l00966" name="l00966"></a><span class="lineno"> 966</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00967" name="l00967"></a><span class="lineno"> 967</span> }</div>
<div class="line"><a id="l00968" name="l00968"></a><span class="lineno"> 968</span> </div>
<div class="line"><a id="l00969" name="l00969"></a><span class="lineno"> 969</span> <span class="comment">/* Read ECMB header */</span></div>
<div class="line"><a id="l00970" name="l00970"></a><span class="lineno"> 970</span> <a class="code hl_function" href="internal_8h.html#a60c57e3b2e8e233d0be91f3690bf077c">aaruf_fseek</a>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>, (<a class="code hl_typedef" href="internal_8h.html#afb4a123eeae51c668333248fb666e0f2">aaru_off_t</a>)footer.<a class="code hl_variable" href="structAaruRecoveryFooter.html#a67e4601f7be9a5f7e84cb3adfb98e68a">ecmbOffset</a>, SEEK_SET);</div>
<div class="line"><a id="l00971" name="l00971"></a><span class="lineno"> 971</span> </div>
<div class="line"><a id="l00972" name="l00972"></a><span class="lineno"> 972</span> <a class="code hl_struct" href="structErasureCodingMapHeader.html">ErasureCodingMapHeader</a> ecmb;</div>
<div class="line"><a id="l00973" name="l00973"></a><span class="lineno"> 973</span> <span class="keywordflow">if</span>(fread(&amp;ecmb, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structErasureCodingMapHeader.html">ErasureCodingMapHeader</a>), 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>) != 1)</div>
<div class="line"><a id="l00974" name="l00974"></a><span class="lineno"> 974</span> {</div>
<div class="line"><a id="l00975" name="l00975"></a><span class="lineno"> 975</span> <a class="code hl_define" href="log_8h.html#a21cc0459b78d5f2d7bd737e5aae1278a">TRACE</a>(<span class="stringliteral">&quot;Cannot read ECMB header&quot;</span>);</div>
<div class="line"><a id="l00976" name="l00976"></a><span class="lineno"> 976</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00977" name="l00977"></a><span class="lineno"> 977</span> }</div>
<div class="line"><a id="l00978" name="l00978"></a><span class="lineno"> 978</span> </div>
<div class="line"><a id="l00979" name="l00979"></a><span class="lineno"> 979</span> <span class="keywordflow">if</span>(ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#ac1cce17abac0be6beccb121d7a3b24b2">identifier</a> != <a class="code hl_enumvalue" href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3af9f5bd022e035b2a787279913a85cf19">ErasureCodingMapBlock</a>)</div>
<div class="line"><a id="l00980" name="l00980"></a><span class="lineno"> 980</span> {</div>
<div class="line"><a id="l00981" name="l00981"></a><span class="lineno"> 981</span> <a class="code hl_define" href="log_8h.html#a21cc0459b78d5f2d7bd737e5aae1278a">TRACE</a>(<span class="stringliteral">&quot;ECMB identifier mismatch&quot;</span>);</div>
<div class="line"><a id="l00982" name="l00982"></a><span class="lineno"> 982</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00983" name="l00983"></a><span class="lineno"> 983</span> }</div>
<div class="line"><a id="l00984" name="l00984"></a><span class="lineno"> 984</span> </div>
<div class="line"><a id="l00985" name="l00985"></a><span class="lineno"> 985</span> <span class="comment">/* Read payload (uncompressed only for now) */</span></div>
<div class="line"><a id="l00986" name="l00986"></a><span class="lineno"> 986</span> <span class="keywordflow">if</span>(ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#ad52f12a467a76189e31b1c01fc0e6e65">length</a> == 0 || ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#ad52f12a467a76189e31b1c01fc0e6e65">length</a> &gt; 256 * 1024 * 1024) <span class="keywordflow">return</span>; <span class="comment">/* sanity limit */</span></div>
<div class="line"><a id="l00987" name="l00987"></a><span class="lineno"> 987</span> </div>
<div class="line"><a id="l00988" name="l00988"></a><span class="lineno"> 988</span> uint8_t *payload = (uint8_t *)malloc((<span class="keywordtype">size_t</span>)ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#ad52f12a467a76189e31b1c01fc0e6e65">length</a>);</div>
<div class="line"><a id="l00989" name="l00989"></a><span class="lineno"> 989</span> <span class="keywordflow">if</span>(!payload) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00990" name="l00990"></a><span class="lineno"> 990</span> </div>
<div class="line"><a id="l00991" name="l00991"></a><span class="lineno"> 991</span> <span class="keywordflow">if</span>(ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#aaf860b67807c5bf871e52ae617a076ae">compression</a> == <a class="code hl_enumvalue" href="enums_8h.html#affec749ed88365143745313ae9168263a6925460497824fd20caa5ba1925cde84">kCompressionNone</a>)</div>
<div class="line"><a id="l00992" name="l00992"></a><span class="lineno"> 992</span> {</div>
<div class="line"><a id="l00993" name="l00993"></a><span class="lineno"> 993</span> <span class="keywordflow">if</span>(fread(payload, (<span class="keywordtype">size_t</span>)ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#a2aa7763da110a8e7550e61bd6110f83d">cmpLength</a>, 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>) != 1)</div>
<div class="line"><a id="l00994" name="l00994"></a><span class="lineno"> 994</span> {</div>
<div class="line"><a id="l00995" name="l00995"></a><span class="lineno"> 995</span> free(payload);</div>
<div class="line"><a id="l00996" name="l00996"></a><span class="lineno"> 996</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00997" name="l00997"></a><span class="lineno"> 997</span> }</div>
<div class="line"><a id="l00998" name="l00998"></a><span class="lineno"> 998</span> }</div>
<div class="line"><a id="l00999" name="l00999"></a><span class="lineno"> 999</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l01000" name="l01000"></a><span class="lineno"> 1000</span> {</div>
<div class="line"><a id="l01001" name="l01001"></a><span class="lineno"> 1001</span> <span class="comment">/* Compressed ECMB payload — read compressed, decompress */</span></div>
<div class="line"><a id="l01002" name="l01002"></a><span class="lineno"> 1002</span> uint8_t *cmp = (uint8_t *)malloc((<span class="keywordtype">size_t</span>)ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#a2aa7763da110a8e7550e61bd6110f83d">cmpLength</a>);</div>
<div class="line"><a id="l01003" name="l01003"></a><span class="lineno"> 1003</span> <span class="keywordflow">if</span>(!cmp) { free(payload); <span class="keywordflow">return</span>; }</div>
<div class="line"><a id="l01004" name="l01004"></a><span class="lineno"> 1004</span> <span class="keywordflow">if</span>(fread(cmp, (<span class="keywordtype">size_t</span>)ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#a2aa7763da110a8e7550e61bd6110f83d">cmpLength</a>, 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>) != 1) { free(cmp); free(payload); <span class="keywordflow">return</span>; }</div>
<div class="line"><a id="l01005" name="l01005"></a><span class="lineno"> 1005</span> </div>
<div class="line"><a id="l01006" name="l01006"></a><span class="lineno"> 1006</span> <span class="keywordflow">if</span>(ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#aaf860b67807c5bf871e52ae617a076ae">compression</a> == <a class="code hl_enumvalue" href="enums_8h.html#affec749ed88365143745313ae9168263a66b049c2b816874ab71b06cebf5afcd7">kCompressionLzma</a>)</div>
<div class="line"><a id="l01007" name="l01007"></a><span class="lineno"> 1007</span> {</div>
<div class="line"><a id="l01008" name="l01008"></a><span class="lineno"> 1008</span> <span class="keywordtype">size_t</span> out_size = (size_t)ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#ad52f12a467a76189e31b1c01fc0e6e65">length</a>;</div>
<div class="line"><a id="l01009" name="l01009"></a><span class="lineno"> 1009</span> <span class="keywordtype">size_t</span> lzma_src_size = (size_t)ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#a2aa7763da110a8e7550e61bd6110f83d">cmpLength</a> - <a class="code hl_define" href="consts_8h.html#a25fd08252b97a0230d3efc899bddd240">LZMA_PROPERTIES_LENGTH</a>;</div>
<div class="line"><a id="l01010" name="l01010"></a><span class="lineno"> 1010</span> <a class="code hl_function" href="decls_8h.html#a12f3cbc43c2f57a11fbba32a71ba2704">aaruf_lzma_decode_buffer</a>(payload, &amp;out_size, cmp + <a class="code hl_define" href="consts_8h.html#a25fd08252b97a0230d3efc899bddd240">LZMA_PROPERTIES_LENGTH</a>,</div>
<div class="line"><a id="l01011" name="l01011"></a><span class="lineno"> 1011</span> &amp;lzma_src_size, cmp, <a class="code hl_define" href="consts_8h.html#a25fd08252b97a0230d3efc899bddd240">LZMA_PROPERTIES_LENGTH</a>);</div>
<div class="line"><a id="l01012" name="l01012"></a><span class="lineno"> 1012</span> }</div>
<div class="line"><a id="l01013" name="l01013"></a><span class="lineno"> 1013</span> <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#aaf860b67807c5bf871e52ae617a076ae">compression</a> == <a class="code hl_enumvalue" href="enums_8h.html#affec749ed88365143745313ae9168263a6ee0deaccf9cd167806cc479afffc0cc">kCompressionZstd</a>)</div>
<div class="line"><a id="l01014" name="l01014"></a><span class="lineno"> 1014</span> {</div>
<div class="line"><a id="l01015" name="l01015"></a><span class="lineno"> 1015</span> <a class="code hl_function" href="decls_8h.html#ac0f8004dbea44979bf8b58c3e3a1a6ae">aaruf_zstd_decode_buffer</a>(payload, (<span class="keywordtype">size_t</span>)ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#ad52f12a467a76189e31b1c01fc0e6e65">length</a>, cmp, (<span class="keywordtype">size_t</span>)ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#a2aa7763da110a8e7550e61bd6110f83d">cmpLength</a>);</div>
<div class="line"><a id="l01016" name="l01016"></a><span class="lineno"> 1016</span> }</div>
<div class="line"><a id="l01017" name="l01017"></a><span class="lineno"> 1017</span> free(cmp);</div>
<div class="line"><a id="l01018" name="l01018"></a><span class="lineno"> 1018</span> }</div>
<div class="line"><a id="l01019" name="l01019"></a><span class="lineno"> 1019</span> </div>
<div class="line"><a id="l01020" name="l01020"></a><span class="lineno"> 1020</span> <span class="comment">/* Verify CRC64 */</span></div>
<div class="line"><a id="l01021" name="l01021"></a><span class="lineno"> 1021</span> uint64_t computed_crc = <a class="code hl_function" href="decls_8h.html#a0fee4834bf0747bcd933c4e754aa4692">aaruf_crc64_data</a>(payload, (uint32_t)ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#ad52f12a467a76189e31b1c01fc0e6e65">length</a>);</div>
<div class="line"><a id="l01022" name="l01022"></a><span class="lineno"> 1022</span> <span class="keywordflow">if</span>(computed_crc != ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#aa883d1e565b1856a7a16b2fcf8ee8b7d">crc64</a>)</div>
<div class="line"><a id="l01023" name="l01023"></a><span class="lineno"> 1023</span> {</div>
<div class="line"><a id="l01024" name="l01024"></a><span class="lineno"> 1024</span> <a class="code hl_define" href="log_8h.html#a21cc0459b78d5f2d7bd737e5aae1278a">TRACE</a>(<span class="stringliteral">&quot;ECMB payload CRC64 mismatch&quot;</span>);</div>
<div class="line"><a id="l01025" name="l01025"></a><span class="lineno"> 1025</span> free(payload);</div>
<div class="line"><a id="l01026" name="l01026"></a><span class="lineno"> 1026</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01027" name="l01027"></a><span class="lineno"> 1027</span> }</div>
<div class="line"><a id="l01028" name="l01028"></a><span class="lineno"> 1028</span> </div>
<div class="line"><a id="l01029" name="l01029"></a><span class="lineno"> 1029</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a25448606ea0870a817f4a2b6c94f7698">ec_algorithm</a> = ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#a174d1be87a00bda3012715de76423ec4">algorithm</a>;</div>
<div class="line"><a id="l01030" name="l01030"></a><span class="lineno"> 1030</span> </div>
<div class="line"><a id="l01031" name="l01031"></a><span class="lineno"> 1031</span> <span class="comment">/* Parse all stripe groups */</span></div>
<div class="line"><a id="l01032" name="l01032"></a><span class="lineno"> 1032</span> uint8_t *p = payload;</div>
<div class="line"><a id="l01033" name="l01033"></a><span class="lineno"> 1033</span> <span class="keywordtype">size_t</span> remaining = (size_t)ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#ad52f12a467a76189e31b1c01fc0e6e65">length</a>;</div>
<div class="line"><a id="l01034" name="l01034"></a><span class="lineno"> 1034</span> </div>
<div class="line"><a id="l01035" name="l01035"></a><span class="lineno"> 1035</span> <a class="code hl_struct" href="structEcBlockLookupEntry.html">EcBlockLookupEntry</a> *lookup_root = NULL;</div>
<div class="line"><a id="l01036" name="l01036"></a><span class="lineno"> 1036</span> <a class="code hl_struct" href="structEcReadStripe.html">EcReadStripe</a> *data_stripes = NULL;</div>
<div class="line"><a id="l01037" name="l01037"></a><span class="lineno"> 1037</span> uint32_t data_stripe_count = 0;</div>
<div class="line"><a id="l01038" name="l01038"></a><span class="lineno"> 1038</span> </div>
<div class="line"><a id="l01039" name="l01039"></a><span class="lineno"> 1039</span> <span class="keywordflow">for</span>(uint8_t g = 0; g &lt; ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#accae80e978eeccc7c026eb5ade721aae">stripeGroupCount</a> &amp;&amp; remaining &gt;= <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeGroupDescriptor.html">StripeGroupDescriptor</a>); g++)</div>
<div class="line"><a id="l01040" name="l01040"></a><span class="lineno"> 1040</span> {</div>
<div class="line"><a id="l01041" name="l01041"></a><span class="lineno"> 1041</span> <a class="code hl_struct" href="structStripeGroupDescriptor.html">StripeGroupDescriptor</a> group;</div>
<div class="line"><a id="l01042" name="l01042"></a><span class="lineno"> 1042</span> memcpy(&amp;group, p, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeGroupDescriptor.html">StripeGroupDescriptor</a>));</div>
<div class="line"><a id="l01043" name="l01043"></a><span class="lineno"> 1043</span> p += <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeGroupDescriptor.html">StripeGroupDescriptor</a>);</div>
<div class="line"><a id="l01044" name="l01044"></a><span class="lineno"> 1044</span> remaining -= <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeGroupDescriptor.html">StripeGroupDescriptor</a>);</div>
<div class="line"><a id="l01045" name="l01045"></a><span class="lineno"> 1045</span> </div>
<div class="line"><a id="l01046" name="l01046"></a><span class="lineno"> 1046</span> <span class="comment">/* Parse stripes for this group */</span></div>
<div class="line"><a id="l01047" name="l01047"></a><span class="lineno"> 1047</span> <a class="code hl_struct" href="structEcReadStripe.html">EcReadStripe</a> *grp_stripes = NULL;</div>
<div class="line"><a id="l01048" name="l01048"></a><span class="lineno"> 1048</span> <span class="keywordflow">if</span>(group.<a class="code hl_variable" href="structStripeGroupDescriptor.html#a9b737c4f6fda1894d51858d2a3d8d877">stripeCount</a> &gt; 0)</div>
<div class="line"><a id="l01049" name="l01049"></a><span class="lineno"> 1049</span> {</div>
<div class="line"><a id="l01050" name="l01050"></a><span class="lineno"> 1050</span> grp_stripes = (<a class="code hl_struct" href="structEcReadStripe.html">EcReadStripe</a> *)calloc(group.<a class="code hl_variable" href="structStripeGroupDescriptor.html#a9b737c4f6fda1894d51858d2a3d8d877">stripeCount</a>, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structEcReadStripe.html">EcReadStripe</a>));</div>
<div class="line"><a id="l01051" name="l01051"></a><span class="lineno"> 1051</span> <span class="keywordflow">if</span>(!grp_stripes) <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l01052" name="l01052"></a><span class="lineno"> 1052</span> }</div>
<div class="line"><a id="l01053" name="l01053"></a><span class="lineno"> 1053</span> </div>
<div class="line"><a id="l01054" name="l01054"></a><span class="lineno"> 1054</span> <span class="keywordflow">for</span>(uint32_t s = 0; s &lt; group.<a class="code hl_variable" href="structStripeGroupDescriptor.html#a9b737c4f6fda1894d51858d2a3d8d877">stripeCount</a>; s++)</div>
<div class="line"><a id="l01055" name="l01055"></a><span class="lineno"> 1055</span> {</div>
<div class="line"><a id="l01056" name="l01056"></a><span class="lineno"> 1056</span> <span class="keywordflow">if</span>(remaining &lt; <span class="keyword">sizeof</span>(uint16_t)) <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l01057" name="l01057"></a><span class="lineno"> 1057</span> uint16_t ak;</div>
<div class="line"><a id="l01058" name="l01058"></a><span class="lineno"> 1058</span> memcpy(&amp;ak, p, <span class="keyword">sizeof</span>(uint16_t)); p += <span class="keyword">sizeof</span>(uint16_t); remaining -= <span class="keyword">sizeof</span>(uint16_t);</div>
<div class="line"><a id="l01059" name="l01059"></a><span class="lineno"> 1059</span> <span class="keywordflow">if</span>(grp_stripes) grp_stripes[s].<a class="code hl_variable" href="structEcReadStripe.html#a80b525ebfe07bff2cb08bf97ce633e2f">actual_k</a> = ak;</div>
<div class="line"><a id="l01060" name="l01060"></a><span class="lineno"> 1060</span> </div>
<div class="line"><a id="l01061" name="l01061"></a><span class="lineno"> 1061</span> <span class="keywordtype">size_t</span> data_bytes = (size_t)ak * <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeDataBlockEntry.html">StripeDataBlockEntry</a>);</div>
<div class="line"><a id="l01062" name="l01062"></a><span class="lineno"> 1062</span> <span class="keywordtype">size_t</span> parity_bytes = (size_t)group.<a class="code hl_variable" href="structStripeGroupDescriptor.html#afd47dcff7fe194084c22dab9a6866c8b">M</a> * <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeParityBlockEntry.html">StripeParityBlockEntry</a>);</div>
<div class="line"><a id="l01063" name="l01063"></a><span class="lineno"> 1063</span> <span class="keywordflow">if</span>(remaining &lt; data_bytes + parity_bytes) <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l01064" name="l01064"></a><span class="lineno"> 1064</span> </div>
<div class="line"><a id="l01065" name="l01065"></a><span class="lineno"> 1065</span> <span class="keywordflow">if</span>(grp_stripes)</div>
<div class="line"><a id="l01066" name="l01066"></a><span class="lineno"> 1066</span> {</div>
<div class="line"><a id="l01067" name="l01067"></a><span class="lineno"> 1067</span> grp_stripes[s].<a class="code hl_variable" href="structEcReadStripe.html#a196073177bb5753b30b17ad495af7b97">data_entries</a> = (<a class="code hl_struct" href="structStripeDataBlockEntry.html">StripeDataBlockEntry</a> *)malloc(data_bytes);</div>
<div class="line"><a id="l01068" name="l01068"></a><span class="lineno"> 1068</span> <span class="keywordflow">if</span>(grp_stripes[s].data_entries)</div>
<div class="line"><a id="l01069" name="l01069"></a><span class="lineno"> 1069</span> memcpy(grp_stripes[s].data_entries, p, data_bytes);</div>
<div class="line"><a id="l01070" name="l01070"></a><span class="lineno"> 1070</span> </div>
<div class="line"><a id="l01071" name="l01071"></a><span class="lineno"> 1071</span> grp_stripes[s].<a class="code hl_variable" href="structEcReadStripe.html#ac88d41411a685f4b7fbecb69d179ec3f">parity_offsets</a> = (uint64_t *)malloc((<span class="keywordtype">size_t</span>)group.<a class="code hl_variable" href="structStripeGroupDescriptor.html#afd47dcff7fe194084c22dab9a6866c8b">M</a> * <span class="keyword">sizeof</span>(uint64_t));</div>
<div class="line"><a id="l01072" name="l01072"></a><span class="lineno"> 1072</span> }</div>
<div class="line"><a id="l01073" name="l01073"></a><span class="lineno"> 1073</span> </div>
<div class="line"><a id="l01074" name="l01074"></a><span class="lineno"> 1074</span> p += data_bytes; remaining -= data_bytes;</div>
<div class="line"><a id="l01075" name="l01075"></a><span class="lineno"> 1075</span> </div>
<div class="line"><a id="l01076" name="l01076"></a><span class="lineno"> 1076</span> <span class="keywordflow">for</span>(uint16_t m = 0; m &lt; group.<a class="code hl_variable" href="structStripeGroupDescriptor.html#afd47dcff7fe194084c22dab9a6866c8b">M</a>; m++)</div>
<div class="line"><a id="l01077" name="l01077"></a><span class="lineno"> 1077</span> {</div>
<div class="line"><a id="l01078" name="l01078"></a><span class="lineno"> 1078</span> <a class="code hl_struct" href="structStripeParityBlockEntry.html">StripeParityBlockEntry</a> pe;</div>
<div class="line"><a id="l01079" name="l01079"></a><span class="lineno"> 1079</span> memcpy(&amp;pe, p, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeParityBlockEntry.html">StripeParityBlockEntry</a>));</div>
<div class="line"><a id="l01080" name="l01080"></a><span class="lineno"> 1080</span> p += <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeParityBlockEntry.html">StripeParityBlockEntry</a>); remaining -= <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structStripeParityBlockEntry.html">StripeParityBlockEntry</a>);</div>
<div class="line"><a id="l01081" name="l01081"></a><span class="lineno"> 1081</span> <span class="keywordflow">if</span>(grp_stripes &amp;&amp; grp_stripes[s].parity_offsets)</div>
<div class="line"><a id="l01082" name="l01082"></a><span class="lineno"> 1082</span> grp_stripes[s].<a class="code hl_variable" href="structEcReadStripe.html#ac88d41411a685f4b7fbecb69d179ec3f">parity_offsets</a>[m] = pe.<a class="code hl_variable" href="structStripeParityBlockEntry.html#a4222801a62acbce61990ee79faf26050">offset</a>;</div>
<div class="line"><a id="l01083" name="l01083"></a><span class="lineno"> 1083</span> }</div>
<div class="line"><a id="l01084" name="l01084"></a><span class="lineno"> 1084</span> </div>
<div class="line"><a id="l01085" name="l01085"></a><span class="lineno"> 1085</span> <span class="comment">/* Build lookup hashmap for data group blocks */</span></div>
<div class="line"><a id="l01086" name="l01086"></a><span class="lineno"> 1086</span> <span class="keywordflow">if</span>(group.<a class="code hl_variable" href="structStripeGroupDescriptor.html#a6093f8c41fb1aa55c8367e2a92fe9f7f">groupType</a> == <a class="code hl_enumvalue" href="enums_8h.html#a485c1f7093f3c3171ac27404bfb1b03eacca27cc435d2d572b6d740594da18db9">kECGroupData</a> &amp;&amp; grp_stripes &amp;&amp; grp_stripes[s].<a class="code hl_variable" href="structEcReadStripe.html#a196073177bb5753b30b17ad495af7b97">data_entries</a>)</div>
<div class="line"><a id="l01087" name="l01087"></a><span class="lineno"> 1087</span> {</div>
<div class="line"><a id="l01088" name="l01088"></a><span class="lineno"> 1088</span> <span class="keywordflow">for</span>(uint16_t k = 0; k &lt; ak; k++)</div>
<div class="line"><a id="l01089" name="l01089"></a><span class="lineno"> 1089</span> {</div>
<div class="line"><a id="l01090" name="l01090"></a><span class="lineno"> 1090</span> <a class="code hl_struct" href="structEcBlockLookupEntry.html">EcBlockLookupEntry</a> *le = (<a class="code hl_struct" href="structEcBlockLookupEntry.html">EcBlockLookupEntry</a> *)calloc(1, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structEcBlockLookupEntry.html">EcBlockLookupEntry</a>));</div>
<div class="line"><a id="l01091" name="l01091"></a><span class="lineno"> 1091</span> <span class="keywordflow">if</span>(!le) <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l01092" name="l01092"></a><span class="lineno"> 1092</span> le-&gt;<a class="code hl_variable" href="structEcBlockLookupEntry.html#a13a8928f4f9cc3d0d7a30b1d0530c016">block_offset</a> = grp_stripes[s].<a class="code hl_variable" href="structEcReadStripe.html#a196073177bb5753b30b17ad495af7b97">data_entries</a>[k].<a class="code hl_variable" href="structStripeDataBlockEntry.html#a7aac714b3d98b543e792537fd7c8d3fc">offset</a>;</div>
<div class="line"><a id="l01093" name="l01093"></a><span class="lineno"> 1093</span> le-&gt;<a class="code hl_variable" href="structEcBlockLookupEntry.html#aedeac38371118113a77e02cc65512320">stripe_index</a> = s;</div>
<div class="line"><a id="l01094" name="l01094"></a><span class="lineno"> 1094</span> le-&gt;<a class="code hl_variable" href="structEcBlockLookupEntry.html#a8645b89803f927a7608a6f8d30d74292">position</a> = k;</div>
<div class="line"><a id="l01095" name="l01095"></a><span class="lineno"> 1095</span> HASH_ADD(hh, lookup_root, block_offset, <span class="keyword">sizeof</span>(uint64_t), le);</div>
<div class="line"><a id="l01096" name="l01096"></a><span class="lineno"> 1096</span> }</div>
<div class="line"><a id="l01097" name="l01097"></a><span class="lineno"> 1097</span> }</div>
<div class="line"><a id="l01098" name="l01098"></a><span class="lineno"> 1098</span> }</div>
<div class="line"><a id="l01099" name="l01099"></a><span class="lineno"> 1099</span> </div>
<div class="line"><a id="l01100" name="l01100"></a><span class="lineno"> 1100</span> <span class="comment">/* Store parsed data based on group type */</span></div>
<div class="line"><a id="l01101" name="l01101"></a><span class="lineno"> 1101</span> <span class="keywordflow">if</span>(group.<a class="code hl_variable" href="structStripeGroupDescriptor.html#a6093f8c41fb1aa55c8367e2a92fe9f7f">groupType</a> == <a class="code hl_enumvalue" href="enums_8h.html#a485c1f7093f3c3171ac27404bfb1b03eacca27cc435d2d572b6d740594da18db9">kECGroupData</a>)</div>
<div class="line"><a id="l01102" name="l01102"></a><span class="lineno"> 1102</span> {</div>
<div class="line"><a id="l01103" name="l01103"></a><span class="lineno"> 1103</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aece272b6ba4a3451e5f56be5a1e5c7c5">ec_K</a> = group.<a class="code hl_variable" href="structStripeGroupDescriptor.html#a46b938eb0fea65843e741c2cc240d14b">K</a>;</div>
<div class="line"><a id="l01104" name="l01104"></a><span class="lineno"> 1104</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a9c7a7eafdd48b8d0cbdbb46d28cfceaa">ec_M</a> = group.<a class="code hl_variable" href="structStripeGroupDescriptor.html#afd47dcff7fe194084c22dab9a6866c8b">M</a>;</div>
<div class="line"><a id="l01105" name="l01105"></a><span class="lineno"> 1105</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a3dd804f91ba84019bd5a23226fa7d608">ec_data_shard_size</a> = group.<a class="code hl_variable" href="structStripeGroupDescriptor.html#a2a457b42f8562c872b0b7e0f1b054ef5">shardSize</a>;</div>
<div class="line"><a id="l01106" name="l01106"></a><span class="lineno"> 1106</span> data_stripes = grp_stripes;</div>
<div class="line"><a id="l01107" name="l01107"></a><span class="lineno"> 1107</span> data_stripe_count = group.<a class="code hl_variable" href="structStripeGroupDescriptor.html#a9b737c4f6fda1894d51858d2a3d8d877">stripeCount</a>;</div>
<div class="line"><a id="l01108" name="l01108"></a><span class="lineno"> 1108</span> }</div>
<div class="line"><a id="l01109" name="l01109"></a><span class="lineno"> 1109</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l01110" name="l01110"></a><span class="lineno"> 1110</span> {</div>
<div class="line"><a id="l01111" name="l01111"></a><span class="lineno"> 1111</span> <span class="comment">/* For non-data groups, free the parsed stripes for now.</span></div>
<div class="line"><a id="l01112" name="l01112"></a><span class="lineno"> 1112</span><span class="comment"> * Recovery for DDT/metadata/index groups would use these,</span></div>
<div class="line"><a id="l01113" name="l01113"></a><span class="lineno"> 1113</span><span class="comment"> * but the current read path only recovers data blocks. */</span></div>
<div class="line"><a id="l01114" name="l01114"></a><span class="lineno"> 1114</span> <span class="keywordflow">if</span>(grp_stripes)</div>
<div class="line"><a id="l01115" name="l01115"></a><span class="lineno"> 1115</span> {</div>
<div class="line"><a id="l01116" name="l01116"></a><span class="lineno"> 1116</span> <span class="keywordflow">for</span>(uint32_t s = 0; s &lt; group.<a class="code hl_variable" href="structStripeGroupDescriptor.html#a9b737c4f6fda1894d51858d2a3d8d877">stripeCount</a>; s++)</div>
<div class="line"><a id="l01117" name="l01117"></a><span class="lineno"> 1117</span> {</div>
<div class="line"><a id="l01118" name="l01118"></a><span class="lineno"> 1118</span> free(grp_stripes[s].data_entries);</div>
<div class="line"><a id="l01119" name="l01119"></a><span class="lineno"> 1119</span> free(grp_stripes[s].parity_offsets);</div>
<div class="line"><a id="l01120" name="l01120"></a><span class="lineno"> 1120</span> }</div>
<div class="line"><a id="l01121" name="l01121"></a><span class="lineno"> 1121</span> free(grp_stripes);</div>
<div class="line"><a id="l01122" name="l01122"></a><span class="lineno"> 1122</span> }</div>
<div class="line"><a id="l01123" name="l01123"></a><span class="lineno"> 1123</span> }</div>
<div class="line"><a id="l01124" name="l01124"></a><span class="lineno"> 1124</span> }</div>
<div class="line"><a id="l01125" name="l01125"></a><span class="lineno"> 1125</span> </div>
<div class="line"><a id="l01126" name="l01126"></a><span class="lineno"> 1126</span> free(payload);</div>
<div class="line"><a id="l01127" name="l01127"></a><span class="lineno"> 1127</span> </div>
<div class="line"><a id="l01128" name="l01128"></a><span class="lineno"> 1128</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aad3acc958f1b3e63fdeacfd349aff736">ec_read_stripes</a> = data_stripes;</div>
<div class="line"><a id="l01129" name="l01129"></a><span class="lineno"> 1129</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a3e230f326ef10eae2a496ca4532c8143">ec_read_stripe_count</a> = data_stripe_count;</div>
<div class="line"><a id="l01130" name="l01130"></a><span class="lineno"> 1130</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aafe10b9028dcb7a53c5b05b8db2b2ba8">ec_block_lookup</a> = lookup_root;</div>
<div class="line"><a id="l01131" name="l01131"></a><span class="lineno"> 1131</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#af7b4e0a80f76581b0cb1440d9a689f0f">ec_recovery_available</a> = (data_stripes != NULL &amp;&amp; data_stripe_count &gt; 0);</div>
<div class="line"><a id="l01132" name="l01132"></a><span class="lineno"> 1132</span> </div>
<div class="line"><a id="l01133" name="l01133"></a><span class="lineno"> 1133</span> <span class="comment">/* Create RS codec for decoding */</span></div>
<div class="line"><a id="l01134" name="l01134"></a><span class="lineno"> 1134</span> <span class="keywordflow">if</span>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#af7b4e0a80f76581b0cb1440d9a689f0f">ec_recovery_available</a> &amp;&amp; !ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a231115c6a202af9b0b846dcd9894435d">ec_rs_ctx</a>)</div>
<div class="line"><a id="l01135" name="l01135"></a><span class="lineno"> 1135</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a231115c6a202af9b0b846dcd9894435d">ec_rs_ctx</a> = <a class="code hl_function" href="reed__solomon_8c.html#a68a7b13ef6443640abc2818a3bd7d5bf">rs_create</a>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aece272b6ba4a3451e5f56be5a1e5c7c5">ec_K</a>, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a9c7a7eafdd48b8d0cbdbb46d28cfceaa">ec_M</a>);</div>
<div class="line"><a id="l01136" name="l01136"></a><span class="lineno"> 1136</span> </div>
<div class="line"><a id="l01137" name="l01137"></a><span class="lineno"> 1137</span> <a class="code hl_define" href="log_8h.html#a21cc0459b78d5f2d7bd737e5aae1278a">TRACE</a>(<span class="stringliteral">&quot;ECMB loaded: %u groups, K=%u M=%u shard_size=%u data_stripes=%u&quot;</span>,</div>
<div class="line"><a id="l01138" name="l01138"></a><span class="lineno"> 1138</span> ecmb.<a class="code hl_variable" href="structErasureCodingMapHeader.html#accae80e978eeccc7c026eb5ade721aae">stripeGroupCount</a>, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aece272b6ba4a3451e5f56be5a1e5c7c5">ec_K</a>, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a9c7a7eafdd48b8d0cbdbb46d28cfceaa">ec_M</a>, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a3dd804f91ba84019bd5a23226fa7d608">ec_data_shard_size</a>, data_stripe_count);</div>
<div class="line"><a id="l01139" name="l01139"></a><span class="lineno"> 1139</span>}</div>
</div>
<div class="line"><a id="l01140" name="l01140"></a><span class="lineno"> 1140</span> </div>
<div class="line"><a id="l01141" name="l01141"></a><span class="lineno"> 1141</span><span class="comment">/* =========================================================================</span></div>
<div class="line"><a id="l01142" name="l01142"></a><span class="lineno"> 1142</span><span class="comment"> * Data block recovery (read path)</span></div>
<div class="line"><a id="l01143" name="l01143"></a><span class="lineno"> 1143</span><span class="comment"> * ========================================================================= */</span></div>
<div class="line"><a id="l01144" name="l01144"></a><span class="lineno"> 1144</span> </div>
<div class="foldopen" id="foldopen01145" data-start="{" data-end="}">
<div class="line"><a id="l01145" name="l01145"></a><span class="lineno"><a class="line" href="erasure__internal_8h.html#a7a9ac507738cdf72e951f152edd4d233"> 1145</a></span>int32_t <a class="code hl_function" href="erasure_8c.html#a7a9ac507738cdf72e951f152edd4d233">ec_recover_data_block</a>(<a class="code hl_struct" href="structaaruformat__context.html">aaruformat_context</a> *ctx, uint64_t block_offset, uint64_t offset,</div>
<div class="line"><a id="l01146" name="l01146"></a><span class="lineno"> 1146</span> uint8_t *data, uint32_t *length, uint8_t sector_status)</div>
<div class="line"><a id="l01147" name="l01147"></a><span class="lineno"> 1147</span>{</div>
<div class="line"><a id="l01148" name="l01148"></a><span class="lineno"> 1148</span> <span class="keywordflow">if</span>(!ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#af7b4e0a80f76581b0cb1440d9a689f0f">ec_recovery_available</a> || ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a3613b5ea23ce609b6d2c3a047692d455">ec_recovery_in_progress</a>) <span class="keywordflow">return</span> <a class="code hl_define" href="errors_8h.html#ac9f4e38e8d5a1f940c9cd0c7f6788c37">AARUF_ERROR_CANNOT_DECOMPRESS_BLOCK</a>;</div>
<div class="line"><a id="l01149" name="l01149"></a><span class="lineno"> 1149</span> </div>
<div class="line"><a id="l01150" name="l01150"></a><span class="lineno"> 1150</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a3613b5ea23ce609b6d2c3a047692d455">ec_recovery_in_progress</a> = <span class="keyword">true</span>;</div>
<div class="line"><a id="l01151" name="l01151"></a><span class="lineno"> 1151</span> </div>
<div class="line"><a id="l01152" name="l01152"></a><span class="lineno"> 1152</span> <span class="comment">/* Look up which stripe this block belongs to */</span></div>
<div class="line"><a id="l01153" name="l01153"></a><span class="lineno"> 1153</span> <a class="code hl_struct" href="structEcBlockLookupEntry.html">EcBlockLookupEntry</a> *le = NULL;</div>
<div class="line"><a id="l01154" name="l01154"></a><span class="lineno"> 1154</span> HASH_FIND(hh, (<a class="code hl_struct" href="structEcBlockLookupEntry.html">EcBlockLookupEntry</a> *)ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aafe10b9028dcb7a53c5b05b8db2b2ba8">ec_block_lookup</a>, &amp;block_offset, <span class="keyword">sizeof</span>(uint64_t), le);</div>
<div class="line"><a id="l01155" name="l01155"></a><span class="lineno"> 1155</span> <span class="keywordflow">if</span>(!le) { ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a3613b5ea23ce609b6d2c3a047692d455">ec_recovery_in_progress</a> = <span class="keyword">false</span>; <span class="keywordflow">return</span> <a class="code hl_define" href="errors_8h.html#ac9f4e38e8d5a1f940c9cd0c7f6788c37">AARUF_ERROR_CANNOT_DECOMPRESS_BLOCK</a>; }</div>
<div class="line"><a id="l01156" name="l01156"></a><span class="lineno"> 1156</span> </div>
<div class="line"><a id="l01157" name="l01157"></a><span class="lineno"> 1157</span> uint32_t si = le-&gt;<a class="code hl_variable" href="structEcBlockLookupEntry.html#aedeac38371118113a77e02cc65512320">stripe_index</a>;</div>
<div class="line"><a id="l01158" name="l01158"></a><span class="lineno"> 1158</span> <a class="code hl_struct" href="structEcReadStripe.html">EcReadStripe</a> *stripes = (<a class="code hl_struct" href="structEcReadStripe.html">EcReadStripe</a> *)ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aad3acc958f1b3e63fdeacfd349aff736">ec_read_stripes</a>;</div>
<div class="line"><a id="l01159" name="l01159"></a><span class="lineno"> 1159</span> <a class="code hl_struct" href="structEcReadStripe.html">EcReadStripe</a> *stripe = &amp;stripes[si];</div>
<div class="line"><a id="l01160" name="l01160"></a><span class="lineno"> 1160</span> uint16_t <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a> = ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aece272b6ba4a3451e5f56be5a1e5c7c5">ec_K</a>;</div>
<div class="line"><a id="l01161" name="l01161"></a><span class="lineno"> 1161</span> uint16_t M = ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a9c7a7eafdd48b8d0cbdbb46d28cfceaa">ec_M</a>;</div>
<div class="line"><a id="l01162" name="l01162"></a><span class="lineno"> 1162</span> uint32_t shard_size = ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a3dd804f91ba84019bd5a23226fa7d608">ec_data_shard_size</a>;</div>
<div class="line"><a id="l01163" name="l01163"></a><span class="lineno"> 1163</span> </div>
<div class="line"><a id="l01164" name="l01164"></a><span class="lineno"> 1164</span> <span class="comment">/* Always use K+M shards for RS. For partial stripes (actual_k &lt; K),</span></div>
<div class="line"><a id="l01165" name="l01165"></a><span class="lineno"> 1165</span><span class="comment"> * positions actual_k..K-1 are all-zero (calloc&#39;d) and marked present.</span></div>
<div class="line"><a id="l01166" name="l01166"></a><span class="lineno"> 1166</span><span class="comment"> * This works because the encoding used the K-size generator matrix</span></div>
<div class="line"><a id="l01167" name="l01167"></a><span class="lineno"> 1167</span><span class="comment"> * and zero-contributions for unused positions. */</span></div>
<div class="line"><a id="l01168" name="l01168"></a><span class="lineno"> 1168</span> uint16_t total_shards = <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a> + M;</div>
<div class="line"><a id="l01169" name="l01169"></a><span class="lineno"> 1169</span> </div>
<div class="line"><a id="l01170" name="l01170"></a><span class="lineno"> 1170</span> <span class="comment">/* Allocate shard pointers and present flags */</span></div>
<div class="line"><a id="l01171" name="l01171"></a><span class="lineno"> 1171</span> uint8_t **shards = (uint8_t **)calloc(total_shards, <span class="keyword">sizeof</span>(uint8_t *));</div>
<div class="line"><a id="l01172" name="l01172"></a><span class="lineno"> 1172</span> uint8_t *present = (uint8_t *)calloc(total_shards, 1);</div>
<div class="line"><a id="l01173" name="l01173"></a><span class="lineno"> 1173</span> <span class="keywordflow">if</span>(!shards || !present) { free(shards); free(present); ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a3613b5ea23ce609b6d2c3a047692d455">ec_recovery_in_progress</a> = <span class="keyword">false</span>; <span class="keywordflow">return</span> <a class="code hl_define" href="errors_8h.html#a35a771e3648bf971a004d4b2be9b5ec4">AARUF_ERROR_NOT_ENOUGH_MEMORY</a>; }</div>
<div class="line"><a id="l01174" name="l01174"></a><span class="lineno"> 1174</span> </div>
<div class="line"><a id="l01175" name="l01175"></a><span class="lineno"> 1175</span> <span class="keywordflow">for</span>(uint16_t i = 0; i &lt; total_shards; i++)</div>
<div class="line"><a id="l01176" name="l01176"></a><span class="lineno"> 1176</span> {</div>
<div class="line"><a id="l01177" name="l01177"></a><span class="lineno"> 1177</span> shards[i] = (uint8_t *)calloc(1, shard_size);</div>
<div class="line"><a id="l01178" name="l01178"></a><span class="lineno"> 1178</span> <span class="keywordflow">if</span>(!shards[i])</div>
<div class="line"><a id="l01179" name="l01179"></a><span class="lineno"> 1179</span> {</div>
<div class="line"><a id="l01180" name="l01180"></a><span class="lineno"> 1180</span> <span class="keywordflow">for</span>(uint16_t j = 0; j &lt; i; j++) free(shards[j]);</div>
<div class="line"><a id="l01181" name="l01181"></a><span class="lineno"> 1181</span> free(shards); free(present);</div>
<div class="line"><a id="l01182" name="l01182"></a><span class="lineno"> 1182</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a3613b5ea23ce609b6d2c3a047692d455">ec_recovery_in_progress</a> = <span class="keyword">false</span>;</div>
<div class="line"><a id="l01183" name="l01183"></a><span class="lineno"> 1183</span> <span class="keywordflow">return</span> <a class="code hl_define" href="errors_8h.html#a35a771e3648bf971a004d4b2be9b5ec4">AARUF_ERROR_NOT_ENOUGH_MEMORY</a>;</div>
<div class="line"><a id="l01184" name="l01184"></a><span class="lineno"> 1184</span> }</div>
<div class="line"><a id="l01185" name="l01185"></a><span class="lineno"> 1185</span> }</div>
<div class="line"><a id="l01186" name="l01186"></a><span class="lineno"> 1186</span> </div>
<div class="line"><a id="l01187" name="l01187"></a><span class="lineno"> 1187</span> <span class="comment">/* Read data shards from file and verify each one&#39;s CRC64 against ECMB */</span></div>
<div class="line"><a id="l01188" name="l01188"></a><span class="lineno"> 1188</span> <span class="keywordflow">for</span>(uint16_t k = 0; k &lt; stripe-&gt;<a class="code hl_variable" href="structEcReadStripe.html#a80b525ebfe07bff2cb08bf97ce633e2f">actual_k</a>; k++)</div>
<div class="line"><a id="l01189" name="l01189"></a><span class="lineno"> 1189</span> {</div>
<div class="line"><a id="l01190" name="l01190"></a><span class="lineno"> 1190</span> <a class="code hl_struct" href="structStripeDataBlockEntry.html">StripeDataBlockEntry</a> *de = &amp;stripe-&gt;<a class="code hl_variable" href="structEcReadStripe.html#a196073177bb5753b30b17ad495af7b97">data_entries</a>[k];</div>
<div class="line"><a id="l01191" name="l01191"></a><span class="lineno"> 1191</span> uint32_t read_size = de-&gt;<a class="code hl_variable" href="structStripeDataBlockEntry.html#a3351d43103f9f7fbd9f4486161a1656d">onDiskSize</a>;</div>
<div class="line"><a id="l01192" name="l01192"></a><span class="lineno"> 1192</span> <span class="keywordflow">if</span>(read_size &gt; shard_size) read_size = shard_size;</div>
<div class="line"><a id="l01193" name="l01193"></a><span class="lineno"> 1193</span> </div>
<div class="line"><a id="l01194" name="l01194"></a><span class="lineno"> 1194</span> <a class="code hl_function" href="internal_8h.html#a60c57e3b2e8e233d0be91f3690bf077c">aaruf_fseek</a>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>, (<a class="code hl_typedef" href="internal_8h.html#afb4a123eeae51c668333248fb666e0f2">aaru_off_t</a>)de-&gt;<a class="code hl_variable" href="structStripeDataBlockEntry.html#a7aac714b3d98b543e792537fd7c8d3fc">offset</a>, SEEK_SET);</div>
<div class="line"><a id="l01195" name="l01195"></a><span class="lineno"> 1195</span> <span class="keywordflow">if</span>(fread(shards[k], read_size, 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>) != 1)</div>
<div class="line"><a id="l01196" name="l01196"></a><span class="lineno"> 1196</span> {</div>
<div class="line"><a id="l01197" name="l01197"></a><span class="lineno"> 1197</span> present[k] = 0;</div>
<div class="line"><a id="l01198" name="l01198"></a><span class="lineno"> 1198</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l01199" name="l01199"></a><span class="lineno"> 1199</span> }</div>
<div class="line"><a id="l01200" name="l01200"></a><span class="lineno"> 1200</span> </div>
<div class="line"><a id="l01201" name="l01201"></a><span class="lineno"> 1201</span> <span class="comment">/* Verify CRC64 (zero-padded to shard_size via calloc) */</span></div>
<div class="line"><a id="l01202" name="l01202"></a><span class="lineno"> 1202</span> uint64_t crc = <a class="code hl_function" href="decls_8h.html#a0fee4834bf0747bcd933c4e754aa4692">aaruf_crc64_data</a>(shards[k], shard_size);</div>
<div class="line"><a id="l01203" name="l01203"></a><span class="lineno"> 1203</span> present[k] = (crc == de-&gt;<a class="code hl_variable" href="structStripeDataBlockEntry.html#af85494afc772fe1469927c826e24a1b2">shardCrc64</a>) ? 1 : 0;</div>
<div class="line"><a id="l01204" name="l01204"></a><span class="lineno"> 1204</span> }</div>
<div class="line"><a id="l01205" name="l01205"></a><span class="lineno"> 1205</span> </div>
<div class="line"><a id="l01206" name="l01206"></a><span class="lineno"> 1206</span> <span class="comment">/* Positions actual_k..K-1 are all-zero and present (unused stripe positions) */</span></div>
<div class="line"><a id="l01207" name="l01207"></a><span class="lineno"> 1207</span> <span class="keywordflow">for</span>(uint16_t k = stripe-&gt;<a class="code hl_variable" href="structEcReadStripe.html#a80b525ebfe07bff2cb08bf97ce633e2f">actual_k</a>; k &lt; <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a>; k++)</div>
<div class="line"><a id="l01208" name="l01208"></a><span class="lineno"> 1208</span> present[k] = 1; <span class="comment">/* All-zero shards, implicitly correct */</span></div>
<div class="line"><a id="l01209" name="l01209"></a><span class="lineno"> 1209</span> </div>
<div class="line"><a id="l01210" name="l01210"></a><span class="lineno"> 1210</span> <span class="comment">/* Read parity shards */</span></div>
<div class="line"><a id="l01211" name="l01211"></a><span class="lineno"> 1211</span> <span class="keywordflow">for</span>(uint16_t m = 0; m &lt; M; m++)</div>
<div class="line"><a id="l01212" name="l01212"></a><span class="lineno"> 1212</span> {</div>
<div class="line"><a id="l01213" name="l01213"></a><span class="lineno"> 1213</span> uint16_t shard_idx = <a class="code hl_variable" href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a> + m;</div>
<div class="line"><a id="l01214" name="l01214"></a><span class="lineno"> 1214</span> uint64_t parity_offset = stripe-&gt;<a class="code hl_variable" href="structEcReadStripe.html#ac88d41411a685f4b7fbecb69d179ec3f">parity_offsets</a>[m];</div>
<div class="line"><a id="l01215" name="l01215"></a><span class="lineno"> 1215</span> </div>
<div class="line"><a id="l01216" name="l01216"></a><span class="lineno"> 1216</span> <a class="code hl_function" href="internal_8h.html#a60c57e3b2e8e233d0be91f3690bf077c">aaruf_fseek</a>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>, (<a class="code hl_typedef" href="internal_8h.html#afb4a123eeae51c668333248fb666e0f2">aaru_off_t</a>)parity_offset, SEEK_SET);</div>
<div class="line"><a id="l01217" name="l01217"></a><span class="lineno"> 1217</span> </div>
<div class="line"><a id="l01218" name="l01218"></a><span class="lineno"> 1218</span> <span class="comment">/* Read parity block header */</span></div>
<div class="line"><a id="l01219" name="l01219"></a><span class="lineno"> 1219</span> <a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a> parity_header;</div>
<div class="line"><a id="l01220" name="l01220"></a><span class="lineno"> 1220</span> <span class="keywordflow">if</span>(fread(&amp;parity_header, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a>), 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>) != 1)</div>
<div class="line"><a id="l01221" name="l01221"></a><span class="lineno"> 1221</span> {</div>
<div class="line"><a id="l01222" name="l01222"></a><span class="lineno"> 1222</span> present[shard_idx] = 0;</div>
<div class="line"><a id="l01223" name="l01223"></a><span class="lineno"> 1223</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l01224" name="l01224"></a><span class="lineno"> 1224</span> }</div>
<div class="line"><a id="l01225" name="l01225"></a><span class="lineno"> 1225</span> </div>
<div class="line"><a id="l01226" name="l01226"></a><span class="lineno"> 1226</span> <span class="comment">/* Read and decompress parity payload */</span></div>
<div class="line"><a id="l01227" name="l01227"></a><span class="lineno"> 1227</span> <span class="keywordflow">if</span>(parity_header.<a class="code hl_variable" href="structBlockHeader.html#ad68963422fd2a5f6d0e0be751cbef559">compression</a> == <a class="code hl_enumvalue" href="enums_8h.html#affec749ed88365143745313ae9168263a6925460497824fd20caa5ba1925cde84">kCompressionNone</a>)</div>
<div class="line"><a id="l01228" name="l01228"></a><span class="lineno"> 1228</span> {</div>
<div class="line"><a id="l01229" name="l01229"></a><span class="lineno"> 1229</span> uint32_t to_read = parity_header.<a class="code hl_variable" href="structBlockHeader.html#a1f9f3204a10090709b28d0df4bb547e5">length</a>;</div>
<div class="line"><a id="l01230" name="l01230"></a><span class="lineno"> 1230</span> <span class="keywordflow">if</span>(to_read &gt; shard_size) to_read = shard_size;</div>
<div class="line"><a id="l01231" name="l01231"></a><span class="lineno"> 1231</span> <span class="keywordflow">if</span>(fread(shards[shard_idx], to_read, 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>) != 1)</div>
<div class="line"><a id="l01232" name="l01232"></a><span class="lineno"> 1232</span> {</div>
<div class="line"><a id="l01233" name="l01233"></a><span class="lineno"> 1233</span> present[shard_idx] = 0;</div>
<div class="line"><a id="l01234" name="l01234"></a><span class="lineno"> 1234</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l01235" name="l01235"></a><span class="lineno"> 1235</span> }</div>
<div class="line"><a id="l01236" name="l01236"></a><span class="lineno"> 1236</span> }</div>
<div class="line"><a id="l01237" name="l01237"></a><span class="lineno"> 1237</span> <span class="keywordflow">else</span> <span class="keywordflow">if</span>(parity_header.<a class="code hl_variable" href="structBlockHeader.html#ad68963422fd2a5f6d0e0be751cbef559">compression</a> == <a class="code hl_enumvalue" href="enums_8h.html#affec749ed88365143745313ae9168263a66b049c2b816874ab71b06cebf5afcd7">kCompressionLzma</a>)</div>
<div class="line"><a id="l01238" name="l01238"></a><span class="lineno"> 1238</span> {</div>
<div class="line"><a id="l01239" name="l01239"></a><span class="lineno"> 1239</span> uint32_t cmp_data_len = parity_header.<a class="code hl_variable" href="structBlockHeader.html#a0ee87beb4362823260f70a87ac17379f">cmpLength</a> - <a class="code hl_define" href="consts_8h.html#a25fd08252b97a0230d3efc899bddd240">LZMA_PROPERTIES_LENGTH</a>;</div>
<div class="line"><a id="l01240" name="l01240"></a><span class="lineno"> 1240</span> uint8_t lzma_props[<a class="code hl_define" href="consts_8h.html#a25fd08252b97a0230d3efc899bddd240">LZMA_PROPERTIES_LENGTH</a>];</div>
<div class="line"><a id="l01241" name="l01241"></a><span class="lineno"> 1241</span> <span class="keywordflow">if</span>(fread(lzma_props, <a class="code hl_define" href="consts_8h.html#a25fd08252b97a0230d3efc899bddd240">LZMA_PROPERTIES_LENGTH</a>, 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>) != 1 )</div>
<div class="line"><a id="l01242" name="l01242"></a><span class="lineno"> 1242</span> {</div>
<div class="line"><a id="l01243" name="l01243"></a><span class="lineno"> 1243</span> present[shard_idx] = 0;</div>
<div class="line"><a id="l01244" name="l01244"></a><span class="lineno"> 1244</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l01245" name="l01245"></a><span class="lineno"> 1245</span> }</div>
<div class="line"><a id="l01246" name="l01246"></a><span class="lineno"> 1246</span> uint8_t *cmp = (uint8_t *)malloc(cmp_data_len);</div>
<div class="line"><a id="l01247" name="l01247"></a><span class="lineno"> 1247</span> <span class="keywordflow">if</span>(!cmp) { present[shard_idx] = 0; <span class="keywordflow">continue</span>; }</div>
<div class="line"><a id="l01248" name="l01248"></a><span class="lineno"> 1248</span> <span class="keywordflow">if</span>(fread(cmp, cmp_data_len, 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>) != 1) { free(cmp); present[shard_idx] = 0; <span class="keywordflow">continue</span>; }</div>
<div class="line"><a id="l01249" name="l01249"></a><span class="lineno"> 1249</span> </div>
<div class="line"><a id="l01250" name="l01250"></a><span class="lineno"> 1250</span> <span class="keywordtype">size_t</span> out_size = shard_size;</div>
<div class="line"><a id="l01251" name="l01251"></a><span class="lineno"> 1251</span> <span class="keywordtype">size_t</span> lzma_src = (size_t)cmp_data_len;</div>
<div class="line"><a id="l01252" name="l01252"></a><span class="lineno"> 1252</span> <a class="code hl_function" href="decls_8h.html#a12f3cbc43c2f57a11fbba32a71ba2704">aaruf_lzma_decode_buffer</a>(shards[shard_idx], &amp;out_size, cmp, &amp;lzma_src, lzma_props, <a class="code hl_define" href="consts_8h.html#a25fd08252b97a0230d3efc899bddd240">LZMA_PROPERTIES_LENGTH</a>);</div>
<div class="line"><a id="l01253" name="l01253"></a><span class="lineno"> 1253</span> free(cmp);</div>
<div class="line"><a id="l01254" name="l01254"></a><span class="lineno"> 1254</span> }</div>
<div class="line"><a id="l01255" name="l01255"></a><span class="lineno"> 1255</span> <span class="keywordflow">else</span> <span class="keywordflow">if</span>(parity_header.<a class="code hl_variable" href="structBlockHeader.html#ad68963422fd2a5f6d0e0be751cbef559">compression</a> == <a class="code hl_enumvalue" href="enums_8h.html#affec749ed88365143745313ae9168263a6ee0deaccf9cd167806cc479afffc0cc">kCompressionZstd</a>)</div>
<div class="line"><a id="l01256" name="l01256"></a><span class="lineno"> 1256</span> {</div>
<div class="line"><a id="l01257" name="l01257"></a><span class="lineno"> 1257</span> uint8_t *cmp = (uint8_t *)malloc(parity_header.<a class="code hl_variable" href="structBlockHeader.html#a0ee87beb4362823260f70a87ac17379f">cmpLength</a>);</div>
<div class="line"><a id="l01258" name="l01258"></a><span class="lineno"> 1258</span> <span class="keywordflow">if</span>(!cmp) { present[shard_idx] = 0; <span class="keywordflow">continue</span>; }</div>
<div class="line"><a id="l01259" name="l01259"></a><span class="lineno"> 1259</span> <span class="keywordflow">if</span>(fread(cmp, parity_header.<a class="code hl_variable" href="structBlockHeader.html#a0ee87beb4362823260f70a87ac17379f">cmpLength</a>, 1, ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">imageStream</a>) != 1) { free(cmp); present[shard_idx] = 0; <span class="keywordflow">continue</span>; }</div>
<div class="line"><a id="l01260" name="l01260"></a><span class="lineno"> 1260</span> </div>
<div class="line"><a id="l01261" name="l01261"></a><span class="lineno"> 1261</span> <a class="code hl_function" href="decls_8h.html#ac0f8004dbea44979bf8b58c3e3a1a6ae">aaruf_zstd_decode_buffer</a>(shards[shard_idx], shard_size, cmp, parity_header.<a class="code hl_variable" href="structBlockHeader.html#a0ee87beb4362823260f70a87ac17379f">cmpLength</a>);</div>
<div class="line"><a id="l01262" name="l01262"></a><span class="lineno"> 1262</span> free(cmp);</div>
<div class="line"><a id="l01263" name="l01263"></a><span class="lineno"> 1263</span> }</div>
<div class="line"><a id="l01264" name="l01264"></a><span class="lineno"> 1264</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l01265" name="l01265"></a><span class="lineno"> 1265</span> {</div>
<div class="line"><a id="l01266" name="l01266"></a><span class="lineno"> 1266</span> present[shard_idx] = 0;</div>
<div class="line"><a id="l01267" name="l01267"></a><span class="lineno"> 1267</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l01268" name="l01268"></a><span class="lineno"> 1268</span> }</div>
<div class="line"><a id="l01269" name="l01269"></a><span class="lineno"> 1269</span> present[shard_idx] = 1;</div>
<div class="line"><a id="l01270" name="l01270"></a><span class="lineno"> 1270</span> }</div>
<div class="line"><a id="l01271" name="l01271"></a><span class="lineno"> 1271</span> </div>
<div class="line"><a id="l01272" name="l01272"></a><span class="lineno"> 1272</span> <span class="comment">/* Always use the original RS(K,M) codec — partial stripes have zero-padded unused positions */</span></div>
<div class="line"><a id="l01273" name="l01273"></a><span class="lineno"> 1273</span> <a class="code hl_struct" href="structrs__context.html">rs_context</a> *rs = (<a class="code hl_struct" href="structrs__context.html">rs_context</a> *)ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a231115c6a202af9b0b846dcd9894435d">ec_rs_ctx</a>;</div>
<div class="line"><a id="l01274" name="l01274"></a><span class="lineno"> 1274</span> <span class="keywordflow">if</span>(!rs)</div>
<div class="line"><a id="l01275" name="l01275"></a><span class="lineno"> 1275</span> {</div>
<div class="line"><a id="l01276" name="l01276"></a><span class="lineno"> 1276</span> <span class="keywordflow">for</span>(uint16_t i = 0; i &lt; total_shards; i++) free(shards[i]);</div>
<div class="line"><a id="l01277" name="l01277"></a><span class="lineno"> 1277</span> free(shards); free(present);</div>
<div class="line"><a id="l01278" name="l01278"></a><span class="lineno"> 1278</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a3613b5ea23ce609b6d2c3a047692d455">ec_recovery_in_progress</a> = <span class="keyword">false</span>;</div>
<div class="line"><a id="l01279" name="l01279"></a><span class="lineno"> 1279</span> <span class="keywordflow">return</span> <a class="code hl_define" href="errors_8h.html#a35a771e3648bf971a004d4b2be9b5ec4">AARUF_ERROR_NOT_ENOUGH_MEMORY</a>;</div>
<div class="line"><a id="l01280" name="l01280"></a><span class="lineno"> 1280</span> }</div>
<div class="line"><a id="l01281" name="l01281"></a><span class="lineno"> 1281</span> </div>
<div class="line"><a id="l01282" name="l01282"></a><span class="lineno"> 1282</span> <span class="comment">/* RS decode */</span></div>
<div class="line"><a id="l01283" name="l01283"></a><span class="lineno"> 1283</span> <span class="keywordtype">int</span> rc = <a class="code hl_function" href="reed__solomon_8c.html#aea0122b72cfa6f77a4751d5466e73024">rs_decode</a>(rs, shards, present, shard_size);</div>
<div class="line"><a id="l01284" name="l01284"></a><span class="lineno"> 1284</span> </div>
<div class="line"><a id="l01285" name="l01285"></a><span class="lineno"> 1285</span> <span class="keywordflow">if</span>(rc != 0)</div>
<div class="line"><a id="l01286" name="l01286"></a><span class="lineno"> 1286</span> {</div>
<div class="line"><a id="l01287" name="l01287"></a><span class="lineno"> 1287</span> <span class="keywordflow">for</span>(uint16_t i = 0; i &lt; total_shards; i++) free(shards[i]);</div>
<div class="line"><a id="l01288" name="l01288"></a><span class="lineno"> 1288</span> free(shards); free(present);</div>
<div class="line"><a id="l01289" name="l01289"></a><span class="lineno"> 1289</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a3613b5ea23ce609b6d2c3a047692d455">ec_recovery_in_progress</a> = <span class="keyword">false</span>;</div>
<div class="line"><a id="l01290" name="l01290"></a><span class="lineno"> 1290</span> <span class="keywordflow">return</span> <a class="code hl_define" href="errors_8h.html#ac9f4e38e8d5a1f940c9cd0c7f6788c37">AARUF_ERROR_CANNOT_DECOMPRESS_BLOCK</a>;</div>
<div class="line"><a id="l01291" name="l01291"></a><span class="lineno"> 1291</span> }</div>
<div class="line"><a id="l01292" name="l01292"></a><span class="lineno"> 1292</span> </div>
<div class="line"><a id="l01293" name="l01293"></a><span class="lineno"> 1293</span> <span class="comment">/* Find the shard corresponding to our corrupted block */</span></div>
<div class="line"><a id="l01294" name="l01294"></a><span class="lineno"> 1294</span> uint16_t our_pos = le-&gt;<a class="code hl_variable" href="structEcBlockLookupEntry.html#a8645b89803f927a7608a6f8d30d74292">position</a>;</div>
<div class="line"><a id="l01295" name="l01295"></a><span class="lineno"> 1295</span> uint8_t *recovered_shard = shards[our_pos];</div>
<div class="line"><a id="l01296" name="l01296"></a><span class="lineno"> 1296</span> </div>
<div class="line"><a id="l01297" name="l01297"></a><span class="lineno"> 1297</span> <span class="comment">/* Parse the recovered BlockHeader */</span></div>
<div class="line"><a id="l01298" name="l01298"></a><span class="lineno"> 1298</span> <a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a> recovered_header;</div>
<div class="line"><a id="l01299" name="l01299"></a><span class="lineno"> 1299</span> memcpy(&amp;recovered_header, recovered_shard, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a>));</div>
<div class="line"><a id="l01300" name="l01300"></a><span class="lineno"> 1300</span> </div>
<div class="line"><a id="l01301" name="l01301"></a><span class="lineno"> 1301</span> <span class="comment">/* Decompress the recovered payload */</span></div>
<div class="line"><a id="l01302" name="l01302"></a><span class="lineno"> 1302</span> uint32_t hdr_size = <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a>);</div>
<div class="line"><a id="l01303" name="l01303"></a><span class="lineno"> 1303</span> uint8_t *recovered_payload = recovered_shard + hdr_size;</div>
<div class="line"><a id="l01304" name="l01304"></a><span class="lineno"> 1304</span> uint32_t payload_len = recovered_header.<a class="code hl_variable" href="structBlockHeader.html#a0ee87beb4362823260f70a87ac17379f">cmpLength</a>;</div>
<div class="line"><a id="l01305" name="l01305"></a><span class="lineno"> 1305</span> </div>
<div class="line"><a id="l01306" name="l01306"></a><span class="lineno"> 1306</span> uint8_t *block = NULL;</div>
<div class="line"><a id="l01307" name="l01307"></a><span class="lineno"> 1307</span> </div>
<div class="line"><a id="l01308" name="l01308"></a><span class="lineno"> 1308</span> <span class="keywordflow">if</span>(recovered_header.<a class="code hl_variable" href="structBlockHeader.html#ad68963422fd2a5f6d0e0be751cbef559">compression</a> == <a class="code hl_enumvalue" href="enums_8h.html#affec749ed88365143745313ae9168263a6925460497824fd20caa5ba1925cde84">kCompressionNone</a>)</div>
<div class="line"><a id="l01309" name="l01309"></a><span class="lineno"> 1309</span> {</div>
<div class="line"><a id="l01310" name="l01310"></a><span class="lineno"> 1310</span> block = (uint8_t *)malloc(recovered_header.<a class="code hl_variable" href="structBlockHeader.html#a1f9f3204a10090709b28d0df4bb547e5">length</a>);</div>
<div class="line"><a id="l01311" name="l01311"></a><span class="lineno"> 1311</span> <span class="keywordflow">if</span>(block) memcpy(block, recovered_payload, recovered_header.<a class="code hl_variable" href="structBlockHeader.html#a1f9f3204a10090709b28d0df4bb547e5">length</a>);</div>
<div class="line"><a id="l01312" name="l01312"></a><span class="lineno"> 1312</span> }</div>
<div class="line"><a id="l01313" name="l01313"></a><span class="lineno"> 1313</span> <span class="keywordflow">else</span> <span class="keywordflow">if</span>(recovered_header.<a class="code hl_variable" href="structBlockHeader.html#ad68963422fd2a5f6d0e0be751cbef559">compression</a> == <a class="code hl_enumvalue" href="enums_8h.html#affec749ed88365143745313ae9168263a66b049c2b816874ab71b06cebf5afcd7">kCompressionLzma</a>)</div>
<div class="line"><a id="l01314" name="l01314"></a><span class="lineno"> 1314</span> {</div>
<div class="line"><a id="l01315" name="l01315"></a><span class="lineno"> 1315</span> uint8_t *lzma_props = recovered_payload;</div>
<div class="line"><a id="l01316" name="l01316"></a><span class="lineno"> 1316</span> uint8_t *lzma_data = recovered_payload + <a class="code hl_define" href="consts_8h.html#a25fd08252b97a0230d3efc899bddd240">LZMA_PROPERTIES_LENGTH</a>;</div>
<div class="line"><a id="l01317" name="l01317"></a><span class="lineno"> 1317</span> uint32_t lzma_data_len = payload_len - <a class="code hl_define" href="consts_8h.html#a25fd08252b97a0230d3efc899bddd240">LZMA_PROPERTIES_LENGTH</a>;</div>
<div class="line"><a id="l01318" name="l01318"></a><span class="lineno"> 1318</span> </div>
<div class="line"><a id="l01319" name="l01319"></a><span class="lineno"> 1319</span> block = (uint8_t *)malloc(recovered_header.<a class="code hl_variable" href="structBlockHeader.html#a1f9f3204a10090709b28d0df4bb547e5">length</a>);</div>
<div class="line"><a id="l01320" name="l01320"></a><span class="lineno"> 1320</span> <span class="keywordflow">if</span>(block)</div>
<div class="line"><a id="l01321" name="l01321"></a><span class="lineno"> 1321</span> {</div>
<div class="line"><a id="l01322" name="l01322"></a><span class="lineno"> 1322</span> <span class="keywordtype">size_t</span> out_size = recovered_header.<a class="code hl_variable" href="structBlockHeader.html#a1f9f3204a10090709b28d0df4bb547e5">length</a>;</div>
<div class="line"><a id="l01323" name="l01323"></a><span class="lineno"> 1323</span> <span class="keywordtype">size_t</span> lzma_src2 = (size_t)lzma_data_len;</div>
<div class="line"><a id="l01324" name="l01324"></a><span class="lineno"> 1324</span> <a class="code hl_function" href="decls_8h.html#a12f3cbc43c2f57a11fbba32a71ba2704">aaruf_lzma_decode_buffer</a>(block, &amp;out_size, lzma_data, &amp;lzma_src2, lzma_props, <a class="code hl_define" href="consts_8h.html#a25fd08252b97a0230d3efc899bddd240">LZMA_PROPERTIES_LENGTH</a>);</div>
<div class="line"><a id="l01325" name="l01325"></a><span class="lineno"> 1325</span> }</div>
<div class="line"><a id="l01326" name="l01326"></a><span class="lineno"> 1326</span> }</div>
<div class="line"><a id="l01327" name="l01327"></a><span class="lineno"> 1327</span> <span class="keywordflow">else</span> <span class="keywordflow">if</span>(recovered_header.<a class="code hl_variable" href="structBlockHeader.html#ad68963422fd2a5f6d0e0be751cbef559">compression</a> == <a class="code hl_enumvalue" href="enums_8h.html#affec749ed88365143745313ae9168263a6ee0deaccf9cd167806cc479afffc0cc">kCompressionZstd</a>)</div>
<div class="line"><a id="l01328" name="l01328"></a><span class="lineno"> 1328</span> {</div>
<div class="line"><a id="l01329" name="l01329"></a><span class="lineno"> 1329</span> block = (uint8_t *)malloc(recovered_header.<a class="code hl_variable" href="structBlockHeader.html#a1f9f3204a10090709b28d0df4bb547e5">length</a>);</div>
<div class="line"><a id="l01330" name="l01330"></a><span class="lineno"> 1330</span> <span class="keywordflow">if</span>(block)</div>
<div class="line"><a id="l01331" name="l01331"></a><span class="lineno"> 1331</span> <a class="code hl_function" href="decls_8h.html#ac0f8004dbea44979bf8b58c3e3a1a6ae">aaruf_zstd_decode_buffer</a>(block, recovered_header.<a class="code hl_variable" href="structBlockHeader.html#a1f9f3204a10090709b28d0df4bb547e5">length</a>, recovered_payload, payload_len);</div>
<div class="line"><a id="l01332" name="l01332"></a><span class="lineno"> 1332</span> }</div>
<div class="line"><a id="l01333" name="l01333"></a><span class="lineno"> 1333</span> <span class="keywordflow">else</span> <span class="keywordflow">if</span>(recovered_header.<a class="code hl_variable" href="structBlockHeader.html#ad68963422fd2a5f6d0e0be751cbef559">compression</a> == <a class="code hl_enumvalue" href="enums_8h.html#affec749ed88365143745313ae9168263ab68094bb67edceda03f5044de1e54428">kCompressionFlac</a>)</div>
<div class="line"><a id="l01334" name="l01334"></a><span class="lineno"> 1334</span> {</div>
<div class="line"><a id="l01335" name="l01335"></a><span class="lineno"> 1335</span> block = (uint8_t *)malloc(recovered_header.<a class="code hl_variable" href="structBlockHeader.html#a1f9f3204a10090709b28d0df4bb547e5">length</a>);</div>
<div class="line"><a id="l01336" name="l01336"></a><span class="lineno"> 1336</span> <span class="keywordflow">if</span>(block)</div>
<div class="line"><a id="l01337" name="l01337"></a><span class="lineno"> 1337</span> <a class="code hl_function" href="decls_8h.html#af0ff6ad1495d50a8fa0ce0005be69471">aaruf_flac_decode_redbook_buffer</a>(block, recovered_header.<a class="code hl_variable" href="structBlockHeader.html#a1f9f3204a10090709b28d0df4bb547e5">length</a>, recovered_payload, payload_len);</div>
<div class="line"><a id="l01338" name="l01338"></a><span class="lineno"> 1338</span> }</div>
<div class="line"><a id="l01339" name="l01339"></a><span class="lineno"> 1339</span> </div>
<div class="line"><a id="l01340" name="l01340"></a><span class="lineno"> 1340</span> int32_t result = <a class="code hl_define" href="errors_8h.html#ac9f4e38e8d5a1f940c9cd0c7f6788c37">AARUF_ERROR_CANNOT_DECOMPRESS_BLOCK</a>;</div>
<div class="line"><a id="l01341" name="l01341"></a><span class="lineno"> 1341</span> </div>
<div class="line"><a id="l01342" name="l01342"></a><span class="lineno"> 1342</span> <span class="keywordflow">if</span>(block)</div>
<div class="line"><a id="l01343" name="l01343"></a><span class="lineno"> 1343</span> {</div>
<div class="line"><a id="l01344" name="l01344"></a><span class="lineno"> 1344</span> <span class="comment">/* Verify recovered uncompressed data CRC64 */</span></div>
<div class="line"><a id="l01345" name="l01345"></a><span class="lineno"> 1345</span> uint64_t block_crc = <a class="code hl_function" href="decls_8h.html#a0fee4834bf0747bcd933c4e754aa4692">aaruf_crc64_data</a>(block, recovered_header.<a class="code hl_variable" href="structBlockHeader.html#a1f9f3204a10090709b28d0df4bb547e5">length</a>);</div>
<div class="line"><a id="l01346" name="l01346"></a><span class="lineno"> 1346</span> <span class="keywordflow">if</span>(block_crc == recovered_header.<a class="code hl_variable" href="structBlockHeader.html#ab4d9e3a871e0c7f12a881017dac4ca12">crc64</a>)</div>
<div class="line"><a id="l01347" name="l01347"></a><span class="lineno"> 1347</span> {</div>
<div class="line"><a id="l01348" name="l01348"></a><span class="lineno"> 1348</span> <span class="comment">/* Extract the requested sector */</span></div>
<div class="line"><a id="l01349" name="l01349"></a><span class="lineno"> 1349</span> uint32_t sector_size = recovered_header.<a class="code hl_variable" href="structBlockHeader.html#a5bd50f95c8c1f91e5013a1a154690beb">sectorSize</a>;</div>
<div class="line"><a id="l01350" name="l01350"></a><span class="lineno"> 1350</span> <span class="keywordflow">if</span>(sector_size &gt; 0 &amp;&amp; offset * sector_size + sector_size &lt;= recovered_header.<a class="code hl_variable" href="structBlockHeader.html#a1f9f3204a10090709b28d0df4bb547e5">length</a>)</div>
<div class="line"><a id="l01351" name="l01351"></a><span class="lineno"> 1351</span> {</div>
<div class="line"><a id="l01352" name="l01352"></a><span class="lineno"> 1352</span> memcpy(data, block + offset * sector_size, sector_size);</div>
<div class="line"><a id="l01353" name="l01353"></a><span class="lineno"> 1353</span> *length = sector_size;</div>
<div class="line"><a id="l01354" name="l01354"></a><span class="lineno"> 1354</span> result = <a class="code hl_define" href="errors_8h.html#a1d6e49f7e8a1fa489efa0a582e90b5de">AARUF_STATUS_OK</a>;</div>
<div class="line"><a id="l01355" name="l01355"></a><span class="lineno"> 1355</span> </div>
<div class="line"><a id="l01356" name="l01356"></a><span class="lineno"> 1356</span> <span class="comment">/* Cache the recovered block so subsequent sector reads from the same</span></div>
<div class="line"><a id="l01357" name="l01357"></a><span class="lineno"> 1357</span><span class="comment"> * block don&#39;t re-trigger recovery (this is the critical optimization). */</span></div>
<div class="line"><a id="l01358" name="l01358"></a><span class="lineno"> 1358</span> <a class="code hl_function" href="lru_8h.html#a0735969939ca80db3fe439ed92b787bb">add_to_cache_uint64</a>(&amp;ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a58359ec8607d1d10e0af8699be238e77">block_cache</a>, block_offset, block);</div>
<div class="line"><a id="l01359" name="l01359"></a><span class="lineno"> 1359</span> </div>
<div class="line"><a id="l01360" name="l01360"></a><span class="lineno"> 1360</span> <span class="comment">/* Also cache the recovered BlockHeader */</span></div>
<div class="line"><a id="l01361" name="l01361"></a><span class="lineno"> 1361</span> <a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a> *cached_hdr = (<a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a> *)malloc(<span class="keyword">sizeof</span>(<a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a>));</div>
<div class="line"><a id="l01362" name="l01362"></a><span class="lineno"> 1362</span> <span class="keywordflow">if</span>(cached_hdr)</div>
<div class="line"><a id="l01363" name="l01363"></a><span class="lineno"> 1363</span> {</div>
<div class="line"><a id="l01364" name="l01364"></a><span class="lineno"> 1364</span> memcpy(cached_hdr, &amp;recovered_header, <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structBlockHeader.html">BlockHeader</a>));</div>
<div class="line"><a id="l01365" name="l01365"></a><span class="lineno"> 1365</span> <a class="code hl_function" href="lru_8h.html#a0735969939ca80db3fe439ed92b787bb">add_to_cache_uint64</a>(&amp;ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a3a12addf4a338cc04471709604d48ae1">block_header_cache</a>, block_offset, cached_hdr);</div>
<div class="line"><a id="l01366" name="l01366"></a><span class="lineno"> 1366</span> }</div>
<div class="line"><a id="l01367" name="l01367"></a><span class="lineno"> 1367</span> </div>
<div class="line"><a id="l01368" name="l01368"></a><span class="lineno"> 1368</span> block = NULL; <span class="comment">/* Ownership transferred to cache — don&#39;t free */</span></div>
<div class="line"><a id="l01369" name="l01369"></a><span class="lineno"> 1369</span> }</div>
<div class="line"><a id="l01370" name="l01370"></a><span class="lineno"> 1370</span> }</div>
<div class="line"><a id="l01371" name="l01371"></a><span class="lineno"> 1371</span> free(block); <span class="comment">/* Only frees if not transferred to cache */</span></div>
<div class="line"><a id="l01372" name="l01372"></a><span class="lineno"> 1372</span> }</div>
<div class="line"><a id="l01373" name="l01373"></a><span class="lineno"> 1373</span> </div>
<div class="line"><a id="l01374" name="l01374"></a><span class="lineno"> 1374</span> <span class="keywordflow">for</span>(uint16_t i = 0; i &lt; total_shards; i++) free(shards[i]);</div>
<div class="line"><a id="l01375" name="l01375"></a><span class="lineno"> 1375</span> free(shards);</div>
<div class="line"><a id="l01376" name="l01376"></a><span class="lineno"> 1376</span> free(present);</div>
<div class="line"><a id="l01377" name="l01377"></a><span class="lineno"> 1377</span> </div>
<div class="line"><a id="l01378" name="l01378"></a><span class="lineno"> 1378</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a3613b5ea23ce609b6d2c3a047692d455">ec_recovery_in_progress</a> = <span class="keyword">false</span>;</div>
<div class="line"><a id="l01379" name="l01379"></a><span class="lineno"> 1379</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l01380" name="l01380"></a><span class="lineno"> 1380</span>}</div>
</div>
<div class="ttc" id="aaaruformat_8h_html"><div class="ttname"><a href="aaruformat_8h.html">aaruformat.h</a></div></div>
<div class="ttc" id="aconsts_8h_html"><div class="ttname"><a href="consts_8h.html">consts.h</a></div><div class="ttdoc">Core public constants and compiletime limits for the Aaru container format implementation.</div></div>
<div class="ttc" id="aconsts_8h_html_a1d7434dbf5927484a6d767b8a27c3cd4"><div class="ttname"><a href="consts_8h.html#a1d7434dbf5927484a6d767b8a27c3cd4">AARU_RECOVERY_FOOTER_MAGIC</a></div><div class="ttdeci">#define AARU_RECOVERY_FOOTER_MAGIC</div><div class="ttdoc">Magic number at the end of the recovery footer: &quot;AVRECMFR&quot; in ASCII little-endian.</div><div class="ttdef"><b>Definition</b> <a href="consts_8h_source.html#l00115">consts.h:115</a></div></div>
<div class="ttc" id="aconsts_8h_html_a25fd08252b97a0230d3efc899bddd240"><div class="ttname"><a href="consts_8h.html#a25fd08252b97a0230d3efc899bddd240">LZMA_PROPERTIES_LENGTH</a></div><div class="ttdeci">#define LZMA_PROPERTIES_LENGTH</div><div class="ttdoc">Size in bytes of the fixed LZMA properties header (lc/lp/pb + dictionary size).</div><div class="ttdef"><b>Definition</b> <a href="consts_8h_source.html#l00082">consts.h:82</a></div></div>
<div class="ttc" id="aconsts_8h_html_a3c3ba66fe2b547655c9e4b16a1ba519a"><div class="ttname"><a href="consts_8h.html#a3c3ba66fe2b547655c9e4b16a1ba519a">AARU_MAGIC</a></div><div class="ttdeci">#define AARU_MAGIC</div><div class="ttdoc">Magic identifier for AaruFormat container (ASCII &quot;AARUFRMT&quot;).</div><div class="ttdef"><b>Definition</b> <a href="consts_8h_source.html#l00064">consts.h:64</a></div></div>
<div class="ttc" id="acontext_8h_html"><div class="ttname"><a href="context_8h.html">context.h</a></div><div class="ttdoc">Central runtime context structures for libaaruformat (image state, caches, checksum buffers).</div></div>
<div class="ttc" id="adata_8h_html"><div class="ttname"><a href="data_8h.html">data.h</a></div><div class="ttdoc">On-disk layout structures for data-bearing and geometry blocks.</div></div>
<div class="ttc" id="addt_8h_html"><div class="ttname"><a href="ddt_8h.html">ddt.h</a></div><div class="ttdoc">On-disk headers for Deduplication Data Tables (DDT) versions 1 and 2.</div></div>
<div class="ttc" id="adecls_8h_html_a018e0da1c1f7e4f6187a982c0e40e056"><div class="ttname"><a href="decls_8h.html#a018e0da1c1f7e4f6187a982c0e40e056">AARU_CALL</a></div><div class="ttdeci">#define AARU_CALL</div><div class="ttdef"><b>Definition</b> <a href="decls_8h_source.html#l00046">decls.h:46</a></div></div>
<div class="ttc" id="adecls_8h_html_a0e69fad529047d6fe9440b1fc66c3f85"><div class="ttname"><a href="decls_8h.html#a0e69fad529047d6fe9440b1fc66c3f85">aaruf_lzma_encode_buffer</a></div><div class="ttdeci">int32_t aaruf_lzma_encode_buffer(uint8_t *dst_buffer, size_t *dst_size, const uint8_t *src_buffer, size_t src_size, uint8_t *out_props, size_t *out_props_size, int32_t level, uint32_t dict_size, int32_t lc, int32_t lp, int32_t pb, int32_t fb, int32_t num_threads)</div><div class="ttdoc">Encodes a buffer using LZMA compression.</div><div class="ttdef"><b>Definition</b> <a href="lzma_8c_source.html#l00065">lzma.c:65</a></div></div>
<div class="ttc" id="adecls_8h_html_a0fee4834bf0747bcd933c4e754aa4692"><div class="ttname"><a href="decls_8h.html#a0fee4834bf0747bcd933c4e754aa4692">aaruf_crc64_data</a></div><div class="ttdeci">uint64_t aaruf_crc64_data(const uint8_t *data, uint32_t len)</div><div class="ttdef"><b>Definition</b> <a href="crc64_8c_source.html#l00160">crc64.c:160</a></div></div>
<div class="ttc" id="adecls_8h_html_a12f3cbc43c2f57a11fbba32a71ba2704"><div class="ttname"><a href="decls_8h.html#a12f3cbc43c2f57a11fbba32a71ba2704">aaruf_lzma_decode_buffer</a></div><div class="ttdeci">int32_t aaruf_lzma_decode_buffer(uint8_t *dst_buffer, size_t *dst_size, const uint8_t *src_buffer, size_t *src_size, const uint8_t *props, size_t props_size)</div><div class="ttdoc">Decodes an LZMA-compressed buffer.</div><div class="ttdef"><b>Definition</b> <a href="lzma_8c_source.html#l00039">lzma.c:39</a></div></div>
<div class="ttc" id="adecls_8h_html_a3950b73c924a7096bb2313e0858a315a"><div class="ttname"><a href="decls_8h.html#a3950b73c924a7096bb2313e0858a315a">aaruf_zstd_encode_buffer</a></div><div class="ttdeci">size_t aaruf_zstd_encode_buffer(uint8_t *dst_buffer, size_t dst_size, const uint8_t *src_buffer, size_t src_size, int level, int num_threads)</div><div class="ttdoc">Encodes a buffer using Zstandard compression.</div><div class="ttdef"><b>Definition</b> <a href="zstd_8c_source.html#l00059">zstd.c:59</a></div></div>
<div class="ttc" id="adecls_8h_html_a9001412c35f3c92d3a9320d27b0d97f9"><div class="ttname"><a href="decls_8h.html#a9001412c35f3c92d3a9320d27b0d97f9">AARU_EXPORT</a></div><div class="ttdeci">#define AARU_EXPORT</div><div class="ttdef"><b>Definition</b> <a href="decls_8h_source.html#l00055">decls.h:55</a></div></div>
<div class="ttc" id="adecls_8h_html_ac0f8004dbea44979bf8b58c3e3a1a6ae"><div class="ttname"><a href="decls_8h.html#ac0f8004dbea44979bf8b58c3e3a1a6ae">aaruf_zstd_decode_buffer</a></div><div class="ttdeci">size_t aaruf_zstd_decode_buffer(uint8_t *dst_buffer, size_t dst_size, const uint8_t *src_buffer, size_t src_size)</div><div class="ttdoc">Decodes a Zstandard-compressed buffer.</div><div class="ttdef"><b>Definition</b> <a href="zstd_8c_source.html#l00034">zstd.c:34</a></div></div>
<div class="ttc" id="adecls_8h_html_af0ff6ad1495d50a8fa0ce0005be69471"><div class="ttname"><a href="decls_8h.html#af0ff6ad1495d50a8fa0ce0005be69471">aaruf_flac_decode_redbook_buffer</a></div><div class="ttdeci">size_t aaruf_flac_decode_redbook_buffer(uint8_t *dst_buffer, size_t dst_size, const uint8_t *src_buffer, size_t src_size)</div><div class="ttdoc">Decodes a FLAC-compressed Red Book audio buffer.</div><div class="ttdef"><b>Definition</b> <a href="flac_8c_source.html#l00048">flac.c:48</a></div></div>
<div class="ttc" id="aenums_8h_html"><div class="ttname"><a href="enums_8h.html">enums.h</a></div></div>
<div class="ttc" id="aenums_8h_html_a485c1f7093f3c3171ac27404bfb1b03ea5fb086c67288ffec790901b1026b3e0f"><div class="ttname"><a href="enums_8h.html#a485c1f7093f3c3171ac27404bfb1b03ea5fb086c67288ffec790901b1026b3e0f">kECGroupMetadata</a></div><div class="ttdeci">@ kECGroupMetadata</div><div class="ttdoc">Metadata/media tag blocks.</div><div class="ttdef"><b>Definition</b> <a href="enums_8h_source.html#l00341">enums.h:341</a></div></div>
<div class="ttc" id="aenums_8h_html_a485c1f7093f3c3171ac27404bfb1b03ea85486aa10ff27c8196e2f063b097679e"><div class="ttname"><a href="enums_8h.html#a485c1f7093f3c3171ac27404bfb1b03ea85486aa10ff27c8196e2f063b097679e">kECGroupIndex</a></div><div class="ttdeci">@ kECGroupIndex</div><div class="ttdoc">Index block (K=1, M replicas).</div><div class="ttdef"><b>Definition</b> <a href="enums_8h_source.html#l00342">enums.h:342</a></div></div>
<div class="ttc" id="aenums_8h_html_a485c1f7093f3c3171ac27404bfb1b03eaba5fd72984872e2da8f9adcee83c592a"><div class="ttname"><a href="enums_8h.html#a485c1f7093f3c3171ac27404bfb1b03eaba5fd72984872e2da8f9adcee83c592a">kECGroupDdtPrimary</a></div><div class="ttdeci">@ kECGroupDdtPrimary</div><div class="ttdoc">Primary DDT (K=1, M replicas).</div><div class="ttdef"><b>Definition</b> <a href="enums_8h_source.html#l00340">enums.h:340</a></div></div>
<div class="ttc" id="aenums_8h_html_a485c1f7093f3c3171ac27404bfb1b03eacca27cc435d2d572b6d740594da18db9"><div class="ttname"><a href="enums_8h.html#a485c1f7093f3c3171ac27404bfb1b03eacca27cc435d2d572b6d740594da18db9">kECGroupData</a></div><div class="ttdeci">@ kECGroupData</div><div class="ttdoc">User data blocks (DBLK).</div><div class="ttdef"><b>Definition</b> <a href="enums_8h_source.html#l00338">enums.h:338</a></div></div>
<div class="ttc" id="aenums_8h_html_a485c1f7093f3c3171ac27404bfb1b03eaf5acb726ee779a2e93b636a0bee14972"><div class="ttname"><a href="enums_8h.html#a485c1f7093f3c3171ac27404bfb1b03eaf5acb726ee779a2e93b636a0bee14972">kECGroupDdtSecondary</a></div><div class="ttdeci">@ kECGroupDdtSecondary</div><div class="ttdoc">Secondary DDT subtables.</div><div class="ttdef"><b>Definition</b> <a href="enums_8h_source.html#l00339">enums.h:339</a></div></div>
<div class="ttc" id="aenums_8h_html_a54420623f26ab6bb61042b41cccf37a3a318acaf230a8ad091ef405caf7e4f411"><div class="ttname"><a href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3a318acaf230a8ad091ef405caf7e4f411">IndexBlock3</a></div><div class="ttdeci">@ IndexBlock3</div><div class="ttdoc">Block containing the index v3.</div><div class="ttdef"><b>Definition</b> <a href="enums_8h_source.html#l00171">enums.h:171</a></div></div>
<div class="ttc" id="aenums_8h_html_a54420623f26ab6bb61042b41cccf37a3a5a0811c5ee97536aef900cecb8787713"><div class="ttname"><a href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3a5a0811c5ee97536aef900cecb8787713">DataBlock</a></div><div class="ttdeci">@ DataBlock</div><div class="ttdoc">Block containing data.</div><div class="ttdef"><b>Definition</b> <a href="enums_8h_source.html#l00164">enums.h:164</a></div></div>
<div class="ttc" id="aenums_8h_html_a54420623f26ab6bb61042b41cccf37a3a6ee3c4c583df36e3dfe796593c1e9439"><div class="ttname"><a href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3a6ee3c4c583df36e3dfe796593c1e9439">IndexBlock2</a></div><div class="ttdeci">@ IndexBlock2</div><div class="ttdoc">Block containing the index v2.</div><div class="ttdef"><b>Definition</b> <a href="enums_8h_source.html#l00170">enums.h:170</a></div></div>
<div class="ttc" id="aenums_8h_html_a54420623f26ab6bb61042b41cccf37a3a76b6a78e4e765794c4cca2dde5bfc3fb"><div class="ttname"><a href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3a76b6a78e4e765794c4cca2dde5bfc3fb">DeDuplicationTableSecondary</a></div><div class="ttdeci">@ DeDuplicationTableSecondary</div><div class="ttdoc">Block containing a secondary deduplication table (v2).</div><div class="ttdef"><b>Definition</b> <a href="enums_8h_source.html#l00168">enums.h:168</a></div></div>
<div class="ttc" id="aenums_8h_html_a54420623f26ab6bb61042b41cccf37a3ab8d63dc690b2ba82f066fdc31ab5adad"><div class="ttname"><a href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3ab8d63dc690b2ba82f066fdc31ab5adad">IndexBlock</a></div><div class="ttdeci">@ IndexBlock</div><div class="ttdoc">Block containing the index (v1).</div><div class="ttdef"><b>Definition</b> <a href="enums_8h_source.html#l00169">enums.h:169</a></div></div>
<div class="ttc" id="aenums_8h_html_a54420623f26ab6bb61042b41cccf37a3aba4d0f50b26af1d0292daaa0d70feacf"><div class="ttname"><a href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3aba4d0f50b26af1d0292daaa0d70feacf">DeDuplicationTable2</a></div><div class="ttdeci">@ DeDuplicationTable2</div><div class="ttdoc">Block containing a deduplication table v2.</div><div class="ttdef"><b>Definition</b> <a href="enums_8h_source.html#l00166">enums.h:166</a></div></div>
<div class="ttc" id="aenums_8h_html_a54420623f26ab6bb61042b41cccf37a3ac9f1e20a51c73f238aa322e180c42bd4"><div class="ttname"><a href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3ac9f1e20a51c73f238aa322e180c42bd4">DeDuplicationTable</a></div><div class="ttdeci">@ DeDuplicationTable</div><div class="ttdoc">Block containing a deduplication table (v1).</div><div class="ttdef"><b>Definition</b> <a href="enums_8h_source.html#l00165">enums.h:165</a></div></div>
<div class="ttc" id="aenums_8h_html_a54420623f26ab6bb61042b41cccf37a3af9f5bd022e035b2a787279913a85cf19"><div class="ttname"><a href="enums_8h.html#a54420623f26ab6bb61042b41cccf37a3af9f5bd022e035b2a787279913a85cf19">ErasureCodingMapBlock</a></div><div class="ttdeci">@ ErasureCodingMapBlock</div><div class="ttdoc">Block containing erasure coding stripe map and recovery metadata.</div><div class="ttdef"><b>Definition</b> <a href="enums_8h_source.html#l00187">enums.h:187</a></div></div>
<div class="ttc" id="aenums_8h_html_a8224cd67a8e4e3d365e0371899c7065fa8b803843c50589f197b6461d1c74ea9b"><div class="ttname"><a href="enums_8h.html#a8224cd67a8e4e3d365e0371899c7065fa8b803843c50589f197b6461d1c74ea9b">AARU_FEATURE_ROCOMPAT_ERASURE</a></div><div class="ttdeci">@ AARU_FEATURE_ROCOMPAT_ERASURE</div><div class="ttdoc">Image contains erasure coding parity blocks and recovery metadata.</div><div class="ttdef"><b>Definition</b> <a href="enums_8h_source.html#l00319">enums.h:319</a></div></div>
<div class="ttc" id="aenums_8h_html_a83c99da65804eb80cfb955eb9a15ef5ea80cd481d5fe067366bbde7db7cab4e22"><div class="ttname"><a href="enums_8h.html#a83c99da65804eb80cfb955eb9a15ef5ea80cd481d5fe067366bbde7db7cab4e22">kErasureCodingRsVandermonde</a></div><div class="ttdeci">@ kErasureCodingRsVandermonde</div><div class="ttdoc">Reed-Solomon with Vandermonde generator matrix over GF(2^8).</div><div class="ttdef"><b>Definition</b> <a href="enums_8h_source.html#l00329">enums.h:329</a></div></div>
<div class="ttc" id="aenums_8h_html_a83c99da65804eb80cfb955eb9a15ef5ead3ee61b96379729331df2b6ed04a95a0"><div class="ttname"><a href="enums_8h.html#a83c99da65804eb80cfb955eb9a15ef5ead3ee61b96379729331df2b6ed04a95a0">kErasureCodingXor</a></div><div class="ttdeci">@ kErasureCodingXor</div><div class="ttdoc">Simple XOR parity (M must be 1).</div><div class="ttdef"><b>Definition</b> <a href="enums_8h_source.html#l00328">enums.h:328</a></div></div>
<div class="ttc" id="aenums_8h_html_ad8ed01ff3ff33333d8e19db4d2818bb6a0415d7a4a6fe1e616eecc1a0465c8dd4"><div class="ttname"><a href="enums_8h.html#ad8ed01ff3ff33333d8e19db4d2818bb6a0415d7a4a6fe1e616eecc1a0465c8dd4">kDataTypeErasureParityDdt</a></div><div class="ttdeci">@ kDataTypeErasureParityDdt</div><div class="ttdoc">Erasure coding parity shard for DDT secondary blocks.</div><div class="ttdef"><b>Definition</b> <a href="enums_8h_source.html#l00152">enums.h:152</a></div></div>
<div class="ttc" id="aenums_8h_html_ad8ed01ff3ff33333d8e19db4d2818bb6a08a4aa580854c87d64264258bb690bc3"><div class="ttname"><a href="enums_8h.html#ad8ed01ff3ff33333d8e19db4d2818bb6a08a4aa580854c87d64264258bb690bc3">kDataTypeErasureParityDdtPrimary</a></div><div class="ttdeci">@ kDataTypeErasureParityDdtPrimary</div><div class="ttdoc">Erasure coding parity replica for DDT primary block.</div><div class="ttdef"><b>Definition</b> <a href="enums_8h_source.html#l00153">enums.h:153</a></div></div>
<div class="ttc" id="aenums_8h_html_ad8ed01ff3ff33333d8e19db4d2818bb6a5069a00563fe1a94724c8f15f463419d"><div class="ttname"><a href="enums_8h.html#ad8ed01ff3ff33333d8e19db4d2818bb6a5069a00563fe1a94724c8f15f463419d">kDataTypeErasureParityIndex</a></div><div class="ttdeci">@ kDataTypeErasureParityIndex</div><div class="ttdoc">Erasure coding parity replica for index block.</div><div class="ttdef"><b>Definition</b> <a href="enums_8h_source.html#l00155">enums.h:155</a></div></div>
<div class="ttc" id="aenums_8h_html_ad8ed01ff3ff33333d8e19db4d2818bb6aa85ba79bd52a96a4ca058718351b06f5"><div class="ttname"><a href="enums_8h.html#ad8ed01ff3ff33333d8e19db4d2818bb6aa85ba79bd52a96a4ca058718351b06f5">kDataTypeErasureParityMeta</a></div><div class="ttdeci">@ kDataTypeErasureParityMeta</div><div class="ttdoc">Erasure coding parity shard for metadata blocks.</div><div class="ttdef"><b>Definition</b> <a href="enums_8h_source.html#l00154">enums.h:154</a></div></div>
<div class="ttc" id="aenums_8h_html_ad8ed01ff3ff33333d8e19db4d2818bb6ace86d5a01f2f20eab66f36b8af9676c2"><div class="ttname"><a href="enums_8h.html#ad8ed01ff3ff33333d8e19db4d2818bb6ace86d5a01f2f20eab66f36b8af9676c2">kDataTypeUserData</a></div><div class="ttdeci">@ kDataTypeUserData</div><div class="ttdoc">User (main) data.</div><div class="ttdef"><b>Definition</b> <a href="enums_8h_source.html#l00048">enums.h:48</a></div></div>
<div class="ttc" id="aenums_8h_html_ad8ed01ff3ff33333d8e19db4d2818bb6adb8752d43e2e151c60d90bb2962d16a6"><div class="ttname"><a href="enums_8h.html#ad8ed01ff3ff33333d8e19db4d2818bb6adb8752d43e2e151c60d90bb2962d16a6">kDataTypeErasureParity</a></div><div class="ttdeci">@ kDataTypeErasureParity</div><div class="ttdoc">Erasure coding parity shard for data blocks.</div><div class="ttdef"><b>Definition</b> <a href="enums_8h_source.html#l00151">enums.h:151</a></div></div>
<div class="ttc" id="aenums_8h_html_af887903d155851fe30d08053c4b2c1b8a2ee503de2bb99eb6a677fd9871a9c44d"><div class="ttname"><a href="enums_8h.html#af887903d155851fe30d08053c4b2c1b8a2ee503de2bb99eb6a677fd9871a9c44d">AARUF_STATUS_INVALID_CONTEXT</a></div><div class="ttdeci">@ AARUF_STATUS_INVALID_CONTEXT</div><div class="ttdoc">Provided context/handle is invalid.</div><div class="ttdef"><b>Definition</b> <a href="enums_8h_source.html#l00237">enums.h:237</a></div></div>
<div class="ttc" id="aenums_8h_html_affec749ed88365143745313ae9168263a66b049c2b816874ab71b06cebf5afcd7"><div class="ttname"><a href="enums_8h.html#affec749ed88365143745313ae9168263a66b049c2b816874ab71b06cebf5afcd7">kCompressionLzma</a></div><div class="ttdeci">@ kCompressionLzma</div><div class="ttdoc">LZMA compression.</div><div class="ttdef"><b>Definition</b> <a href="enums_8h_source.html#l00034">enums.h:34</a></div></div>
<div class="ttc" id="aenums_8h_html_affec749ed88365143745313ae9168263a6925460497824fd20caa5ba1925cde84"><div class="ttname"><a href="enums_8h.html#affec749ed88365143745313ae9168263a6925460497824fd20caa5ba1925cde84">kCompressionNone</a></div><div class="ttdeci">@ kCompressionNone</div><div class="ttdoc">Not compressed.</div><div class="ttdef"><b>Definition</b> <a href="enums_8h_source.html#l00033">enums.h:33</a></div></div>
<div class="ttc" id="aenums_8h_html_affec749ed88365143745313ae9168263a6ee0deaccf9cd167806cc479afffc0cc"><div class="ttname"><a href="enums_8h.html#affec749ed88365143745313ae9168263a6ee0deaccf9cd167806cc479afffc0cc">kCompressionZstd</a></div><div class="ttdeci">@ kCompressionZstd</div><div class="ttdoc">Zstandard compression.</div><div class="ttdef"><b>Definition</b> <a href="enums_8h_source.html#l00037">enums.h:37</a></div></div>
<div class="ttc" id="aenums_8h_html_affec749ed88365143745313ae9168263ab68094bb67edceda03f5044de1e54428"><div class="ttname"><a href="enums_8h.html#affec749ed88365143745313ae9168263ab68094bb67edceda03f5044de1e54428">kCompressionFlac</a></div><div class="ttdeci">@ kCompressionFlac</div><div class="ttdoc">FLAC compression.</div><div class="ttdef"><b>Definition</b> <a href="enums_8h_source.html#l00035">enums.h:35</a></div></div>
<div class="ttc" id="aerasure_8c_html_a1222930aded868b0b0c4eeed13c237e2"><div class="ttname"><a href="erasure_8c.html#a1222930aded868b0b0c4eeed13c237e2">ec_collect_blocks_by_type</a></div><div class="ttdeci">static void ec_collect_blocks_by_type(aaruformat_context *ctx, uint32_t block_type, uint64_t **out_offsets, uint32_t **out_sizes, uint32_t *out_count)</div><div class="ttdoc">Collect file offsets and on-disk sizes for index entries matching a block type.</div><div class="ttdef"><b>Definition</b> <a href="#l00642">erasure.c:642</a></div></div>
<div class="ttc" id="aerasure_8c_html_a1883da545c74667f3438d8e48b195aa1"><div class="ttname"><a href="erasure_8c.html#a1883da545c74667f3438d8e48b195aa1">ec_stripe_icd</a></div><div class="ttdeci">static UT_icd ec_stripe_icd</div><div class="ttdef"><b>Definition</b> <a href="#l00065">erasure.c:65</a></div></div>
<div class="ttc" id="aerasure_8c_html_a18f424702fcd85725ee26c1cf7e253db"><div class="ttname"><a href="erasure_8c.html#a18f424702fcd85725ee26c1cf7e253db">ec_load_ecmb</a></div><div class="ttdeci">void ec_load_ecmb(aaruformat_context *ctx)</div><div class="ttdoc">Try to load the ECMB from the recovery footer at EOF.</div><div class="ttdef"><b>Definition</b> <a href="#l00941">erasure.c:941</a></div></div>
<div class="ttc" id="aerasure_8c_html_a38a12ac5d36e23b28d2f110906b14126"><div class="ttname"><a href="erasure_8c.html#a38a12ac5d36e23b28d2f110906b14126">ec_finalize</a></div><div class="ttdeci">void ec_finalize(aaruformat_context *ctx)</div><div class="ttdoc">Flush all partial data stripes and write parity for all groups + ECMB + recovery footer.</div><div class="ttdef"><b>Definition</b> <a href="#l00690">erasure.c:690</a></div></div>
<div class="ttc" id="aerasure_8c_html_a415f83d4f5fbce86adcec87aa368313c"><div class="ttname"><a href="erasure_8c.html#a415f83d4f5fbce86adcec87aa368313c">WRITE_GROUP</a></div><div class="ttdeci">#define WRITE_GROUP(desc, desc_len, grp)</div></div>
<div class="ttc" id="aerasure_8c_html_a51fe2ca1a6eabf109f0cfc4b3223508b"><div class="ttname"><a href="erasure_8c.html#a51fe2ca1a6eabf109f0cfc4b3223508b">aaruf_set_erasure_coding_auto</a></div><div class="ttdeci">int32_t aaruf_set_erasure_coding_auto(void *context, uint8_t recovery_percent)</div><div class="ttdoc">Configure erasure coding from a desired recovery percentage.</div><div class="ttdef"><b>Definition</b> <a href="#l00193">erasure.c:193</a></div></div>
<div class="ttc" id="aerasure_8c_html_a676c380c73d5adf73afd7613ec06b29d"><div class="ttname"><a href="erasure_8c.html#a676c380c73d5adf73afd7613ec06b29d">ec_accumulate_data_block</a></div><div class="ttdeci">void ec_accumulate_data_block(aaruformat_context *ctx, const BlockHeader *block_header, const uint8_t *lzma_props, const uint8_t *payload, uint32_t payload_size, uint64_t file_offset)</div><div class="ttdoc">Accumulate parity for a data block that was just written to disk.</div><div class="ttdef"><b>Definition</b> <a href="#l00228">erasure.c:228</a></div></div>
<div class="ttc" id="aerasure_8c_html_a7a9ac507738cdf72e951f152edd4d233"><div class="ttname"><a href="erasure_8c.html#a7a9ac507738cdf72e951f152edd4d233">ec_recover_data_block</a></div><div class="ttdeci">int32_t ec_recover_data_block(aaruformat_context *ctx, uint64_t block_offset, uint64_t offset, uint8_t *data, uint32_t *length, uint8_t sector_status)</div><div class="ttdoc">Attempt to recover a data block that failed decompression or CRC verification.</div><div class="ttdef"><b>Definition</b> <a href="#l01145">erasure.c:1145</a></div></div>
<div class="ttc" id="aerasure_8c_html_a8b0f3ab93ca60ce00321ca28c2484c7c"><div class="ttname"><a href="erasure_8c.html#a8b0f3ab93ca60ce00321ca28c2484c7c">aaruf_set_erasure_coding</a></div><div class="ttdeci">int32_t aaruf_set_erasure_coding(void *context, uint8_t algorithm, uint16_t K, uint16_t M)</div><div class="ttdoc">Configure erasure coding for a newly created image.</div><div class="ttdef"><b>Definition</b> <a href="#l00082">erasure.c:82</a></div></div>
<div class="ttc" id="aerasure_8c_html_aa258c90d05ad57fc4c378679e5187e48"><div class="ttname"><a href="erasure_8c.html#aa258c90d05ad57fc4c378679e5187e48">ec_flush_data_stripe</a></div><div class="ttdeci">void ec_flush_data_stripe(aaruformat_context *ctx, uint32_t slot)</div><div class="ttdoc">Write M parity blocks for a completed data stripe slot and record the stripe descriptor.</div><div class="ttdef"><b>Definition</b> <a href="#l00304">erasure.c:304</a></div></div>
<div class="ttc" id="aerasure_8c_html_ae5fe558b49013df6e932278061a2ab53"><div class="ttname"><a href="erasure_8c.html#ae5fe558b49013df6e932278061a2ab53">ec_free</a></div><div class="ttdeci">void ec_free(aaruformat_context *ctx)</div><div class="ttdoc">Free all erasure coding state from the context.</div><div class="ttdef"><b>Definition</b> <a href="#l00876">erasure.c:876</a></div></div>
<div class="ttc" id="aerasure_8c_html_aed80b4dc1f360dbac00a5f73d350bf1a"><div class="ttname"><a href="erasure_8c.html#aed80b4dc1f360dbac00a5f73d350bf1a">ec_write_batch_parity</a></div><div class="ttdeci">static void ec_write_batch_parity(aaruformat_context *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, StripeGroupDescriptor *out_group)</div><div class="ttdoc">Compute and write batch parity for a set of blocks already on disk.</div><div class="ttdef"><b>Definition</b> <a href="#l00495">erasure.c:495</a></div></div>
<div class="ttc" id="aerasure_8h_html"><div class="ttname"><a href="erasure_8h.html">erasure.h</a></div><div class="ttdoc">On-disk structures for erasure coding recovery data.</div></div>
<div class="ttc" id="aerrors_8h_html"><div class="ttname"><a href="errors_8h.html">errors.h</a></div><div class="ttdoc">Public error and status code definitions for libaaruformat.</div></div>
<div class="ttc" id="aerrors_8h_html_a1d6e49f7e8a1fa489efa0a582e90b5de"><div class="ttname"><a href="errors_8h.html#a1d6e49f7e8a1fa489efa0a582e90b5de">AARUF_STATUS_OK</a></div><div class="ttdeci">#define AARUF_STATUS_OK</div><div class="ttdoc">Sector present and read without uncorrectable errors.</div><div class="ttdef"><b>Definition</b> <a href="errors_8h_source.html#l00081">errors.h:81</a></div></div>
<div class="ttc" id="aerrors_8h_html_a1df49eaa19eaa14891b6aaab966a9bc6"><div class="ttname"><a href="errors_8h.html#a1df49eaa19eaa14891b6aaab966a9bc6">AARUF_READ_ONLY</a></div><div class="ttdeci">#define AARUF_READ_ONLY</div><div class="ttdoc">Operation requires write mode but context is read-only.</div><div class="ttdef"><b>Definition</b> <a href="errors_8h_source.html#l00061">errors.h:61</a></div></div>
<div class="ttc" id="aerrors_8h_html_a35a771e3648bf971a004d4b2be9b5ec4"><div class="ttname"><a href="errors_8h.html#a35a771e3648bf971a004d4b2be9b5ec4">AARUF_ERROR_NOT_ENOUGH_MEMORY</a></div><div class="ttdeci">#define AARUF_ERROR_NOT_ENOUGH_MEMORY</div><div class="ttdoc">Memory allocation failure (critical).</div><div class="ttdef"><b>Definition</b> <a href="errors_8h_source.html#l00048">errors.h:48</a></div></div>
<div class="ttc" id="aerrors_8h_html_a8fc3ecb14777e72bebad62084b6caf16"><div class="ttname"><a href="errors_8h.html#a8fc3ecb14777e72bebad62084b6caf16">AARUF_ERROR_INCORRECT_DATA_SIZE</a></div><div class="ttdeci">#define AARUF_ERROR_INCORRECT_DATA_SIZE</div><div class="ttdoc">Data size does not match expected size.</div><div class="ttdef"><b>Definition</b> <a href="errors_8h_source.html#l00065">errors.h:65</a></div></div>
<div class="ttc" id="aerrors_8h_html_ac9f4e38e8d5a1f940c9cd0c7f6788c37"><div class="ttname"><a href="errors_8h.html#ac9f4e38e8d5a1f940c9cd0c7f6788c37">AARUF_ERROR_CANNOT_DECOMPRESS_BLOCK</a></div><div class="ttdeci">#define AARUF_ERROR_CANNOT_DECOMPRESS_BLOCK</div><div class="ttdoc">Decompression routine failed or size mismatch.</div><div class="ttdef"><b>Definition</b> <a href="errors_8h_source.html#l00056">errors.h:56</a></div></div>
<div class="ttc" id="agf256_8h_html"><div class="ttname"><a href="gf256_8h.html">gf256.h</a></div></div>
<div class="ttc" id="aindex_8h_html"><div class="ttname"><a href="index_8h.html">index.h</a></div><div class="ttdoc">Ondisk index block header and entry structures (versions 1, 2 and 3).</div></div>
<div class="ttc" id="ainternal_8h_html"><div class="ttname"><a href="internal_8h.html">internal.h</a></div></div>
<div class="ttc" id="ainternal_8h_html_a60c57e3b2e8e233d0be91f3690bf077c"><div class="ttname"><a href="internal_8h.html#a60c57e3b2e8e233d0be91f3690bf077c">aaruf_fseek</a></div><div class="ttdeci">static int aaruf_fseek(FILE *stream, aaru_off_t offset, int origin)</div><div class="ttdef"><b>Definition</b> <a href="internal_8h_source.html#l00046">internal.h:46</a></div></div>
<div class="ttc" id="ainternal_8h_html_a697ee4ab2c7adc710e56b0ef868596d7"><div class="ttname"><a href="internal_8h.html#a697ee4ab2c7adc710e56b0ef868596d7">aaruf_ftell</a></div><div class="ttdeci">static aaru_off_t aaruf_ftell(FILE *stream)</div><div class="ttdef"><b>Definition</b> <a href="internal_8h_source.html#l00052">internal.h:52</a></div></div>
<div class="ttc" id="ainternal_8h_html_a96247194f6c1e4090020e2a3691f8c9d"><div class="ttname"><a href="internal_8h.html#a96247194f6c1e4090020e2a3691f8c9d">LZMA_THREADS</a></div><div class="ttdeci">#define LZMA_THREADS(ctx)</div><div class="ttdoc">Clamp num_threads to LZMA&#39;s valid range [1, 2].</div><div class="ttdef"><b>Definition</b> <a href="internal_8h_source.html#l00023">internal.h:23</a></div></div>
<div class="ttc" id="ainternal_8h_html_afb4a123eeae51c668333248fb666e0f2"><div class="ttname"><a href="internal_8h.html#afb4a123eeae51c668333248fb666e0f2">aaru_off_t</a></div><div class="ttdeci">int64_t aaru_off_t</div><div class="ttdef"><b>Definition</b> <a href="internal_8h_source.html#l00042">internal.h:42</a></div></div>
<div class="ttc" id="alog_8h_html"><div class="ttname"><a href="log_8h.html">log.h</a></div></div>
<div class="ttc" id="alog_8h_html_a21cc0459b78d5f2d7bd737e5aae1278a"><div class="ttname"><a href="log_8h.html#a21cc0459b78d5f2d7bd737e5aae1278a">TRACE</a></div><div class="ttdeci">#define TRACE(fmt,...)</div><div class="ttdef"><b>Definition</b> <a href="log_8h_source.html#l00025">log.h:25</a></div></div>
<div class="ttc" id="alru_8h_html_a0735969939ca80db3fe439ed92b787bb"><div class="ttname"><a href="lru_8h.html#a0735969939ca80db3fe439ed92b787bb">add_to_cache_uint64</a></div><div class="ttdeci">void add_to_cache_uint64(struct CacheHeader *cache, uint64_t key, void *value)</div><div class="ttdoc">Adds a value to the cache with a uint64_t key, evicting LRU if full.</div><div class="ttdef"><b>Definition</b> <a href="lru_8c_source.html#l00048">lru.c:48</a></div></div>
<div class="ttc" id="areed__solomon_8c_html_a5eed1476ef3e8666f011b529337b8518"><div class="ttname"><a href="reed__solomon_8c.html#a5eed1476ef3e8666f011b529337b8518">rs_free</a></div><div class="ttdeci">void rs_free(rs_context *ctx)</div><div class="ttdoc">Free a Reed-Solomon codec context.</div><div class="ttdef"><b>Definition</b> <a href="reed__solomon_8c_source.html#l00201">reed_solomon.c:201</a></div></div>
<div class="ttc" id="areed__solomon_8c_html_a68a7b13ef6443640abc2818a3bd7d5bf"><div class="ttname"><a href="reed__solomon_8c.html#a68a7b13ef6443640abc2818a3bd7d5bf">rs_create</a></div><div class="ttdeci">rs_context * rs_create(uint16_t K, uint16_t M)</div><div class="ttdoc">Create a Reed-Solomon codec for RS(K, M) over GF(2^8).</div><div class="ttdef"><b>Definition</b> <a href="reed__solomon_8c_source.html#l00150">reed_solomon.c:150</a></div></div>
<div class="ttc" id="areed__solomon_8c_html_ab02dd67e8f4b96de007048f30649adb1"><div class="ttname"><a href="reed__solomon_8c.html#ab02dd67e8f4b96de007048f30649adb1">rs_encode_incremental</a></div><div class="ttdeci">void rs_encode_incremental(uint8_t coeff, const uint8_t *data, uint8_t *parity, size_t shard_size)</div><div class="ttdoc">Incrementally accumulate one data shard&#39;s contribution to one parity shard.</div><div class="ttdef"><b>Definition</b> <a href="reed__solomon_8c_source.html#l00213">reed_solomon.c:213</a></div></div>
<div class="ttc" id="areed__solomon_8c_html_ada549b6a6028807b96d975bba70bea2d"><div class="ttname"><a href="reed__solomon_8c.html#ada549b6a6028807b96d975bba70bea2d">rs_get_coefficient</a></div><div class="ttdeci">uint8_t rs_get_coefficient(const rs_context *ctx, uint16_t m, uint16_t k)</div><div class="ttdoc">Get the generator matrix coefficient for parity shard m, data shard k.</div><div class="ttdef"><b>Definition</b> <a href="reed__solomon_8c_source.html#l00208">reed_solomon.c:208</a></div></div>
<div class="ttc" id="areed__solomon_8c_html_aea0122b72cfa6f77a4751d5466e73024"><div class="ttname"><a href="reed__solomon_8c.html#aea0122b72cfa6f77a4751d5466e73024">rs_decode</a></div><div class="ttdeci">int rs_decode(const rs_context *ctx, uint8_t **shards, const uint8_t *present, size_t shard_size)</div><div class="ttdoc">Decode (reconstruct) erased shards.</div><div class="ttdef"><b>Definition</b> <a href="reed__solomon_8c_source.html#l00218">reed_solomon.c:218</a></div></div>
<div class="ttc" id="areed__solomon_8h_html"><div class="ttname"><a href="reed__solomon_8h.html">reed_solomon.h</a></div></div>
<div class="ttc" id="asha256_8c_html_a22c6551e88df4c5c42fce3d0641adb64"><div class="ttname"><a href="sha256_8c.html#a22c6551e88df4c5c42fce3d0641adb64">K</a></div><div class="ttdeci">static const uint32_t K[64]</div><div class="ttdef"><b>Definition</b> <a href="sha256_8c_source.html#l00031">sha256.c:31</a></div></div>
<div class="ttc" id="astructAaruHeaderV2_html"><div class="ttname"><a href="structAaruHeaderV2.html">AaruHeaderV2</a></div><div class="ttdoc">Version 2 container header with GUID, alignment shifts, and feature negotiation bitmaps.</div><div class="ttdef"><b>Definition</b> <a href="header_8h_source.html#l00106">header.h:107</a></div></div>
<div class="ttc" id="astructAaruHeaderV2_html_a4ec4b1d593f5a0af19f6d7b8eaeada40"><div class="ttname"><a href="structAaruHeaderV2.html#a4ec4b1d593f5a0af19f6d7b8eaeada40">AaruHeaderV2::indexOffset</a></div><div class="ttdeci">uint64_t indexOffset</div><div class="ttdoc">Absolute byte offset to primary index block (MUST be &gt; 0; 0 =&gt; corrupt/unreadable).</div><div class="ttdef"><b>Definition</b> <a href="header_8h_source.html#l00115">header.h:115</a></div></div>
<div class="ttc" id="astructAaruHeaderV2_html_a9dae72bee3d161760dbbe389e4a70444"><div class="ttname"><a href="structAaruHeaderV2.html#a9dae72bee3d161760dbbe389e4a70444">AaruHeaderV2::featureCompatibleRo</a></div><div class="ttdeci">uint64_t featureCompatibleRo</div><div class="ttdoc">Feature bits: unimplemented -&gt; degrade to read-only access.</div><div class="ttdef"><b>Definition</b> <a href="header_8h_source.html#l00122">header.h:122</a></div></div>
<div class="ttc" id="astructAaruRecoveryFooter_html"><div class="ttname"><a href="structAaruRecoveryFooter.html">AaruRecoveryFooter</a></div><div class="ttdoc">Recovery footer written at the very end of the file (last 160 bytes).</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00116">erasure.h:117</a></div></div>
<div class="ttc" id="astructAaruRecoveryFooter_html_a2a0e7425f369422c197cda6b4ff56033"><div class="ttname"><a href="structAaruRecoveryFooter.html#a2a0e7425f369422c197cda6b4ff56033">AaruRecoveryFooter::headerCrc64</a></div><div class="ttdeci">uint64_t headerCrc64</div><div class="ttdoc">CRC64-ECMA of the original AaruHeaderV2 (128 bytes at offset 0).</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00120">erasure.h:120</a></div></div>
<div class="ttc" id="astructAaruRecoveryFooter_html_a67e4601f7be9a5f7e84cb3adfb98e68a"><div class="ttname"><a href="structAaruRecoveryFooter.html#a67e4601f7be9a5f7e84cb3adfb98e68a">AaruRecoveryFooter::ecmbOffset</a></div><div class="ttdeci">uint64_t ecmbOffset</div><div class="ttdoc">Absolute file offset of the primary ECMB.</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00118">erasure.h:118</a></div></div>
<div class="ttc" id="astructAaruRecoveryFooter_html_a8d65cec53b91b52d2bafb7e76eef818a"><div class="ttname"><a href="structAaruRecoveryFooter.html#a8d65cec53b91b52d2bafb7e76eef818a">AaruRecoveryFooter::footerMagic</a></div><div class="ttdeci">uint64_t footerMagic</div><div class="ttdoc">Must be AARU_RECOVERY_FOOTER_MAGIC (0x52464D4345525641).</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00122">erasure.h:122</a></div></div>
<div class="ttc" id="astructAaruRecoveryFooter_html_ad3f4ad3842317379eea5ad1bd3335482"><div class="ttname"><a href="structAaruRecoveryFooter.html#ad3f4ad3842317379eea5ad1bd3335482">AaruRecoveryFooter::ecmbLength</a></div><div class="ttdeci">uint64_t ecmbLength</div><div class="ttdoc">Total on-disk size of the ECMB (header + payload).</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00119">erasure.h:119</a></div></div>
<div class="ttc" id="astructAaruRecoveryFooter_html_afd53d818d8d4f4c23e4483bfea1701f5"><div class="ttname"><a href="structAaruRecoveryFooter.html#afd53d818d8d4f4c23e4483bfea1701f5">AaruRecoveryFooter::backupHeader</a></div><div class="ttdeci">AaruHeaderV2 backupHeader</div><div class="ttdoc">Complete copy of AaruHeaderV2 from file offset 0.</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00121">erasure.h:121</a></div></div>
<div class="ttc" id="astructBlockHeader_html"><div class="ttname"><a href="structBlockHeader.html">BlockHeader</a></div><div class="ttdoc">Header preceding the compressed data payload of a data block (BlockType::DataBlock).</div><div class="ttdef"><b>Definition</b> <a href="data_8h_source.html#l00070">data.h:71</a></div></div>
<div class="ttc" id="astructBlockHeader_html_a0ee87beb4362823260f70a87ac17379f"><div class="ttname"><a href="structBlockHeader.html#a0ee87beb4362823260f70a87ac17379f">BlockHeader::cmpLength</a></div><div class="ttdeci">uint32_t cmpLength</div><div class="ttdoc">Size in bytes of the compressed payload immediately following this header.</div><div class="ttdef"><b>Definition</b> <a href="data_8h_source.html#l00076">data.h:76</a></div></div>
<div class="ttc" id="astructBlockHeader_html_a1f9f3204a10090709b28d0df4bb547e5"><div class="ttname"><a href="structBlockHeader.html#a1f9f3204a10090709b28d0df4bb547e5">BlockHeader::length</a></div><div class="ttdeci">uint32_t length</div><div class="ttdoc">Size in bytes of the uncompressed payload resulting after decompression.</div><div class="ttdef"><b>Definition</b> <a href="data_8h_source.html#l00077">data.h:77</a></div></div>
<div class="ttc" id="astructBlockHeader_html_a3b03f118fb2dc3dcef3f87a82238e358"><div class="ttname"><a href="structBlockHeader.html#a3b03f118fb2dc3dcef3f87a82238e358">BlockHeader::identifier</a></div><div class="ttdeci">uint32_t identifier</div><div class="ttdoc">Block identifier, must be BlockType::DataBlock.</div><div class="ttdef"><b>Definition</b> <a href="data_8h_source.html#l00072">data.h:72</a></div></div>
<div class="ttc" id="astructBlockHeader_html_a5bd50f95c8c1f91e5013a1a154690beb"><div class="ttname"><a href="structBlockHeader.html#a5bd50f95c8c1f91e5013a1a154690beb">BlockHeader::sectorSize</a></div><div class="ttdeci">uint32_t sectorSize</div><div class="ttdoc">Size in bytes of each logical sector represented in this block.</div><div class="ttdef"><b>Definition</b> <a href="data_8h_source.html#l00075">data.h:75</a></div></div>
<div class="ttc" id="astructBlockHeader_html_a8ff40eae6c49f0d9b49825f75e1e2bf8"><div class="ttname"><a href="structBlockHeader.html#a8ff40eae6c49f0d9b49825f75e1e2bf8">BlockHeader::cmpCrc64</a></div><div class="ttdeci">uint64_t cmpCrc64</div><div class="ttdoc">CRC64-ECMA of the compressed payload (cmpLength bytes).</div><div class="ttdef"><b>Definition</b> <a href="data_8h_source.html#l00078">data.h:78</a></div></div>
<div class="ttc" id="astructBlockHeader_html_ab4d9e3a871e0c7f12a881017dac4ca12"><div class="ttname"><a href="structBlockHeader.html#ab4d9e3a871e0c7f12a881017dac4ca12">BlockHeader::crc64</a></div><div class="ttdeci">uint64_t crc64</div><div class="ttdoc">CRC64-ECMA of the uncompressed payload (length bytes).</div><div class="ttdef"><b>Definition</b> <a href="data_8h_source.html#l00079">data.h:79</a></div></div>
<div class="ttc" id="astructBlockHeader_html_ac31ad48f3362a43175c94ec2e30662ad"><div class="ttname"><a href="structBlockHeader.html#ac31ad48f3362a43175c94ec2e30662ad">BlockHeader::type</a></div><div class="ttdeci">uint16_t type</div><div class="ttdoc">Logical data classification (value from DataType).</div><div class="ttdef"><b>Definition</b> <a href="data_8h_source.html#l00073">data.h:73</a></div></div>
<div class="ttc" id="astructBlockHeader_html_ad68963422fd2a5f6d0e0be751cbef559"><div class="ttname"><a href="structBlockHeader.html#ad68963422fd2a5f6d0e0be751cbef559">BlockHeader::compression</a></div><div class="ttdeci">uint16_t compression</div><div class="ttdoc">Compression algorithm used (value from CompressionType).</div><div class="ttdef"><b>Definition</b> <a href="data_8h_source.html#l00074">data.h:74</a></div></div>
<div class="ttc" id="astructDdtHeader2_html"><div class="ttname"><a href="structDdtHeader2.html">DdtHeader2</a></div><div class="ttdoc">Header preceding a version 2 hierarchical deduplication table.</div><div class="ttdef"><b>Definition</b> <a href="ddt_8h_source.html#l00141">ddt.h:142</a></div></div>
<div class="ttc" id="astructDdtHeader2_html_aa67b097c3a20f926ede495d27152f1c0"><div class="ttname"><a href="structDdtHeader2.html#aa67b097c3a20f926ede495d27152f1c0">DdtHeader2::blockAlignmentShift</a></div><div class="ttdeci">uint8_t blockAlignmentShift</div><div class="ttdoc">2^blockAlignmentShift = block alignment boundary in bytes.</div><div class="ttdef"><b>Definition</b> <a href="ddt_8h_source.html#l00154">ddt.h:154</a></div></div>
<div class="ttc" id="astructDdtHeader2_html_ad9a2beb3a79bc6c239ba04fe341e0cde"><div class="ttname"><a href="structDdtHeader2.html#ad9a2beb3a79bc6c239ba04fe341e0cde">DdtHeader2::dataShift</a></div><div class="ttdeci">uint8_t dataShift</div><div class="ttdoc">2^dataShift = sectors represented per increment in blockIndex field.</div><div class="ttdef"><b>Definition</b> <a href="ddt_8h_source.html#l00155">ddt.h:155</a></div></div>
<div class="ttc" id="astructDdtHeader2_html_aee50fc92a9151bd352808b28bccd5045"><div class="ttname"><a href="structDdtHeader2.html#aee50fc92a9151bd352808b28bccd5045">DdtHeader2::cmpLength</a></div><div class="ttdeci">uint64_t cmpLength</div><div class="ttdoc">Compressed payload size in bytes.</div><div class="ttdef"><b>Definition</b> <a href="ddt_8h_source.html#l00159">ddt.h:159</a></div></div>
<div class="ttc" id="astructEcBlockLookupEntry_html"><div class="ttname"><a href="structEcBlockLookupEntry.html">EcBlockLookupEntry</a></div><div class="ttdoc">Hash table entry mapping block file offset -&gt; stripe index + position.</div><div class="ttdef"><b>Definition</b> <a href="#l00054">erasure.c:55</a></div></div>
<div class="ttc" id="astructEcBlockLookupEntry_html_a13a8928f4f9cc3d0d7a30b1d0530c016"><div class="ttname"><a href="structEcBlockLookupEntry.html#a13a8928f4f9cc3d0d7a30b1d0530c016">EcBlockLookupEntry::block_offset</a></div><div class="ttdeci">uint64_t block_offset</div><div class="ttdoc">Key: file offset of the data block.</div><div class="ttdef"><b>Definition</b> <a href="#l00056">erasure.c:56</a></div></div>
<div class="ttc" id="astructEcBlockLookupEntry_html_a8645b89803f927a7608a6f8d30d74292"><div class="ttname"><a href="structEcBlockLookupEntry.html#a8645b89803f927a7608a6f8d30d74292">EcBlockLookupEntry::position</a></div><div class="ttdeci">uint16_t position</div><div class="ttdoc">Position within the stripe (0..actual_k-1).</div><div class="ttdef"><b>Definition</b> <a href="#l00058">erasure.c:58</a></div></div>
<div class="ttc" id="astructEcBlockLookupEntry_html_aafe5aa886cf56f4dbcc9c7426792e61c"><div class="ttname"><a href="structEcBlockLookupEntry.html#aafe5aa886cf56f4dbcc9c7426792e61c">EcBlockLookupEntry::hh</a></div><div class="ttdeci">UT_hash_handle hh</div><div class="ttdef"><b>Definition</b> <a href="#l00059">erasure.c:59</a></div></div>
<div class="ttc" id="astructEcBlockLookupEntry_html_aedeac38371118113a77e02cc65512320"><div class="ttname"><a href="structEcBlockLookupEntry.html#aedeac38371118113a77e02cc65512320">EcBlockLookupEntry::stripe_index</a></div><div class="ttdeci">uint32_t stripe_index</div><div class="ttdoc">Index into ec_read_stripes array.</div><div class="ttdef"><b>Definition</b> <a href="#l00057">erasure.c:57</a></div></div>
<div class="ttc" id="astructEcReadStripe_html"><div class="ttname"><a href="structEcReadStripe.html">EcReadStripe</a></div><div class="ttdoc">In-memory representation of one data stripe (parsed from ECMB).</div><div class="ttdef"><b>Definition</b> <a href="#l00046">erasure.c:47</a></div></div>
<div class="ttc" id="astructEcReadStripe_html_a196073177bb5753b30b17ad495af7b97"><div class="ttname"><a href="structEcReadStripe.html#a196073177bb5753b30b17ad495af7b97">EcReadStripe::data_entries</a></div><div class="ttdeci">StripeDataBlockEntry * data_entries</div><div class="ttdoc">Array of actual_k entries.</div><div class="ttdef"><b>Definition</b> <a href="#l00049">erasure.c:49</a></div></div>
<div class="ttc" id="astructEcReadStripe_html_a80b525ebfe07bff2cb08bf97ce633e2f"><div class="ttname"><a href="structEcReadStripe.html#a80b525ebfe07bff2cb08bf97ce633e2f">EcReadStripe::actual_k</a></div><div class="ttdeci">uint16_t actual_k</div><div class="ttdoc">Number of data blocks in this stripe.</div><div class="ttdef"><b>Definition</b> <a href="#l00048">erasure.c:48</a></div></div>
<div class="ttc" id="astructEcReadStripe_html_ac88d41411a685f4b7fbecb69d179ec3f"><div class="ttname"><a href="structEcReadStripe.html#ac88d41411a685f4b7fbecb69d179ec3f">EcReadStripe::parity_offsets</a></div><div class="ttdeci">uint64_t * parity_offsets</div><div class="ttdoc">Array of M parity block file offsets.</div><div class="ttdef"><b>Definition</b> <a href="#l00050">erasure.c:50</a></div></div>
<div class="ttc" id="astructErasureCodingMapHeader_html"><div class="ttname"><a href="structErasureCodingMapHeader.html">ErasureCodingMapHeader</a></div><div class="ttdoc">Header for the Erasure Coding Map Block (BlockType::ErasureCodingMapBlock).</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00049">erasure.h:50</a></div></div>
<div class="ttc" id="astructErasureCodingMapHeader_html_a174d1be87a00bda3012715de76423ec4"><div class="ttname"><a href="structErasureCodingMapHeader.html#a174d1be87a00bda3012715de76423ec4">ErasureCodingMapHeader::algorithm</a></div><div class="ttdeci">uint8_t algorithm</div><div class="ttdoc">Erasure coding algorithm (ErasureCodingAlgorithm).</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00052">erasure.h:52</a></div></div>
<div class="ttc" id="astructErasureCodingMapHeader_html_a2aa7763da110a8e7550e61bd6110f83d"><div class="ttname"><a href="structErasureCodingMapHeader.html#a2aa7763da110a8e7550e61bd6110f83d">ErasureCodingMapHeader::cmpLength</a></div><div class="ttdeci">uint64_t cmpLength</div><div class="ttdoc">Size in bytes of the compressed mapping payload.</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00055">erasure.h:55</a></div></div>
<div class="ttc" id="astructErasureCodingMapHeader_html_aa686c5c90093d0ba86657c1f15f64a2d"><div class="ttname"><a href="structErasureCodingMapHeader.html#aa686c5c90093d0ba86657c1f15f64a2d">ErasureCodingMapHeader::cmpCrc64</a></div><div class="ttdeci">uint64_t cmpCrc64</div><div class="ttdoc">CRC64-ECMA of the compressed mapping payload.</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00057">erasure.h:57</a></div></div>
<div class="ttc" id="astructErasureCodingMapHeader_html_aa883d1e565b1856a7a16b2fcf8ee8b7d"><div class="ttname"><a href="structErasureCodingMapHeader.html#aa883d1e565b1856a7a16b2fcf8ee8b7d">ErasureCodingMapHeader::crc64</a></div><div class="ttdeci">uint64_t crc64</div><div class="ttdoc">CRC64-ECMA of the uncompressed mapping payload.</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00058">erasure.h:58</a></div></div>
<div class="ttc" id="astructErasureCodingMapHeader_html_aaf860b67807c5bf871e52ae617a076ae"><div class="ttname"><a href="structErasureCodingMapHeader.html#aaf860b67807c5bf871e52ae617a076ae">ErasureCodingMapHeader::compression</a></div><div class="ttdeci">uint16_t compression</div><div class="ttdoc">Compression algorithm for the mapping payload (CompressionType).</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00054">erasure.h:54</a></div></div>
<div class="ttc" id="astructErasureCodingMapHeader_html_ac1cce17abac0be6beccb121d7a3b24b2"><div class="ttname"><a href="structErasureCodingMapHeader.html#ac1cce17abac0be6beccb121d7a3b24b2">ErasureCodingMapHeader::identifier</a></div><div class="ttdeci">uint32_t identifier</div><div class="ttdoc">Block identifier, must be BlockType::ErasureCodingMapBlock (0x424D4345).</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00051">erasure.h:51</a></div></div>
<div class="ttc" id="astructErasureCodingMapHeader_html_accae80e978eeccc7c026eb5ade721aae"><div class="ttname"><a href="structErasureCodingMapHeader.html#accae80e978eeccc7c026eb5ade721aae">ErasureCodingMapHeader::stripeGroupCount</a></div><div class="ttdeci">uint8_t stripeGroupCount</div><div class="ttdoc">Number of stripe groups in payload (typically 5).</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00053">erasure.h:53</a></div></div>
<div class="ttc" id="astructErasureCodingMapHeader_html_ad52f12a467a76189e31b1c01fc0e6e65"><div class="ttname"><a href="structErasureCodingMapHeader.html#ad52f12a467a76189e31b1c01fc0e6e65">ErasureCodingMapHeader::length</a></div><div class="ttdeci">uint64_t length</div><div class="ttdoc">Size in bytes of the uncompressed mapping payload.</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00056">erasure.h:56</a></div></div>
<div class="ttc" id="astructIndexEntry_html"><div class="ttname"><a href="structIndexEntry.html">IndexEntry</a></div><div class="ttdoc">Single index entry describing a block&#39;s type, (optional) data classification, and file offset.</div><div class="ttdef"><b>Definition</b> <a href="index_8h_source.html#l00108">index.h:109</a></div></div>
<div class="ttc" id="astructIndexEntry_html_a4b5c7115ac83019c3f77c6f047e5f75e"><div class="ttname"><a href="structIndexEntry.html#a4b5c7115ac83019c3f77c6f047e5f75e">IndexEntry::blockType</a></div><div class="ttdeci">uint32_t blockType</div><div class="ttdoc">Block identifier of the referenced block (value from BlockType).</div><div class="ttdef"><b>Definition</b> <a href="index_8h_source.html#l00110">index.h:110</a></div></div>
<div class="ttc" id="astructIndexEntry_html_a854951a64192d7e4cdcfa6dd6fd2b3ea"><div class="ttname"><a href="structIndexEntry.html#a854951a64192d7e4cdcfa6dd6fd2b3ea">IndexEntry::offset</a></div><div class="ttdeci">uint64_t offset</div><div class="ttdoc">Absolute byte offset in the image where the referenced block header begins.</div><div class="ttdef"><b>Definition</b> <a href="index_8h_source.html#l00112">index.h:112</a></div></div>
<div class="ttc" id="astructIndexEntry_html_ae5d35082a756e0388efbf5fabbe93d10"><div class="ttname"><a href="structIndexEntry.html#ae5d35082a756e0388efbf5fabbe93d10">IndexEntry::dataType</a></div><div class="ttdeci">uint16_t dataType</div><div class="ttdoc">Data classification (value from DataType) or unused for untyped blocks.</div><div class="ttdef"><b>Definition</b> <a href="index_8h_source.html#l00111">index.h:111</a></div></div>
<div class="ttc" id="astructIndexHeader3_html"><div class="ttname"><a href="structIndexHeader3.html">IndexHeader3</a></div><div class="ttdoc">Index header (version 3) adding hierarchical chaining (identifier == IndexBlock3).</div><div class="ttdef"><b>Definition</b> <a href="index_8h_source.html#l00092">index.h:93</a></div></div>
<div class="ttc" id="astructIndexHeader3_html_af05fe8e08e929aa0eab6b74638f22b74"><div class="ttname"><a href="structIndexHeader3.html#af05fe8e08e929aa0eab6b74638f22b74">IndexHeader3::entries</a></div><div class="ttdeci">uint64_t entries</div><div class="ttdoc">Number of IndexEntry records that follow in this (sub)index block.</div><div class="ttdef"><b>Definition</b> <a href="index_8h_source.html#l00095">index.h:95</a></div></div>
<div class="ttc" id="astructStripeDataBlockEntry_html"><div class="ttname"><a href="structStripeDataBlockEntry.html">StripeDataBlockEntry</a></div><div class="ttdoc">Per-data-block metadata within a stripe descriptor.</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00087">erasure.h:88</a></div></div>
<div class="ttc" id="astructStripeDataBlockEntry_html_a3351d43103f9f7fbd9f4486161a1656d"><div class="ttname"><a href="structStripeDataBlockEntry.html#a3351d43103f9f7fbd9f4486161a1656d">StripeDataBlockEntry::onDiskSize</a></div><div class="ttdeci">uint32_t onDiskSize</div><div class="ttdoc">Actual on-disk bytes (sizeof(header) + cmpLength).</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00090">erasure.h:90</a></div></div>
<div class="ttc" id="astructStripeDataBlockEntry_html_a7aac714b3d98b543e792537fd7c8d3fc"><div class="ttname"><a href="structStripeDataBlockEntry.html#a7aac714b3d98b543e792537fd7c8d3fc">StripeDataBlockEntry::offset</a></div><div class="ttdeci">uint64_t offset</div><div class="ttdoc">Absolute file offset of the block.</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00089">erasure.h:89</a></div></div>
<div class="ttc" id="astructStripeDataBlockEntry_html_af85494afc772fe1469927c826e24a1b2"><div class="ttname"><a href="structStripeDataBlockEntry.html#af85494afc772fe1469927c826e24a1b2">StripeDataBlockEntry::shardCrc64</a></div><div class="ttdeci">uint64_t shardCrc64</div><div class="ttdoc">CRC64-ECMA of on-disk bytes zero-padded to shardSize.</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00091">erasure.h:91</a></div></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 class="ttc" id="astructStripeGroupDescriptor_html_a2a457b42f8562c872b0b7e0f1b054ef5"><div class="ttname"><a href="structStripeGroupDescriptor.html#a2a457b42f8562c872b0b7e0f1b054ef5">StripeGroupDescriptor::shardSize</a></div><div class="ttdeci">uint32_t shardSize</div><div class="ttdoc">Fixed shard size in bytes (max possible on-disk block size for this group).</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00073">erasure.h:73</a></div></div>
<div class="ttc" id="astructStripeGroupDescriptor_html_a46b938eb0fea65843e741c2cc240d14b"><div class="ttname"><a href="structStripeGroupDescriptor.html#a46b938eb0fea65843e741c2cc240d14b">StripeGroupDescriptor::K</a></div><div class="ttdeci">uint16_t K</div><div class="ttdoc">Number of data blocks per stripe.</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00071">erasure.h:71</a></div></div>
<div class="ttc" id="astructStripeGroupDescriptor_html_a6093f8c41fb1aa55c8367e2a92fe9f7f"><div class="ttname"><a href="structStripeGroupDescriptor.html#a6093f8c41fb1aa55c8367e2a92fe9f7f">StripeGroupDescriptor::groupType</a></div><div class="ttdeci">uint8_t groupType</div><div class="ttdoc">Protection group type (ErasureCodingGroupType).</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00070">erasure.h:70</a></div></div>
<div class="ttc" id="astructStripeGroupDescriptor_html_a747366878bf9d2d68b37fddc30346546"><div class="ttname"><a href="structStripeGroupDescriptor.html#a747366878bf9d2d68b37fddc30346546">StripeGroupDescriptor::interleaveDepth</a></div><div class="ttdeci">uint16_t interleaveDepth</div><div class="ttdoc">Interleave depth D (K for full interleave, 1 for consecutive).</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00075">erasure.h:75</a></div></div>
<div class="ttc" id="astructStripeGroupDescriptor_html_a9b737c4f6fda1894d51858d2a3d8d877"><div class="ttname"><a href="structStripeGroupDescriptor.html#a9b737c4f6fda1894d51858d2a3d8d877">StripeGroupDescriptor::stripeCount</a></div><div class="ttdeci">uint32_t stripeCount</div><div class="ttdoc">Number of stripes in this group.</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00074">erasure.h:74</a></div></div>
<div class="ttc" id="astructStripeGroupDescriptor_html_afd47dcff7fe194084c22dab9a6866c8b"><div class="ttname"><a href="structStripeGroupDescriptor.html#afd47dcff7fe194084c22dab9a6866c8b">StripeGroupDescriptor::M</a></div><div class="ttdeci">uint16_t M</div><div class="ttdoc">Number of parity blocks per stripe.</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00072">erasure.h:72</a></div></div>
<div class="ttc" id="astructStripeParityBlockEntry_html"><div class="ttname"><a href="structStripeParityBlockEntry.html">StripeParityBlockEntry</a></div><div class="ttdoc">Per-parity-block metadata within a stripe descriptor.</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00098">erasure.h:99</a></div></div>
<div class="ttc" id="astructStripeParityBlockEntry_html_a4222801a62acbce61990ee79faf26050"><div class="ttname"><a href="structStripeParityBlockEntry.html#a4222801a62acbce61990ee79faf26050">StripeParityBlockEntry::offset</a></div><div class="ttdeci">uint64_t offset</div><div class="ttdoc">Absolute file offset of the parity DBLK.</div><div class="ttdef"><b>Definition</b> <a href="erasure_8h_source.html#l00100">erasure.h:100</a></div></div>
<div class="ttc" id="astructaaruformat__context_html"><div class="ttname"><a href="structaaruformat__context.html">aaruformat_context</a></div><div class="ttdoc">Master context representing an open or increation Aaru image.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00174">context.h:175</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_a0306814ea46f136a21ffdbf5504744d2"><div class="ttname"><a href="structaaruformat__context.html#a0306814ea46f136a21ffdbf5504744d2">aaruformat_context::ec_data_shard_crcs</a></div><div class="ttdeci">uint64_t * ec_data_shard_crcs</div><div class="ttdoc">Array of K * K CRC64 values for blocks in active stripes.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00387">context.h:387</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_a04c5fb367458a6e9dd0a50b39f6edec2"><div class="ttname"><a href="structaaruformat__context.html#a04c5fb367458a6e9dd0a50b39f6edec2">aaruformat_context::user_data_ddt_header</a></div><div class="ttdeci">DdtHeader2 user_data_ddt_header</div><div class="ttdoc">Active user data DDT v2 header (primary table meta).</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00192">context.h:192</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_a0562ac6ba169471d3d83482342d68ff2"><div class="ttname"><a href="structaaruformat__context.html#a0562ac6ba169471d3d83482342d68ff2">aaruformat_context::ec_data_block_sizes</a></div><div class="ttdeci">uint32_t * ec_data_block_sizes</div><div class="ttdoc">Array of K * K actual on-disk sizes for blocks in active stripes.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00386">context.h:386</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_a130daf19dbed426f1c4c6f82691bc054"><div class="ttname"><a href="structaaruformat__context.html#a130daf19dbed426f1c4c6f82691bc054">aaruformat_context::compression_enabled</a></div><div class="ttdeci">bool compression_enabled</div><div class="ttdoc">True if block compression enabled (writing path).</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00304">context.h:304</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_a231115c6a202af9b0b846dcd9894435d"><div class="ttname"><a href="structaaruformat__context.html#a231115c6a202af9b0b846dcd9894435d">aaruformat_context::ec_rs_ctx</a></div><div class="ttdeci">void * ec_rs_ctx</div><div class="ttdoc">rs_context* (opaque RS codec), NULL if EC disabled.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00383">context.h:383</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_a25448606ea0870a817f4a2b6c94f7698"><div class="ttname"><a href="structaaruformat__context.html#a25448606ea0870a817f4a2b6c94f7698">aaruformat_context::ec_algorithm</a></div><div class="ttdeci">uint8_t ec_algorithm</div><div class="ttdoc">ErasureCodingAlgorithm (0=XOR, 1=RS-Vandermonde).</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00379">context.h:379</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_a3613b5ea23ce609b6d2c3a047692d455"><div class="ttname"><a href="structaaruformat__context.html#a3613b5ea23ce609b6d2c3a047692d455">aaruformat_context::ec_recovery_in_progress</a></div><div class="ttdeci">bool ec_recovery_in_progress</div><div class="ttdoc">Recursion guard for recovery (prevents infinite loops).</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00398">context.h:398</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_a3a12addf4a338cc04471709604d48ae1"><div class="ttname"><a href="structaaruformat__context.html#a3a12addf4a338cc04471709604d48ae1">aaruformat_context::block_header_cache</a></div><div class="ttdeci">struct CacheHeader block_header_cache</div><div class="ttdoc">LRU/Cache header for block headers.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00259">context.h:259</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_a3dd804f91ba84019bd5a23226fa7d608"><div class="ttname"><a href="structaaruformat__context.html#a3dd804f91ba84019bd5a23226fa7d608">aaruformat_context::ec_data_shard_size</a></div><div class="ttdeci">uint32_t ec_data_shard_size</div><div class="ttdoc">Max on-disk block size for data blocks (fixed at creation).</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00382">context.h:382</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_a3e230f326ef10eae2a496ca4532c8143"><div class="ttname"><a href="structaaruformat__context.html#a3e230f326ef10eae2a496ca4532c8143">aaruformat_context::ec_read_stripe_count</a></div><div class="ttdeci">uint32_t ec_read_stripe_count</div><div class="ttdoc">Number of data stripes parsed from ECMB.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00395">context.h:395</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_a58359ec8607d1d10e0af8699be238e77"><div class="ttname"><a href="structaaruformat__context.html#a58359ec8607d1d10e0af8699be238e77">aaruformat_context::block_cache</a></div><div class="ttdeci">struct CacheHeader block_cache</div><div class="ttdoc">LRU/Cache header for block payloads.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00260">context.h:260</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_a63616c8450e9e1853e0645714fe310cb"><div class="ttname"><a href="structaaruformat__context.html#a63616c8450e9e1853e0645714fe310cb">aaruformat_context::dirty_index_block</a></div><div class="ttdeci">bool dirty_index_block</div><div class="ttdoc">True if index block should be written during close.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00345">context.h:345</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_a670dec8d59407989fefc361dc26c6832"><div class="ttname"><a href="structaaruformat__context.html#a670dec8d59407989fefc361dc26c6832">aaruformat_context::header</a></div><div class="ttdeci">AaruHeaderV2 header</div><div class="ttdoc">Parsed container header (v2).</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00178">context.h:178</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_a682d900c0f7dc71bc4820e09609f1615"><div class="ttname"><a href="structaaruformat__context.html#a682d900c0f7dc71bc4820e09609f1615">aaruformat_context::ec_data_stripes</a></div><div class="ttdeci">UT_array * ec_data_stripes</div><div class="ttdoc">Completed data stripe descriptors (serialized to ECMB).</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00390">context.h:390</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_a6f61f9ea20f4e3b791a0d6388dd43651"><div class="ttname"><a href="structaaruformat__context.html#a6f61f9ea20f4e3b791a0d6388dd43651">aaruformat_context::is_writing</a></div><div class="ttdeci">bool is_writing</div><div class="ttdoc">True if context opened/created for writing.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00295">context.h:295</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_a78edd22a0d4a0cbbbbdb783b3df4ba5a"><div class="ttname"><a href="structaaruformat__context.html#a78edd22a0d4a0cbbbbdb783b3df4ba5a">aaruformat_context::current_block_header</a></div><div class="ttdeci">BlockHeader current_block_header</div><div class="ttdoc">Header for block currently being assembled (write path).</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00284">context.h:284</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_a7dc0a0fe0bf6223ff4587fd01c360b76"><div class="ttname"><a href="structaaruformat__context.html#a7dc0a0fe0bf6223ff4587fd01c360b76">aaruformat_context::magic</a></div><div class="ttdeci">uint64_t magic</div><div class="ttdoc">File magic (AARU_MAGIC) post-open.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00177">context.h:177</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_a939b702f75e80062bc635add4c3ab142"><div class="ttname"><a href="structaaruformat__context.html#a939b702f75e80062bc635add4c3ab142">aaruformat_context::next_block_position</a></div><div class="ttdeci">uint64_t next_block_position</div><div class="ttdoc">Absolute file offset where next block will be written.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00285">context.h:285</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_a9a68ea472d082df95246171eaab070d0"><div class="ttname"><a href="structaaruformat__context.html#a9a68ea472d082df95246171eaab070d0">aaruformat_context::ec_data_block_offsets</a></div><div class="ttdeci">uint64_t * ec_data_block_offsets</div><div class="ttdoc">Array of K * K file offsets for blocks in active stripes.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00385">context.h:385</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_a9b5df0512665a9b31fbfff6dc912b6eb"><div class="ttname"><a href="structaaruformat__context.html#a9b5df0512665a9b31fbfff6dc912b6eb">aaruformat_context::ec_total_data_blocks</a></div><div class="ttdeci">uint32_t ec_total_data_blocks</div><div class="ttdoc">Total data blocks written (counter for round-robin assignment).</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00389">context.h:389</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_a9c7a7eafdd48b8d0cbdbb46d28cfceaa"><div class="ttname"><a href="structaaruformat__context.html#a9c7a7eafdd48b8d0cbdbb46d28cfceaa">aaruformat_context::ec_M</a></div><div class="ttdeci">uint16_t ec_M</div><div class="ttdoc">Parity blocks per stripe.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00381">context.h:381</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_a9cf4d3d7117a279de4c178eb7af217d6"><div class="ttname"><a href="structaaruformat__context.html#a9cf4d3d7117a279de4c178eb7af217d6">aaruformat_context::has_zstd_blocks</a></div><div class="ttdeci">bool has_zstd_blocks</div><div class="ttdoc">True if any block was actually written with Zstandard compression.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00306">context.h:306</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_a9f694f685458e2142e116da91727de38"><div class="ttname"><a href="structaaruformat__context.html#a9f694f685458e2142e116da91727de38">aaruformat_context::zstd_level</a></div><div class="ttdeci">int zstd_level</div><div class="ttdoc">Zstandard compression level (writing path, default 19).</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00307">context.h:307</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_aa8301e298630675bb060fde6fa6e401a"><div class="ttname"><a href="structaaruformat__context.html#aa8301e298630675bb060fde6fa6e401a">aaruformat_context::ec_data_stripe_counts</a></div><div class="ttdeci">uint16_t * ec_data_stripe_counts</div><div class="ttdoc">Array of K: blocks accumulated per stripe slot.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00388">context.h:388</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_aad3acc958f1b3e63fdeacfd349aff736"><div class="ttname"><a href="structaaruformat__context.html#aad3acc958f1b3e63fdeacfd349aff736">aaruformat_context::ec_read_stripes</a></div><div class="ttdeci">void * ec_read_stripes</div><div class="ttdoc">Parsed EcReadStripe array for data group, NULL if no ECMB.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00394">context.h:394</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_aafe10b9028dcb7a53c5b05b8db2b2ba8"><div class="ttname"><a href="structaaruformat__context.html#aafe10b9028dcb7a53c5b05b8db2b2ba8">aaruformat_context::ec_block_lookup</a></div><div class="ttdeci">void * ec_block_lookup</div><div class="ttdoc">uthash: block file offset → stripe index + position.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00396">context.h:396</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_ab516fae594bde4f76b75488d0a3ca3a8"><div class="ttname"><a href="structaaruformat__context.html#ab516fae594bde4f76b75488d0a3ca3a8">aaruformat_context::imageStream</a></div><div class="ttdeci">FILE * imageStream</div><div class="ttdoc">Underlying FILE* stream (binary mode).</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00179">context.h:179</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_ab97a719a5b4186695b67143db7376152"><div class="ttname"><a href="structaaruformat__context.html#ab97a719a5b4186695b67143db7376152">aaruformat_context::index_entries</a></div><div class="ttdeci">UT_array * index_entries</div><div class="ttdoc">Flattened index entries (UT_array of IndexEntry).</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00255">context.h:255</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_abd11e50d05e8f007bf084a586bad0fe9"><div class="ttname"><a href="structaaruformat__context.html#abd11e50d05e8f007bf084a586bad0fe9">aaruformat_context::num_threads</a></div><div class="ttdeci">int num_threads</div><div class="ttdoc">Compression worker threads (1 = single-threaded, default).</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00308">context.h:308</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_ac08b99bdbcd7a208e6893d59f0e02a17"><div class="ttname"><a href="structaaruformat__context.html#ac08b99bdbcd7a208e6893d59f0e02a17">aaruformat_context::ec_enabled</a></div><div class="ttdeci">bool ec_enabled</div><div class="ttdoc">True if erasure coding is active.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00391">context.h:391</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_ac11104550371641bb95b74c83ed8b748"><div class="ttname"><a href="structaaruformat__context.html#ac11104550371641bb95b74c83ed8b748">aaruformat_context::ec_data_parity</a></div><div class="ttdeci">uint8_t ** ec_data_parity</div><div class="ttdoc">Array of K * M parity buffers (interleaved stripe slots).</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00384">context.h:384</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_ad027cde303f65d3ccc5b18a879692782"><div class="ttname"><a href="structaaruformat__context.html#ad027cde303f65d3ccc5b18a879692782">aaruformat_context::use_zstd</a></div><div class="ttdeci">bool use_zstd</div><div class="ttdoc">Use Zstandard instead of LZMA for data blocks.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00305">context.h:305</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_adc67f6a6ef1602648bb064d47eb1fe88"><div class="ttname"><a href="structaaruformat__context.html#adc67f6a6ef1602648bb064d47eb1fe88">aaruformat_context::lzma_dict_size</a></div><div class="ttdeci">uint32_t lzma_dict_size</div><div class="ttdoc">LZMA dictionary size (writing path).</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00302">context.h:302</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_aece272b6ba4a3451e5f56be5a1e5c7c5"><div class="ttname"><a href="structaaruformat__context.html#aece272b6ba4a3451e5f56be5a1e5c7c5">aaruformat_context::ec_K</a></div><div class="ttdeci">uint16_t ec_K</div><div class="ttdoc">Data blocks per stripe.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00380">context.h:380</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_af7b4e0a80f76581b0cb1440d9a689f0f"><div class="ttname"><a href="structaaruformat__context.html#af7b4e0a80f76581b0cb1440d9a689f0f">aaruformat_context::ec_recovery_available</a></div><div class="ttdeci">bool ec_recovery_available</div><div class="ttdoc">True if ECMB loaded and recovery is possible.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00397">context.h:397</a></div></div>
<div class="ttc" id="astructrs__context_html"><div class="ttname"><a href="structrs__context.html">rs_context</a></div><div class="ttdef"><b>Definition</b> <a href="reed__solomon_8c_source.html#l00043">reed_solomon.c:44</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
</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.16.1 </li>
</ul>
</div>
</body>
</html>