Auto update

This commit is contained in:
Andrea Mazzoleni 2016-01-09 17:18:05 +01:00
parent 90bf302bb1
commit 493a91f0c6
207 changed files with 16507 additions and 15922 deletions

View file

@ -31,13 +31,13 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">713</td>
<td class="headerCovTableEntry">712</td>
<td class="headerCovTableEntry">781</td>
<td class="headerCovTableEntryHi">91.3 %</td>
<td class="headerCovTableEntryHi">91.2 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">9</td>
@ -61,31 +61,27 @@
</tr>
<tr>
<td class="coverFn"><a href="check.c.gcov.html#796">block_is_enabled</a></td>
<td class="coverFnHi">1866664</td>
<td class="coverFnHi">1869102</td>
</tr>
<tr>
<td class="coverFn"><a href="check.c.gcov.html#594">file_post</a></td>
<td class="coverFnHi">933332</td>
<td class="coverFnHi">934551</td>
</tr>
<tr>
<td class="coverFn"><a href="check.c.gcov.html#285">repair</a></td>
<td class="coverFnHi">869089</td>
<td class="coverFnHi">870166</td>
</tr>
<tr>
<td class="coverFn"><a href="check.c.gcov.html#68">blockcmp</a></td>
<td class="coverFnHi">468172</td>
<td class="coverFnHi">469276</td>
</tr>
<tr>
<td class="coverFn"><a href="check.c.gcov.html#160">repair_step</a></td>
<td class="coverFnHi">260805</td>
<td class="coverFnHi">254143</td>
</tr>
<tr>
<td class="coverFn"><a href="check.c.gcov.html#97">is_hash_matching</a></td>
<td class="coverFnHi">209449</td>
</tr>
<tr>
<td class="coverFn"><a href="check.c.gcov.html#140">is_parity_matching</a></td>
<td class="coverFnHi">8386</td>
<td class="coverFnHi">211335</td>
</tr>
<tr>
<td class="coverFn"><a href="check.c.gcov.html#1904">state_check</a></td>
@ -95,6 +91,10 @@
<td class="coverFn"><a href="check.c.gcov.html#842">state_check_process</a></td>
<td class="coverFnHi">118</td>
</tr>
<tr>
<td class="coverFn"><a href="check.c.gcov.html#140">is_parity_matching</a></td>
<td class="coverFnHi">8</td>
</tr>
</table>
<br>
</center>

View file

@ -31,13 +31,13 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">713</td>
<td class="headerCovTableEntry">712</td>
<td class="headerCovTableEntry">781</td>
<td class="headerCovTableEntryHi">91.3 %</td>
<td class="headerCovTableEntryHi">91.2 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">9</td>
@ -61,31 +61,31 @@
</tr>
<tr>
<td class="coverFn"><a href="check.c.gcov.html#796">block_is_enabled</a></td>
<td class="coverFnHi">1866664</td>
<td class="coverFnHi">1869102</td>
</tr>
<tr>
<td class="coverFn"><a href="check.c.gcov.html#68">blockcmp</a></td>
<td class="coverFnHi">468172</td>
<td class="coverFnHi">469276</td>
</tr>
<tr>
<td class="coverFn"><a href="check.c.gcov.html#594">file_post</a></td>
<td class="coverFnHi">933332</td>
<td class="coverFnHi">934551</td>
</tr>
<tr>
<td class="coverFn"><a href="check.c.gcov.html#97">is_hash_matching</a></td>
<td class="coverFnHi">209449</td>
<td class="coverFnHi">211335</td>
</tr>
<tr>
<td class="coverFn"><a href="check.c.gcov.html#140">is_parity_matching</a></td>
<td class="coverFnHi">8386</td>
<td class="coverFnHi">8</td>
</tr>
<tr>
<td class="coverFn"><a href="check.c.gcov.html#285">repair</a></td>
<td class="coverFnHi">869089</td>
<td class="coverFnHi">870166</td>
</tr>
<tr>
<td class="coverFn"><a href="check.c.gcov.html#160">repair_step</a></td>
<td class="coverFnHi">260805</td>
<td class="coverFnHi">254143</td>
</tr>
<tr>
<td class="coverFn"><a href="check.c.gcov.html#1904">state_check</a></td>

File diff suppressed because it is too large Load diff

View file

@ -31,13 +31,13 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">300</td>
<td class="headerCovTableEntry">318</td>
<td class="headerCovTableEntryHi">94.3 %</td>
<td class="headerCovTableEntry">301</td>
<td class="headerCovTableEntry">320</td>
<td class="headerCovTableEntryHi">94.1 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">11</td>
@ -64,7 +64,7 @@
<td class="coverFnHi">72</td>
</tr>
<tr>
<td class="coverFn"><a href="device.c.gcov.html#596">printl</a></td>
<td class="coverFn"><a href="device.c.gcov.html#600">printl</a></td>
<td class="coverFnHi">52</td>
</tr>
<tr>
@ -84,7 +84,7 @@
<td class="coverFnHi">18</td>
</tr>
<tr>
<td class="coverFn"><a href="device.c.gcov.html#613">printp</a></td>
<td class="coverFn"><a href="device.c.gcov.html#617">printp</a></td>
<td class="coverFnHi">18</td>
</tr>
<tr>
@ -92,15 +92,15 @@
<td class="coverFnHi">13</td>
</tr>
<tr>
<td class="coverFn"><a href="device.c.gcov.html#935">state_device</a></td>
<td class="coverFn"><a href="device.c.gcov.html#939">state_device</a></td>
<td class="coverFnHi">5</td>
</tr>
<tr>
<td class="coverFn"><a href="device.c.gcov.html#647">state_smart</a></td>
<td class="coverFn"><a href="device.c.gcov.html#651">state_smart</a></td>
<td class="coverFnHi">1</td>
</tr>
<tr>
<td class="coverFn"><a href="device.c.gcov.html#871">devtest</a></td>
<td class="coverFn"><a href="device.c.gcov.html#875">devtest</a></td>
<td class="coverFnHi">1</td>
</tr>
</table>

View file

@ -31,13 +31,13 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">300</td>
<td class="headerCovTableEntry">318</td>
<td class="headerCovTableEntryHi">94.3 %</td>
<td class="headerCovTableEntry">301</td>
<td class="headerCovTableEntry">320</td>
<td class="headerCovTableEntryHi">94.1 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">11</td>
@ -60,7 +60,7 @@
<td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="device.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
</tr>
<tr>
<td class="coverFn"><a href="device.c.gcov.html#871">devtest</a></td>
<td class="coverFn"><a href="device.c.gcov.html#875">devtest</a></td>
<td class="coverFnHi">1</td>
</tr>
<tr>
@ -76,11 +76,11 @@
<td class="coverFnHi">31</td>
</tr>
<tr>
<td class="coverFn"><a href="device.c.gcov.html#596">printl</a></td>
<td class="coverFn"><a href="device.c.gcov.html#600">printl</a></td>
<td class="coverFnHi">52</td>
</tr>
<tr>
<td class="coverFn"><a href="device.c.gcov.html#613">printp</a></td>
<td class="coverFn"><a href="device.c.gcov.html#617">printp</a></td>
<td class="coverFnHi">18</td>
</tr>
<tr>
@ -96,11 +96,11 @@
<td class="coverFnHi">72</td>
</tr>
<tr>
<td class="coverFn"><a href="device.c.gcov.html#935">state_device</a></td>
<td class="coverFn"><a href="device.c.gcov.html#939">state_device</a></td>
<td class="coverFnHi">5</td>
</tr>
<tr>
<td class="coverFn"><a href="device.c.gcov.html#647">state_smart</a></td>
<td class="coverFn"><a href="device.c.gcov.html#651">state_smart</a></td>
<td class="coverFnHi">1</td>
</tr>
</table>

View file

@ -31,13 +31,13 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">300</td>
<td class="headerCovTableEntry">318</td>
<td class="headerCovTableEntryHi">94.3 %</td>
<td class="headerCovTableEntry">301</td>
<td class="headerCovTableEntry">320</td>
<td class="headerCovTableEntryHi">94.1 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">11</td>
@ -100,7 +100,7 @@
<span class="lineNum"> 38 </span> : * they really fail, not counting as a failure.
<span class="lineNum"> 39 </span> : *
<span class="lineNum"> 40 </span> : * The following tables are computed using the data from 2014-02-14 to 2014-12-31
<span class="lineNum"> 41 </span> : * becasue it's the period when more SMART attributes were gathered.
<span class="lineNum"> 41 </span> : * because it's the period when more SMART attributes were gathered.
<span class="lineNum"> 42 </span> : *
<span class="lineNum"> 43 </span> : * In this period there are 47322 disk seen, with 1988 removed because failed,
<span class="lineNum"> 44 </span> : * and with 4121 removed because predicted to fail.
@ -632,451 +632,455 @@
<span class="lineNum"> 570 </span> : * Garth Alan Gibson, &quot;Redundant Disk Arrays: Reliable, Parallel Secondary Storage&quot;, 1990
<span class="lineNum"> 571 </span> : */
<span class="lineNum"> 572 </span> :
<span class="lineNum"> 573 </span> : /* get the Mean Time Between Failure of a single disk */
<span class="lineNum"> 574 </span> : /* from the array failure rate */
<span class="lineNum"> 575 </span><span class="lineCov"> 18 : MTBF = n / array_failure_rate;</span>
<span class="lineNum"> 573 </span> : /* avoid division by zero */
<span class="lineNum"> 574 </span><span class="lineCov"> 18 : if (array_failure_rate == 0)</span>
<span class="lineNum"> 575 </span><span class="lineNoCov"> 0 : return 0;</span>
<span class="lineNum"> 576 </span> :
<span class="lineNum"> 577 </span> : /* get the Mean Time Between Repair (the time that a failed disk is replaced) */
<span class="lineNum"> 578 </span> : /* from the repair rate */
<span class="lineNum"> 579 </span><span class="lineCov"> 18 : MTTR = 1.0 / replace_rate;</span>
<span class="lineNum"> 577 </span> : /* get the Mean Time Between Failure of a single disk */
<span class="lineNum"> 578 </span> : /* from the array failure rate */
<span class="lineNum"> 579 </span><span class="lineCov"> 18 : MTBF = n / array_failure_rate;</span>
<span class="lineNum"> 580 </span> :
<span class="lineNum"> 581 </span> : /* use the approximated MTTDL equation */
<span class="lineNum"> 582 </span><span class="lineCov"> 18 : MTTDL = pow(MTBF, redundancy + 1) / pow(MTTR, redundancy);</span>
<span class="lineNum"> 583 </span><span class="lineCov"> 99 : for (i = 0; i &lt; redundancy + 1; ++i)</span>
<span class="lineNum"> 584 </span><span class="lineCov"> 81 : MTTDL /= n - i;</span>
<span class="lineNum"> 585 </span> :
<span class="lineNum"> 586 </span> : /* the raid failure rate is just the inverse of the MTTDL */
<span class="lineNum"> 587 </span><span class="lineCov"> 18 : raid_failure_rate = 1.0 / MTTDL;</span>
<span class="lineNum"> 588 </span> :
<span class="lineNum"> 589 </span> : /* probability of at least one RAID failure */
<span class="lineNum"> 590 </span> : /* note that is almost equal at the probabilty of */
<span class="lineNum"> 591 </span> : /* the first failure. */
<span class="lineNum"> 592 </span><span class="lineCov"> 18 : return poisson_prob_n_or_more_failures(raid_failure_rate, 1);</span>
<span class="lineNum"> 593 </span> : }
<span class="lineNum"> 594 </span> :
<span class="lineNum"> 595 </span> : /**
<a name="596"><span class="lineNum"> 596 </span> : * Print a string with space padding.</a>
<span class="lineNum"> 597 </span> : */
<span class="lineNum"> 598 </span><span class="lineCov"> 52 : static void printl(const char* str, size_t pad)</span>
<span class="lineNum"> 599 </span> : {
<span class="lineNum"> 600 </span> : size_t len;
<span class="lineNum"> 601 </span> :
<span class="lineNum"> 602 </span><span class="lineCov"> 52 : printf(&quot;%s&quot;, str);</span>
<span class="lineNum"> 603 </span> :
<span class="lineNum"> 604 </span><span class="lineCov"> 52 : len = strlen(str);</span>
<span class="lineNum"> 581 </span> : /* get the Mean Time Between Repair (the time that a failed disk is replaced) */
<span class="lineNum"> 582 </span> : /* from the repair rate */
<span class="lineNum"> 583 </span><span class="lineCov"> 18 : MTTR = 1.0 / replace_rate;</span>
<span class="lineNum"> 584 </span> :
<span class="lineNum"> 585 </span> : /* use the approximated MTTDL equation */
<span class="lineNum"> 586 </span><span class="lineCov"> 18 : MTTDL = pow(MTBF, redundancy + 1) / pow(MTTR, redundancy);</span>
<span class="lineNum"> 587 </span><span class="lineCov"> 99 : for (i = 0; i &lt; redundancy + 1; ++i)</span>
<span class="lineNum"> 588 </span><span class="lineCov"> 81 : MTTDL /= n - i;</span>
<span class="lineNum"> 589 </span> :
<span class="lineNum"> 590 </span> : /* the raid failure rate is just the inverse of the MTTDL */
<span class="lineNum"> 591 </span><span class="lineCov"> 18 : raid_failure_rate = 1.0 / MTTDL;</span>
<span class="lineNum"> 592 </span> :
<span class="lineNum"> 593 </span> : /* probability of at least one RAID failure */
<span class="lineNum"> 594 </span> : /* note that is almost equal at the probability of */
<span class="lineNum"> 595 </span> : /* the first failure. */
<span class="lineNum"> 596 </span><span class="lineCov"> 18 : return poisson_prob_n_or_more_failures(raid_failure_rate, 1);</span>
<span class="lineNum"> 597 </span> : }
<span class="lineNum"> 598 </span> :
<span class="lineNum"> 599 </span> : /**
<a name="600"><span class="lineNum"> 600 </span> : * Print a string with space padding.</a>
<span class="lineNum"> 601 </span> : */
<span class="lineNum"> 602 </span><span class="lineCov"> 52 : static void printl(const char* str, size_t pad)</span>
<span class="lineNum"> 603 </span> : {
<span class="lineNum"> 604 </span> : size_t len;
<span class="lineNum"> 605 </span> :
<span class="lineNum"> 606 </span><span class="lineCov"> 245 : while (len &lt; pad) {</span>
<span class="lineNum"> 607 </span><span class="lineCov"> 141 : printf(&quot; &quot;);</span>
<span class="lineNum"> 608 </span><span class="lineCov"> 141 : ++len;</span>
<span class="lineNum"> 609 </span> : }
<span class="lineNum"> 610 </span><span class="lineCov"> 52 : }</span>
<span class="lineNum"> 611 </span> :
<span class="lineNum"> 612 </span> : /**
<a name="613"><span class="lineNum"> 613 </span> : * Print a probability with space padding.</a>
<span class="lineNum"> 614 </span> : */
<span class="lineNum"> 615 </span><span class="lineCov"> 18 : static void printp(double v, size_t pad)</span>
<span class="lineNum"> 616 </span> : {
<span class="lineNum"> 617 </span> : char buf[64];
<span class="lineNum"> 618 </span><span class="lineCov"> 18 : const char* s = &quot;%&quot;;</span>
<span class="lineNum"> 619 </span> :
<span class="lineNum"> 620 </span><span class="lineCov"> 18 : if (v &gt; 0.1)</span>
<span class="lineNum"> 621 </span><span class="lineCov"> 4 : snprintf(buf, sizeof(buf), &quot;%5.2f%s&quot;, v, s);</span>
<span class="lineNum"> 622 </span><span class="lineCov"> 14 : else if (v &gt; 0.01)</span>
<span class="lineNum"> 623 </span><span class="lineCov"> 2 : snprintf(buf, sizeof(buf), &quot;%6.3f%s&quot;, v, s);</span>
<span class="lineNum"> 624 </span><span class="lineCov"> 12 : else if (v &gt; 0.001)</span>
<span class="lineNum"> 625 </span><span class="lineCov"> 3 : snprintf(buf, sizeof(buf), &quot;%7.4f%s&quot;, v, s);</span>
<span class="lineNum"> 626 </span><span class="lineCov"> 9 : else if (v &gt; 0.0001)</span>
<span class="lineNum"> 627 </span><span class="lineCov"> 2 : snprintf(buf, sizeof(buf), &quot;%8.5f%s&quot;, v, s);</span>
<span class="lineNum"> 628 </span><span class="lineCov"> 7 : else if (v &gt; 0.00001)</span>
<span class="lineNum"> 629 </span><span class="lineCov"> 2 : snprintf(buf, sizeof(buf), &quot;%9.6f%s&quot;, v, s);</span>
<span class="lineNum"> 630 </span><span class="lineCov"> 5 : else if (v &gt; 0.000001)</span>
<span class="lineNum"> 631 </span><span class="lineCov"> 1 : snprintf(buf, sizeof(buf), &quot;%10.7f%s&quot;, v, s);</span>
<span class="lineNum"> 632 </span><span class="lineCov"> 4 : else if (v &gt; 0.0000001)</span>
<span class="lineNum"> 633 </span><span class="lineCov"> 1 : snprintf(buf, sizeof(buf), &quot;%11.8f%s&quot;, v, s);</span>
<span class="lineNum"> 634 </span><span class="lineCov"> 3 : else if (v &gt; 0.00000001)</span>
<span class="lineNum"> 635 </span><span class="lineCov"> 1 : snprintf(buf, sizeof(buf), &quot;%12.9f%s&quot;, v, s);</span>
<span class="lineNum"> 636 </span><span class="lineCov"> 2 : else if (v &gt; 0.000000001)</span>
<span class="lineNum"> 637 </span><span class="lineCov"> 1 : snprintf(buf, sizeof(buf), &quot;%13.10f%s&quot;, v, s);</span>
<span class="lineNum"> 638 </span><span class="lineCov"> 1 : else if (v &gt; 0.0000000001)</span>
<span class="lineNum"> 639 </span><span class="lineNoCov"> 0 : snprintf(buf, sizeof(buf), &quot;%14.11f%s&quot;, v, s);</span>
<span class="lineNum"> 640 </span><span class="lineCov"> 1 : else if (v &gt; 0.00000000001)</span>
<span class="lineNum"> 641 </span><span class="lineCov"> 1 : snprintf(buf, sizeof(buf), &quot;%15.12f%s&quot;, v, s);</span>
<span class="lineNum"> 642 </span><span class="lineNoCov"> 0 : else if (v &gt; 0.000000000001)</span>
<span class="lineNum"> 643 </span><span class="lineNoCov"> 0 : snprintf(buf, sizeof(buf), &quot;%16.13f%s&quot;, v, s);</span>
<span class="lineNum"> 644 </span> : else
<span class="lineNum"> 645 </span><span class="lineNoCov"> 0 : snprintf(buf, sizeof(buf), &quot;%17.14f%s&quot;, v, s);</span>
<span class="lineNum"> 646 </span><span class="lineCov"> 18 : printl(buf, pad);</span>
<a name="647"><span class="lineNum"> 647 </span><span class="lineCov"> 18 : }</span></a>
<span class="lineNum"> 648 </span> :
<span class="lineNum"> 649 </span><span class="lineCov"> 1 : static void state_smart(unsigned n, tommy_list* low)</span>
<span class="lineNum"> 650 </span> : {
<span class="lineNum"> 651 </span> : tommy_node* i;
<span class="lineNum"> 652 </span> : unsigned j;
<span class="lineNum"> 653 </span> : size_t device_pad;
<span class="lineNum"> 654 </span> : size_t serial_pad;
<span class="lineNum"> 655 </span> : int have_parent;
<span class="lineNum"> 656 </span> : double array_failure_rate;
<span class="lineNum"> 657 </span> : double p_at_least_one_failure;
<span class="lineNum"> 658 </span><span class="lineCov"> 1 : int make_it_fail = 0;</span>
<span class="lineNum"> 659 </span><span class="lineCov"> 1 : uint64_t mask32 = 0xffffffffU;</span>
<span class="lineNum"> 660 </span><span class="lineCov"> 1 : uint64_t mask16 = 0xffffU;</span>
<span class="lineNum"> 661 </span> :
<span class="lineNum"> 662 </span> : /* compute lengths for padding */
<span class="lineNum"> 663 </span><span class="lineCov"> 1 : device_pad = 0;</span>
<span class="lineNum"> 664 </span><span class="lineCov"> 1 : serial_pad = 0;</span>
<span class="lineNum"> 665 </span><span class="lineCov"> 1 : have_parent = 0;</span>
<span class="lineNum"> 666 </span><span class="lineCov"> 17 : for (i = tommy_list_head(low); i != 0; i = i-&gt;next) {</span>
<span class="lineNum"> 667 </span> : size_t len;
<span class="lineNum"> 668 </span><span class="lineCov"> 16 : devinfo_t* devinfo = i-&gt;data;</span>
<span class="lineNum"> 669 </span> :
<span class="lineNum"> 670 </span><span class="lineCov"> 16 : len = strlen(devinfo-&gt;file);</span>
<span class="lineNum"> 671 </span><span class="lineCov"> 16 : if (len &gt; device_pad)</span>
<span class="lineNum"> 672 </span><span class="lineCov"> 1 : device_pad = len;</span>
<span class="lineNum"> 606 </span><span class="lineCov"> 52 : printf(&quot;%s&quot;, str);</span>
<span class="lineNum"> 607 </span> :
<span class="lineNum"> 608 </span><span class="lineCov"> 52 : len = strlen(str);</span>
<span class="lineNum"> 609 </span> :
<span class="lineNum"> 610 </span><span class="lineCov"> 245 : while (len &lt; pad) {</span>
<span class="lineNum"> 611 </span><span class="lineCov"> 141 : printf(&quot; &quot;);</span>
<span class="lineNum"> 612 </span><span class="lineCov"> 141 : ++len;</span>
<span class="lineNum"> 613 </span> : }
<span class="lineNum"> 614 </span><span class="lineCov"> 52 : }</span>
<span class="lineNum"> 615 </span> :
<span class="lineNum"> 616 </span> : /**
<a name="617"><span class="lineNum"> 617 </span> : * Print a probability with space padding.</a>
<span class="lineNum"> 618 </span> : */
<span class="lineNum"> 619 </span><span class="lineCov"> 18 : static void printp(double v, size_t pad)</span>
<span class="lineNum"> 620 </span> : {
<span class="lineNum"> 621 </span> : char buf[64];
<span class="lineNum"> 622 </span><span class="lineCov"> 18 : const char* s = &quot;%&quot;;</span>
<span class="lineNum"> 623 </span> :
<span class="lineNum"> 624 </span><span class="lineCov"> 18 : if (v &gt; 0.1)</span>
<span class="lineNum"> 625 </span><span class="lineCov"> 4 : snprintf(buf, sizeof(buf), &quot;%5.2f%s&quot;, v, s);</span>
<span class="lineNum"> 626 </span><span class="lineCov"> 14 : else if (v &gt; 0.01)</span>
<span class="lineNum"> 627 </span><span class="lineCov"> 2 : snprintf(buf, sizeof(buf), &quot;%6.3f%s&quot;, v, s);</span>
<span class="lineNum"> 628 </span><span class="lineCov"> 12 : else if (v &gt; 0.001)</span>
<span class="lineNum"> 629 </span><span class="lineCov"> 3 : snprintf(buf, sizeof(buf), &quot;%7.4f%s&quot;, v, s);</span>
<span class="lineNum"> 630 </span><span class="lineCov"> 9 : else if (v &gt; 0.0001)</span>
<span class="lineNum"> 631 </span><span class="lineCov"> 2 : snprintf(buf, sizeof(buf), &quot;%8.5f%s&quot;, v, s);</span>
<span class="lineNum"> 632 </span><span class="lineCov"> 7 : else if (v &gt; 0.00001)</span>
<span class="lineNum"> 633 </span><span class="lineCov"> 2 : snprintf(buf, sizeof(buf), &quot;%9.6f%s&quot;, v, s);</span>
<span class="lineNum"> 634 </span><span class="lineCov"> 5 : else if (v &gt; 0.000001)</span>
<span class="lineNum"> 635 </span><span class="lineCov"> 1 : snprintf(buf, sizeof(buf), &quot;%10.7f%s&quot;, v, s);</span>
<span class="lineNum"> 636 </span><span class="lineCov"> 4 : else if (v &gt; 0.0000001)</span>
<span class="lineNum"> 637 </span><span class="lineCov"> 1 : snprintf(buf, sizeof(buf), &quot;%11.8f%s&quot;, v, s);</span>
<span class="lineNum"> 638 </span><span class="lineCov"> 3 : else if (v &gt; 0.00000001)</span>
<span class="lineNum"> 639 </span><span class="lineCov"> 1 : snprintf(buf, sizeof(buf), &quot;%12.9f%s&quot;, v, s);</span>
<span class="lineNum"> 640 </span><span class="lineCov"> 2 : else if (v &gt; 0.000000001)</span>
<span class="lineNum"> 641 </span><span class="lineCov"> 1 : snprintf(buf, sizeof(buf), &quot;%13.10f%s&quot;, v, s);</span>
<span class="lineNum"> 642 </span><span class="lineCov"> 1 : else if (v &gt; 0.0000000001)</span>
<span class="lineNum"> 643 </span><span class="lineNoCov"> 0 : snprintf(buf, sizeof(buf), &quot;%14.11f%s&quot;, v, s);</span>
<span class="lineNum"> 644 </span><span class="lineCov"> 1 : else if (v &gt; 0.00000000001)</span>
<span class="lineNum"> 645 </span><span class="lineCov"> 1 : snprintf(buf, sizeof(buf), &quot;%15.12f%s&quot;, v, s);</span>
<span class="lineNum"> 646 </span><span class="lineNoCov"> 0 : else if (v &gt; 0.000000000001)</span>
<span class="lineNum"> 647 </span><span class="lineNoCov"> 0 : snprintf(buf, sizeof(buf), &quot;%16.13f%s&quot;, v, s);</span>
<span class="lineNum"> 648 </span> : else
<span class="lineNum"> 649 </span><span class="lineNoCov"> 0 : snprintf(buf, sizeof(buf), &quot;%17.14f%s&quot;, v, s);</span>
<span class="lineNum"> 650 </span><span class="lineCov"> 18 : printl(buf, pad);</span>
<a name="651"><span class="lineNum"> 651 </span><span class="lineCov"> 18 : }</span></a>
<span class="lineNum"> 652 </span> :
<span class="lineNum"> 653 </span><span class="lineCov"> 1 : static void state_smart(unsigned n, tommy_list* low)</span>
<span class="lineNum"> 654 </span> : {
<span class="lineNum"> 655 </span> : tommy_node* i;
<span class="lineNum"> 656 </span> : unsigned j;
<span class="lineNum"> 657 </span> : size_t device_pad;
<span class="lineNum"> 658 </span> : size_t serial_pad;
<span class="lineNum"> 659 </span> : int have_parent;
<span class="lineNum"> 660 </span> : double array_failure_rate;
<span class="lineNum"> 661 </span> : double p_at_least_one_failure;
<span class="lineNum"> 662 </span><span class="lineCov"> 1 : int make_it_fail = 0;</span>
<span class="lineNum"> 663 </span><span class="lineCov"> 1 : uint64_t mask32 = 0xffffffffU;</span>
<span class="lineNum"> 664 </span><span class="lineCov"> 1 : uint64_t mask16 = 0xffffU;</span>
<span class="lineNum"> 665 </span> :
<span class="lineNum"> 666 </span> : /* compute lengths for padding */
<span class="lineNum"> 667 </span><span class="lineCov"> 1 : device_pad = 0;</span>
<span class="lineNum"> 668 </span><span class="lineCov"> 1 : serial_pad = 0;</span>
<span class="lineNum"> 669 </span><span class="lineCov"> 1 : have_parent = 0;</span>
<span class="lineNum"> 670 </span><span class="lineCov"> 17 : for (i = tommy_list_head(low); i != 0; i = i-&gt;next) {</span>
<span class="lineNum"> 671 </span> : size_t len;
<span class="lineNum"> 672 </span><span class="lineCov"> 16 : devinfo_t* devinfo = i-&gt;data;</span>
<span class="lineNum"> 673 </span> :
<span class="lineNum"> 674 </span><span class="lineCov"> 16 : len = strlen(devinfo-&gt;smart_serial);</span>
<span class="lineNum"> 675 </span><span class="lineCov"> 16 : if (len &gt; serial_pad)</span>
<span class="lineNum"> 676 </span><span class="lineCov"> 2 : serial_pad = len;</span>
<span class="lineNum"> 674 </span><span class="lineCov"> 16 : len = strlen(devinfo-&gt;file);</span>
<span class="lineNum"> 675 </span><span class="lineCov"> 16 : if (len &gt; device_pad)</span>
<span class="lineNum"> 676 </span><span class="lineCov"> 1 : device_pad = len;</span>
<span class="lineNum"> 677 </span> :
<span class="lineNum"> 678 </span><span class="lineCov"> 16 : if (devinfo-&gt;parent != 0)</span>
<span class="lineNum"> 679 </span><span class="lineNoCov"> 0 : have_parent = 1;</span>
<span class="lineNum"> 680 </span> : }
<span class="lineNum"> 678 </span><span class="lineCov"> 16 : len = strlen(devinfo-&gt;smart_serial);</span>
<span class="lineNum"> 679 </span><span class="lineCov"> 16 : if (len &gt; serial_pad)</span>
<span class="lineNum"> 680 </span><span class="lineCov"> 2 : serial_pad = len;</span>
<span class="lineNum"> 681 </span> :
<span class="lineNum"> 682 </span><span class="lineCov"> 1 : printf(&quot;SnapRAID SMART report:\n&quot;);</span>
<span class="lineNum"> 683 </span><span class="lineCov"> 1 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 684 </span><span class="lineCov"> 1 : printf(&quot; Temp&quot;);</span>
<span class="lineNum"> 685 </span><span class="lineCov"> 1 : printf(&quot; Power&quot;);</span>
<span class="lineNum"> 686 </span><span class="lineCov"> 1 : printf(&quot; Error&quot;);</span>
<span class="lineNum"> 687 </span><span class="lineCov"> 1 : printf(&quot; FP&quot;);</span>
<span class="lineNum"> 688 </span><span class="lineCov"> 1 : printf(&quot; Size&quot;);</span>
<span class="lineNum"> 689 </span><span class="lineCov"> 1 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 690 </span><span class="lineCov"> 1 : printf(&quot; C&quot;);</span>
<span class="lineNum"> 691 </span><span class="lineCov"> 1 : printf(&quot; OnDays&quot;);</span>
<span class="lineNum"> 692 </span><span class="lineCov"> 1 : printf(&quot; Count&quot;);</span>
<span class="lineNum"> 693 </span><span class="lineCov"> 1 : printf(&quot; &quot;);</span>
<span class="lineNum"> 694 </span><span class="lineCov"> 1 : printf(&quot; TB&quot;);</span>
<span class="lineNum"> 695 </span><span class="lineCov"> 1 : printf(&quot; &quot;); printl(&quot;Serial&quot;, serial_pad);</span>
<span class="lineNum"> 696 </span><span class="lineCov"> 1 : printf(&quot; &quot;); printl(&quot;Device&quot;, device_pad);</span>
<span class="lineNum"> 697 </span><span class="lineCov"> 1 : printf(&quot; Disk&quot;);</span>
<span class="lineNum"> 698 </span><span class="lineCov"> 1 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 699 </span> : /* |&lt;##################################################################72&gt;|####80&gt;| */
<span class="lineNum"> 700 </span><span class="lineCov"> 1 : printf(&quot; -----------------------------------------------------------------------\n&quot;);</span>
<span class="lineNum"> 701 </span> :
<span class="lineNum"> 702 </span><span class="lineCov"> 1 : array_failure_rate = 0;</span>
<span class="lineNum"> 703 </span><span class="lineCov"> 17 : for (i = tommy_list_head(low); i != 0; i = i-&gt;next) {</span>
<span class="lineNum"> 704 </span><span class="lineCov"> 16 : devinfo_t* devinfo = i-&gt;data;</span>
<span class="lineNum"> 705 </span> : double afr;
<span class="lineNum"> 706 </span> : uint64_t flag;
<span class="lineNum"> 707 </span> :
<span class="lineNum"> 708 </span><span class="lineCov"> 16 : if (devinfo-&gt;smart[194] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 709 </span><span class="lineCov"> 15 : printf(&quot;%7&quot; PRIu64, devinfo-&gt;smart[194] &amp; mask16);</span>
<span class="lineNum"> 710 </span><span class="lineCov"> 1 : else if (devinfo-&gt;smart[190] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 711 </span><span class="lineNoCov"> 0 : printf(&quot;%7&quot; PRIu64, devinfo-&gt;smart[190] &amp; mask16);</span>
<span class="lineNum"> 712 </span> : else
<span class="lineNum"> 713 </span><span class="lineCov"> 1 : printf(&quot; -&quot;);</span>
<span class="lineNum"> 714 </span> :
<span class="lineNum"> 715 </span><span class="lineCov"> 16 : if (devinfo-&gt;smart[9] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 716 </span><span class="lineCov"> 15 : printf(&quot;%7&quot; PRIu64, (devinfo-&gt;smart[9] &amp; mask32) / 24);</span>
<span class="lineNum"> 717 </span> : else
<span class="lineNum"> 718 </span><span class="lineCov"> 1 : printf(&quot; -&quot;);</span>
<span class="lineNum"> 719 </span> :
<span class="lineNum"> 720 </span><span class="lineCov"> 16 : if (devinfo-&gt;smart[SMART_FLAGS] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 721 </span><span class="lineCov"> 8 : flag = devinfo-&gt;smart[SMART_FLAGS];</span>
<span class="lineNum"> 722 </span> : else
<span class="lineNum"> 723 </span><span class="lineCov"> 8 : flag = 0;</span>
<span class="lineNum"> 724 </span><span class="lineCov"> 16 : if (flag &amp; SMARTCTL_FLAG_FAIL)</span>
<span class="lineNum"> 725 </span><span class="lineCov"> 1 : printf(&quot; FAIL&quot;);</span>
<span class="lineNum"> 726 </span><span class="lineCov"> 15 : else if (flag &amp; SMARTCTL_FLAG_PREFAIL)</span>
<span class="lineNum"> 727 </span><span class="lineCov"> 1 : printf(&quot; PREFAIL&quot;);</span>
<span class="lineNum"> 728 </span><span class="lineCov"> 14 : else if (flag &amp; SMARTCTL_FLAG_PREFAIL_LOGGED)</span>
<span class="lineNum"> 729 </span><span class="lineCov"> 1 : printf(&quot; logfail&quot;);</span>
<span class="lineNum"> 730 </span><span class="lineCov"> 13 : else if (devinfo-&gt;smart[SMART_ERROR] != SMART_UNASSIGNED</span>
<span class="lineNum"> 731 </span><span class="lineCov"> 13 : &amp;&amp; devinfo-&gt;smart[SMART_ERROR] != 0)</span>
<span class="lineNum"> 732 </span><span class="lineCov"> 1 : printf(&quot;%8&quot; PRIu64, devinfo-&gt;smart[SMART_ERROR]);</span>
<span class="lineNum"> 733 </span><span class="lineCov"> 12 : else if (flag &amp; SMARTCTL_FLAG_ERROR)</span>
<span class="lineNum"> 734 </span><span class="lineCov"> 1 : printf(&quot; logerr&quot;);</span>
<span class="lineNum"> 735 </span><span class="lineCov"> 11 : else if (flag &amp; SMARTCTL_FLAG_ERROR_LOGGED)</span>
<span class="lineNum"> 736 </span><span class="lineCov"> 1 : printf(&quot; selferr&quot;);</span>
<span class="lineNum"> 737 </span><span class="lineCov"> 10 : else if (devinfo-&gt;smart[SMART_ERROR] == 0)</span>
<span class="lineNum"> 738 </span><span class="lineCov"> 10 : printf(&quot; 0&quot;);</span>
<span class="lineNum"> 739 </span> : else
<span class="lineNum"> 740 </span><span class="lineNoCov"> 0 : printf(&quot; -&quot;);</span>
<span class="lineNum"> 741 </span> :
<span class="lineNum"> 742 </span> : /* if some fail/prefail attribute, make the command to fail */
<span class="lineNum"> 743 </span><span class="lineCov"> 16 : if (flag &amp; (SMARTCTL_FLAG_FAIL | SMARTCTL_FLAG_PREFAIL))</span>
<span class="lineNum"> 744 </span><span class="lineCov"> 2 : make_it_fail = 1;</span>
<span class="lineNum"> 682 </span><span class="lineCov"> 16 : if (devinfo-&gt;parent != 0)</span>
<span class="lineNum"> 683 </span><span class="lineNoCov"> 0 : have_parent = 1;</span>
<span class="lineNum"> 684 </span> : }
<span class="lineNum"> 685 </span> :
<span class="lineNum"> 686 </span><span class="lineCov"> 1 : printf(&quot;SnapRAID SMART report:\n&quot;);</span>
<span class="lineNum"> 687 </span><span class="lineCov"> 1 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 688 </span><span class="lineCov"> 1 : printf(&quot; Temp&quot;);</span>
<span class="lineNum"> 689 </span><span class="lineCov"> 1 : printf(&quot; Power&quot;);</span>
<span class="lineNum"> 690 </span><span class="lineCov"> 1 : printf(&quot; Error&quot;);</span>
<span class="lineNum"> 691 </span><span class="lineCov"> 1 : printf(&quot; FP&quot;);</span>
<span class="lineNum"> 692 </span><span class="lineCov"> 1 : printf(&quot; Size&quot;);</span>
<span class="lineNum"> 693 </span><span class="lineCov"> 1 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 694 </span><span class="lineCov"> 1 : printf(&quot; C&quot;);</span>
<span class="lineNum"> 695 </span><span class="lineCov"> 1 : printf(&quot; OnDays&quot;);</span>
<span class="lineNum"> 696 </span><span class="lineCov"> 1 : printf(&quot; Count&quot;);</span>
<span class="lineNum"> 697 </span><span class="lineCov"> 1 : printf(&quot; &quot;);</span>
<span class="lineNum"> 698 </span><span class="lineCov"> 1 : printf(&quot; TB&quot;);</span>
<span class="lineNum"> 699 </span><span class="lineCov"> 1 : printf(&quot; &quot;); printl(&quot;Serial&quot;, serial_pad);</span>
<span class="lineNum"> 700 </span><span class="lineCov"> 1 : printf(&quot; &quot;); printl(&quot;Device&quot;, device_pad);</span>
<span class="lineNum"> 701 </span><span class="lineCov"> 1 : printf(&quot; Disk&quot;);</span>
<span class="lineNum"> 702 </span><span class="lineCov"> 1 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 703 </span> : /* |&lt;##################################################################72&gt;|####80&gt;| */
<span class="lineNum"> 704 </span><span class="lineCov"> 1 : printf(&quot; -----------------------------------------------------------------------\n&quot;);</span>
<span class="lineNum"> 705 </span> :
<span class="lineNum"> 706 </span><span class="lineCov"> 1 : array_failure_rate = 0;</span>
<span class="lineNum"> 707 </span><span class="lineCov"> 17 : for (i = tommy_list_head(low); i != 0; i = i-&gt;next) {</span>
<span class="lineNum"> 708 </span><span class="lineCov"> 16 : devinfo_t* devinfo = i-&gt;data;</span>
<span class="lineNum"> 709 </span> : double afr;
<span class="lineNum"> 710 </span> : uint64_t flag;
<span class="lineNum"> 711 </span> :
<span class="lineNum"> 712 </span><span class="lineCov"> 16 : if (devinfo-&gt;smart[194] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 713 </span><span class="lineCov"> 15 : printf(&quot;%7&quot; PRIu64, devinfo-&gt;smart[194] &amp; mask16);</span>
<span class="lineNum"> 714 </span><span class="lineCov"> 1 : else if (devinfo-&gt;smart[190] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 715 </span><span class="lineNoCov"> 0 : printf(&quot;%7&quot; PRIu64, devinfo-&gt;smart[190] &amp; mask16);</span>
<span class="lineNum"> 716 </span> : else
<span class="lineNum"> 717 </span><span class="lineCov"> 1 : printf(&quot; -&quot;);</span>
<span class="lineNum"> 718 </span> :
<span class="lineNum"> 719 </span><span class="lineCov"> 16 : if (devinfo-&gt;smart[9] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 720 </span><span class="lineCov"> 15 : printf(&quot;%7&quot; PRIu64, (devinfo-&gt;smart[9] &amp; mask32) / 24);</span>
<span class="lineNum"> 721 </span> : else
<span class="lineNum"> 722 </span><span class="lineCov"> 1 : printf(&quot; -&quot;);</span>
<span class="lineNum"> 723 </span> :
<span class="lineNum"> 724 </span><span class="lineCov"> 16 : if (devinfo-&gt;smart[SMART_FLAGS] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 725 </span><span class="lineCov"> 8 : flag = devinfo-&gt;smart[SMART_FLAGS];</span>
<span class="lineNum"> 726 </span> : else
<span class="lineNum"> 727 </span><span class="lineCov"> 8 : flag = 0;</span>
<span class="lineNum"> 728 </span><span class="lineCov"> 16 : if (flag &amp; SMARTCTL_FLAG_FAIL)</span>
<span class="lineNum"> 729 </span><span class="lineCov"> 1 : printf(&quot; FAIL&quot;);</span>
<span class="lineNum"> 730 </span><span class="lineCov"> 15 : else if (flag &amp; SMARTCTL_FLAG_PREFAIL)</span>
<span class="lineNum"> 731 </span><span class="lineCov"> 1 : printf(&quot; PREFAIL&quot;);</span>
<span class="lineNum"> 732 </span><span class="lineCov"> 14 : else if (flag &amp; SMARTCTL_FLAG_PREFAIL_LOGGED)</span>
<span class="lineNum"> 733 </span><span class="lineCov"> 1 : printf(&quot; logfail&quot;);</span>
<span class="lineNum"> 734 </span><span class="lineCov"> 13 : else if (devinfo-&gt;smart[SMART_ERROR] != SMART_UNASSIGNED</span>
<span class="lineNum"> 735 </span><span class="lineCov"> 13 : &amp;&amp; devinfo-&gt;smart[SMART_ERROR] != 0)</span>
<span class="lineNum"> 736 </span><span class="lineCov"> 1 : printf(&quot;%8&quot; PRIu64, devinfo-&gt;smart[SMART_ERROR]);</span>
<span class="lineNum"> 737 </span><span class="lineCov"> 12 : else if (flag &amp; SMARTCTL_FLAG_ERROR)</span>
<span class="lineNum"> 738 </span><span class="lineCov"> 1 : printf(&quot; logerr&quot;);</span>
<span class="lineNum"> 739 </span><span class="lineCov"> 11 : else if (flag &amp; SMARTCTL_FLAG_ERROR_LOGGED)</span>
<span class="lineNum"> 740 </span><span class="lineCov"> 1 : printf(&quot; selferr&quot;);</span>
<span class="lineNum"> 741 </span><span class="lineCov"> 10 : else if (devinfo-&gt;smart[SMART_ERROR] == 0)</span>
<span class="lineNum"> 742 </span><span class="lineCov"> 10 : printf(&quot; 0&quot;);</span>
<span class="lineNum"> 743 </span> : else
<span class="lineNum"> 744 </span><span class="lineNoCov"> 0 : printf(&quot; -&quot;);</span>
<span class="lineNum"> 745 </span> :
<span class="lineNum"> 746 </span> : /* note that in older smartmontools, like 5.x, rotation rate is not present */
<span class="lineNum"> 747 </span> : /* and then it could remain unassigned */
<span class="lineNum"> 748 </span> :
<span class="lineNum"> 749 </span><span class="lineCov"> 16 : if (flag &amp; (SMARTCTL_FLAG_UNSUPPORTED | SMARTCTL_FLAG_OPEN)) {</span>
<span class="lineNum"> 750 </span> : /* if error running smartctl, skip AFR estimation */
<span class="lineNum"> 751 </span><span class="lineCov"> 2 : afr = 0;</span>
<span class="lineNum"> 752 </span><span class="lineCov"> 2 : printf(&quot; n/a&quot;);</span>
<span class="lineNum"> 753 </span><span class="lineCov"> 14 : } else if (devinfo-&gt;smart[SMART_ROTATION_RATE] == 0) {</span>
<span class="lineNum"> 754 </span> : /* if SSD, skip AFR estimation as data is from not SSD disks */
<span class="lineNum"> 755 </span><span class="lineCov"> 1 : afr = 0;</span>
<span class="lineNum"> 756 </span><span class="lineCov"> 1 : printf(&quot; SSD&quot;);</span>
<span class="lineNum"> 757 </span> : } else {
<span class="lineNum"> 758 </span><span class="lineCov"> 13 : afr = smart_afr(devinfo-&gt;smart);</span>
<span class="lineNum"> 759 </span> :
<span class="lineNum"> 760 </span><span class="lineCov"> 13 : if (afr == 0) {</span>
<span class="lineNum"> 761 </span> : /* this happens only if no data */
<span class="lineNum"> 762 </span><span class="lineCov"> 1 : printf(&quot; -&quot;);</span>
<span class="lineNum"> 763 </span> : } else {
<span class="lineNum"> 764 </span> : /* use only the disks in the array */
<span class="lineNum"> 765 </span><span class="lineCov"> 12 : if (devinfo-&gt;parent != 0 || !have_parent)</span>
<span class="lineNum"> 766 </span><span class="lineCov"> 12 : array_failure_rate += afr;</span>
<span class="lineNum"> 767 </span> :
<span class="lineNum"> 768 </span><span class="lineCov"> 12 : printf(&quot;%4.0f%%&quot;, poisson_prob_n_or_more_failures(afr, 1) * 100);</span>
<span class="lineNum"> 769 </span> : }
<span class="lineNum"> 770 </span> : }
<span class="lineNum"> 746 </span> : /* if some fail/prefail attribute, make the command to fail */
<span class="lineNum"> 747 </span><span class="lineCov"> 16 : if (flag &amp; (SMARTCTL_FLAG_FAIL | SMARTCTL_FLAG_PREFAIL))</span>
<span class="lineNum"> 748 </span><span class="lineCov"> 2 : make_it_fail = 1;</span>
<span class="lineNum"> 749 </span> :
<span class="lineNum"> 750 </span> : /* note that in older smartmontools, like 5.x, rotation rate is not present */
<span class="lineNum"> 751 </span> : /* and then it could remain unassigned */
<span class="lineNum"> 752 </span> :
<span class="lineNum"> 753 </span><span class="lineCov"> 16 : if (flag &amp; (SMARTCTL_FLAG_UNSUPPORTED | SMARTCTL_FLAG_OPEN)) {</span>
<span class="lineNum"> 754 </span> : /* if error running smartctl, skip AFR estimation */
<span class="lineNum"> 755 </span><span class="lineCov"> 2 : afr = 0;</span>
<span class="lineNum"> 756 </span><span class="lineCov"> 2 : printf(&quot; n/a&quot;);</span>
<span class="lineNum"> 757 </span><span class="lineCov"> 14 : } else if (devinfo-&gt;smart[SMART_ROTATION_RATE] == 0) {</span>
<span class="lineNum"> 758 </span> : /* if SSD, skip AFR estimation as data is from not SSD disks */
<span class="lineNum"> 759 </span><span class="lineCov"> 1 : afr = 0;</span>
<span class="lineNum"> 760 </span><span class="lineCov"> 1 : printf(&quot; SSD&quot;);</span>
<span class="lineNum"> 761 </span> : } else {
<span class="lineNum"> 762 </span><span class="lineCov"> 13 : afr = smart_afr(devinfo-&gt;smart);</span>
<span class="lineNum"> 763 </span> :
<span class="lineNum"> 764 </span><span class="lineCov"> 13 : if (afr == 0) {</span>
<span class="lineNum"> 765 </span> : /* this happens only if no data */
<span class="lineNum"> 766 </span><span class="lineCov"> 1 : printf(&quot; -&quot;);</span>
<span class="lineNum"> 767 </span> : } else {
<span class="lineNum"> 768 </span> : /* use only the disks in the array */
<span class="lineNum"> 769 </span><span class="lineCov"> 12 : if (devinfo-&gt;parent != 0 || !have_parent)</span>
<span class="lineNum"> 770 </span><span class="lineCov"> 12 : array_failure_rate += afr;</span>
<span class="lineNum"> 771 </span> :
<span class="lineNum"> 772 </span><span class="lineCov"> 16 : if (devinfo-&gt;smart[SMART_SIZE] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 773 </span><span class="lineCov"> 15 : printf(&quot; %4.1f&quot;, devinfo-&gt;smart[SMART_SIZE] / 1E12);</span>
<span class="lineNum"> 774 </span> : else
<span class="lineNum"> 775 </span><span class="lineCov"> 1 : printf(&quot; -&quot;);</span>
<span class="lineNum"> 776 </span> :
<span class="lineNum"> 777 </span><span class="lineCov"> 16 : printf(&quot; &quot;);</span>
<span class="lineNum"> 778 </span><span class="lineCov"> 16 : if (*devinfo-&gt;smart_serial)</span>
<span class="lineNum"> 779 </span><span class="lineCov"> 15 : printl(devinfo-&gt;smart_serial, serial_pad);</span>
<span class="lineNum"> 780 </span> : else
<span class="lineNum"> 781 </span><span class="lineCov"> 1 : printl(&quot;-&quot;, serial_pad);</span>
<span class="lineNum"> 782 </span> :
<span class="lineNum"> 783 </span><span class="lineCov"> 16 : printf(&quot; &quot;);</span>
<span class="lineNum"> 784 </span><span class="lineCov"> 16 : if (*devinfo-&gt;file)</span>
<span class="lineNum"> 785 </span><span class="lineCov"> 15 : printl(devinfo-&gt;file, device_pad);</span>
<span class="lineNum"> 786 </span> : else
<span class="lineNum"> 787 </span><span class="lineCov"> 1 : printl(&quot;-&quot;, device_pad);</span>
<span class="lineNum"> 788 </span> :
<span class="lineNum"> 789 </span><span class="lineCov"> 16 : printf(&quot; &quot;);</span>
<span class="lineNum"> 790 </span><span class="lineCov"> 16 : if (*devinfo-&gt;name)</span>
<span class="lineNum"> 791 </span><span class="lineCov"> 15 : printf(&quot;%s&quot;, devinfo-&gt;name);</span>
<span class="lineNum"> 792 </span> : else
<span class="lineNum"> 793 </span><span class="lineCov"> 1 : printf(&quot;-&quot;);</span>
<span class="lineNum"> 794 </span> :
<span class="lineNum"> 795 </span><span class="lineCov"> 16 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 796 </span> :
<span class="lineNum"> 797 </span><span class="lineCov"> 16 : log_tag(&quot;smart:%s:%s\n&quot;, devinfo-&gt;file, devinfo-&gt;name);</span>
<span class="lineNum"> 798 </span><span class="lineCov"> 16 : if (devinfo-&gt;smart_serial[0])</span>
<span class="lineNum"> 799 </span><span class="lineCov"> 15 : log_tag(&quot;attr:%s:%s:serial:%s\n&quot;, devinfo-&gt;file, devinfo-&gt;name, esc(devinfo-&gt;smart_serial));</span>
<span class="lineNum"> 800 </span><span class="lineCov"> 16 : if (afr != 0)</span>
<span class="lineNum"> 801 </span><span class="lineCov"> 12 : log_tag(&quot;attr:%s:%s:afr:%g\n&quot;, devinfo-&gt;file, devinfo-&gt;name, afr);</span>
<span class="lineNum"> 802 </span><span class="lineCov"> 16 : if (devinfo-&gt;smart[SMART_SIZE] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 803 </span><span class="lineCov"> 15 : log_tag(&quot;attr:%s:%s:size:%&quot; PRIu64 &quot;\n&quot;, devinfo-&gt;file, devinfo-&gt;name, devinfo-&gt;smart[SMART_SIZE]);</span>
<span class="lineNum"> 804 </span><span class="lineCov"> 16 : if (devinfo-&gt;smart[SMART_ERROR] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 805 </span><span class="lineCov"> 16 : log_tag(&quot;attr:%s:%s:error:%&quot; PRIu64 &quot;\n&quot;, devinfo-&gt;file, devinfo-&gt;name, devinfo-&gt;smart[SMART_ERROR]);</span>
<span class="lineNum"> 806 </span><span class="lineCov"> 16 : if (devinfo-&gt;smart[SMART_ROTATION_RATE] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 807 </span><span class="lineCov"> 16 : log_tag(&quot;attr:%s:%s:rotationrate:%&quot; PRIu64 &quot;\n&quot;, devinfo-&gt;file, devinfo-&gt;name, devinfo-&gt;smart[SMART_ROTATION_RATE]);</span>
<span class="lineNum"> 808 </span><span class="lineCov"> 16 : if (devinfo-&gt;smart[SMART_FLAGS] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 809 </span><span class="lineCov"> 8 : log_tag(&quot;attr:%s:%s:flags:%&quot; PRIu64 &quot;:%&quot; PRIx64 &quot;\n&quot;, devinfo-&gt;file, devinfo-&gt;name, devinfo-&gt;smart[SMART_FLAGS], devinfo-&gt;smart[SMART_FLAGS]);</span>
<span class="lineNum"> 810 </span><span class="lineCov"> 4112 : for (j = 0; j &lt; 256; ++j)</span>
<span class="lineNum"> 811 </span><span class="lineCov"> 4096 : if (devinfo-&gt;smart[j] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 812 </span><span class="lineCov"> 3840 : log_tag(&quot;attr:%s:%s:%u:%&quot; PRIu64 &quot;:%&quot; PRIx64 &quot;\n&quot;, devinfo-&gt;file, devinfo-&gt;name, j, devinfo-&gt;smart[j], devinfo-&gt;smart[j]);</span>
<span class="lineNum"> 813 </span> : }
<span class="lineNum"> 814 </span> :
<span class="lineNum"> 815 </span><span class="lineCov"> 1 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 816 </span> :
<span class="lineNum"> 817 </span> : /* |&lt;##################################################################72&gt;|####80&gt;| */
<span class="lineNum"> 818 </span><span class="lineCov"> 1 : printf(&quot;The FP column is the estimated probability (in percentage) that the disk\n&quot;);</span>
<span class="lineNum"> 819 </span><span class="lineCov"> 1 : printf(&quot;is going to fail in the next year.\n&quot;);</span>
<span class="lineNum"> 820 </span><span class="lineCov"> 1 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 821 </span> :
<span class="lineNum"> 822 </span> : /*
<span class="lineNum"> 823 </span> : * The probability of one and of at least one failure is computed assuming
<span class="lineNum"> 824 </span> : * a Poisson distribution with the estimated array failure rate.
<span class="lineNum"> 825 </span> : */
<span class="lineNum"> 826 </span><span class="lineCov"> 1 : p_at_least_one_failure = poisson_prob_n_or_more_failures(array_failure_rate, 1);</span>
<span class="lineNum"> 827 </span> :
<span class="lineNum"> 828 </span><span class="lineCov"> 1 : printf(&quot;Probability that at least one disk is going to fail in the next year is %.0f%%.\n&quot;, p_at_least_one_failure * 100);</span>
<span class="lineNum"> 829 </span><span class="lineCov"> 1 : log_tag(&quot;summary:array_failure:%g:%g\n&quot;, array_failure_rate, p_at_least_one_failure);</span>
<span class="lineNum"> 830 </span> :
<span class="lineNum"> 831 </span> : /* print extra stats only in verbose mode */
<span class="lineNum"> 832 </span><span class="lineCov"> 1 : if (msg_level &lt; MSG_VERBOSE)</span>
<span class="lineNum"> 833 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 772 </span><span class="lineCov"> 12 : printf(&quot;%4.0f%%&quot;, poisson_prob_n_or_more_failures(afr, 1) * 100);</span>
<span class="lineNum"> 773 </span> : }
<span class="lineNum"> 774 </span> : }
<span class="lineNum"> 775 </span> :
<span class="lineNum"> 776 </span><span class="lineCov"> 16 : if (devinfo-&gt;smart[SMART_SIZE] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 777 </span><span class="lineCov"> 15 : printf(&quot; %4.1f&quot;, devinfo-&gt;smart[SMART_SIZE] / 1E12);</span>
<span class="lineNum"> 778 </span> : else
<span class="lineNum"> 779 </span><span class="lineCov"> 1 : printf(&quot; -&quot;);</span>
<span class="lineNum"> 780 </span> :
<span class="lineNum"> 781 </span><span class="lineCov"> 16 : printf(&quot; &quot;);</span>
<span class="lineNum"> 782 </span><span class="lineCov"> 16 : if (*devinfo-&gt;smart_serial)</span>
<span class="lineNum"> 783 </span><span class="lineCov"> 15 : printl(devinfo-&gt;smart_serial, serial_pad);</span>
<span class="lineNum"> 784 </span> : else
<span class="lineNum"> 785 </span><span class="lineCov"> 1 : printl(&quot;-&quot;, serial_pad);</span>
<span class="lineNum"> 786 </span> :
<span class="lineNum"> 787 </span><span class="lineCov"> 16 : printf(&quot; &quot;);</span>
<span class="lineNum"> 788 </span><span class="lineCov"> 16 : if (*devinfo-&gt;file)</span>
<span class="lineNum"> 789 </span><span class="lineCov"> 15 : printl(devinfo-&gt;file, device_pad);</span>
<span class="lineNum"> 790 </span> : else
<span class="lineNum"> 791 </span><span class="lineCov"> 1 : printl(&quot;-&quot;, device_pad);</span>
<span class="lineNum"> 792 </span> :
<span class="lineNum"> 793 </span><span class="lineCov"> 16 : printf(&quot; &quot;);</span>
<span class="lineNum"> 794 </span><span class="lineCov"> 16 : if (*devinfo-&gt;name)</span>
<span class="lineNum"> 795 </span><span class="lineCov"> 15 : printf(&quot;%s&quot;, devinfo-&gt;name);</span>
<span class="lineNum"> 796 </span> : else
<span class="lineNum"> 797 </span><span class="lineCov"> 1 : printf(&quot;-&quot;);</span>
<span class="lineNum"> 798 </span> :
<span class="lineNum"> 799 </span><span class="lineCov"> 16 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 800 </span> :
<span class="lineNum"> 801 </span><span class="lineCov"> 16 : log_tag(&quot;smart:%s:%s\n&quot;, devinfo-&gt;file, devinfo-&gt;name);</span>
<span class="lineNum"> 802 </span><span class="lineCov"> 16 : if (devinfo-&gt;smart_serial[0])</span>
<span class="lineNum"> 803 </span><span class="lineCov"> 15 : log_tag(&quot;attr:%s:%s:serial:%s\n&quot;, devinfo-&gt;file, devinfo-&gt;name, esc(devinfo-&gt;smart_serial));</span>
<span class="lineNum"> 804 </span><span class="lineCov"> 16 : if (afr != 0)</span>
<span class="lineNum"> 805 </span><span class="lineCov"> 12 : log_tag(&quot;attr:%s:%s:afr:%g\n&quot;, devinfo-&gt;file, devinfo-&gt;name, afr);</span>
<span class="lineNum"> 806 </span><span class="lineCov"> 16 : if (devinfo-&gt;smart[SMART_SIZE] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 807 </span><span class="lineCov"> 15 : log_tag(&quot;attr:%s:%s:size:%&quot; PRIu64 &quot;\n&quot;, devinfo-&gt;file, devinfo-&gt;name, devinfo-&gt;smart[SMART_SIZE]);</span>
<span class="lineNum"> 808 </span><span class="lineCov"> 16 : if (devinfo-&gt;smart[SMART_ERROR] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 809 </span><span class="lineCov"> 16 : log_tag(&quot;attr:%s:%s:error:%&quot; PRIu64 &quot;\n&quot;, devinfo-&gt;file, devinfo-&gt;name, devinfo-&gt;smart[SMART_ERROR]);</span>
<span class="lineNum"> 810 </span><span class="lineCov"> 16 : if (devinfo-&gt;smart[SMART_ROTATION_RATE] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 811 </span><span class="lineCov"> 16 : log_tag(&quot;attr:%s:%s:rotationrate:%&quot; PRIu64 &quot;\n&quot;, devinfo-&gt;file, devinfo-&gt;name, devinfo-&gt;smart[SMART_ROTATION_RATE]);</span>
<span class="lineNum"> 812 </span><span class="lineCov"> 16 : if (devinfo-&gt;smart[SMART_FLAGS] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 813 </span><span class="lineCov"> 8 : log_tag(&quot;attr:%s:%s:flags:%&quot; PRIu64 &quot;:%&quot; PRIx64 &quot;\n&quot;, devinfo-&gt;file, devinfo-&gt;name, devinfo-&gt;smart[SMART_FLAGS], devinfo-&gt;smart[SMART_FLAGS]);</span>
<span class="lineNum"> 814 </span><span class="lineCov"> 4112 : for (j = 0; j &lt; 256; ++j)</span>
<span class="lineNum"> 815 </span><span class="lineCov"> 4096 : if (devinfo-&gt;smart[j] != SMART_UNASSIGNED)</span>
<span class="lineNum"> 816 </span><span class="lineCov"> 3840 : log_tag(&quot;attr:%s:%s:%u:%&quot; PRIu64 &quot;:%&quot; PRIx64 &quot;\n&quot;, devinfo-&gt;file, devinfo-&gt;name, j, devinfo-&gt;smart[j], devinfo-&gt;smart[j]);</span>
<span class="lineNum"> 817 </span> : }
<span class="lineNum"> 818 </span> :
<span class="lineNum"> 819 </span><span class="lineCov"> 1 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 820 </span> :
<span class="lineNum"> 821 </span> : /* |&lt;##################################################################72&gt;|####80&gt;| */
<span class="lineNum"> 822 </span><span class="lineCov"> 1 : printf(&quot;The FP column is the estimated probability (in percentage) that the disk\n&quot;);</span>
<span class="lineNum"> 823 </span><span class="lineCov"> 1 : printf(&quot;is going to fail in the next year.\n&quot;);</span>
<span class="lineNum"> 824 </span><span class="lineCov"> 1 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 825 </span> :
<span class="lineNum"> 826 </span> : /*
<span class="lineNum"> 827 </span> : * The probability of one and of at least one failure is computed assuming
<span class="lineNum"> 828 </span> : * a Poisson distribution with the estimated array failure rate.
<span class="lineNum"> 829 </span> : */
<span class="lineNum"> 830 </span><span class="lineCov"> 1 : p_at_least_one_failure = poisson_prob_n_or_more_failures(array_failure_rate, 1);</span>
<span class="lineNum"> 831 </span> :
<span class="lineNum"> 832 </span><span class="lineCov"> 1 : printf(&quot;Probability that at least one disk is going to fail in the next year is %.0f%%.\n&quot;, p_at_least_one_failure * 100);</span>
<span class="lineNum"> 833 </span><span class="lineCov"> 1 : log_tag(&quot;summary:array_failure:%g:%g\n&quot;, array_failure_rate, p_at_least_one_failure);</span>
<span class="lineNum"> 834 </span> :
<span class="lineNum"> 835 </span> : /* |&lt;##################################################################72&gt;|####80&gt;| */
<span class="lineNum"> 836 </span><span class="lineCov"> 1 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 837 </span><span class="lineCov"> 1 : printf(&quot;Probability of data loss in the next year for different parity and\n&quot;);</span>
<span class="lineNum"> 838 </span><span class="lineCov"> 1 : printf(&quot;combined scrub and repair time:\n&quot;);</span>
<span class="lineNum"> 839 </span><span class="lineCov"> 1 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 840 </span><span class="lineCov"> 1 : printf(&quot; Parity 1 Week 1 Month 3 Months\n&quot;);</span>
<span class="lineNum"> 841 </span><span class="lineCov"> 1 : printf(&quot; -----------------------------------------------------------------------\n&quot;);</span>
<span class="lineNum"> 842 </span><span class="lineCov"> 7 : for (j = 0; j &lt; RAID_PARITY_MAX; ++j) {</span>
<span class="lineNum"> 843 </span><span class="lineCov"> 6 : printf(&quot;%6u&quot;, j + 1);</span>
<span class="lineNum"> 844 </span><span class="lineCov"> 6 : printf(&quot; &quot;);</span>
<span class="lineNum"> 845 </span><span class="lineCov"> 6 : printp(raid_prob_of_one_or_more_failures(array_failure_rate, 365.0 / 7, n, j + 1) * 100, 19);</span>
<span class="lineNum"> 846 </span><span class="lineCov"> 6 : printf(&quot; &quot;);</span>
<span class="lineNum"> 847 </span><span class="lineCov"> 6 : printp(raid_prob_of_one_or_more_failures(array_failure_rate, 365.0 / 30, n, j + 1) * 100, 17);</span>
<span class="lineNum"> 835 </span> : /* print extra stats only in verbose mode */
<span class="lineNum"> 836 </span><span class="lineCov"> 1 : if (msg_level &lt; MSG_VERBOSE)</span>
<span class="lineNum"> 837 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 838 </span> :
<span class="lineNum"> 839 </span> : /* |&lt;##################################################################72&gt;|####80&gt;| */
<span class="lineNum"> 840 </span><span class="lineCov"> 1 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 841 </span><span class="lineCov"> 1 : printf(&quot;Probability of data loss in the next year for different parity and\n&quot;);</span>
<span class="lineNum"> 842 </span><span class="lineCov"> 1 : printf(&quot;combined scrub and repair time:\n&quot;);</span>
<span class="lineNum"> 843 </span><span class="lineCov"> 1 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 844 </span><span class="lineCov"> 1 : printf(&quot; Parity 1 Week 1 Month 3 Months\n&quot;);</span>
<span class="lineNum"> 845 </span><span class="lineCov"> 1 : printf(&quot; -----------------------------------------------------------------------\n&quot;);</span>
<span class="lineNum"> 846 </span><span class="lineCov"> 7 : for (j = 0; j &lt; RAID_PARITY_MAX; ++j) {</span>
<span class="lineNum"> 847 </span><span class="lineCov"> 6 : printf(&quot;%6u&quot;, j + 1);</span>
<span class="lineNum"> 848 </span><span class="lineCov"> 6 : printf(&quot; &quot;);</span>
<span class="lineNum"> 849 </span><span class="lineCov"> 6 : printp(raid_prob_of_one_or_more_failures(array_failure_rate, 365.0 / 90, n, j + 1) * 100, 13);</span>
<span class="lineNum"> 850 </span><span class="lineCov"> 6 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 851 </span> : }
<span class="lineNum"> 852 </span> :
<span class="lineNum"> 853 </span><span class="lineCov"> 1 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 854 </span> :
<span class="lineNum"> 855 </span> : /* |&lt;##################################################################72&gt;|####80&gt;| */
<span class="lineNum"> 856 </span><span class="lineCov"> 1 : printf(&quot;These values are the probabilities that in the next year you'll have a\n&quot;);</span>
<span class="lineNum"> 857 </span><span class="lineCov"> 1 : printf(&quot;sequence of failures that the parity WONT be able to recover, assuming\n&quot;);</span>
<span class="lineNum"> 858 </span><span class="lineCov"> 1 : printf(&quot;that you regularly scrub, and in case repair, the array in the specified\n&quot;);</span>
<span class="lineNum"> 859 </span><span class="lineCov"> 1 : printf(&quot;time.\n&quot;);</span>
<span class="lineNum"> 860 </span> :
<span class="lineNum"> 861 </span> : bail:
<span class="lineNum"> 862 </span><span class="lineCov"> 1 : if (make_it_fail) {</span>
<span class="lineNum"> 863 </span><span class="lineCov"> 1 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 864 </span><span class="lineCov"> 1 : printf(&quot;DANGER! SMART is reporting that one or more disks are FAILING!\n&quot;);</span>
<span class="lineNum"> 865 </span><span class="lineCov"> 1 : printf(&quot;Please take immediate action!\n&quot;);</span>
<span class="lineNum"> 866 </span><span class="lineCov"> 1 : exit(EXIT_FAILURE);</span>
<span class="lineNum"> 867 </span> : }
<span class="lineNum"> 868 </span><span class="lineNoCov"> 0 : }</span>
<span class="lineNum"> 869 </span> :
<span class="lineNum"> 870 </span> : /**
<a name="871"><span class="lineNum"> 871 </span> : * Fill with fake data the device list.</a>
<span class="lineNum"> 872 </span> : */
<span class="lineNum"> 873 </span><span class="lineCov"> 1 : static int devtest(tommy_list* low, int operation)</span>
<span class="lineNum"> 874 </span> : {
<span class="lineNum"> 875 </span> : unsigned c;
<span class="lineNum"> 876 </span> :
<span class="lineNum"> 877 </span><span class="lineCov"> 1 : if (operation != DEVICE_SMART)</span>
<span class="lineNum"> 878 </span><span class="lineNoCov"> 0 : return -1;</span>
<span class="lineNum"> 879 </span> :
<span class="lineNum"> 880 </span> : /* add some fake data */
<span class="lineNum"> 881 </span><span class="lineCov"> 17 : for (c = 0; c &lt; 16; ++c) {</span>
<span class="lineNum"> 882 </span> : devinfo_t* entry;
<span class="lineNum"> 883 </span> : int j;
<span class="lineNum"> 884 </span> :
<span class="lineNum"> 885 </span><span class="lineCov"> 16 : entry = calloc_nofail(1, sizeof(devinfo_t));</span>
<span class="lineNum"> 886 </span> :
<span class="lineNum"> 887 </span><span class="lineCov"> 16 : entry-&gt;device = c;</span>
<span class="lineNum"> 849 </span><span class="lineCov"> 6 : printp(raid_prob_of_one_or_more_failures(array_failure_rate, 365.0 / 7, n, j + 1) * 100, 19);</span>
<span class="lineNum"> 850 </span><span class="lineCov"> 6 : printf(&quot; &quot;);</span>
<span class="lineNum"> 851 </span><span class="lineCov"> 6 : printp(raid_prob_of_one_or_more_failures(array_failure_rate, 365.0 / 30, n, j + 1) * 100, 17);</span>
<span class="lineNum"> 852 </span><span class="lineCov"> 6 : printf(&quot; &quot;);</span>
<span class="lineNum"> 853 </span><span class="lineCov"> 6 : printp(raid_prob_of_one_or_more_failures(array_failure_rate, 365.0 / 90, n, j + 1) * 100, 13);</span>
<span class="lineNum"> 854 </span><span class="lineCov"> 6 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 855 </span> : }
<span class="lineNum"> 856 </span> :
<span class="lineNum"> 857 </span><span class="lineCov"> 1 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 858 </span> :
<span class="lineNum"> 859 </span> : /* |&lt;##################################################################72&gt;|####80&gt;| */
<span class="lineNum"> 860 </span><span class="lineCov"> 1 : printf(&quot;These values are the probabilities that in the next year you'll have a\n&quot;);</span>
<span class="lineNum"> 861 </span><span class="lineCov"> 1 : printf(&quot;sequence of failures that the parity WONT be able to recover, assuming\n&quot;);</span>
<span class="lineNum"> 862 </span><span class="lineCov"> 1 : printf(&quot;that you regularly scrub, and in case repair, the array in the specified\n&quot;);</span>
<span class="lineNum"> 863 </span><span class="lineCov"> 1 : printf(&quot;time.\n&quot;);</span>
<span class="lineNum"> 864 </span> :
<span class="lineNum"> 865 </span> : bail:
<span class="lineNum"> 866 </span><span class="lineCov"> 1 : if (make_it_fail) {</span>
<span class="lineNum"> 867 </span><span class="lineCov"> 1 : printf(&quot;\n&quot;);</span>
<span class="lineNum"> 868 </span><span class="lineCov"> 1 : printf(&quot;DANGER! SMART is reporting that one or more disks are FAILING!\n&quot;);</span>
<span class="lineNum"> 869 </span><span class="lineCov"> 1 : printf(&quot;Please take immediate action!\n&quot;);</span>
<span class="lineNum"> 870 </span><span class="lineCov"> 1 : exit(EXIT_FAILURE);</span>
<span class="lineNum"> 871 </span> : }
<span class="lineNum"> 872 </span><span class="lineNoCov"> 0 : }</span>
<span class="lineNum"> 873 </span> :
<span class="lineNum"> 874 </span> : /**
<a name="875"><span class="lineNum"> 875 </span> : * Fill with fake data the device list.</a>
<span class="lineNum"> 876 </span> : */
<span class="lineNum"> 877 </span><span class="lineCov"> 1 : static int devtest(tommy_list* low, int operation)</span>
<span class="lineNum"> 878 </span> : {
<span class="lineNum"> 879 </span> : unsigned c;
<span class="lineNum"> 880 </span> :
<span class="lineNum"> 881 </span><span class="lineCov"> 1 : if (operation != DEVICE_SMART)</span>
<span class="lineNum"> 882 </span><span class="lineNoCov"> 0 : return -1;</span>
<span class="lineNum"> 883 </span> :
<span class="lineNum"> 884 </span> : /* add some fake data */
<span class="lineNum"> 885 </span><span class="lineCov"> 17 : for (c = 0; c &lt; 16; ++c) {</span>
<span class="lineNum"> 886 </span> : devinfo_t* entry;
<span class="lineNum"> 887 </span> : int j;
<span class="lineNum"> 888 </span> :
<span class="lineNum"> 889 </span><span class="lineCov"> 16 : tommy_list_insert_tail(low, &amp;entry-&gt;node, entry);</span>
<span class="lineNum"> 889 </span><span class="lineCov"> 16 : entry = calloc_nofail(1, sizeof(devinfo_t));</span>
<span class="lineNum"> 890 </span> :
<span class="lineNum"> 891 </span><span class="lineCov"> 4112 : for (j = 0; j &lt; 256; ++j) {</span>
<span class="lineNum"> 892 </span><span class="lineCov"> 4096 : switch (c) {</span>
<span class="lineNum"> 893 </span><span class="lineCov"> 256 : case 0 : entry-&gt;smart[j] = 0; break;</span>
<span class="lineNum"> 894 </span><span class="lineCov"> 256 : case 1 : entry-&gt;smart[j] = SMART_UNASSIGNED; break;</span>
<span class="lineNum"> 895 </span> : default:
<span class="lineNum"> 896 </span><span class="lineCov"> 3584 : if (j == 193)</span>
<span class="lineNum"> 897 </span><span class="lineCov"> 14 : entry-&gt;smart[j] = c - 2;</span>
<span class="lineNum"> 898 </span> : else
<span class="lineNum"> 899 </span><span class="lineCov"> 3570 : entry-&gt;smart[j] = 0;</span>
<span class="lineNum"> 900 </span><span class="lineCov"> 3584 : break;</span>
<span class="lineNum"> 901 </span> : }
<span class="lineNum"> 902 </span> : }
<span class="lineNum"> 903 </span> :
<span class="lineNum"> 904 </span><span class="lineCov"> 16 : if (c == 0) {</span>
<span class="lineNum"> 905 </span><span class="lineCov"> 1 : entry-&gt;smart_serial[0] = 0;</span>
<span class="lineNum"> 906 </span><span class="lineCov"> 1 : entry-&gt;file[0] = 0;</span>
<span class="lineNum"> 907 </span><span class="lineCov"> 1 : entry-&gt;name[0] = 0;</span>
<span class="lineNum"> 908 </span><span class="lineCov"> 1 : entry-&gt;smart[SMART_SIZE] = SMART_UNASSIGNED;</span>
<span class="lineNum"> 909 </span><span class="lineCov"> 1 : entry-&gt;smart[SMART_ROTATION_RATE] = 0;</span>
<span class="lineNum"> 910 </span> : } else {
<span class="lineNum"> 911 </span><span class="lineCov"> 15 : snprintf(entry-&gt;smart_serial, sizeof(entry-&gt;smart_serial), &quot;%u&quot;, c);</span>
<span class="lineNum"> 912 </span><span class="lineCov"> 15 : pathcpy(entry-&gt;file, sizeof(entry-&gt;name), &quot;file&quot;);</span>
<span class="lineNum"> 913 </span><span class="lineCov"> 15 : pathcpy(entry-&gt;name, sizeof(entry-&gt;name), &quot;name&quot;);</span>
<span class="lineNum"> 914 </span><span class="lineCov"> 15 : entry-&gt;smart[SMART_SIZE] = c * TERA;</span>
<span class="lineNum"> 915 </span><span class="lineCov"> 15 : entry-&gt;smart[SMART_ROTATION_RATE] = 7200;</span>
<span class="lineNum"> 916 </span> : }
<span class="lineNum"> 917 </span> :
<span class="lineNum"> 918 </span><span class="lineCov"> 16 : entry-&gt;smart[SMART_ERROR] = 0;</span>
<span class="lineNum"> 919 </span><span class="lineCov"> 16 : entry-&gt;smart[SMART_FLAGS] = SMART_UNASSIGNED;</span>
<span class="lineNum"> 920 </span> :
<span class="lineNum"> 921 </span><span class="lineCov"> 16 : switch (c) {</span>
<span class="lineNum"> 922 </span><span class="lineCov"> 1 : case 3 : entry-&gt;smart[SMART_ERROR] = 1; break;</span>
<span class="lineNum"> 923 </span><span class="lineCov"> 1 : case 4 : entry-&gt;smart[SMART_FLAGS] = SMARTCTL_FLAG_UNSUPPORTED; break;</span>
<span class="lineNum"> 924 </span><span class="lineCov"> 1 : case 5 : entry-&gt;smart[SMART_FLAGS] = SMARTCTL_FLAG_COMMAND; break;</span>
<span class="lineNum"> 925 </span><span class="lineCov"> 1 : case 6 : entry-&gt;smart[SMART_FLAGS] = SMARTCTL_FLAG_OPEN; break;</span>
<span class="lineNum"> 926 </span><span class="lineCov"> 1 : case 7 : entry-&gt;smart[SMART_FLAGS] = SMARTCTL_FLAG_FAIL; break;</span>
<span class="lineNum"> 927 </span><span class="lineCov"> 1 : case 8 : entry-&gt;smart[SMART_FLAGS] = SMARTCTL_FLAG_PREFAIL; break;</span>
<span class="lineNum"> 928 </span><span class="lineCov"> 1 : case 9 : entry-&gt;smart[SMART_FLAGS] = SMARTCTL_FLAG_PREFAIL_LOGGED; break;</span>
<span class="lineNum"> 929 </span><span class="lineCov"> 1 : case 10 : entry-&gt;smart[SMART_FLAGS] = SMARTCTL_FLAG_ERROR; break;</span>
<span class="lineNum"> 930 </span><span class="lineCov"> 1 : case 11 : entry-&gt;smart[SMART_FLAGS] = SMARTCTL_FLAG_ERROR_LOGGED; break;</span>
<span class="lineNum"> 931 </span> : }
<span class="lineNum"> 932 </span> : }
<span class="lineNum"> 933 </span> :
<span class="lineNum"> 934 </span><span class="lineCov"> 1 : return 0;</span>
<a name="935"><span class="lineNum"> 935 </span> : }</a>
<span class="lineNum"> 936 </span> :
<span class="lineNum"> 937 </span><span class="lineCov"> 5 : void state_device(struct snapraid_state* state, int operation)</span>
<span class="lineNum"> 938 </span> : {
<span class="lineNum"> 939 </span> : tommy_node* i;
<span class="lineNum"> 940 </span> : unsigned j;
<span class="lineNum"> 941 </span> : tommy_list high;
<span class="lineNum"> 942 </span> : tommy_list low;
<span class="lineNum"> 943 </span> : int ret;
<span class="lineNum"> 944 </span> :
<span class="lineNum"> 945 </span><span class="lineCov"> 5 : switch (operation) {</span>
<span class="lineNum"> 946 </span><span class="lineCov"> 1 : case DEVICE_UP : msg_progress(&quot;Spinup...\n&quot;); break;</span>
<span class="lineNum"> 947 </span><span class="lineCov"> 1 : case DEVICE_DOWN : msg_progress(&quot;Spindown...\n&quot;); break;</span>
<span class="lineNum"> 948 </span> : }
<span class="lineNum"> 949 </span> :
<span class="lineNum"> 950 </span><span class="lineCov"> 5 : tommy_list_init(&amp;high);</span>
<span class="lineNum"> 951 </span><span class="lineCov"> 5 : tommy_list_init(&amp;low);</span>
<span class="lineNum"> 952 </span> :
<span class="lineNum"> 953 </span> : /* for all disks */
<span class="lineNum"> 954 </span><span class="lineCov"> 35 : for (i = state-&gt;disklist; i != 0; i = i-&gt;next) {</span>
<span class="lineNum"> 955 </span><span class="lineCov"> 30 : struct snapraid_disk* disk = i-&gt;data;</span>
<span class="lineNum"> 956 </span> : devinfo_t* entry;
<span class="lineNum"> 957 </span> :
<span class="lineNum"> 958 </span><span class="lineCov"> 30 : entry = calloc_nofail(1, sizeof(devinfo_t));</span>
<span class="lineNum"> 959 </span> :
<span class="lineNum"> 960 </span><span class="lineCov"> 30 : entry-&gt;device = disk-&gt;device;</span>
<span class="lineNum"> 961 </span><span class="lineCov"> 30 : pathcpy(entry-&gt;name, sizeof(entry-&gt;name), disk-&gt;name);</span>
<span class="lineNum"> 962 </span><span class="lineCov"> 30 : pathcpy(entry-&gt;mount, sizeof(entry-&gt;mount), disk-&gt;dir);</span>
<span class="lineNum"> 963 </span><span class="lineCov"> 30 : pathcpy(entry-&gt;smartctl, sizeof(entry-&gt;smartctl), disk-&gt;smartctl);</span>
<span class="lineNum"> 964 </span> :
<span class="lineNum"> 965 </span><span class="lineCov"> 30 : tommy_list_insert_tail(&amp;high, &amp;entry-&gt;node, entry);</span>
<span class="lineNum"> 966 </span> : }
<span class="lineNum"> 967 </span> :
<span class="lineNum"> 968 </span> : /* for all parities */
<span class="lineNum"> 969 </span><span class="lineCov"> 35 : for (j = 0; j &lt; state-&gt;level; ++j) {</span>
<span class="lineNum"> 970 </span> : devinfo_t* entry;
<span class="lineNum"> 891 </span><span class="lineCov"> 16 : entry-&gt;device = c;</span>
<span class="lineNum"> 892 </span> :
<span class="lineNum"> 893 </span><span class="lineCov"> 16 : tommy_list_insert_tail(low, &amp;entry-&gt;node, entry);</span>
<span class="lineNum"> 894 </span> :
<span class="lineNum"> 895 </span><span class="lineCov"> 4112 : for (j = 0; j &lt; 256; ++j) {</span>
<span class="lineNum"> 896 </span><span class="lineCov"> 4096 : switch (c) {</span>
<span class="lineNum"> 897 </span><span class="lineCov"> 256 : case 0 : entry-&gt;smart[j] = 0; break;</span>
<span class="lineNum"> 898 </span><span class="lineCov"> 256 : case 1 : entry-&gt;smart[j] = SMART_UNASSIGNED; break;</span>
<span class="lineNum"> 899 </span> : default:
<span class="lineNum"> 900 </span><span class="lineCov"> 3584 : if (j == 193)</span>
<span class="lineNum"> 901 </span><span class="lineCov"> 14 : entry-&gt;smart[j] = c - 2;</span>
<span class="lineNum"> 902 </span> : else
<span class="lineNum"> 903 </span><span class="lineCov"> 3570 : entry-&gt;smart[j] = 0;</span>
<span class="lineNum"> 904 </span><span class="lineCov"> 3584 : break;</span>
<span class="lineNum"> 905 </span> : }
<span class="lineNum"> 906 </span> : }
<span class="lineNum"> 907 </span> :
<span class="lineNum"> 908 </span><span class="lineCov"> 16 : if (c == 0) {</span>
<span class="lineNum"> 909 </span><span class="lineCov"> 1 : entry-&gt;smart_serial[0] = 0;</span>
<span class="lineNum"> 910 </span><span class="lineCov"> 1 : entry-&gt;file[0] = 0;</span>
<span class="lineNum"> 911 </span><span class="lineCov"> 1 : entry-&gt;name[0] = 0;</span>
<span class="lineNum"> 912 </span><span class="lineCov"> 1 : entry-&gt;smart[SMART_SIZE] = SMART_UNASSIGNED;</span>
<span class="lineNum"> 913 </span><span class="lineCov"> 1 : entry-&gt;smart[SMART_ROTATION_RATE] = 0;</span>
<span class="lineNum"> 914 </span> : } else {
<span class="lineNum"> 915 </span><span class="lineCov"> 15 : snprintf(entry-&gt;smart_serial, sizeof(entry-&gt;smart_serial), &quot;%u&quot;, c);</span>
<span class="lineNum"> 916 </span><span class="lineCov"> 15 : pathcpy(entry-&gt;file, sizeof(entry-&gt;name), &quot;file&quot;);</span>
<span class="lineNum"> 917 </span><span class="lineCov"> 15 : pathcpy(entry-&gt;name, sizeof(entry-&gt;name), &quot;name&quot;);</span>
<span class="lineNum"> 918 </span><span class="lineCov"> 15 : entry-&gt;smart[SMART_SIZE] = c * TERA;</span>
<span class="lineNum"> 919 </span><span class="lineCov"> 15 : entry-&gt;smart[SMART_ROTATION_RATE] = 7200;</span>
<span class="lineNum"> 920 </span> : }
<span class="lineNum"> 921 </span> :
<span class="lineNum"> 922 </span><span class="lineCov"> 16 : entry-&gt;smart[SMART_ERROR] = 0;</span>
<span class="lineNum"> 923 </span><span class="lineCov"> 16 : entry-&gt;smart[SMART_FLAGS] = SMART_UNASSIGNED;</span>
<span class="lineNum"> 924 </span> :
<span class="lineNum"> 925 </span><span class="lineCov"> 16 : switch (c) {</span>
<span class="lineNum"> 926 </span><span class="lineCov"> 1 : case 3 : entry-&gt;smart[SMART_ERROR] = 1; break;</span>
<span class="lineNum"> 927 </span><span class="lineCov"> 1 : case 4 : entry-&gt;smart[SMART_FLAGS] = SMARTCTL_FLAG_UNSUPPORTED; break;</span>
<span class="lineNum"> 928 </span><span class="lineCov"> 1 : case 5 : entry-&gt;smart[SMART_FLAGS] = SMARTCTL_FLAG_COMMAND; break;</span>
<span class="lineNum"> 929 </span><span class="lineCov"> 1 : case 6 : entry-&gt;smart[SMART_FLAGS] = SMARTCTL_FLAG_OPEN; break;</span>
<span class="lineNum"> 930 </span><span class="lineCov"> 1 : case 7 : entry-&gt;smart[SMART_FLAGS] = SMARTCTL_FLAG_FAIL; break;</span>
<span class="lineNum"> 931 </span><span class="lineCov"> 1 : case 8 : entry-&gt;smart[SMART_FLAGS] = SMARTCTL_FLAG_PREFAIL; break;</span>
<span class="lineNum"> 932 </span><span class="lineCov"> 1 : case 9 : entry-&gt;smart[SMART_FLAGS] = SMARTCTL_FLAG_PREFAIL_LOGGED; break;</span>
<span class="lineNum"> 933 </span><span class="lineCov"> 1 : case 10 : entry-&gt;smart[SMART_FLAGS] = SMARTCTL_FLAG_ERROR; break;</span>
<span class="lineNum"> 934 </span><span class="lineCov"> 1 : case 11 : entry-&gt;smart[SMART_FLAGS] = SMARTCTL_FLAG_ERROR_LOGGED; break;</span>
<span class="lineNum"> 935 </span> : }
<span class="lineNum"> 936 </span> : }
<span class="lineNum"> 937 </span> :
<span class="lineNum"> 938 </span><span class="lineCov"> 1 : return 0;</span>
<a name="939"><span class="lineNum"> 939 </span> : }</a>
<span class="lineNum"> 940 </span> :
<span class="lineNum"> 941 </span><span class="lineCov"> 5 : void state_device(struct snapraid_state* state, int operation)</span>
<span class="lineNum"> 942 </span> : {
<span class="lineNum"> 943 </span> : tommy_node* i;
<span class="lineNum"> 944 </span> : unsigned j;
<span class="lineNum"> 945 </span> : tommy_list high;
<span class="lineNum"> 946 </span> : tommy_list low;
<span class="lineNum"> 947 </span> : int ret;
<span class="lineNum"> 948 </span> :
<span class="lineNum"> 949 </span><span class="lineCov"> 5 : switch (operation) {</span>
<span class="lineNum"> 950 </span><span class="lineCov"> 1 : case DEVICE_UP : msg_progress(&quot;Spinup...\n&quot;); break;</span>
<span class="lineNum"> 951 </span><span class="lineCov"> 1 : case DEVICE_DOWN : msg_progress(&quot;Spindown...\n&quot;); break;</span>
<span class="lineNum"> 952 </span> : }
<span class="lineNum"> 953 </span> :
<span class="lineNum"> 954 </span><span class="lineCov"> 5 : tommy_list_init(&amp;high);</span>
<span class="lineNum"> 955 </span><span class="lineCov"> 5 : tommy_list_init(&amp;low);</span>
<span class="lineNum"> 956 </span> :
<span class="lineNum"> 957 </span> : /* for all disks */
<span class="lineNum"> 958 </span><span class="lineCov"> 35 : for (i = state-&gt;disklist; i != 0; i = i-&gt;next) {</span>
<span class="lineNum"> 959 </span><span class="lineCov"> 30 : struct snapraid_disk* disk = i-&gt;data;</span>
<span class="lineNum"> 960 </span> : devinfo_t* entry;
<span class="lineNum"> 961 </span> :
<span class="lineNum"> 962 </span><span class="lineCov"> 30 : entry = calloc_nofail(1, sizeof(devinfo_t));</span>
<span class="lineNum"> 963 </span> :
<span class="lineNum"> 964 </span><span class="lineCov"> 30 : entry-&gt;device = disk-&gt;device;</span>
<span class="lineNum"> 965 </span><span class="lineCov"> 30 : pathcpy(entry-&gt;name, sizeof(entry-&gt;name), disk-&gt;name);</span>
<span class="lineNum"> 966 </span><span class="lineCov"> 30 : pathcpy(entry-&gt;mount, sizeof(entry-&gt;mount), disk-&gt;dir);</span>
<span class="lineNum"> 967 </span><span class="lineCov"> 30 : pathcpy(entry-&gt;smartctl, sizeof(entry-&gt;smartctl), disk-&gt;smartctl);</span>
<span class="lineNum"> 968 </span> :
<span class="lineNum"> 969 </span><span class="lineCov"> 30 : tommy_list_insert_tail(&amp;high, &amp;entry-&gt;node, entry);</span>
<span class="lineNum"> 970 </span> : }
<span class="lineNum"> 971 </span> :
<span class="lineNum"> 972 </span><span class="lineCov"> 30 : entry = calloc_nofail(1, sizeof(devinfo_t));</span>
<span class="lineNum"> 973 </span> :
<span class="lineNum"> 974 </span><span class="lineCov"> 30 : entry-&gt;device = state-&gt;parity[j].device;</span>
<span class="lineNum"> 975 </span><span class="lineCov"> 30 : pathcpy(entry-&gt;name, sizeof(entry-&gt;name), lev_config_name(j));</span>
<span class="lineNum"> 976 </span><span class="lineCov"> 30 : pathcpy(entry-&gt;mount, sizeof(entry-&gt;mount), state-&gt;parity[j].path);</span>
<span class="lineNum"> 977 </span><span class="lineCov"> 30 : pathcpy(entry-&gt;smartctl, sizeof(entry-&gt;smartctl), state-&gt;parity[j].smartctl);</span>
<span class="lineNum"> 978 </span><span class="lineCov"> 30 : pathcut(entry-&gt;mount); /* remove the parity file */</span>
<span class="lineNum"> 979 </span> :
<span class="lineNum"> 980 </span><span class="lineCov"> 30 : tommy_list_insert_tail(&amp;high, &amp;entry-&gt;node, entry);</span>
<span class="lineNum"> 981 </span> : }
<span class="lineNum"> 982 </span> :
<span class="lineNum"> 983 </span><span class="lineCov"> 5 : if (state-&gt;opt.fake_device)</span>
<span class="lineNum"> 984 </span><span class="lineCov"> 1 : ret = devtest(&amp;low, operation);</span>
<span class="lineNum"> 985 </span> : else
<span class="lineNum"> 986 </span><span class="lineCov"> 4 : ret = devquery(&amp;high, &amp;low, operation);</span>
<span class="lineNum"> 987 </span> :
<span class="lineNum"> 988 </span><span class="lineCov"> 5 : if (ret != 0) {</span>
<span class="lineNum"> 989 </span><span class="lineCov"> 2 : const char* ope = 0;</span>
<span class="lineNum"> 990 </span><span class="lineCov"> 2 : switch (operation) {</span>
<span class="lineNum"> 991 </span><span class="lineNoCov"> 0 : case DEVICE_UP : ope = &quot;Spinup&quot;; break;</span>
<span class="lineNum"> 992 </span><span class="lineCov"> 1 : case DEVICE_DOWN : ope = &quot;Spindown&quot;; break;</span>
<span class="lineNum"> 993 </span><span class="lineNoCov"> 0 : case DEVICE_LIST : ope = &quot;List&quot;; break;</span>
<span class="lineNum"> 994 </span><span class="lineCov"> 1 : case DEVICE_SMART : ope = &quot;SMART&quot;; break;</span>
<span class="lineNum"> 995 </span> : }
<span class="lineNum"> 996 </span><span class="lineCov"> 2 : log_fatal(&quot;%s unsupported in this platform.\n&quot;, ope);</span>
<span class="lineNum"> 997 </span> : } else {
<span class="lineNum"> 998 </span><span class="lineCov"> 3 : if (operation == DEVICE_LIST) {</span>
<span class="lineNum"> 999 </span><span class="lineCov"> 13 : for (i = tommy_list_head(&amp;low); i != 0; i = i-&gt;next) {</span>
<span class="lineNum"> 1000 </span><span class="lineCov"> 12 : devinfo_t* devinfo = i-&gt;data;</span>
<span class="lineNum"> 1001 </span><span class="lineCov"> 12 : devinfo_t* parent = devinfo-&gt;parent;</span>
<span class="lineNum"> 1002 </span> : #ifdef _WIN32
<span class="lineNum"> 1003 </span> : printf(&quot;%&quot; PRIu64 &quot;\t%s\t%08&quot; PRIx64 &quot;\t%s\t%s\n&quot;, devinfo-&gt;device, devinfo-&gt;wfile, parent-&gt;device, parent-&gt;wfile, parent-&gt;name);
<span class="lineNum"> 1004 </span> : #else
<span class="lineNum"> 1005 </span><span class="lineCov"> 12 : printf(&quot;%u:%u\t%s\t%u:%u\t%s\t%s\n&quot;, major(devinfo-&gt;device), minor(devinfo-&gt;device), devinfo-&gt;file, major(parent-&gt;device), minor(parent-&gt;device), parent-&gt;file, parent-&gt;name);</span>
<span class="lineNum"> 1006 </span> : #endif
<span class="lineNum"> 1007 </span> : }
<span class="lineNum"> 1008 </span> : }
<span class="lineNum"> 1009 </span> :
<span class="lineNum"> 1010 </span><span class="lineCov"> 3 : if (operation == DEVICE_SMART)</span>
<span class="lineNum"> 1011 </span><span class="lineCov"> 1 : state_smart(state-&gt;level + tommy_list_count(&amp;state-&gt;disklist), &amp;low);</span>
<span class="lineNum"> 1012 </span> : }
<span class="lineNum"> 972 </span> : /* for all parities */
<span class="lineNum"> 973 </span><span class="lineCov"> 35 : for (j = 0; j &lt; state-&gt;level; ++j) {</span>
<span class="lineNum"> 974 </span> : devinfo_t* entry;
<span class="lineNum"> 975 </span> :
<span class="lineNum"> 976 </span><span class="lineCov"> 30 : entry = calloc_nofail(1, sizeof(devinfo_t));</span>
<span class="lineNum"> 977 </span> :
<span class="lineNum"> 978 </span><span class="lineCov"> 30 : entry-&gt;device = state-&gt;parity[j].device;</span>
<span class="lineNum"> 979 </span><span class="lineCov"> 30 : pathcpy(entry-&gt;name, sizeof(entry-&gt;name), lev_config_name(j));</span>
<span class="lineNum"> 980 </span><span class="lineCov"> 30 : pathcpy(entry-&gt;mount, sizeof(entry-&gt;mount), state-&gt;parity[j].path);</span>
<span class="lineNum"> 981 </span><span class="lineCov"> 30 : pathcpy(entry-&gt;smartctl, sizeof(entry-&gt;smartctl), state-&gt;parity[j].smartctl);</span>
<span class="lineNum"> 982 </span><span class="lineCov"> 30 : pathcut(entry-&gt;mount); /* remove the parity file */</span>
<span class="lineNum"> 983 </span> :
<span class="lineNum"> 984 </span><span class="lineCov"> 30 : tommy_list_insert_tail(&amp;high, &amp;entry-&gt;node, entry);</span>
<span class="lineNum"> 985 </span> : }
<span class="lineNum"> 986 </span> :
<span class="lineNum"> 987 </span><span class="lineCov"> 5 : if (state-&gt;opt.fake_device)</span>
<span class="lineNum"> 988 </span><span class="lineCov"> 1 : ret = devtest(&amp;low, operation);</span>
<span class="lineNum"> 989 </span> : else
<span class="lineNum"> 990 </span><span class="lineCov"> 4 : ret = devquery(&amp;high, &amp;low, operation);</span>
<span class="lineNum"> 991 </span> :
<span class="lineNum"> 992 </span><span class="lineCov"> 5 : if (ret != 0) {</span>
<span class="lineNum"> 993 </span><span class="lineCov"> 2 : const char* ope = 0;</span>
<span class="lineNum"> 994 </span><span class="lineCov"> 2 : switch (operation) {</span>
<span class="lineNum"> 995 </span><span class="lineNoCov"> 0 : case DEVICE_UP : ope = &quot;Spinup&quot;; break;</span>
<span class="lineNum"> 996 </span><span class="lineCov"> 1 : case DEVICE_DOWN : ope = &quot;Spindown&quot;; break;</span>
<span class="lineNum"> 997 </span><span class="lineNoCov"> 0 : case DEVICE_LIST : ope = &quot;List&quot;; break;</span>
<span class="lineNum"> 998 </span><span class="lineCov"> 1 : case DEVICE_SMART : ope = &quot;SMART&quot;; break;</span>
<span class="lineNum"> 999 </span> : }
<span class="lineNum"> 1000 </span><span class="lineCov"> 2 : log_fatal(&quot;%s unsupported in this platform.\n&quot;, ope);</span>
<span class="lineNum"> 1001 </span> : } else {
<span class="lineNum"> 1002 </span><span class="lineCov"> 3 : if (operation == DEVICE_LIST) {</span>
<span class="lineNum"> 1003 </span><span class="lineCov"> 13 : for (i = tommy_list_head(&amp;low); i != 0; i = i-&gt;next) {</span>
<span class="lineNum"> 1004 </span><span class="lineCov"> 12 : devinfo_t* devinfo = i-&gt;data;</span>
<span class="lineNum"> 1005 </span><span class="lineCov"> 12 : devinfo_t* parent = devinfo-&gt;parent;</span>
<span class="lineNum"> 1006 </span> : #ifdef _WIN32
<span class="lineNum"> 1007 </span> : printf(&quot;%&quot; PRIu64 &quot;\t%s\t%08&quot; PRIx64 &quot;\t%s\t%s\n&quot;, devinfo-&gt;device, devinfo-&gt;wfile, parent-&gt;device, parent-&gt;wfile, parent-&gt;name);
<span class="lineNum"> 1008 </span> : #else
<span class="lineNum"> 1009 </span><span class="lineCov"> 12 : printf(&quot;%u:%u\t%s\t%u:%u\t%s\t%s\n&quot;, major(devinfo-&gt;device), minor(devinfo-&gt;device), devinfo-&gt;file, major(parent-&gt;device), minor(parent-&gt;device), parent-&gt;file, parent-&gt;name);</span>
<span class="lineNum"> 1010 </span> : #endif
<span class="lineNum"> 1011 </span> : }
<span class="lineNum"> 1012 </span> : }
<span class="lineNum"> 1013 </span> :
<span class="lineNum"> 1014 </span><span class="lineCov"> 4 : tommy_list_foreach(&amp;high, free);</span>
<span class="lineNum"> 1015 </span><span class="lineCov"> 4 : tommy_list_foreach(&amp;low, free);</span>
<span class="lineNum"> 1016 </span><span class="lineCov"> 4 : }</span>
<span class="lineNum"> 1014 </span><span class="lineCov"> 3 : if (operation == DEVICE_SMART)</span>
<span class="lineNum"> 1015 </span><span class="lineCov"> 1 : state_smart(state-&gt;level + tommy_list_count(&amp;state-&gt;disklist), &amp;low);</span>
<span class="lineNum"> 1016 </span> : }
<span class="lineNum"> 1017 </span> :
<span class="lineNum"> 1018 </span><span class="lineCov"> 4 : tommy_list_foreach(&amp;high, free);</span>
<span class="lineNum"> 1019 </span><span class="lineCov"> 4 : tommy_list_foreach(&amp;low, free);</span>
<span class="lineNum"> 1020 </span><span class="lineCov"> 4 : }</span>
<span class="lineNum"> 1021 </span> :
</pre>
</td>
</tr>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">2</td>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">2</td>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">2</td>
@ -116,38 +116,38 @@
<span class="lineNum"> 54 </span><span class="lineCov"> 2 : countsize = 0;</span>
<span class="lineNum"> 55 </span><span class="lineCov"> 2 : countpos = 0;</span>
<span class="lineNum"> 56 </span><span class="lineCov"> 2 : state_progress_begin(state, blockstart, blockmax, countmax);</span>
<span class="lineNum"> 57 </span><span class="lineCov"> 7054 : for (i = blockstart; i &lt; blockmax; ++i) {</span>
<span class="lineNum"> 57 </span><span class="lineCov"> 7088 : for (i = blockstart; i &lt; blockmax; ++i) {</span>
<span class="lineNum"> 58 </span> : /* for each disk, process the block */
<span class="lineNum"> 59 </span><span class="lineCov"> 49364 : for (j = 0; j &lt; diskmax; ++j) {</span>
<span class="lineNum"> 59 </span><span class="lineCov"> 49602 : for (j = 0; j &lt; diskmax; ++j) {</span>
<span class="lineNum"> 60 </span> : int read_size;
<span class="lineNum"> 61 </span> : struct snapraid_block* block;
<span class="lineNum"> 62 </span><span class="lineCov"> 42312 : struct snapraid_disk* disk = handle[j].disk;</span>
<span class="lineNum"> 62 </span><span class="lineCov"> 42516 : struct snapraid_disk* disk = handle[j].disk;</span>
<span class="lineNum"> 63 </span> : struct snapraid_file* file;
<span class="lineNum"> 64 </span> : block_off_t file_pos;
<span class="lineNum"> 65 </span> :
<span class="lineNum"> 66 </span><span class="lineCov"> 42312 : if (!disk) {</span>
<span class="lineNum"> 66 </span><span class="lineCov"> 42516 : if (!disk) {</span>
<span class="lineNum"> 67 </span> : /* if no disk, nothing to do */
<span class="lineNum"> 68 </span><span class="lineCov"> 9755 : continue;</span>
<span class="lineNum"> 68 </span><span class="lineCov"> 9855 : continue;</span>
<span class="lineNum"> 69 </span> : }
<span class="lineNum"> 70 </span> :
<span class="lineNum"> 71 </span><span class="lineCov"> 37641 : block = fs_par2block_get(disk, i);</span>
<span class="lineNum"> 71 </span><span class="lineCov"> 37837 : block = fs_par2block_get(disk, i);</span>
<span class="lineNum"> 72 </span> :
<span class="lineNum"> 73 </span><span class="lineCov"> 37641 : if (!block_has_file(block)) {</span>
<span class="lineNum"> 73 </span><span class="lineCov"> 37837 : if (!block_has_file(block)) {</span>
<span class="lineNum"> 74 </span> : /* if no file, nothing to do */
<span class="lineNum"> 75 </span><span class="lineCov"> 413 : continue;</span>
<span class="lineNum"> 75 </span><span class="lineCov"> 497 : continue;</span>
<span class="lineNum"> 76 </span> : }
<span class="lineNum"> 77 </span> :
<span class="lineNum"> 78 </span> : /* get the file of this block */
<span class="lineNum"> 79 </span><span class="lineCov"> 37228 : file = fs_par2file_get(disk, i, &amp;file_pos);</span>
<span class="lineNum"> 79 </span><span class="lineCov"> 37340 : file = fs_par2file_get(disk, i, &amp;file_pos);</span>
<span class="lineNum"> 80 </span> :
<span class="lineNum"> 81 </span> : /* until now is CPU */
<span class="lineNum"> 82 </span><span class="lineCov"> 37228 : state_usage_cpu(state);</span>
<span class="lineNum"> 82 </span><span class="lineCov"> 37340 : state_usage_cpu(state);</span>
<span class="lineNum"> 83 </span> :
<span class="lineNum"> 84 </span> : /* if the file is closed or different than the current one */
<span class="lineNum"> 85 </span><span class="lineCov"> 37228 : if (handle[j].file == 0 || handle[j].file != file) {</span>
<span class="lineNum"> 85 </span><span class="lineCov"> 37340 : if (handle[j].file == 0 || handle[j].file != file) {</span>
<span class="lineNum"> 86 </span> : /* close the old one, if any */
<span class="lineNum"> 87 </span><span class="lineCov"> 15082 : ret = handle_close(&amp;handle[j]);</span>
<span class="lineNum"> 88 </span><span class="lineCov"> 15082 : if (ret == -1) {</span>
<span class="lineNum"> 87 </span><span class="lineCov"> 15096 : ret = handle_close(&amp;handle[j]);</span>
<span class="lineNum"> 88 </span><span class="lineCov"> 15096 : if (ret == -1) {</span>
<span class="lineNum"> 89 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 90 </span> : log_tag(&quot;error:%u:%s:%s: Close error. %s\n&quot;, i, disk-&gt;name, esc(handle[j].file-&gt;sub), strerror(errno));
<span class="lineNum"> 91 </span> : log_fatal(&quot;DANGER! Unexpected close error in a data disk, it isn't possible to dry.\n&quot;);
@ -158,8 +158,8 @@
<span class="lineNum"> 96 </span> : }
<span class="lineNum"> 97 </span> :
<span class="lineNum"> 98 </span> : /* open the file only for reading */
<span class="lineNum"> 99 </span><span class="lineCov"> 15082 : ret = handle_open(&amp;handle[j], file, state-&gt;file_mode, log_fatal, 0);</span>
<span class="lineNum"> 100 </span><span class="lineCov"> 15082 : if (ret == -1) {</span>
<span class="lineNum"> 99 </span><span class="lineCov"> 15096 : ret = handle_open(&amp;handle[j], file, state-&gt;file_mode, log_fatal, 0);</span>
<span class="lineNum"> 100 </span><span class="lineCov"> 15096 : if (ret == -1) {</span>
<span class="lineNum"> 101 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 102 </span> : log_tag(&quot;error:%u:%s:%s: Open error. %s\n&quot;, i, disk-&gt;name, esc(file-&gt;sub), strerror(errno));
<span class="lineNum"> 103 </span> : log_fatal(&quot;DANGER! Unexpected open error in a data disk, it isn't possible to dry.\n&quot;);
@ -171,41 +171,41 @@
<span class="lineNum"> 109 </span> : }
<span class="lineNum"> 110 </span> :
<span class="lineNum"> 111 </span> : /* read from the file */
<span class="lineNum"> 112 </span><span class="lineCov"> 37228 : read_size = handle_read(&amp;handle[j], file_pos, buffer_aligned, state-&gt;block_size, log_error, 0);</span>
<span class="lineNum"> 113 </span><span class="lineCov"> 37228 : if (read_size == -1) {</span>
<span class="lineNum"> 112 </span><span class="lineCov"> 37340 : read_size = handle_read(&amp;handle[j], file_pos, buffer_aligned, state-&gt;block_size, log_error, 0);</span>
<span class="lineNum"> 113 </span><span class="lineCov"> 37340 : if (read_size == -1) {</span>
<span class="lineNum"> 114 </span><span class="lineNoCov"> 0 : log_tag(&quot;error:%u:%s:%s: Read error at position %u\n&quot;, i, disk-&gt;name, esc(file-&gt;sub), file_pos);</span>
<span class="lineNum"> 115 </span><span class="lineNoCov"> 0 : ++error;</span>
<span class="lineNum"> 116 </span><span class="lineNoCov"> 0 : continue;</span>
<span class="lineNum"> 117 </span> : }
<span class="lineNum"> 118 </span> :
<span class="lineNum"> 119 </span> : /* until now is disk */
<span class="lineNum"> 120 </span><span class="lineCov"> 37228 : state_usage_disk(state, disk);</span>
<span class="lineNum"> 120 </span><span class="lineCov"> 37340 : state_usage_disk(state, disk);</span>
<span class="lineNum"> 121 </span> :
<span class="lineNum"> 122 </span><span class="lineCov"> 37228 : countsize += read_size;</span>
<span class="lineNum"> 122 </span><span class="lineCov"> 37340 : countsize += read_size;</span>
<span class="lineNum"> 123 </span> : }
<span class="lineNum"> 124 </span> :
<span class="lineNum"> 125 </span> : /* read the parity */
<span class="lineNum"> 126 </span><span class="lineCov"> 49364 : for (l = 0; l &lt; state-&gt;level; ++l) {</span>
<span class="lineNum"> 127 </span><span class="lineCov"> 42312 : if (parity[l]) {</span>
<span class="lineNum"> 126 </span><span class="lineCov"> 49602 : for (l = 0; l &lt; state-&gt;level; ++l) {</span>
<span class="lineNum"> 127 </span><span class="lineCov"> 42516 : if (parity[l]) {</span>
<span class="lineNum"> 128 </span> : /* until now is CPU */
<span class="lineNum"> 129 </span><span class="lineCov"> 42312 : state_usage_cpu(state);</span>
<span class="lineNum"> 129 </span><span class="lineCov"> 42516 : state_usage_cpu(state);</span>
<span class="lineNum"> 130 </span> :
<span class="lineNum"> 131 </span><span class="lineCov"> 42312 : ret = parity_read(parity[l], i, buffer_aligned, state-&gt;block_size, log_error);</span>
<span class="lineNum"> 132 </span><span class="lineCov"> 42312 : if (ret == -1) {</span>
<span class="lineNum"> 131 </span><span class="lineCov"> 42516 : ret = parity_read(parity[l], i, buffer_aligned, state-&gt;block_size, log_error);</span>
<span class="lineNum"> 132 </span><span class="lineCov"> 42516 : if (ret == -1) {</span>
<span class="lineNum"> 133 </span><span class="lineNoCov"> 0 : log_tag(&quot;parity_error:%u:%s: Read error\n&quot;, i, lev_config_name(l));</span>
<span class="lineNum"> 134 </span><span class="lineNoCov"> 0 : ++error;</span>
<span class="lineNum"> 135 </span> : }
<span class="lineNum"> 136 </span> :
<span class="lineNum"> 137 </span> : /* until now is parity */
<span class="lineNum"> 138 </span><span class="lineCov"> 42312 : state_usage_parity(state, l);</span>
<span class="lineNum"> 138 </span><span class="lineCov"> 42516 : state_usage_parity(state, l);</span>
<span class="lineNum"> 139 </span> : }
<span class="lineNum"> 140 </span> : }
<span class="lineNum"> 141 </span> :
<span class="lineNum"> 142 </span> : /* count the number of processed block */
<span class="lineNum"> 143 </span><span class="lineCov"> 7052 : ++countpos;</span>
<span class="lineNum"> 143 </span><span class="lineCov"> 7086 : ++countpos;</span>
<span class="lineNum"> 144 </span> :
<span class="lineNum"> 145 </span> : /* progress */
<span class="lineNum"> 146 </span><span class="lineCov"> 7052 : if (state_progress(state, i, countpos, countmax, countsize)) {</span>
<span class="lineNum"> 146 </span><span class="lineCov"> 7086 : if (state_progress(state, i, countpos, countmax, countsize)) {</span>
<span class="lineNum"> 147 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 148 </span> : break;
<span class="lineNum"> 149 </span> : /* LCOV_EXCL_STOP */

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">5</td>
@ -61,24 +61,24 @@
</tr>
<tr>
<td class="coverFn"><a href="dup.c.gcov.html#37">hash_alloc</a></td>
<td class="coverFnHi">16956</td>
<td class="coverFnHi">16970</td>
</tr>
<tr>
<td class="coverFn"><a href="dup.c.gcov.html#74">hash_free</a></td>
<td class="coverFnHi">16956</td>
<td class="coverFnHi">16970</td>
</tr>
<tr>
<td class="coverFn"><a href="dup.c.gcov.html#69">hash_hash</a></td>
<td class="coverFnHi">16956</td>
<td class="coverFnHi">16970</td>
</tr>
<tr>
<td class="coverFn"><a href="dup.c.gcov.html#79">hash_compare</a></td>
<td class="coverFnHi">14</td>
</tr>
<tr>
<td class="coverFn"><a href="dup.c.gcov.html#87">state_dup</a></td>
<td class="coverFnHi">3</td>
</tr>
<tr>
<td class="coverFn"><a href="dup.c.gcov.html#79">hash_compare</a></td>
<td class="coverFnHi">2</td>
</tr>
</table>
<br>
</center>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">5</td>
@ -61,19 +61,19 @@
</tr>
<tr>
<td class="coverFn"><a href="dup.c.gcov.html#37">hash_alloc</a></td>
<td class="coverFnHi">16956</td>
<td class="coverFnHi">16970</td>
</tr>
<tr>
<td class="coverFn"><a href="dup.c.gcov.html#79">hash_compare</a></td>
<td class="coverFnHi">2</td>
<td class="coverFnHi">14</td>
</tr>
<tr>
<td class="coverFn"><a href="dup.c.gcov.html#74">hash_free</a></td>
<td class="coverFnHi">16956</td>
<td class="coverFnHi">16970</td>
</tr>
<tr>
<td class="coverFn"><a href="dup.c.gcov.html#69">hash_hash</a></td>
<td class="coverFnHi">16956</td>
<td class="coverFnHi">16970</td>
</tr>
<tr>
<td class="coverFn"><a href="dup.c.gcov.html#87">state_dup</a></td>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">5</td>
@ -98,54 +98,54 @@
<span class="lineNum"> 36 </span> : tommy_hashdyn_node node;
<a name="37"><span class="lineNum"> 37 </span> : };</a>
<span class="lineNum"> 38 </span> :
<span class="lineNum"> 39 </span><span class="lineCov"> 16956 : struct snapraid_hash* hash_alloc(struct snapraid_state* state, struct snapraid_disk* disk, struct snapraid_file* file)</span>
<span class="lineNum"> 39 </span><span class="lineCov"> 16970 : struct snapraid_hash* hash_alloc(struct snapraid_state* state, struct snapraid_disk* disk, struct snapraid_file* file)</span>
<span class="lineNum"> 40 </span> : {
<span class="lineNum"> 41 </span> : struct snapraid_hash* hash;
<span class="lineNum"> 42 </span> : block_off_t i;
<span class="lineNum"> 43 </span> : unsigned char* buf;
<span class="lineNum"> 44 </span> :
<span class="lineNum"> 45 </span><span class="lineCov"> 16956 : hash = malloc_nofail(sizeof(struct snapraid_hash));</span>
<span class="lineNum"> 46 </span><span class="lineCov"> 16956 : hash-&gt;disk = disk;</span>
<span class="lineNum"> 47 </span><span class="lineCov"> 16956 : hash-&gt;file = file;</span>
<span class="lineNum"> 45 </span><span class="lineCov"> 16970 : hash = malloc_nofail(sizeof(struct snapraid_hash));</span>
<span class="lineNum"> 46 </span><span class="lineCov"> 16970 : hash-&gt;disk = disk;</span>
<span class="lineNum"> 47 </span><span class="lineCov"> 16970 : hash-&gt;file = file;</span>
<span class="lineNum"> 48 </span> :
<span class="lineNum"> 49 </span><span class="lineCov"> 16956 : buf = malloc_nofail(file-&gt;blockmax * HASH_SIZE);</span>
<span class="lineNum"> 49 </span><span class="lineCov"> 16970 : buf = malloc_nofail(file-&gt;blockmax * HASH_SIZE);</span>
<span class="lineNum"> 50 </span> :
<span class="lineNum"> 51 </span> : /* set the back pointer */
<span class="lineNum"> 52 </span><span class="lineCov"> 58816 : for (i = 0; i &lt; file-&gt;blockmax; ++i) {</span>
<span class="lineNum"> 53 </span><span class="lineCov"> 41860 : struct snapraid_block* block = fs_file2block_get(file, i);</span>
<span class="lineNum"> 52 </span><span class="lineCov"> 58942 : for (i = 0; i &lt; file-&gt;blockmax; ++i) {</span>
<span class="lineNum"> 53 </span><span class="lineCov"> 41972 : struct snapraid_block* block = fs_file2block_get(file, i);</span>
<span class="lineNum"> 54 </span> :
<span class="lineNum"> 55 </span><span class="lineCov"> 41860 : memcpy(buf + i * HASH_SIZE, block-&gt;hash, HASH_SIZE);</span>
<span class="lineNum"> 55 </span><span class="lineCov"> 41972 : memcpy(buf + i * HASH_SIZE, block-&gt;hash, HASH_SIZE);</span>
<span class="lineNum"> 56 </span> :
<span class="lineNum"> 57 </span><span class="lineCov"> 41860 : if (!block_has_updated_hash(block)) {</span>
<span class="lineNum"> 57 </span><span class="lineCov"> 41972 : if (!block_has_updated_hash(block)) {</span>
<span class="lineNum"> 58 </span><span class="lineNoCov"> 0 : free(buf);</span>
<span class="lineNum"> 59 </span><span class="lineNoCov"> 0 : free(hash);</span>
<span class="lineNum"> 60 </span><span class="lineNoCov"> 0 : return 0;</span>
<span class="lineNum"> 61 </span> : }
<span class="lineNum"> 62 </span> : }
<span class="lineNum"> 63 </span> :
<span class="lineNum"> 64 </span><span class="lineCov"> 16956 : memhash(state-&gt;besthash, state-&gt;hashseed, hash-&gt;hash, buf, file-&gt;blockmax * HASH_SIZE);</span>
<span class="lineNum"> 64 </span><span class="lineCov"> 16970 : memhash(state-&gt;besthash, state-&gt;hashseed, hash-&gt;hash, buf, file-&gt;blockmax * HASH_SIZE);</span>
<span class="lineNum"> 65 </span> :
<span class="lineNum"> 66 </span><span class="lineCov"> 16956 : free(buf);</span>
<span class="lineNum"> 66 </span><span class="lineCov"> 16970 : free(buf);</span>
<span class="lineNum"> 67 </span> :
<span class="lineNum"> 68 </span><span class="lineCov"> 16956 : return hash;</span>
<span class="lineNum"> 68 </span><span class="lineCov"> 16970 : return hash;</span>
<a name="69"><span class="lineNum"> 69 </span> : }</a>
<span class="lineNum"> 70 </span> :
<span class="lineNum"> 71 </span><span class="lineCov"> 16956 : static inline tommy_uint32_t hash_hash(struct snapraid_hash* hash)</span>
<span class="lineNum"> 71 </span><span class="lineCov"> 16970 : static inline tommy_uint32_t hash_hash(struct snapraid_hash* hash)</span>
<span class="lineNum"> 72 </span> : {
<span class="lineNum"> 73 </span><span class="lineCov"> 16956 : return tommy_hash_u32(0, hash-&gt;hash, HASH_SIZE);</span>
<span class="lineNum"> 73 </span><span class="lineCov"> 16970 : return tommy_hash_u32(0, hash-&gt;hash, HASH_SIZE);</span>
<a name="74"><span class="lineNum"> 74 </span> : }</a>
<span class="lineNum"> 75 </span> :
<span class="lineNum"> 76 </span><span class="lineCov"> 16956 : void hash_free(struct snapraid_hash* hash)</span>
<span class="lineNum"> 76 </span><span class="lineCov"> 16970 : void hash_free(struct snapraid_hash* hash)</span>
<span class="lineNum"> 77 </span> : {
<span class="lineNum"> 78 </span><span class="lineCov"> 16956 : free(hash);</span>
<a name="79"><span class="lineNum"> 79 </span><span class="lineCov"> 16956 : }</span></a>
<span class="lineNum"> 78 </span><span class="lineCov"> 16970 : free(hash);</span>
<a name="79"><span class="lineNum"> 79 </span><span class="lineCov"> 16970 : }</span></a>
<span class="lineNum"> 80 </span> :
<span class="lineNum"> 81 </span><span class="lineCov"> 2 : int hash_compare(const void* void_arg, const void* void_data)</span>
<span class="lineNum"> 81 </span><span class="lineCov"> 14 : int hash_compare(const void* void_arg, const void* void_data)</span>
<span class="lineNum"> 82 </span> : {
<span class="lineNum"> 83 </span><span class="lineCov"> 2 : const char* arg = void_arg;</span>
<span class="lineNum"> 84 </span><span class="lineCov"> 2 : const struct snapraid_hash* hash = void_data;</span>
<span class="lineNum"> 83 </span><span class="lineCov"> 14 : const char* arg = void_arg;</span>
<span class="lineNum"> 84 </span><span class="lineCov"> 14 : const struct snapraid_hash* hash = void_data;</span>
<span class="lineNum"> 85 </span> :
<span class="lineNum"> 86 </span><span class="lineCov"> 2 : return memcmp(arg, hash-&gt;hash, HASH_SIZE);</span>
<span class="lineNum"> 86 </span><span class="lineCov"> 14 : return memcmp(arg, hash-&gt;hash, HASH_SIZE);</span>
<a name="87"><span class="lineNum"> 87 </span> : }</a>
<span class="lineNum"> 88 </span> :
<span class="lineNum"> 89 </span><span class="lineCov"> 3 : void state_dup(struct snapraid_state* state)</span>
@ -168,32 +168,32 @@
<span class="lineNum"> 106 </span><span class="lineCov"> 18 : struct snapraid_disk* disk = i-&gt;data;</span>
<span class="lineNum"> 107 </span> :
<span class="lineNum"> 108 </span> : /* for each file */
<span class="lineNum"> 109 </span><span class="lineCov"> 16998 : for (j = disk-&gt;filelist; j != 0; j = j-&gt;next) {</span>
<span class="lineNum"> 110 </span><span class="lineCov"> 16980 : struct snapraid_file* file = j-&gt;data;</span>
<span class="lineNum"> 109 </span><span class="lineCov"> 17012 : for (j = disk-&gt;filelist; j != 0; j = j-&gt;next) {</span>
<span class="lineNum"> 110 </span><span class="lineCov"> 16994 : struct snapraid_file* file = j-&gt;data;</span>
<span class="lineNum"> 111 </span> : struct snapraid_hash* hash;
<span class="lineNum"> 112 </span> : tommy_hash_t hash32;
<span class="lineNum"> 113 </span> :
<span class="lineNum"> 114 </span> : /* if empty, skip it */
<span class="lineNum"> 115 </span><span class="lineCov"> 16980 : if (file-&gt;size == 0)</span>
<span class="lineNum"> 115 </span><span class="lineCov"> 16994 : if (file-&gt;size == 0)</span>
<span class="lineNum"> 116 </span><span class="lineCov"> 24 : continue;</span>
<span class="lineNum"> 117 </span> :
<span class="lineNum"> 118 </span><span class="lineCov"> 16956 : hash = hash_alloc(state, disk, file);</span>
<span class="lineNum"> 118 </span><span class="lineCov"> 16970 : hash = hash_alloc(state, disk, file);</span>
<span class="lineNum"> 119 </span> :
<span class="lineNum"> 120 </span> : /* if no hash, skip it */
<span class="lineNum"> 121 </span><span class="lineCov"> 16956 : if (!hash)</span>
<span class="lineNum"> 121 </span><span class="lineCov"> 16970 : if (!hash)</span>
<span class="lineNum"> 122 </span><span class="lineNoCov"> 0 : continue;</span>
<span class="lineNum"> 123 </span> :
<span class="lineNum"> 124 </span><span class="lineCov"> 16956 : hash32 = hash_hash(hash);</span>
<span class="lineNum"> 124 </span><span class="lineCov"> 16970 : hash32 = hash_hash(hash);</span>
<span class="lineNum"> 125 </span> :
<span class="lineNum"> 126 </span><span class="lineCov"> 16956 : struct snapraid_hash* found = tommy_hashdyn_search(&amp;hashset, hash_compare, hash-&gt;hash, hash32);</span>
<span class="lineNum"> 127 </span><span class="lineCov"> 16956 : if (found) {</span>
<span class="lineNum"> 128 </span><span class="lineCov"> 2 : ++count;</span>
<span class="lineNum"> 129 </span><span class="lineCov"> 2 : size += found-&gt;file-&gt;size;</span>
<span class="lineNum"> 130 </span><span class="lineCov"> 2 : log_tag(&quot;dup:%s:%s:%s:%s:%&quot; PRIu64 &quot;: dup\n&quot;, disk-&gt;name, esc(file-&gt;sub), found-&gt;disk-&gt;name, esc(found-&gt;file-&gt;sub), found-&gt;file-&gt;size);</span>
<span class="lineNum"> 131 </span><span class="lineCov"> 2 : printf(&quot;%12&quot; PRIu64 &quot; %s%s = %s%s\n&quot;, file-&gt;size, disk-&gt;dir, file-&gt;sub, found-&gt;disk-&gt;dir, found-&gt;file-&gt;sub);</span>
<span class="lineNum"> 132 </span><span class="lineCov"> 2 : hash_free(hash);</span>
<span class="lineNum"> 126 </span><span class="lineCov"> 16970 : struct snapraid_hash* found = tommy_hashdyn_search(&amp;hashset, hash_compare, hash-&gt;hash, hash32);</span>
<span class="lineNum"> 127 </span><span class="lineCov"> 16970 : if (found) {</span>
<span class="lineNum"> 128 </span><span class="lineCov"> 14 : ++count;</span>
<span class="lineNum"> 129 </span><span class="lineCov"> 14 : size += found-&gt;file-&gt;size;</span>
<span class="lineNum"> 130 </span><span class="lineCov"> 14 : log_tag(&quot;dup:%s:%s:%s:%s:%&quot; PRIu64 &quot;: dup\n&quot;, disk-&gt;name, esc(file-&gt;sub), found-&gt;disk-&gt;name, esc(found-&gt;file-&gt;sub), found-&gt;file-&gt;size);</span>
<span class="lineNum"> 131 </span><span class="lineCov"> 14 : printf(&quot;%12&quot; PRIu64 &quot; %s%s = %s%s\n&quot;, file-&gt;size, disk-&gt;dir, file-&gt;sub, found-&gt;disk-&gt;dir, found-&gt;file-&gt;sub);</span>
<span class="lineNum"> 132 </span><span class="lineCov"> 14 : hash_free(hash);</span>
<span class="lineNum"> 133 </span> : } else {
<span class="lineNum"> 134 </span><span class="lineCov"> 16954 : tommy_hashdyn_insert(&amp;hashset, &amp;hash-&gt;node, hash, hash32);</span>
<span class="lineNum"> 134 </span><span class="lineCov"> 16956 : tommy_hashdyn_insert(&amp;hashset, &amp;hash-&gt;node, hash, hash32);</span>
<span class="lineNum"> 135 </span> : }
<span class="lineNum"> 136 </span> : }
<span class="lineNum"> 137 </span> : }

View file

@ -31,13 +31,13 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">545</td>
<td class="headerCovTableEntry">581</td>
<td class="headerCovTableEntry">546</td>
<td class="headerCovTableEntry">582</td>
<td class="headerCovTableEntryHi">93.8 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">62</td>
@ -60,248 +60,248 @@
<td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1043">chunk_parity_inside_compare</a></td>
<td class="coverFnHi">211700412</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1093">chunk_file_inside_compare</a></td>
<td class="coverFnHi">123424429</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1283">fs_file2block_get</a></td>
<td class="coverFnHi">112904165</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1141">fs_par2file_get_ts</a></td>
<td class="coverFnHi">62671366</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1061">fs_par2chunk_get_ts</a></td>
<td class="coverFnHi">62562730</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1295">fs_par2block_get_ts</a></td>
<td class="coverFnHi">51148943</td>
<td class="coverFn"><a href="elem.c.gcov.html#1044">chunk_parity_inside_compare</a></td>
<td class="coverFnHi">102351431</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#648">chunk_file_compare</a></td>
<td class="coverFnHi">43527418</td>
<td class="coverFnHi">44153325</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1284">fs_file2block_get</a></td>
<td class="coverFnHi">44106216</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#635">chunk_parity_compare</a></td>
<td class="coverFnHi">43029600</td>
<td class="coverFnHi">43351652</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1116">fs_file2chunk_get_ts</a></td>
<td class="coverFnHi">34157182</td>
<td class="coverFn"><a href="elem.c.gcov.html#1062">fs_par2chunk_get_ts</a></td>
<td class="coverFnHi">38418652</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1155">fs_file2par_get_ts</a></td>
<td class="coverFnHi">28740730</td>
<td class="coverFn"><a href="elem.c.gcov.html#1142">fs_par2file_get_ts</a></td>
<td class="coverFnHi">38311850</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1296">fs_par2block_get_ts</a></td>
<td class="coverFnHi">26733115</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1094">chunk_file_inside_compare</a></td>
<td class="coverFnHi">21495373</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#167">filter_apply</a></td>
<td class="coverFnHi">12035450</td>
<td class="coverFnHi">12222233</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1170">fs_allocate</a></td>
<td class="coverFnHi">8849850</td>
<td class="coverFn"><a href="elem.c.gcov.html#1117">fs_file2chunk_get_ts</a></td>
<td class="coverFnHi">10223247</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1171">fs_allocate</a></td>
<td class="coverFnHi">8975787</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#466">file_block_size</a></td>
<td class="coverFnHi">6610122</td>
<td class="coverFnHi">6677441</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#906">chunk_file_check_foreach</a></td>
<td class="coverFnHi">6291380</td>
<td class="coverFn"><a href="elem.c.gcov.html#907">chunk_file_check_foreach</a></td>
<td class="coverFnHi">6441048</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#856">chunk_parity_check_foreach</a></td>
<td class="coverFnHi">6291380</td>
<td class="coverFn"><a href="elem.c.gcov.html#857">chunk_parity_check_foreach</a></td>
<td class="coverFnHi">6441048</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#192">filter_recurse</a></td>
<td class="coverFnHi">6023667</td>
<td class="coverFnHi">6118464</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#482">file_block_is_last</a></td>
<td class="coverFnHi">5319910</td>
<td class="coverFnHi">5326414</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1156">fs_file2par_get_ts</a></td>
<td class="coverFnHi">4878725</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#604">chunk_alloc</a></td>
<td class="coverFnHi">3607761</td>
<td class="coverFnHi">3657427</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#356">file_alloc</a></td>
<td class="coverFnHi">3565141</td>
<td class="coverFnHi">3611495</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#630">chunk_free</a></td>
<td class="coverFnHi">3437520</td>
<td class="coverFnHi">3486903</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#404">file_free</a></td>
<td class="coverFnHi">3417248</td>
<td class="coverFnHi">3466242</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#226">filter_element</a></td>
<td class="coverFnHi">3226232</td>
<td class="coverFnHi">3273724</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#275">filter_path</a></td>
<td class="coverFnHi">3223260</td>
<td class="coverFnHi">3270701</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#331">filter_content</a></td>
<td class="coverFnHi">3066852</td>
<td class="coverFnHi">3114300</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#497">file_inode_compare_to_arg</a></td>
<td class="coverFnHi">866983</td>
<td class="coverFnHi">927047</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1327">time_compare</a></td>
<td class="coverFnHi">743492</td>
<td class="coverFn"><a href="elem.c.gcov.html#1328">time_compare</a></td>
<td class="coverFnHi">707506</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#521">file_path_compare</a></td>
<td class="coverFnHi">126356</td>
<td class="coverFnHi">129121</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#149">filter_type</a></td>
<td class="coverFnHi">125437</td>
<td class="coverFnHi">125387</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#666">link_alloc</a></td>
<td class="coverFnHi">115419</td>
<td class="coverFnHi">116876</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#678">link_free</a></td>
<td class="coverFnHi">109621</td>
<td class="coverFnHi">111078</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1215">fs_deallocate</a></td>
<td class="coverFnHi">106802</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#541">file_path_compare_to_arg</a></td>
<td class="coverFnHi">105104</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1214">fs_deallocate</a></td>
<td class="coverFnHi">104155</td>
<td class="coverFnHi">104908</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#285">filter_existence</a></td>
<td class="coverFnHi">80654</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#455">file_name</a></td>
<td class="coverFnHi">47908</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#831">chunk_disk_size_compare</a></td>
<td class="coverFnHi">47779</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#310">filter_correctness</a></td>
<td class="coverFnHi">38806</td>
<td class="coverFnHi">80688</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#529">file_physical_compare</a></td>
<td class="coverFnHi">34618</td>
<td class="coverFnHi">49676</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#832">chunk_disk_size_compare</a></td>
<td class="coverFnHi">48702</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#455">file_name</a></td>
<td class="coverFnHi">47994</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#310">filter_correctness</a></td>
<td class="coverFnHi">38732</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#685">link_name_compare_to_arg</a></td>
<td class="coverFnHi">30380</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#582">file_namestamp_compare</a></td>
<td class="coverFnHi">23954</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#549">file_name_compare</a></td>
<td class="coverFnHi">23954</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#559">file_stamp_compare</a></td>
<td class="coverFnHi">23659</td>
<td class="coverFnHi">31837</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#380">file_dup</a></td>
<td class="coverFnHi">21785</td>
<td class="coverFnHi">24707</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#582">file_namestamp_compare</a></td>
<td class="coverFnHi">23997</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#549">file_name_compare</a></td>
<td class="coverFnHi">23997</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#559">file_stamp_compare</a></td>
<td class="coverFnHi">23661</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#419">file_copy</a></td>
<td class="coverFnHi">6209</td>
<td class="coverFnHi">23633</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#844">disk_size</a></td>
<td class="coverFnHi">3955</td>
<td class="coverFn"><a href="elem.c.gcov.html#845">disk_size</a></td>
<td class="coverFnHi">4165</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#280">filter_dir</a></td>
<td class="coverFnHi">2972</td>
<td class="coverFnHi">3023</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1015">fs_check</a></td>
<td class="coverFnHi">2676</td>
<td class="coverFn"><a href="elem.c.gcov.html#1016">fs_check</a></td>
<td class="coverFnHi">2838</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#726">disk_alloc</a></td>
<td class="coverFnHi">1477</td>
<td class="coverFnHi">1525</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1308">map_alloc</a></td>
<td class="coverFnHi">1447</td>
<td class="coverFn"><a href="elem.c.gcov.html#1309">map_alloc</a></td>
<td class="coverFnHi">1495</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#25">content_alloc</a></td>
<td class="coverFnHi">1434</td>
<td class="coverFnHi">1490</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#766">disk_free</a></td>
<td class="coverFnHi">1351</td>
<td class="coverFn"><a href="elem.c.gcov.html#767">disk_free</a></td>
<td class="coverFnHi">1399</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1322">map_free</a></td>
<td class="coverFnHi">1327</td>
<td class="coverFn"><a href="elem.c.gcov.html#1323">map_free</a></td>
<td class="coverFnHi">1375</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#36">content_free</a></td>
<td class="coverFnHi">1297</td>
<td class="coverFnHi">1353</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#693">link_alpha_compare</a></td>
<td class="coverFnHi">1249</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#801">disk_is_empty</a></td>
<td class="coverFnHi">804</td>
<td class="coverFn"><a href="elem.c.gcov.html#802">disk_is_empty</a></td>
<td class="coverFnHi">870</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#701">dir_alloc</a></td>
<td class="coverFnHi">760</td>
<td class="coverFnHi">772</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#712">dir_free</a></td>
<td class="coverFnHi">712</td>
<td class="coverFnHi">724</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#41">filter_alloc_file</a></td>
<td class="coverFnHi">498</td>
<td class="coverFnHi">514</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#144">filter_free</a></td>
<td class="coverFnHi">461</td>
<td class="coverFnHi">477</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#718">dir_name_compare</a></td>
<td class="coverFnHi">217</td>
<td class="coverFnHi">229</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#413">file_rename</a></td>
<td class="coverFnHi">155</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#788">chunk_disk_empty_compare</a></td>
<td class="coverFnHi">10</td>
<td class="coverFn"><a href="elem.c.gcov.html#789">chunk_disk_empty_compare</a></td>
<td class="coverFnHi">13</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#120">filter_alloc_disk</a></td>

View file

@ -31,13 +31,13 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">545</td>
<td class="headerCovTableEntry">581</td>
<td class="headerCovTableEntry">546</td>
<td class="headerCovTableEntry">582</td>
<td class="headerCovTableEntryHi">93.8 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">62</td>
@ -61,103 +61,103 @@
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#604">chunk_alloc</a></td>
<td class="coverFnHi">3607761</td>
<td class="coverFnHi">3657427</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#788">chunk_disk_empty_compare</a></td>
<td class="coverFnHi">10</td>
<td class="coverFn"><a href="elem.c.gcov.html#789">chunk_disk_empty_compare</a></td>
<td class="coverFnHi">13</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#831">chunk_disk_size_compare</a></td>
<td class="coverFnHi">47779</td>
<td class="coverFn"><a href="elem.c.gcov.html#832">chunk_disk_size_compare</a></td>
<td class="coverFnHi">48702</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#906">chunk_file_check_foreach</a></td>
<td class="coverFnHi">6291380</td>
<td class="coverFn"><a href="elem.c.gcov.html#907">chunk_file_check_foreach</a></td>
<td class="coverFnHi">6441048</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#648">chunk_file_compare</a></td>
<td class="coverFnHi">43527418</td>
<td class="coverFnHi">44153325</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1093">chunk_file_inside_compare</a></td>
<td class="coverFnHi">123424429</td>
<td class="coverFn"><a href="elem.c.gcov.html#1094">chunk_file_inside_compare</a></td>
<td class="coverFnHi">21495373</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#630">chunk_free</a></td>
<td class="coverFnHi">3437520</td>
<td class="coverFnHi">3486903</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#856">chunk_parity_check_foreach</a></td>
<td class="coverFnHi">6291380</td>
<td class="coverFn"><a href="elem.c.gcov.html#857">chunk_parity_check_foreach</a></td>
<td class="coverFnHi">6441048</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#635">chunk_parity_compare</a></td>
<td class="coverFnHi">43029600</td>
<td class="coverFnHi">43351652</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1043">chunk_parity_inside_compare</a></td>
<td class="coverFnHi">211700412</td>
<td class="coverFn"><a href="elem.c.gcov.html#1044">chunk_parity_inside_compare</a></td>
<td class="coverFnHi">102351431</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#25">content_alloc</a></td>
<td class="coverFnHi">1434</td>
<td class="coverFnHi">1490</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#36">content_free</a></td>
<td class="coverFnHi">1297</td>
<td class="coverFnHi">1353</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#701">dir_alloc</a></td>
<td class="coverFnHi">760</td>
<td class="coverFnHi">772</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#712">dir_free</a></td>
<td class="coverFnHi">712</td>
<td class="coverFnHi">724</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#718">dir_name_compare</a></td>
<td class="coverFnHi">217</td>
<td class="coverFnHi">229</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#726">disk_alloc</a></td>
<td class="coverFnHi">1477</td>
<td class="coverFnHi">1525</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#766">disk_free</a></td>
<td class="coverFnHi">1351</td>
<td class="coverFn"><a href="elem.c.gcov.html#767">disk_free</a></td>
<td class="coverFnHi">1399</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#801">disk_is_empty</a></td>
<td class="coverFnHi">804</td>
<td class="coverFn"><a href="elem.c.gcov.html#802">disk_is_empty</a></td>
<td class="coverFnHi">870</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#844">disk_size</a></td>
<td class="coverFnHi">3955</td>
<td class="coverFn"><a href="elem.c.gcov.html#845">disk_size</a></td>
<td class="coverFnHi">4165</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#356">file_alloc</a></td>
<td class="coverFnHi">3565141</td>
<td class="coverFnHi">3611495</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#482">file_block_is_last</a></td>
<td class="coverFnHi">5319910</td>
<td class="coverFnHi">5326414</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#466">file_block_size</a></td>
<td class="coverFnHi">6610122</td>
<td class="coverFnHi">6677441</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#419">file_copy</a></td>
<td class="coverFnHi">6209</td>
<td class="coverFnHi">23633</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#380">file_dup</a></td>
<td class="coverFnHi">21785</td>
<td class="coverFnHi">24707</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#404">file_free</a></td>
<td class="coverFnHi">3417248</td>
<td class="coverFnHi">3466242</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#509">file_inode_compare</a></td>
@ -165,27 +165,27 @@
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#497">file_inode_compare_to_arg</a></td>
<td class="coverFnHi">866983</td>
<td class="coverFnHi">927047</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#455">file_name</a></td>
<td class="coverFnHi">47908</td>
<td class="coverFnHi">47994</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#549">file_name_compare</a></td>
<td class="coverFnHi">23954</td>
<td class="coverFnHi">23997</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#582">file_namestamp_compare</a></td>
<td class="coverFnHi">23954</td>
<td class="coverFnHi">23997</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#521">file_path_compare</a></td>
<td class="coverFnHi">126356</td>
<td class="coverFnHi">129121</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#541">file_path_compare_to_arg</a></td>
<td class="coverFnHi">105104</td>
<td class="coverFnHi">104908</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#593">file_pathstamp_compare</a></td>
@ -193,7 +193,7 @@
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#529">file_physical_compare</a></td>
<td class="coverFnHi">34618</td>
<td class="coverFnHi">49676</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#413">file_rename</a></td>
@ -201,7 +201,7 @@
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#559">file_stamp_compare</a></td>
<td class="coverFnHi">23659</td>
<td class="coverFnHi">23661</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#120">filter_alloc_disk</a></td>
@ -209,87 +209,87 @@
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#41">filter_alloc_file</a></td>
<td class="coverFnHi">498</td>
<td class="coverFnHi">514</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#167">filter_apply</a></td>
<td class="coverFnHi">12035450</td>
<td class="coverFnHi">12222233</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#331">filter_content</a></td>
<td class="coverFnHi">3066852</td>
<td class="coverFnHi">3114300</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#310">filter_correctness</a></td>
<td class="coverFnHi">38806</td>
<td class="coverFnHi">38732</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#280">filter_dir</a></td>
<td class="coverFnHi">2972</td>
<td class="coverFnHi">3023</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#226">filter_element</a></td>
<td class="coverFnHi">3226232</td>
<td class="coverFnHi">3273724</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#285">filter_existence</a></td>
<td class="coverFnHi">80654</td>
<td class="coverFnHi">80688</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#144">filter_free</a></td>
<td class="coverFnHi">461</td>
<td class="coverFnHi">477</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#275">filter_path</a></td>
<td class="coverFnHi">3223260</td>
<td class="coverFnHi">3270701</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#192">filter_recurse</a></td>
<td class="coverFnHi">6023667</td>
<td class="coverFnHi">6118464</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#149">filter_type</a></td>
<td class="coverFnHi">125437</td>
<td class="coverFnHi">125387</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1170">fs_allocate</a></td>
<td class="coverFnHi">8849850</td>
<td class="coverFn"><a href="elem.c.gcov.html#1171">fs_allocate</a></td>
<td class="coverFnHi">8975787</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1015">fs_check</a></td>
<td class="coverFnHi">2676</td>
<td class="coverFn"><a href="elem.c.gcov.html#1016">fs_check</a></td>
<td class="coverFnHi">2838</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1214">fs_deallocate</a></td>
<td class="coverFnHi">104155</td>
<td class="coverFn"><a href="elem.c.gcov.html#1215">fs_deallocate</a></td>
<td class="coverFnHi">106802</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1283">fs_file2block_get</a></td>
<td class="coverFnHi">112904165</td>
<td class="coverFn"><a href="elem.c.gcov.html#1284">fs_file2block_get</a></td>
<td class="coverFnHi">44106216</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1116">fs_file2chunk_get_ts</a></td>
<td class="coverFnHi">34157182</td>
<td class="coverFn"><a href="elem.c.gcov.html#1117">fs_file2chunk_get_ts</a></td>
<td class="coverFnHi">10223247</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1155">fs_file2par_get_ts</a></td>
<td class="coverFnHi">28740730</td>
<td class="coverFn"><a href="elem.c.gcov.html#1156">fs_file2par_get_ts</a></td>
<td class="coverFnHi">4878725</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1295">fs_par2block_get_ts</a></td>
<td class="coverFnHi">51148943</td>
<td class="coverFn"><a href="elem.c.gcov.html#1296">fs_par2block_get_ts</a></td>
<td class="coverFnHi">26733115</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1061">fs_par2chunk_get_ts</a></td>
<td class="coverFnHi">62562730</td>
<td class="coverFn"><a href="elem.c.gcov.html#1062">fs_par2chunk_get_ts</a></td>
<td class="coverFnHi">38418652</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1141">fs_par2file_get_ts</a></td>
<td class="coverFnHi">62671366</td>
<td class="coverFn"><a href="elem.c.gcov.html#1142">fs_par2file_get_ts</a></td>
<td class="coverFnHi">38311850</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#666">link_alloc</a></td>
<td class="coverFnHi">115419</td>
<td class="coverFnHi">116876</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#693">link_alpha_compare</a></td>
@ -297,23 +297,23 @@
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#678">link_free</a></td>
<td class="coverFnHi">109621</td>
<td class="coverFnHi">111078</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#685">link_name_compare_to_arg</a></td>
<td class="coverFnHi">30380</td>
<td class="coverFnHi">31837</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1308">map_alloc</a></td>
<td class="coverFnHi">1447</td>
<td class="coverFn"><a href="elem.c.gcov.html#1309">map_alloc</a></td>
<td class="coverFnHi">1495</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1322">map_free</a></td>
<td class="coverFnHi">1327</td>
<td class="coverFn"><a href="elem.c.gcov.html#1323">map_free</a></td>
<td class="coverFnHi">1375</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.c.gcov.html#1327">time_compare</a></td>
<td class="coverFnHi">743492</td>
<td class="coverFn"><a href="elem.c.gcov.html#1328">time_compare</a></td>
<td class="coverFnHi">707506</td>
</tr>
</table>
<br>

File diff suppressed because it is too large Load diff

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">39</td>
@ -60,159 +60,159 @@
<td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#560">block_state_get</a></td>
<td class="coverFnHi">96735410</td>
<td class="coverFn"><a href="elem.h.gcov.html#562">block_state_get</a></td>
<td class="coverFnHi">49967196</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#639">file_flag_has</a></td>
<td class="coverFnHi">33299459</td>
<td class="coverFn"><a href="elem.h.gcov.html#641">file_flag_has</a></td>
<td class="coverFnHi">33706389</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#957">fs_par2block_get</a></td>
<td class="coverFnHi">21727310</td>
<td class="coverFn"><a href="elem.h.gcov.html#959">fs_par2block_get</a></td>
<td class="coverFnHi">22209416</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#571">block_state_set</a></td>
<td class="coverFnHi">18242161</td>
<td class="coverFn"><a href="elem.h.gcov.html#573">block_state_set</a></td>
<td class="coverFnHi">18633161</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#606">block_has_file</a></td>
<td class="coverFnHi">12929086</td>
<td class="coverFn"><a href="elem.h.gcov.html#608">block_has_file</a></td>
<td class="coverFnHi">13243669</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#928">fs_par2file_get</a></td>
<td class="coverFnHi">11514087</td>
<td class="coverFn"><a href="elem.h.gcov.html#621">block_has_invalid_parity</a></td>
<td class="coverFnHi">11837218</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#619">block_has_invalid_parity</a></td>
<td class="coverFnHi">11489174</td>
<td class="coverFn"><a href="elem.h.gcov.html#930">fs_par2file_get</a></td>
<td class="coverFnHi">11578735</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#1065">info_get</a></td>
<td class="coverFnHi">10573034</td>
<td class="coverFn"><a href="elem.h.gcov.html#543">hash_invalid_set</a></td>
<td class="coverFnHi">9036734</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#541">hash_invalid_set</a></td>
<td class="coverFnHi">8910831</td>
<td class="coverFn"><a href="elem.h.gcov.html#749">file_stamp_hash</a></td>
<td class="coverFnHi">6198269</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#747">file_stamp_hash</a></td>
<td class="coverFnHi">6139138</td>
<td class="coverFn"><a href="elem.h.gcov.html#646">file_flag_set</a></td>
<td class="coverFnHi">5250833</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#644">file_flag_set</a></td>
<td class="coverFnHi">5176917</td>
<td class="coverFn"><a href="elem.h.gcov.html#1067">info_get</a></td>
<td class="coverFnHi">5104110</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#718">file_inode_hash</a></td>
<td class="coverFnHi">4822298</td>
<td class="coverFn"><a href="elem.h.gcov.html#720">file_inode_hash</a></td>
<td class="coverFnHi">4924816</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#739">file_path_hash</a></td>
<td class="coverFnHi">3766623</td>
<td class="coverFn"><a href="elem.h.gcov.html#741">file_path_hash</a></td>
<td class="coverFnHi">3815727</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#1020">info_get_rehash</a></td>
<td class="coverFnHi">3312725</td>
<td class="coverFn"><a href="elem.h.gcov.html#458">filter_hidden</a></td>
<td class="coverFnHi">3114300</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#456">filter_hidden</a></td>
<td class="coverFnHi">3066852</td>
<td class="coverFn"><a href="elem.h.gcov.html#596">block_has_past_hash</a></td>
<td class="coverFnHi">2401624</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#594">block_has_past_hash</a></td>
<td class="coverFnHi">2287366</td>
<td class="coverFn"><a href="elem.h.gcov.html#583">block_has_updated_hash</a></td>
<td class="coverFnHi">2075259</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#1002">info_get_time</a></td>
<td class="coverFnHi">2258078</td>
<td class="coverFn"><a href="elem.h.gcov.html#1022">info_get_rehash</a></td>
<td class="coverFnHi">2058338</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#581">block_has_updated_hash</a></td>
<td class="coverFnHi">2005171</td>
<td class="coverFn"><a href="elem.h.gcov.html#1056">info_set</a></td>
<td class="coverFnHi">1639782</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#1011">info_get_bad</a></td>
<td class="coverFnHi">1725704</td>
<td class="coverFn"><a href="elem.h.gcov.html#1004">info_get_time</a></td>
<td class="coverFnHi">890086</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#1054">info_set</a></td>
<td class="coverFnHi">1609485</td>
<td class="coverFn"><a href="elem.h.gcov.html#521">hash_is_zero</a></td>
<td class="coverFnHi">761026</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#1029">info_get_justsynced</a></td>
<td class="coverFnHi">1474627</td>
<td class="coverFn"><a href="elem.h.gcov.html#505">hash_is_invalid</a></td>
<td class="coverFnHi">759605</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#519">hash_is_zero</a></td>
<td class="coverFnHi">790275</td>
<td class="coverFn"><a href="elem.h.gcov.html#944">fs_file2par_get</a></td>
<td class="coverFnHi">519510</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#503">hash_is_invalid</a></td>
<td class="coverFnHi">776042</td>
<td class="coverFn"><a href="elem.h.gcov.html#1013">info_get_bad</a></td>
<td class="coverFnHi">338860</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#942">fs_file2par_get</a></td>
<td class="coverFnHi">464306</td>
<td class="coverFn"><a href="elem.h.gcov.html#634">block_has_file_and_valid_parity</a></td>
<td class="coverFnHi">257893</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#793">link_flag_get</a></td>
<td class="coverFnHi">410820</td>
<td class="coverFn"><a href="elem.h.gcov.html#774">link_flag_has</a></td>
<td class="coverFnHi">205548</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#983">info_make</a></td>
<td class="coverFnHi">394996</td>
<td class="coverFn"><a href="elem.h.gcov.html#985">info_make</a></td>
<td class="coverFnHi">174394</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#632">block_has_file_and_valid_parity</a></td>
<td class="coverFnHi">221100</td>
<td class="coverFn"><a href="elem.h.gcov.html#823">link_name_hash</a></td>
<td class="coverFnHi">151170</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#772">link_flag_has</a></td>
<td class="coverFnHi">202633</td>
<td class="coverFn"><a href="elem.h.gcov.html#551">hash_zero_set</a></td>
<td class="coverFnHi">115487</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#549">hash_zero_set</a></td>
<td class="coverFnHi">153288</td>
<td class="coverFn"><a href="elem.h.gcov.html#795">link_flag_get</a></td>
<td class="coverFnHi">89637</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#821">link_name_hash</a></td>
<td class="coverFnHi">148256</td>
<td class="coverFn"><a href="elem.h.gcov.html#1031">info_get_justsynced</a></td>
<td class="coverFnHi">79285</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#533">hash_is_real</a></td>
<td class="coverFnHi">65785</td>
<td class="coverFn"><a href="elem.h.gcov.html#535">hash_is_real</a></td>
<td class="coverFnHi">44133</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#777">link_flag_set</a></td>
<td class="coverFnHi">36114</td>
<td class="coverFn"><a href="elem.h.gcov.html#779">link_flag_set</a></td>
<td class="coverFnHi">37571</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#649">file_flag_clear</a></td>
<td class="coverFnHi">14174</td>
<td class="coverFn"><a href="elem.h.gcov.html#651">file_flag_clear</a></td>
<td class="coverFnHi">20621</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#1045">info_set_rehash</a></td>
<td class="coverFnHi">9199</td>
<td class="coverFn"><a href="elem.h.gcov.html#1047">info_set_rehash</a></td>
<td class="coverFnHi">9207</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#1037">info_set_bad</a></td>
<td class="coverFnHi">1802</td>
<td class="coverFn"><a href="elem.h.gcov.html#1039">info_set_bad</a></td>
<td class="coverFnHi">1771</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#859">dir_name_hash</a></td>
<td class="coverFnHi">987</td>
<td class="coverFn"><a href="elem.h.gcov.html#861">dir_name_hash</a></td>
<td class="coverFnHi">1011</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#826">dir_flag_has</a></td>
<td class="coverFnHi">876</td>
<td class="coverFn"><a href="elem.h.gcov.html#828">dir_flag_has</a></td>
<td class="coverFnHi">900</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#831">dir_flag_set</a></td>
<td class="coverFnHi">235</td>
<td class="coverFn"><a href="elem.h.gcov.html#833">dir_flag_set</a></td>
<td class="coverFnHi">247</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#787">link_flag_let</a></td>
<td class="coverFn"><a href="elem.h.gcov.html#789">link_flag_let</a></td>
<td class="coverFnHi">6</td>
</tr>
</table>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">39</td>
@ -60,160 +60,160 @@
<td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="elem.h.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#606">block_has_file</a></td>
<td class="coverFnHi">12929086</td>
<td class="coverFn"><a href="elem.h.gcov.html#608">block_has_file</a></td>
<td class="coverFnHi">13243669</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#632">block_has_file_and_valid_parity</a></td>
<td class="coverFnHi">221100</td>
<td class="coverFn"><a href="elem.h.gcov.html#634">block_has_file_and_valid_parity</a></td>
<td class="coverFnHi">257893</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#619">block_has_invalid_parity</a></td>
<td class="coverFnHi">11489174</td>
<td class="coverFn"><a href="elem.h.gcov.html#621">block_has_invalid_parity</a></td>
<td class="coverFnHi">11837218</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#594">block_has_past_hash</a></td>
<td class="coverFnHi">2287366</td>
<td class="coverFn"><a href="elem.h.gcov.html#596">block_has_past_hash</a></td>
<td class="coverFnHi">2401624</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#581">block_has_updated_hash</a></td>
<td class="coverFnHi">2005171</td>
<td class="coverFn"><a href="elem.h.gcov.html#583">block_has_updated_hash</a></td>
<td class="coverFnHi">2075259</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#560">block_state_get</a></td>
<td class="coverFnHi">96735410</td>
<td class="coverFn"><a href="elem.h.gcov.html#562">block_state_get</a></td>
<td class="coverFnHi">49967196</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#571">block_state_set</a></td>
<td class="coverFnHi">18242161</td>
<td class="coverFn"><a href="elem.h.gcov.html#573">block_state_set</a></td>
<td class="coverFnHi">18633161</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#826">dir_flag_has</a></td>
<td class="coverFnHi">876</td>
<td class="coverFn"><a href="elem.h.gcov.html#828">dir_flag_has</a></td>
<td class="coverFnHi">900</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#831">dir_flag_set</a></td>
<td class="coverFnHi">235</td>
<td class="coverFn"><a href="elem.h.gcov.html#833">dir_flag_set</a></td>
<td class="coverFnHi">247</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#859">dir_name_hash</a></td>
<td class="coverFnHi">987</td>
<td class="coverFn"><a href="elem.h.gcov.html#861">dir_name_hash</a></td>
<td class="coverFnHi">1011</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#649">file_flag_clear</a></td>
<td class="coverFnHi">14174</td>
<td class="coverFn"><a href="elem.h.gcov.html#651">file_flag_clear</a></td>
<td class="coverFnHi">20621</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#639">file_flag_has</a></td>
<td class="coverFnHi">33299459</td>
<td class="coverFn"><a href="elem.h.gcov.html#641">file_flag_has</a></td>
<td class="coverFnHi">33706389</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#644">file_flag_set</a></td>
<td class="coverFnHi">5176917</td>
<td class="coverFn"><a href="elem.h.gcov.html#646">file_flag_set</a></td>
<td class="coverFnHi">5250833</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#718">file_inode_hash</a></td>
<td class="coverFnHi">4822298</td>
<td class="coverFn"><a href="elem.h.gcov.html#720">file_inode_hash</a></td>
<td class="coverFnHi">4924816</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#739">file_path_hash</a></td>
<td class="coverFnHi">3766623</td>
<td class="coverFn"><a href="elem.h.gcov.html#741">file_path_hash</a></td>
<td class="coverFnHi">3815727</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#747">file_stamp_hash</a></td>
<td class="coverFnHi">6139138</td>
<td class="coverFn"><a href="elem.h.gcov.html#749">file_stamp_hash</a></td>
<td class="coverFnHi">6198269</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#456">filter_hidden</a></td>
<td class="coverFnHi">3066852</td>
<td class="coverFn"><a href="elem.h.gcov.html#458">filter_hidden</a></td>
<td class="coverFnHi">3114300</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#942">fs_file2par_get</a></td>
<td class="coverFnHi">464306</td>
<td class="coverFn"><a href="elem.h.gcov.html#944">fs_file2par_get</a></td>
<td class="coverFnHi">519510</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#957">fs_par2block_get</a></td>
<td class="coverFnHi">21727310</td>
<td class="coverFn"><a href="elem.h.gcov.html#959">fs_par2block_get</a></td>
<td class="coverFnHi">22209416</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#928">fs_par2file_get</a></td>
<td class="coverFnHi">11514087</td>
<td class="coverFn"><a href="elem.h.gcov.html#930">fs_par2file_get</a></td>
<td class="coverFnHi">11578735</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#541">hash_invalid_set</a></td>
<td class="coverFnHi">8910831</td>
<td class="coverFn"><a href="elem.h.gcov.html#543">hash_invalid_set</a></td>
<td class="coverFnHi">9036734</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#503">hash_is_invalid</a></td>
<td class="coverFnHi">776042</td>
<td class="coverFn"><a href="elem.h.gcov.html#505">hash_is_invalid</a></td>
<td class="coverFnHi">759605</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#533">hash_is_real</a></td>
<td class="coverFnHi">65785</td>
<td class="coverFn"><a href="elem.h.gcov.html#535">hash_is_real</a></td>
<td class="coverFnHi">44133</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#519">hash_is_zero</a></td>
<td class="coverFnHi">790275</td>
<td class="coverFn"><a href="elem.h.gcov.html#521">hash_is_zero</a></td>
<td class="coverFnHi">761026</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#549">hash_zero_set</a></td>
<td class="coverFnHi">153288</td>
<td class="coverFn"><a href="elem.h.gcov.html#551">hash_zero_set</a></td>
<td class="coverFnHi">115487</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#1065">info_get</a></td>
<td class="coverFnHi">10573034</td>
<td class="coverFn"><a href="elem.h.gcov.html#1067">info_get</a></td>
<td class="coverFnHi">5104110</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#1011">info_get_bad</a></td>
<td class="coverFnHi">1725704</td>
<td class="coverFn"><a href="elem.h.gcov.html#1013">info_get_bad</a></td>
<td class="coverFnHi">338860</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#1029">info_get_justsynced</a></td>
<td class="coverFnHi">1474627</td>
<td class="coverFn"><a href="elem.h.gcov.html#1031">info_get_justsynced</a></td>
<td class="coverFnHi">79285</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#1020">info_get_rehash</a></td>
<td class="coverFnHi">3312725</td>
<td class="coverFn"><a href="elem.h.gcov.html#1022">info_get_rehash</a></td>
<td class="coverFnHi">2058338</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#1002">info_get_time</a></td>
<td class="coverFnHi">2258078</td>
<td class="coverFn"><a href="elem.h.gcov.html#1004">info_get_time</a></td>
<td class="coverFnHi">890086</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#983">info_make</a></td>
<td class="coverFnHi">394996</td>
<td class="coverFn"><a href="elem.h.gcov.html#985">info_make</a></td>
<td class="coverFnHi">174394</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#1054">info_set</a></td>
<td class="coverFnHi">1609485</td>
<td class="coverFn"><a href="elem.h.gcov.html#1056">info_set</a></td>
<td class="coverFnHi">1639782</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#1037">info_set_bad</a></td>
<td class="coverFnHi">1802</td>
<td class="coverFn"><a href="elem.h.gcov.html#1039">info_set_bad</a></td>
<td class="coverFnHi">1771</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#1045">info_set_rehash</a></td>
<td class="coverFnHi">9199</td>
<td class="coverFn"><a href="elem.h.gcov.html#1047">info_set_rehash</a></td>
<td class="coverFnHi">9207</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#793">link_flag_get</a></td>
<td class="coverFnHi">410820</td>
<td class="coverFn"><a href="elem.h.gcov.html#795">link_flag_get</a></td>
<td class="coverFnHi">89637</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#772">link_flag_has</a></td>
<td class="coverFnHi">202633</td>
<td class="coverFn"><a href="elem.h.gcov.html#774">link_flag_has</a></td>
<td class="coverFnHi">205548</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#787">link_flag_let</a></td>
<td class="coverFn"><a href="elem.h.gcov.html#789">link_flag_let</a></td>
<td class="coverFnHi">6</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#777">link_flag_set</a></td>
<td class="coverFnHi">36114</td>
<td class="coverFn"><a href="elem.h.gcov.html#779">link_flag_set</a></td>
<td class="coverFnHi">37571</td>
</tr>
<tr>
<td class="coverFn"><a href="elem.h.gcov.html#821">link_name_hash</a></td>
<td class="coverFnHi">148256</td>
<td class="coverFn"><a href="elem.h.gcov.html#823">link_name_hash</a></td>
<td class="coverFnHi">151170</td>
</tr>
</table>
<br>

File diff suppressed because it is too large Load diff

View file

@ -31,13 +31,13 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">125</td>
<td class="headerCovTableEntry">128</td>
<td class="headerCovTableEntry">126</td>
<td class="headerCovTableEntry">129</td>
<td class="headerCovTableEntryHi">97.7 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">8</td>
@ -61,35 +61,35 @@
</tr>
<tr>
<td class="coverFn"><a href="handle.c.gcov.html#249">handle_read</a></td>
<td class="coverFnHi">5656394</td>
<td class="coverFnHi">5713632</td>
</tr>
<tr>
<td class="coverFn"><a href="handle.c.gcov.html#221">handle_close</a></td>
<td class="coverFnHi">4568631</td>
<td class="coverFnHi">4590919</td>
</tr>
<tr>
<td class="coverFn"><a href="handle.c.gcov.html#149">handle_open</a></td>
<td class="coverFnHi">1972488</td>
<td class="coverFnHi">2024387</td>
</tr>
<tr>
<td class="coverFn"><a href="handle.c.gcov.html#25">handle_create</a></td>
<td class="coverFnHi">771210</td>
<td class="coverFnHi">771290</td>
</tr>
<tr>
<td class="coverFn"><a href="handle.c.gcov.html#324">handle_write</a></td>
<td class="coverFnHi">288205</td>
<td class="coverFnHi">288532</td>
</tr>
<tr>
<td class="coverFn"><a href="handle.c.gcov.html#364">handle_utime</a></td>
<td class="coverFnHi">117763</td>
<td class="coverFnHi">119455</td>
</tr>
<tr>
<td class="coverFn"><a href="handle.c.gcov.html#127">handle_truncate</a></td>
<td class="coverFnHi">3249</td>
<td class="coverFnHi">3187</td>
</tr>
<tr>
<td class="coverFn"><a href="handle.c.gcov.html#384">handle_map</a></td>
<td class="coverFnHi">206</td>
<td class="coverFnHi">214</td>
</tr>
</table>
<br>

View file

@ -31,13 +31,13 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">125</td>
<td class="headerCovTableEntry">128</td>
<td class="headerCovTableEntry">126</td>
<td class="headerCovTableEntry">129</td>
<td class="headerCovTableEntryHi">97.7 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">8</td>
@ -61,35 +61,35 @@
</tr>
<tr>
<td class="coverFn"><a href="handle.c.gcov.html#221">handle_close</a></td>
<td class="coverFnHi">4568631</td>
<td class="coverFnHi">4590919</td>
</tr>
<tr>
<td class="coverFn"><a href="handle.c.gcov.html#25">handle_create</a></td>
<td class="coverFnHi">771210</td>
<td class="coverFnHi">771290</td>
</tr>
<tr>
<td class="coverFn"><a href="handle.c.gcov.html#384">handle_map</a></td>
<td class="coverFnHi">206</td>
<td class="coverFnHi">214</td>
</tr>
<tr>
<td class="coverFn"><a href="handle.c.gcov.html#149">handle_open</a></td>
<td class="coverFnHi">1972488</td>
<td class="coverFnHi">2024387</td>
</tr>
<tr>
<td class="coverFn"><a href="handle.c.gcov.html#249">handle_read</a></td>
<td class="coverFnHi">5656394</td>
<td class="coverFnHi">5713632</td>
</tr>
<tr>
<td class="coverFn"><a href="handle.c.gcov.html#127">handle_truncate</a></td>
<td class="coverFnHi">3249</td>
<td class="coverFnHi">3187</td>
</tr>
<tr>
<td class="coverFn"><a href="handle.c.gcov.html#364">handle_utime</a></td>
<td class="coverFnHi">117763</td>
<td class="coverFnHi">119455</td>
</tr>
<tr>
<td class="coverFn"><a href="handle.c.gcov.html#324">handle_write</a></td>
<td class="coverFnHi">288205</td>
<td class="coverFnHi">288532</td>
</tr>
</table>
<br>

View file

@ -31,13 +31,13 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">125</td>
<td class="headerCovTableEntry">128</td>
<td class="headerCovTableEntry">126</td>
<td class="headerCovTableEntry">129</td>
<td class="headerCovTableEntryHi">97.7 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">8</td>
@ -86,66 +86,66 @@
<span class="lineNum"> 24 </span> : /****************************************************************************/
<a name="25"><span class="lineNum"> 25 </span> : /* handle */</a>
<span class="lineNum"> 26 </span> :
<span class="lineNum"> 27 </span><span class="lineCov"> 771210 : int handle_create(struct snapraid_handle* handle, struct snapraid_file* file, int mode)</span>
<span class="lineNum"> 27 </span><span class="lineCov"> 771290 : int handle_create(struct snapraid_handle* handle, struct snapraid_file* file, int mode)</span>
<span class="lineNum"> 28 </span> : {
<span class="lineNum"> 29 </span> : int ret;
<span class="lineNum"> 30 </span> : int flags;
<span class="lineNum"> 31 </span> :
<span class="lineNum"> 32 </span> : /* if it's the same file, and already opened, nothing to do */
<span class="lineNum"> 33 </span><span class="lineCov"> 771210 : if (handle-&gt;file == file &amp;&amp; handle-&gt;f != -1) {</span>
<span class="lineNum"> 33 </span><span class="lineCov"> 771290 : if (handle-&gt;file == file &amp;&amp; handle-&gt;f != -1) {</span>
<span class="lineNum"> 34 </span><span class="lineNoCov"> 0 : return 0;</span>
<span class="lineNum"> 35 </span> : }
<span class="lineNum"> 36 </span> :
<span class="lineNum"> 37 </span><span class="lineCov"> 771210 : pathprint(handle-&gt;path, sizeof(handle-&gt;path), &quot;%s%s&quot;, handle-&gt;disk-&gt;dir, file-&gt;sub);</span>
<span class="lineNum"> 37 </span><span class="lineCov"> 771290 : pathprint(handle-&gt;path, sizeof(handle-&gt;path), &quot;%s%s&quot;, handle-&gt;disk-&gt;dir, file-&gt;sub);</span>
<span class="lineNum"> 38 </span> :
<span class="lineNum"> 39 </span><span class="lineCov"> 771210 : ret = mkancestor(handle-&gt;path);</span>
<span class="lineNum"> 40 </span><span class="lineCov"> 771210 : if (ret != 0) {</span>
<span class="lineNum"> 39 </span><span class="lineCov"> 771290 : ret = mkancestor(handle-&gt;path);</span>
<span class="lineNum"> 40 </span><span class="lineCov"> 771290 : if (ret != 0) {</span>
<span class="lineNum"> 41 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 42 </span> : return -1;
<span class="lineNum"> 43 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 44 </span> : }
<span class="lineNum"> 45 </span> :
<span class="lineNum"> 46 </span> : /* initial values, changed later if required */
<span class="lineNum"> 47 </span><span class="lineCov"> 771210 : handle-&gt;created = 0;</span>
<span class="lineNum"> 47 </span><span class="lineCov"> 771290 : handle-&gt;created = 0;</span>
<span class="lineNum"> 48 </span> :
<span class="lineNum"> 49 </span> : /* flags for opening */
<span class="lineNum"> 50 </span> : /* O_BINARY: open as binary file (Windows only) */
<span class="lineNum"> 51 </span> : /* O_NOFOLLOW: do not follow links to ensure to open the real file */
<span class="lineNum"> 52 </span> : /* O_SEQUENTIAL: improve performance for sequential access (Windows only) */
<span class="lineNum"> 53 </span><span class="lineCov"> 771210 : flags = O_BINARY | O_NOFOLLOW;</span>
<span class="lineNum"> 54 </span><span class="lineCov"> 771210 : if ((mode &amp; MODE_SEQUENTIAL) != 0)</span>
<span class="lineNum"> 55 </span><span class="lineCov"> 771210 : flags |= O_SEQUENTIAL;</span>
<span class="lineNum"> 53 </span><span class="lineCov"> 771290 : flags = O_BINARY | O_NOFOLLOW;</span>
<span class="lineNum"> 54 </span><span class="lineCov"> 771290 : if ((mode &amp; MODE_SEQUENTIAL) != 0)</span>
<span class="lineNum"> 55 </span><span class="lineCov"> 771290 : flags |= O_SEQUENTIAL;</span>
<span class="lineNum"> 56 </span> :
<span class="lineNum"> 57 </span> : /* open for read write */
<span class="lineNum"> 58 </span><span class="lineCov"> 771210 : handle-&gt;f = open(handle-&gt;path, flags | O_RDWR);</span>
<span class="lineNum"> 58 </span><span class="lineCov"> 771290 : handle-&gt;f = open(handle-&gt;path, flags | O_RDWR);</span>
<span class="lineNum"> 59 </span> :
<span class="lineNum"> 60 </span> : /* if failed for missing write permission */
<span class="lineNum"> 61 </span><span class="lineCov"> 771210 : if (handle-&gt;f == -1 &amp;&amp; (errno == EACCES || errno == EROFS)) {</span>
<span class="lineNum"> 61 </span><span class="lineCov"> 771290 : if (handle-&gt;f == -1 &amp;&amp; (errno == EACCES || errno == EROFS)) {</span>
<span class="lineNum"> 62 </span> : /* open for real-only */
<span class="lineNum"> 63 </span><span class="lineNoCov"> 0 : handle-&gt;f = open(handle-&gt;path, flags | O_RDONLY);</span>
<span class="lineNum"> 64 </span> : }
<span class="lineNum"> 65 </span> :
<span class="lineNum"> 66 </span> : /* if failed for missing file */
<span class="lineNum"> 67 </span><span class="lineCov"> 771210 : if (handle-&gt;f == -1 &amp;&amp; errno == ENOENT) {</span>
<span class="lineNum"> 67 </span><span class="lineCov"> 771290 : if (handle-&gt;f == -1 &amp;&amp; errno == ENOENT) {</span>
<span class="lineNum"> 68 </span> : char path_from[PATH_MAX];
<span class="lineNum"> 69 </span> :
<span class="lineNum"> 70 </span> : /* check if exists a .unrecoverable copy, and rename to the real one */
<span class="lineNum"> 71 </span><span class="lineCov"> 176420 : pathprint(path_from, sizeof(path_from), &quot;%s.unrecoverable&quot;, handle-&gt;path);</span>
<span class="lineNum"> 71 </span><span class="lineCov"> 176470 : pathprint(path_from, sizeof(path_from), &quot;%s.unrecoverable&quot;, handle-&gt;path);</span>
<span class="lineNum"> 72 </span> :
<span class="lineNum"> 73 </span><span class="lineCov"> 176420 : if (rename(path_from, handle-&gt;path) == 0) {</span>
<span class="lineNum"> 73 </span><span class="lineCov"> 176470 : if (rename(path_from, handle-&gt;path) == 0) {</span>
<span class="lineNum"> 74 </span> : /* open for read write */
<span class="lineNum"> 75 </span><span class="lineCov"> 63396 : handle-&gt;f = open(handle-&gt;path, flags | O_RDWR);</span>
<span class="lineNum"> 75 </span><span class="lineCov"> 63363 : handle-&gt;f = open(handle-&gt;path, flags | O_RDWR);</span>
<span class="lineNum"> 76 </span> : } else {
<span class="lineNum"> 77 </span> : /* create it */
<span class="lineNum"> 78 </span><span class="lineCov"> 113024 : handle-&gt;f = open(handle-&gt;path, flags | O_RDWR | O_CREAT, 0600);</span>
<span class="lineNum"> 79 </span><span class="lineCov"> 113024 : if (handle-&gt;f != -1) {</span>
<span class="lineNum"> 78 </span><span class="lineCov"> 113107 : handle-&gt;f = open(handle-&gt;path, flags | O_RDWR | O_CREAT, 0600);</span>
<span class="lineNum"> 79 </span><span class="lineCov"> 113107 : if (handle-&gt;f != -1) {</span>
<span class="lineNum"> 80 </span> : /* mark it as created if really done */
<span class="lineNum"> 81 </span><span class="lineCov"> 113024 : handle-&gt;created = 1;</span>
<span class="lineNum"> 81 </span><span class="lineCov"> 113107 : handle-&gt;created = 1;</span>
<span class="lineNum"> 82 </span> : }
<span class="lineNum"> 83 </span> : }
<span class="lineNum"> 84 </span> : }
<span class="lineNum"> 85 </span> :
<span class="lineNum"> 86 </span><span class="lineCov"> 771210 : if (handle-&gt;f == -1) {</span>
<span class="lineNum"> 86 </span><span class="lineCov"> 771290 : if (handle-&gt;f == -1) {</span>
<span class="lineNum"> 87 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 88 </span> : /* invalidate for error */
<span class="lineNum"> 89 </span> : handle-&gt;file = 0;
@ -158,11 +158,11 @@
<span class="lineNum"> 96 </span> : }
<span class="lineNum"> 97 </span> :
<span class="lineNum"> 98 </span> : /* just opened */
<span class="lineNum"> 99 </span><span class="lineCov"> 771210 : handle-&gt;file = file;</span>
<span class="lineNum"> 99 </span><span class="lineCov"> 771290 : handle-&gt;file = file;</span>
<span class="lineNum"> 100 </span> :
<span class="lineNum"> 101 </span> : /* get the stat info */
<span class="lineNum"> 102 </span><span class="lineCov"> 771210 : ret = fstat(handle-&gt;f, &amp;handle-&gt;st);</span>
<span class="lineNum"> 103 </span><span class="lineCov"> 771210 : if (ret != 0) {</span>
<span class="lineNum"> 102 </span><span class="lineCov"> 771290 : ret = fstat(handle-&gt;f, &amp;handle-&gt;st);</span>
<span class="lineNum"> 103 </span><span class="lineCov"> 771290 : if (ret != 0) {</span>
<span class="lineNum"> 104 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 105 </span> : log_fatal(&quot;Error accessing file '%s'. %s.\n&quot;, handle-&gt;path, strerror(errno));
<span class="lineNum"> 106 </span> : return -1;
@ -170,13 +170,13 @@
<span class="lineNum"> 108 </span> : }
<span class="lineNum"> 109 </span> :
<span class="lineNum"> 110 </span> : /* get the size of the existing data */
<span class="lineNum"> 111 </span><span class="lineCov"> 771210 : handle-&gt;valid_size = handle-&gt;st.st_size;</span>
<span class="lineNum"> 111 </span><span class="lineCov"> 771290 : handle-&gt;valid_size = handle-&gt;st.st_size;</span>
<span class="lineNum"> 112 </span> :
<span class="lineNum"> 113 </span> : #if HAVE_POSIX_FADVISE
<span class="lineNum"> 114 </span><span class="lineCov"> 771210 : if ((mode &amp; MODE_SEQUENTIAL) != 0) {</span>
<span class="lineNum"> 114 </span><span class="lineCov"> 771290 : if ((mode &amp; MODE_SEQUENTIAL) != 0) {</span>
<span class="lineNum"> 115 </span> : /* advise sequential access */
<span class="lineNum"> 116 </span><span class="lineCov"> 771210 : ret = posix_fadvise(handle-&gt;f, 0, 0, POSIX_FADV_SEQUENTIAL);</span>
<span class="lineNum"> 117 </span><span class="lineCov"> 771210 : if (ret != 0) {</span>
<span class="lineNum"> 116 </span><span class="lineCov"> 771290 : ret = posix_fadvise(handle-&gt;f, 0, 0, POSIX_FADV_SEQUENTIAL);</span>
<span class="lineNum"> 117 </span><span class="lineCov"> 771290 : if (ret != 0) {</span>
<span class="lineNum"> 118 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 119 </span> : log_fatal(&quot;Error advising file '%s'. %s.\n&quot;, handle-&gt;path, strerror(ret));
<span class="lineNum"> 120 </span> : return -1;
@ -185,15 +185,15 @@
<span class="lineNum"> 123 </span> : }
<span class="lineNum"> 124 </span> : #endif
<span class="lineNum"> 125 </span> :
<span class="lineNum"> 126 </span><span class="lineCov"> 771210 : return 0;</span>
<span class="lineNum"> 126 </span><span class="lineCov"> 771290 : return 0;</span>
<a name="127"><span class="lineNum"> 127 </span> : }</a>
<span class="lineNum"> 128 </span> :
<span class="lineNum"> 129 </span><span class="lineCov"> 3249 : int handle_truncate(struct snapraid_handle* handle, struct snapraid_file* file)</span>
<span class="lineNum"> 129 </span><span class="lineCov"> 3187 : int handle_truncate(struct snapraid_handle* handle, struct snapraid_file* file)</span>
<span class="lineNum"> 130 </span> : {
<span class="lineNum"> 131 </span> : int ret;
<span class="lineNum"> 132 </span> :
<span class="lineNum"> 133 </span><span class="lineCov"> 3249 : ret = ftruncate(handle-&gt;f, file-&gt;size);</span>
<span class="lineNum"> 134 </span><span class="lineCov"> 3249 : if (ret != 0) {</span>
<span class="lineNum"> 133 </span><span class="lineCov"> 3187 : ret = ftruncate(handle-&gt;f, file-&gt;size);</span>
<span class="lineNum"> 134 </span><span class="lineCov"> 3187 : if (ret != 0) {</span>
<span class="lineNum"> 135 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 136 </span> : if (errno == EACCES) {
<span class="lineNum"> 137 </span> : log_fatal(&quot;Failed to truncate file '%s' for missing write permission.\n&quot;, handle-&gt;path);
@ -205,58 +205,58 @@
<span class="lineNum"> 143 </span> : }
<span class="lineNum"> 144 </span> :
<span class="lineNum"> 145 </span> : /* adjust the size to the truncated size */
<span class="lineNum"> 146 </span><span class="lineCov"> 3249 : handle-&gt;valid_size = file-&gt;size;</span>
<span class="lineNum"> 146 </span><span class="lineCov"> 3187 : handle-&gt;valid_size = file-&gt;size;</span>
<span class="lineNum"> 147 </span> :
<span class="lineNum"> 148 </span><span class="lineCov"> 3249 : return 0;</span>
<span class="lineNum"> 148 </span><span class="lineCov"> 3187 : return 0;</span>
<a name="149"><span class="lineNum"> 149 </span> : }</a>
<span class="lineNum"> 150 </span> :
<span class="lineNum"> 151 </span><span class="lineCov"> 1972488 : int handle_open(struct snapraid_handle* handle, struct snapraid_file* file, int mode, fptr* out, fptr* out_missing)</span>
<span class="lineNum"> 151 </span><span class="lineCov"> 2024387 : int handle_open(struct snapraid_handle* handle, struct snapraid_file* file, int mode, fptr* out, fptr* out_missing)</span>
<span class="lineNum"> 152 </span> : {
<span class="lineNum"> 153 </span> : int ret;
<span class="lineNum"> 154 </span> : int flags;
<span class="lineNum"> 155 </span> :
<span class="lineNum"> 156 </span><span class="lineCov"> 1972488 : if (!out_missing)</span>
<span class="lineNum"> 157 </span><span class="lineCov"> 1971972 : out_missing = out;</span>
<span class="lineNum"> 156 </span><span class="lineCov"> 2024387 : if (!out_missing)</span>
<span class="lineNum"> 157 </span><span class="lineCov"> 2023815 : out_missing = out;</span>
<span class="lineNum"> 158 </span> :
<span class="lineNum"> 159 </span> : /* if already opened, nothing to do */
<span class="lineNum"> 160 </span><span class="lineCov"> 1972488 : if (handle-&gt;file == file &amp;&amp; handle-&gt;f != -1) {</span>
<span class="lineNum"> 161 </span><span class="lineCov"> 332290 : return 0;</span>
<span class="lineNum"> 160 </span><span class="lineCov"> 2024387 : if (handle-&gt;file == file &amp;&amp; handle-&gt;f != -1) {</span>
<span class="lineNum"> 161 </span><span class="lineCov"> 363056 : return 0;</span>
<span class="lineNum"> 162 </span> : }
<span class="lineNum"> 163 </span> :
<span class="lineNum"> 164 </span><span class="lineCov"> 1640198 : pathprint(handle-&gt;path, sizeof(handle-&gt;path), &quot;%s%s&quot;, handle-&gt;disk-&gt;dir, file-&gt;sub);</span>
<span class="lineNum"> 164 </span><span class="lineCov"> 1661331 : pathprint(handle-&gt;path, sizeof(handle-&gt;path), &quot;%s%s&quot;, handle-&gt;disk-&gt;dir, file-&gt;sub);</span>
<span class="lineNum"> 165 </span> :
<span class="lineNum"> 166 </span> : /* for sure not created */
<span class="lineNum"> 167 </span><span class="lineCov"> 1640198 : handle-&gt;created = 0;</span>
<span class="lineNum"> 167 </span><span class="lineCov"> 1661331 : handle-&gt;created = 0;</span>
<span class="lineNum"> 168 </span> :
<span class="lineNum"> 169 </span> : /* flags for opening */
<span class="lineNum"> 170 </span> : /* O_BINARY: open as binary file (Windows only) */
<span class="lineNum"> 171 </span> : /* O_NOFOLLOW: do not follow links to ensure to open the real file */
<span class="lineNum"> 172 </span> : /* O_SEQUENTIAL: improve performance for sequential access (Windows only) */
<span class="lineNum"> 173 </span><span class="lineCov"> 1640198 : flags = O_BINARY | O_NOFOLLOW;</span>
<span class="lineNum"> 174 </span><span class="lineCov"> 1640198 : if ((mode &amp; MODE_SEQUENTIAL) != 0)</span>
<span class="lineNum"> 175 </span><span class="lineCov"> 1628870 : flags |= O_SEQUENTIAL;</span>
<span class="lineNum"> 173 </span><span class="lineCov"> 1661331 : flags = O_BINARY | O_NOFOLLOW;</span>
<span class="lineNum"> 174 </span><span class="lineCov"> 1661331 : if ((mode &amp; MODE_SEQUENTIAL) != 0)</span>
<span class="lineNum"> 175 </span><span class="lineCov"> 1649996 : flags |= O_SEQUENTIAL;</span>
<span class="lineNum"> 176 </span> :
<span class="lineNum"> 177 </span> : /* open for read */
<span class="lineNum"> 178 </span><span class="lineCov"> 1640198 : handle-&gt;f = open_noatime(handle-&gt;path, flags | O_RDONLY);</span>
<span class="lineNum"> 179 </span><span class="lineCov"> 1640198 : if (handle-&gt;f == -1) {</span>
<span class="lineNum"> 178 </span><span class="lineCov"> 1661331 : handle-&gt;f = open_noatime(handle-&gt;path, flags | O_RDONLY);</span>
<span class="lineNum"> 179 </span><span class="lineCov"> 1661331 : if (handle-&gt;f == -1) {</span>
<span class="lineNum"> 180 </span> : /* invalidate for error */
<span class="lineNum"> 181 </span><span class="lineCov"> 78777 : handle-&gt;file = 0;</span>
<span class="lineNum"> 182 </span><span class="lineCov"> 78777 : handle-&gt;f = -1;</span>
<span class="lineNum"> 183 </span><span class="lineCov"> 78777 : handle-&gt;valid_size = 0;</span>
<span class="lineNum"> 181 </span><span class="lineCov"> 78781 : handle-&gt;file = 0;</span>
<span class="lineNum"> 182 </span><span class="lineCov"> 78781 : handle-&gt;f = -1;</span>
<span class="lineNum"> 183 </span><span class="lineCov"> 78781 : handle-&gt;valid_size = 0;</span>
<span class="lineNum"> 184 </span> :
<span class="lineNum"> 185 </span><span class="lineCov"> 78777 : if (errno == ENOENT)</span>
<span class="lineNum"> 186 </span><span class="lineCov"> 78765 : out_missing(&quot;Missing file '%s'.\n&quot;, handle-&gt;path);</span>
<span class="lineNum"> 185 </span><span class="lineCov"> 78781 : if (errno == ENOENT)</span>
<span class="lineNum"> 186 </span><span class="lineCov"> 78769 : out_missing(&quot;Missing file '%s'.\n&quot;, handle-&gt;path);</span>
<span class="lineNum"> 187 </span> : else
<span class="lineNum"> 188 </span><span class="lineCov"> 12 : out(&quot;Error opening file '%s'. %s.\n&quot;, handle-&gt;path, strerror(errno));</span>
<span class="lineNum"> 189 </span><span class="lineCov"> 78777 : return -1;</span>
<span class="lineNum"> 189 </span><span class="lineCov"> 78781 : return -1;</span>
<span class="lineNum"> 190 </span> : }
<span class="lineNum"> 191 </span> :
<span class="lineNum"> 192 </span> : /* just opened */
<span class="lineNum"> 193 </span><span class="lineCov"> 1561421 : handle-&gt;file = file;</span>
<span class="lineNum"> 193 </span><span class="lineCov"> 1582550 : handle-&gt;file = file;</span>
<span class="lineNum"> 194 </span> :
<span class="lineNum"> 195 </span> : /* get the stat info */
<span class="lineNum"> 196 </span><span class="lineCov"> 1561421 : ret = fstat(handle-&gt;f, &amp;handle-&gt;st);</span>
<span class="lineNum"> 197 </span><span class="lineCov"> 1561421 : if (ret != 0) {</span>
<span class="lineNum"> 196 </span><span class="lineCov"> 1582550 : ret = fstat(handle-&gt;f, &amp;handle-&gt;st);</span>
<span class="lineNum"> 197 </span><span class="lineCov"> 1582550 : if (ret != 0) {</span>
<span class="lineNum"> 198 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 199 </span> : out(&quot;Error accessing file '%s'. %s.\n&quot;, handle-&gt;path, strerror(errno));
<span class="lineNum"> 200 </span> : return -1;
@ -264,13 +264,13 @@
<span class="lineNum"> 202 </span> : }
<span class="lineNum"> 203 </span> :
<span class="lineNum"> 204 </span> : /* get the size of the existing data */
<span class="lineNum"> 205 </span><span class="lineCov"> 1561421 : handle-&gt;valid_size = handle-&gt;st.st_size;</span>
<span class="lineNum"> 205 </span><span class="lineCov"> 1582550 : handle-&gt;valid_size = handle-&gt;st.st_size;</span>
<span class="lineNum"> 206 </span> :
<span class="lineNum"> 207 </span> : #if HAVE_POSIX_FADVISE
<span class="lineNum"> 208 </span><span class="lineCov"> 1561421 : if ((mode &amp; MODE_SEQUENTIAL) != 0) {</span>
<span class="lineNum"> 208 </span><span class="lineCov"> 1582550 : if ((mode &amp; MODE_SEQUENTIAL) != 0) {</span>
<span class="lineNum"> 209 </span> : /* advise sequential access */
<span class="lineNum"> 210 </span><span class="lineCov"> 1550093 : ret = posix_fadvise(handle-&gt;f, 0, 0, POSIX_FADV_SEQUENTIAL);</span>
<span class="lineNum"> 211 </span><span class="lineCov"> 1550093 : if (ret != 0) {</span>
<span class="lineNum"> 210 </span><span class="lineCov"> 1571215 : ret = posix_fadvise(handle-&gt;f, 0, 0, POSIX_FADV_SEQUENTIAL);</span>
<span class="lineNum"> 211 </span><span class="lineCov"> 1571215 : if (ret != 0) {</span>
<span class="lineNum"> 212 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 213 </span> : out(&quot;Error advising file '%s'. %s.\n&quot;, handle-&gt;path, strerror(ret));
<span class="lineNum"> 214 </span> : return -1;
@ -279,17 +279,17 @@
<span class="lineNum"> 217 </span> : }
<span class="lineNum"> 218 </span> : #endif
<span class="lineNum"> 219 </span> :
<span class="lineNum"> 220 </span><span class="lineCov"> 1561421 : return 0;</span>
<span class="lineNum"> 220 </span><span class="lineCov"> 1582550 : return 0;</span>
<a name="221"><span class="lineNum"> 221 </span> : }</a>
<span class="lineNum"> 222 </span> :
<span class="lineNum"> 223 </span><span class="lineCov"> 4568631 : int handle_close(struct snapraid_handle* handle)</span>
<span class="lineNum"> 223 </span><span class="lineCov"> 4590919 : int handle_close(struct snapraid_handle* handle)</span>
<span class="lineNum"> 224 </span> : {
<span class="lineNum"> 225 </span> : int ret;
<span class="lineNum"> 226 </span> :
<span class="lineNum"> 227 </span> : /* close if open */
<span class="lineNum"> 228 </span><span class="lineCov"> 4568631 : if (handle-&gt;f != -1) {</span>
<span class="lineNum"> 229 </span><span class="lineCov"> 2332631 : ret = close(handle-&gt;f);</span>
<span class="lineNum"> 230 </span><span class="lineCov"> 2332631 : if (ret != 0) {</span>
<span class="lineNum"> 228 </span><span class="lineCov"> 4590919 : if (handle-&gt;f != -1) {</span>
<span class="lineNum"> 229 </span><span class="lineCov"> 2353840 : ret = close(handle-&gt;f);</span>
<span class="lineNum"> 230 </span><span class="lineCov"> 2353840 : if (ret != 0) {</span>
<span class="lineNum"> 231 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 232 </span> : log_fatal(&quot;Error closing file '%s'. %s.\n&quot;, handle-&gt;file-&gt;sub, strerror(errno));
<span class="lineNum"> 233 </span> :
@ -303,36 +303,36 @@
<span class="lineNum"> 241 </span> : }
<span class="lineNum"> 242 </span> :
<span class="lineNum"> 243 </span> : /* reset the descriptor */
<span class="lineNum"> 244 </span><span class="lineCov"> 4568631 : handle-&gt;file = 0;</span>
<span class="lineNum"> 245 </span><span class="lineCov"> 4568631 : handle-&gt;f = -1;</span>
<span class="lineNum"> 246 </span><span class="lineCov"> 4568631 : handle-&gt;valid_size = 0;</span>
<span class="lineNum"> 244 </span><span class="lineCov"> 4590919 : handle-&gt;file = 0;</span>
<span class="lineNum"> 245 </span><span class="lineCov"> 4590919 : handle-&gt;f = -1;</span>
<span class="lineNum"> 246 </span><span class="lineCov"> 4590919 : handle-&gt;valid_size = 0;</span>
<span class="lineNum"> 247 </span> :
<span class="lineNum"> 248 </span><span class="lineCov"> 4568631 : return 0;</span>
<span class="lineNum"> 248 </span><span class="lineCov"> 4590919 : return 0;</span>
<a name="249"><span class="lineNum"> 249 </span> : }</a>
<span class="lineNum"> 250 </span> :
<span class="lineNum"> 251 </span><span class="lineCov"> 5656394 : int handle_read(struct snapraid_handle* handle, block_off_t file_pos, unsigned char* block_buffer, unsigned block_size, fptr* out, fptr* out_missing)</span>
<span class="lineNum"> 251 </span><span class="lineCov"> 5713632 : int handle_read(struct snapraid_handle* handle, block_off_t file_pos, unsigned char* block_buffer, unsigned block_size, fptr* out, fptr* out_missing)</span>
<span class="lineNum"> 252 </span> : {
<span class="lineNum"> 253 </span> : ssize_t read_ret;
<span class="lineNum"> 254 </span> : data_off_t offset;
<span class="lineNum"> 255 </span> : unsigned read_size;
<span class="lineNum"> 256 </span> : unsigned count;
<span class="lineNum"> 257 </span> :
<span class="lineNum"> 258 </span><span class="lineCov"> 5656394 : offset = file_pos * (data_off_t)block_size;</span>
<span class="lineNum"> 258 </span><span class="lineCov"> 5713632 : offset = file_pos * (data_off_t)block_size;</span>
<span class="lineNum"> 259 </span> :
<span class="lineNum"> 260 </span><span class="lineCov"> 5656394 : if (!out_missing)</span>
<span class="lineNum"> 261 </span><span class="lineCov"> 5642993 : out_missing = out;</span>
<span class="lineNum"> 260 </span><span class="lineCov"> 5713632 : if (!out_missing)</span>
<span class="lineNum"> 261 </span><span class="lineCov"> 5700398 : out_missing = out;</span>
<span class="lineNum"> 262 </span> :
<span class="lineNum"> 263 </span> : /* check if we are going to read only not initialized data */
<span class="lineNum"> 264 </span><span class="lineCov"> 5656394 : if (offset &gt;= handle-&gt;valid_size) {</span>
<span class="lineNum"> 264 </span><span class="lineCov"> 5713632 : if (offset &gt;= handle-&gt;valid_size) {</span>
<span class="lineNum"> 265 </span> : /* if the file is missing, it's at 0 size, or it's rebuilt while reading */
<span class="lineNum"> 266 </span><span class="lineCov"> 433131 : if (offset == handle-&gt;valid_size || handle-&gt;valid_size == 0)</span>
<span class="lineNum"> 267 </span><span class="lineCov"> 431906 : out_missing(&quot;Reading data from missing file '%s' at offset %&quot; PRIu64 &quot;.\n&quot;, handle-&gt;path, offset);</span>
<span class="lineNum"> 266 </span><span class="lineCov"> 433671 : if (offset == handle-&gt;valid_size || handle-&gt;valid_size == 0)</span>
<span class="lineNum"> 267 </span><span class="lineCov"> 432378 : out_missing(&quot;Reading data from missing file '%s' at offset %&quot; PRIu64 &quot;.\n&quot;, handle-&gt;path, offset);</span>
<span class="lineNum"> 268 </span> : else
<span class="lineNum"> 269 </span><span class="lineCov"> 1225 : out(&quot;Reading missing data from file '%s' at offset %&quot; PRIu64 &quot;.\n&quot;, handle-&gt;path, offset);</span>
<span class="lineNum"> 270 </span><span class="lineCov"> 433131 : return -1;</span>
<span class="lineNum"> 269 </span><span class="lineCov"> 1293 : out(&quot;Reading missing data from file '%s' at offset %&quot; PRIu64 &quot;.\n&quot;, handle-&gt;path, offset);</span>
<span class="lineNum"> 270 </span><span class="lineCov"> 433671 : return -1;</span>
<span class="lineNum"> 271 </span> : }
<span class="lineNum"> 272 </span> :
<span class="lineNum"> 273 </span><span class="lineCov"> 5223263 : read_size = file_block_size(handle-&gt;file, file_pos, block_size);</span>
<span class="lineNum"> 273 </span><span class="lineCov"> 5279961 : read_size = file_block_size(handle-&gt;file, file_pos, block_size);</span>
<span class="lineNum"> 274 </span> :
<span class="lineNum"> 275 </span> : #if !HAVE_PREAD
<span class="lineNum"> 276 </span> : if (lseek(handle-&gt;f, offset, SEEK_SET) != offset) {
@ -343,32 +343,32 @@
<span class="lineNum"> 281 </span> : }
<span class="lineNum"> 282 </span> : #endif
<span class="lineNum"> 283 </span> :
<span class="lineNum"> 284 </span><span class="lineCov"> 5223263 : count = 0;</span>
<span class="lineNum"> 284 </span><span class="lineCov"> 5279961 : count = 0;</span>
<span class="lineNum"> 285 </span> : do {
<span class="lineNum"> 286 </span> :
<span class="lineNum"> 287 </span> : #if HAVE_PREAD
<span class="lineNum"> 288 </span><span class="lineCov"> 5232157 : read_ret = pread(handle-&gt;f, block_buffer + count, read_size - count, offset + count);</span>
<span class="lineNum"> 288 </span><span class="lineCov"> 5288816 : read_ret = pread(handle-&gt;f, block_buffer + count, read_size - count, offset + count);</span>
<span class="lineNum"> 289 </span> : #else
<span class="lineNum"> 290 </span> : read_ret = read(handle-&gt;f, block_buffer + count, read_size - count);
<span class="lineNum"> 291 </span> : #endif
<span class="lineNum"> 292 </span> :
<span class="lineNum"> 293 </span><span class="lineCov"> 5232157 : if (read_ret &lt; 0) {</span>
<span class="lineNum"> 293 </span><span class="lineCov"> 5288816 : if (read_ret &lt; 0) {</span>
<span class="lineNum"> 294 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 295 </span> : out(&quot;Error reading file '%s' at offset %&quot; PRIu64 &quot; for size %u. %s.\n&quot;, handle-&gt;path, offset + count, read_size - count, strerror(errno));
<span class="lineNum"> 296 </span> : return -1;
<span class="lineNum"> 297 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 298 </span> : }
<span class="lineNum"> 299 </span><span class="lineCov"> 5232157 : if (read_ret == 0) {</span>
<span class="lineNum"> 300 </span><span class="lineCov"> 8894 : out(&quot;Unexpected end of file '%s' at offset %&quot; PRIu64 &quot;. %s.\n&quot;, handle-&gt;path, offset, strerror(errno));</span>
<span class="lineNum"> 301 </span><span class="lineCov"> 8894 : return -1;</span>
<span class="lineNum"> 299 </span><span class="lineCov"> 5288816 : if (read_ret == 0) {</span>
<span class="lineNum"> 300 </span><span class="lineCov"> 8855 : out(&quot;Unexpected end of file '%s' at offset %&quot; PRIu64 &quot;. %s.\n&quot;, handle-&gt;path, offset, strerror(errno));</span>
<span class="lineNum"> 301 </span><span class="lineCov"> 8855 : return -1;</span>
<span class="lineNum"> 302 </span> : }
<span class="lineNum"> 303 </span> :
<span class="lineNum"> 304 </span><span class="lineCov"> 5223263 : count += read_ret;</span>
<span class="lineNum"> 305 </span><span class="lineCov"> 5223263 : } while (count &lt; read_size);</span>
<span class="lineNum"> 304 </span><span class="lineCov"> 5279961 : count += read_ret;</span>
<span class="lineNum"> 305 </span><span class="lineCov"> 5279961 : } while (count &lt; read_size);</span>
<span class="lineNum"> 306 </span> :
<span class="lineNum"> 307 </span> : /* pad with 0 */
<span class="lineNum"> 308 </span><span class="lineCov"> 5214369 : if (read_size &lt; block_size) {</span>
<span class="lineNum"> 309 </span><span class="lineCov"> 2112031 : memset(block_buffer + read_size, 0, block_size - read_size);</span>
<span class="lineNum"> 308 </span><span class="lineCov"> 5271106 : if (read_size &lt; block_size) {</span>
<span class="lineNum"> 309 </span><span class="lineCov"> 2132322 : memset(block_buffer + read_size, 0, block_size - read_size);</span>
<span class="lineNum"> 310 </span> : }
<span class="lineNum"> 311 </span> :
<span class="lineNum"> 312 </span> : /* Here isn't needed to call posix_fadvise(..., POSIX_FADV_DONTNEED) */
@ -382,21 +382,21 @@
<span class="lineNum"> 320 </span> : /* at: https://lkml.org/lkml/2010/12/6/122 */
<span class="lineNum"> 321 </span> : /* We relay only on the automatic readahead triggered by POSIX_FADV_SEQUENTIAL. */
<span class="lineNum"> 322 </span> :
<span class="lineNum"> 323 </span><span class="lineCov"> 5214369 : return read_size;</span>
<span class="lineNum"> 323 </span><span class="lineCov"> 5271106 : return read_size;</span>
<a name="324"><span class="lineNum"> 324 </span> : }</a>
<span class="lineNum"> 325 </span> :
<span class="lineNum"> 326 </span><span class="lineCov"> 288205 : int handle_write(struct snapraid_handle* handle, block_off_t file_pos, unsigned char* block_buffer, unsigned block_size)</span>
<span class="lineNum"> 326 </span><span class="lineCov"> 288532 : int handle_write(struct snapraid_handle* handle, block_off_t file_pos, unsigned char* block_buffer, unsigned block_size)</span>
<span class="lineNum"> 327 </span> : {
<span class="lineNum"> 328 </span> : ssize_t write_ret;
<span class="lineNum"> 329 </span> : data_off_t offset;
<span class="lineNum"> 330 </span> : unsigned write_size;
<span class="lineNum"> 331 </span> :
<span class="lineNum"> 332 </span><span class="lineCov"> 288205 : offset = file_pos * (data_off_t)block_size;</span>
<span class="lineNum"> 332 </span><span class="lineCov"> 288532 : offset = file_pos * (data_off_t)block_size;</span>
<span class="lineNum"> 333 </span> :
<span class="lineNum"> 334 </span><span class="lineCov"> 288205 : write_size = file_block_size(handle-&gt;file, file_pos, block_size);</span>
<span class="lineNum"> 334 </span><span class="lineCov"> 288532 : write_size = file_block_size(handle-&gt;file, file_pos, block_size);</span>
<span class="lineNum"> 335 </span> :
<span class="lineNum"> 336 </span> : #if HAVE_PWRITE
<span class="lineNum"> 337 </span><span class="lineCov"> 288205 : write_ret = pwrite(handle-&gt;f, block_buffer, write_size, offset);</span>
<span class="lineNum"> 337 </span><span class="lineCov"> 288532 : write_ret = pwrite(handle-&gt;f, block_buffer, write_size, offset);</span>
<span class="lineNum"> 338 </span> : #else
<span class="lineNum"> 339 </span> : if (lseek(handle-&gt;f, offset, SEEK_SET) != offset) {
<span class="lineNum"> 340 </span> : /* LCOV_EXCL_START */
@ -407,7 +407,7 @@
<span class="lineNum"> 345 </span> :
<span class="lineNum"> 346 </span> : write_ret = write(handle-&gt;f, block_buffer, write_size);
<span class="lineNum"> 347 </span> : #endif
<span class="lineNum"> 348 </span><span class="lineCov"> 288205 : if (write_ret != (ssize_t)write_size) { /* conversion is safe because block_size is always small */</span>
<span class="lineNum"> 348 </span><span class="lineCov"> 288532 : if (write_ret != (ssize_t)write_size) { /* conversion is safe because block_size is always small */</span>
<span class="lineNum"> 349 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 350 </span> : log_fatal(&quot;Error writing file '%s'. %s.\n&quot;, handle-&gt;path, strerror(errno));
<span class="lineNum"> 351 </span> : return -1;
@ -415,88 +415,89 @@
<span class="lineNum"> 353 </span> : }
<span class="lineNum"> 354 </span> :
<span class="lineNum"> 355 </span> : /* adjust the size of the valid data */
<span class="lineNum"> 356 </span><span class="lineCov"> 288205 : if (handle-&gt;valid_size &lt; offset + write_size) {</span>
<span class="lineNum"> 357 </span><span class="lineCov"> 282174 : handle-&gt;valid_size = offset + write_size;</span>
<span class="lineNum"> 356 </span><span class="lineCov"> 288532 : if (handle-&gt;valid_size &lt; offset + write_size) {</span>
<span class="lineNum"> 357 </span><span class="lineCov"> 282422 : handle-&gt;valid_size = offset + write_size;</span>
<span class="lineNum"> 358 </span> : }
<span class="lineNum"> 359 </span> :
<span class="lineNum"> 360 </span> : /* Here doesn't make sense to call posix_fadvise(..., POSIX_FADV_DONTNEED) because */
<span class="lineNum"> 361 </span> : /* at this time the data is still not yet written and it cannot be discharged. */
<span class="lineNum"> 362 </span> :
<span class="lineNum"> 363 </span><span class="lineCov"> 288205 : return 0;</span>
<span class="lineNum"> 363 </span><span class="lineCov"> 288532 : return 0;</span>
<a name="364"><span class="lineNum"> 364 </span> : }</a>
<span class="lineNum"> 365 </span> :
<span class="lineNum"> 366 </span><span class="lineCov"> 117763 : int handle_utime(struct snapraid_handle* handle)</span>
<span class="lineNum"> 366 </span><span class="lineCov"> 119455 : int handle_utime(struct snapraid_handle* handle)</span>
<span class="lineNum"> 367 </span> : {
<span class="lineNum"> 368 </span> : int ret;
<span class="lineNum"> 369 </span> :
<span class="lineNum"> 370 </span> : /* do nothing if not opened */
<span class="lineNum"> 371 </span><span class="lineCov"> 117763 : if (handle-&gt;f == -1)</span>
<span class="lineNum"> 371 </span><span class="lineCov"> 119455 : if (handle-&gt;f == -1)</span>
<span class="lineNum"> 372 </span><span class="lineNoCov"> 0 : return 0;</span>
<span class="lineNum"> 373 </span> :
<span class="lineNum"> 374 </span><span class="lineCov"> 117763 : ret = fmtime(handle-&gt;f, handle-&gt;file-&gt;mtime_sec, handle-&gt;file-&gt;mtime_nsec);</span>
<span class="lineNum"> 374 </span><span class="lineCov"> 119455 : ret = fmtime(handle-&gt;f, handle-&gt;file-&gt;mtime_sec, handle-&gt;file-&gt;mtime_nsec);</span>
<span class="lineNum"> 375 </span> :
<span class="lineNum"> 376 </span><span class="lineCov"> 117763 : if (ret != 0) {</span>
<span class="lineNum"> 376 </span><span class="lineCov"> 119455 : if (ret != 0) {</span>
<span class="lineNum"> 377 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 378 </span> : log_fatal(&quot;Error timing file '%s'. %s.\n&quot;, handle-&gt;file-&gt;sub, strerror(errno));
<span class="lineNum"> 379 </span> : return -1;
<span class="lineNum"> 380 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 381 </span> : }
<span class="lineNum"> 382 </span> :
<span class="lineNum"> 383 </span><span class="lineCov"> 117763 : return 0;</span>
<span class="lineNum"> 383 </span><span class="lineCov"> 119455 : return 0;</span>
<a name="384"><span class="lineNum"> 384 </span> : }</a>
<span class="lineNum"> 385 </span> :
<span class="lineNum"> 386 </span><span class="lineCov"> 206 : struct snapraid_handle* handle_map(struct snapraid_state* state, unsigned* handlemax)</span>
<span class="lineNum"> 386 </span><span class="lineCov"> 214 : struct snapraid_handle* handle_map(struct snapraid_state* state, unsigned* handlemax)</span>
<span class="lineNum"> 387 </span> : {
<span class="lineNum"> 388 </span> : tommy_node* i;
<span class="lineNum"> 389 </span> : unsigned j;
<span class="lineNum"> 390 </span><span class="lineCov"> 206 : unsigned size = 0;</span>
<span class="lineNum"> 390 </span><span class="lineCov"> 214 : unsigned size = 0;</span>
<span class="lineNum"> 391 </span> : struct snapraid_handle* handle;
<span class="lineNum"> 392 </span> :
<span class="lineNum"> 393 </span> : /* get the size of the mapping */
<span class="lineNum"> 394 </span><span class="lineCov"> 206 : size = 0;</span>
<span class="lineNum"> 395 </span><span class="lineCov"> 1437 : for (i = state-&gt;maplist; i != 0; i = i-&gt;next) {</span>
<span class="lineNum"> 396 </span><span class="lineCov"> 1231 : struct snapraid_map* map = i-&gt;data;</span>
<span class="lineNum"> 397 </span><span class="lineCov"> 1231 : if (map-&gt;position &gt; size)</span>
<span class="lineNum"> 398 </span><span class="lineCov"> 895 : size = map-&gt;position;</span>
<span class="lineNum"> 394 </span><span class="lineCov"> 214 : size = 0;</span>
<span class="lineNum"> 395 </span><span class="lineCov"> 1493 : for (i = state-&gt;maplist; i != 0; i = i-&gt;next) {</span>
<span class="lineNum"> 396 </span><span class="lineCov"> 1279 : struct snapraid_map* map = i-&gt;data;</span>
<span class="lineNum"> 397 </span><span class="lineCov"> 1279 : if (map-&gt;position &gt; size)</span>
<span class="lineNum"> 398 </span><span class="lineCov"> 925 : size = map-&gt;position;</span>
<span class="lineNum"> 399 </span> : }
<span class="lineNum"> 400 </span><span class="lineCov"> 206 : ++size; /* size is one more than the max */</span>
<span class="lineNum"> 400 </span><span class="lineCov"> 214 : ++size; /* size is one more than the max */</span>
<span class="lineNum"> 401 </span> :
<span class="lineNum"> 402 </span><span class="lineCov"> 206 : handle = malloc_nofail(size * sizeof(struct snapraid_handle));</span>
<span class="lineNum"> 402 </span><span class="lineCov"> 214 : handle = malloc_nofail(size * sizeof(struct snapraid_handle));</span>
<span class="lineNum"> 403 </span> :
<span class="lineNum"> 404 </span><span class="lineCov"> 1442 : for (j = 0; j &lt; size; ++j) {</span>
<span class="lineNum"> 404 </span><span class="lineCov"> 1498 : for (j = 0; j &lt; size; ++j) {</span>
<span class="lineNum"> 405 </span> : /* default for empty position */
<span class="lineNum"> 406 </span><span class="lineCov"> 1236 : handle[j].disk = 0;</span>
<span class="lineNum"> 407 </span><span class="lineCov"> 1236 : handle[j].file = 0;</span>
<span class="lineNum"> 408 </span><span class="lineCov"> 1236 : handle[j].f = -1;</span>
<span class="lineNum"> 409 </span><span class="lineCov"> 1236 : handle[j].valid_size = 0;</span>
<span class="lineNum"> 406 </span><span class="lineCov"> 1284 : handle[j].disk = 0;</span>
<span class="lineNum"> 407 </span><span class="lineCov"> 1284 : handle[j].file = 0;</span>
<span class="lineNum"> 408 </span><span class="lineCov"> 1284 : handle[j].f = -1;</span>
<span class="lineNum"> 409 </span><span class="lineCov"> 1284 : handle[j].valid_size = 0;</span>
<span class="lineNum"> 410 </span> : }
<span class="lineNum"> 411 </span> :
<span class="lineNum"> 412 </span> : /* set the vector */
<span class="lineNum"> 413 </span><span class="lineCov"> 1437 : for (i = state-&gt;disklist; i != 0; i = i-&gt;next) {</span>
<span class="lineNum"> 413 </span><span class="lineCov"> 1493 : for (i = state-&gt;disklist; i != 0; i = i-&gt;next) {</span>
<span class="lineNum"> 414 </span> : struct snapraid_map* map;
<span class="lineNum"> 415 </span><span class="lineCov"> 1231 : struct snapraid_disk* disk = i-&gt;data;</span>
<span class="lineNum"> 415 </span><span class="lineCov"> 1279 : struct snapraid_disk* disk = i-&gt;data;</span>
<span class="lineNum"> 416 </span> : tommy_node* k;
<span class="lineNum"> 417 </span> :
<span class="lineNum"> 418 </span> : /* search the mapping for this disk */
<span class="lineNum"> 419 </span><span class="lineCov"> 4296 : for (k = state-&gt;maplist; k != 0; k = k-&gt;next) {</span>
<span class="lineNum"> 420 </span><span class="lineCov"> 4296 : map = k-&gt;data;</span>
<span class="lineNum"> 421 </span><span class="lineCov"> 4296 : if (strcmp(disk-&gt;name, map-&gt;name) == 0)</span>
<span class="lineNum"> 422 </span><span class="lineCov"> 1231 : break;</span>
<span class="lineNum"> 423 </span> : }
<span class="lineNum"> 424 </span><span class="lineCov"> 1231 : if (k == 0) {</span>
<span class="lineNum"> 425 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 426 </span> : log_fatal(&quot;Internal error for inconsistent disk mapping.\n&quot;);
<span class="lineNum"> 427 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 428 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 429 </span> : }
<span class="lineNum"> 430 </span> :
<span class="lineNum"> 431 </span><span class="lineCov"> 1231 : handle[map-&gt;position].disk = disk;</span>
<span class="lineNum"> 432 </span> : }
<span class="lineNum"> 433 </span> :
<span class="lineNum"> 434 </span><span class="lineCov"> 206 : *handlemax = size;</span>
<span class="lineNum"> 435 </span><span class="lineCov"> 206 : return handle;</span>
<span class="lineNum"> 436 </span> : }
<span class="lineNum"> 437 </span> :
<span class="lineNum"> 419 </span><span class="lineCov"> 1279 : map = 0;</span>
<span class="lineNum"> 420 </span><span class="lineCov"> 4464 : for (k = state-&gt;maplist; k != 0; k = k-&gt;next) {</span>
<span class="lineNum"> 421 </span><span class="lineCov"> 4464 : map = k-&gt;data;</span>
<span class="lineNum"> 422 </span><span class="lineCov"> 4464 : if (strcmp(disk-&gt;name, map-&gt;name) == 0)</span>
<span class="lineNum"> 423 </span><span class="lineCov"> 1279 : break;</span>
<span class="lineNum"> 424 </span> : }
<span class="lineNum"> 425 </span><span class="lineCov"> 1279 : if (!map) {</span>
<span class="lineNum"> 426 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 427 </span> : log_fatal(&quot;Internal error for inconsistent disk mapping.\n&quot;);
<span class="lineNum"> 428 </span> : os_abort();
<span class="lineNum"> 429 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 430 </span> : }
<span class="lineNum"> 431 </span> :
<span class="lineNum"> 432 </span><span class="lineCov"> 1279 : handle[map-&gt;position].disk = disk;</span>
<span class="lineNum"> 433 </span> : }
<span class="lineNum"> 434 </span> :
<span class="lineNum"> 435 </span><span class="lineCov"> 214 : *handlemax = size;</span>
<span class="lineNum"> 436 </span><span class="lineCov"> 214 : return handle;</span>
<span class="lineNum"> 437 </span> : }
<span class="lineNum"> 438 </span> :
</pre>
</td>
</tr>

View file

@ -31,18 +31,18 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">103</td>
<td class="headerCovTableEntry">95</td>
<td class="headerCovTableEntry">105</td>
<td class="headerCovTableEntryHi">98.1 %</td>
<td class="headerCovTableEntryHi">90.5 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">7</td>
<td class="headerCovTableEntry">8</td>
<td class="headerCovTableEntry">8</td>
<td class="headerCovTableEntryHi">100.0 %</td>
<td class="headerCovTableEntryMed">87.5 %</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
@ -61,36 +61,36 @@
</tr>
<tr>
<td class="coverFn"><a href="import.c.gcov.html#47">import_block_hash</a></td>
<td class="coverFnHi">652942</td>
<td class="coverFnHi">657660</td>
</tr>
<tr>
<td class="coverFn"><a href="import.c.gcov.html#150">state_import_fetch</a></td>
<td class="coverFnHi">643998</td>
</tr>
<tr>
<td class="coverFn"><a href="import.c.gcov.html#35">import_block_prevhash_compare</a></td>
<td class="coverFnHi">2238</td>
<td class="coverFn"><a href="import.c.gcov.html#151">state_import_fetch</a></td>
<td class="coverFnHi">653188</td>
</tr>
<tr>
<td class="coverFn"><a href="import.c.gcov.html#27">import_block_hash_compare</a></td>
<td class="coverFnHi">2234</td>
<td class="coverFnHi">4472</td>
</tr>
<tr>
<td class="coverFn"><a href="import.c.gcov.html#52">import_file</a></td>
<td class="coverFn"><a href="import.c.gcov.html#53">import_file</a></td>
<td class="coverFnHi">1750</td>
</tr>
<tr>
<td class="coverFn"><a href="import.c.gcov.html#143">import_file_free</a></td>
<td class="coverFn"><a href="import.c.gcov.html#144">import_file_free</a></td>
<td class="coverFnHi">1750</td>
</tr>
<tr>
<td class="coverFn"><a href="import.c.gcov.html#311">state_import</a></td>
<td class="coverFn"><a href="import.c.gcov.html#312">state_import</a></td>
<td class="coverFnHi">1</td>
</tr>
<tr>
<td class="coverFn"><a href="import.c.gcov.html#230">import_dir</a></td>
<td class="coverFn"><a href="import.c.gcov.html#231">import_dir</a></td>
<td class="coverFnHi">1</td>
</tr>
<tr>
<td class="coverFn"><a href="import.c.gcov.html#35">import_block_prevhash_compare</a></td>
<td class="coverFnLo">0</td>
</tr>
</table>
<br>
</center>

View file

@ -31,18 +31,18 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">103</td>
<td class="headerCovTableEntry">95</td>
<td class="headerCovTableEntry">105</td>
<td class="headerCovTableEntryHi">98.1 %</td>
<td class="headerCovTableEntryHi">90.5 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">7</td>
<td class="headerCovTableEntry">8</td>
<td class="headerCovTableEntry">8</td>
<td class="headerCovTableEntryHi">100.0 %</td>
<td class="headerCovTableEntryMed">87.5 %</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
@ -61,35 +61,35 @@
</tr>
<tr>
<td class="coverFn"><a href="import.c.gcov.html#47">import_block_hash</a></td>
<td class="coverFnHi">652942</td>
<td class="coverFnHi">657660</td>
</tr>
<tr>
<td class="coverFn"><a href="import.c.gcov.html#27">import_block_hash_compare</a></td>
<td class="coverFnHi">2234</td>
<td class="coverFnHi">4472</td>
</tr>
<tr>
<td class="coverFn"><a href="import.c.gcov.html#35">import_block_prevhash_compare</a></td>
<td class="coverFnHi">2238</td>
<td class="coverFnLo">0</td>
</tr>
<tr>
<td class="coverFn"><a href="import.c.gcov.html#230">import_dir</a></td>
<td class="coverFn"><a href="import.c.gcov.html#231">import_dir</a></td>
<td class="coverFnHi">1</td>
</tr>
<tr>
<td class="coverFn"><a href="import.c.gcov.html#52">import_file</a></td>
<td class="coverFn"><a href="import.c.gcov.html#53">import_file</a></td>
<td class="coverFnHi">1750</td>
</tr>
<tr>
<td class="coverFn"><a href="import.c.gcov.html#143">import_file_free</a></td>
<td class="coverFn"><a href="import.c.gcov.html#144">import_file_free</a></td>
<td class="coverFnHi">1750</td>
</tr>
<tr>
<td class="coverFn"><a href="import.c.gcov.html#311">state_import</a></td>
<td class="coverFn"><a href="import.c.gcov.html#312">state_import</a></td>
<td class="coverFnHi">1</td>
</tr>
<tr>
<td class="coverFn"><a href="import.c.gcov.html#150">state_import_fetch</a></td>
<td class="coverFnHi">643998</td>
<td class="coverFn"><a href="import.c.gcov.html#151">state_import_fetch</a></td>
<td class="coverFnHi">653188</td>
</tr>
</table>
<br>

View file

@ -31,18 +31,18 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">103</td>
<td class="headerCovTableEntry">95</td>
<td class="headerCovTableEntry">105</td>
<td class="headerCovTableEntryHi">98.1 %</td>
<td class="headerCovTableEntryHi">90.5 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">7</td>
<td class="headerCovTableEntry">8</td>
<td class="headerCovTableEntry">8</td>
<td class="headerCovTableEntryHi">100.0 %</td>
<td class="headerCovTableEntryMed">87.5 %</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
@ -88,303 +88,304 @@
<span class="lineNum"> 26 </span> : /**
<a name="27"><span class="lineNum"> 27 </span> : * Compare the hash of two import blocks.</a>
<span class="lineNum"> 28 </span> : */
<span class="lineNum"> 29 </span><span class="lineCov"> 2234 : int import_block_hash_compare(const void* void_arg, const void* void_data)</span>
<span class="lineNum"> 29 </span><span class="lineCov"> 4472 : int import_block_hash_compare(const void* void_arg, const void* void_data)</span>
<span class="lineNum"> 30 </span> : {
<span class="lineNum"> 31 </span><span class="lineCov"> 2234 : const unsigned char* arg = void_arg;</span>
<span class="lineNum"> 32 </span><span class="lineCov"> 2234 : const struct snapraid_import_block* block = void_data;</span>
<span class="lineNum"> 31 </span><span class="lineCov"> 4472 : const unsigned char* arg = void_arg;</span>
<span class="lineNum"> 32 </span><span class="lineCov"> 4472 : const struct snapraid_import_block* block = void_data;</span>
<span class="lineNum"> 33 </span> :
<span class="lineNum"> 34 </span><span class="lineCov"> 2234 : return memcmp(arg, block-&gt;hash, HASH_SIZE);</span>
<span class="lineNum"> 34 </span><span class="lineCov"> 4472 : return memcmp(arg, block-&gt;hash, HASH_SIZE);</span>
<a name="35"><span class="lineNum"> 35 </span> : }</a>
<span class="lineNum"> 36 </span> :
<span class="lineNum"> 37 </span><span class="lineCov"> 2238 : int import_block_prevhash_compare(const void* void_arg, const void* void_data)</span>
<span class="lineNum"> 37 </span><span class="lineNoCov"> 0 : int import_block_prevhash_compare(const void* void_arg, const void* void_data)</span>
<span class="lineNum"> 38 </span> : {
<span class="lineNum"> 39 </span><span class="lineCov"> 2238 : const unsigned char* arg = void_arg;</span>
<span class="lineNum"> 40 </span><span class="lineCov"> 2238 : const struct snapraid_import_block* block = void_data;</span>
<span class="lineNum"> 39 </span><span class="lineNoCov"> 0 : const unsigned char* arg = void_arg;</span>
<span class="lineNum"> 40 </span><span class="lineNoCov"> 0 : const struct snapraid_import_block* block = void_data;</span>
<span class="lineNum"> 41 </span> :
<span class="lineNum"> 42 </span><span class="lineCov"> 2238 : return memcmp(arg, block-&gt;prevhash, HASH_SIZE);</span>
<span class="lineNum"> 42 </span><span class="lineNoCov"> 0 : return memcmp(arg, block-&gt;prevhash, HASH_SIZE);</span>
<span class="lineNum"> 43 </span> : }
<span class="lineNum"> 44 </span> :
<span class="lineNum"> 45 </span> : /**
<span class="lineNum"> 46 </span> : * Compute the hash of the hash for an import block.
<a name="47"><span class="lineNum"> 47 </span> : * We just use the first 32 bit of the hash itself.</a>
<span class="lineNum"> 48 </span> : */
<span class="lineNum"> 49 </span><span class="lineCov"> 652942 : static inline tommy_uint32_t import_block_hash(const unsigned char* hash)</span>
<span class="lineNum"> 49 </span><span class="lineCov"> 657660 : static inline tommy_uint32_t import_block_hash(const unsigned char* hash)</span>
<span class="lineNum"> 50 </span> : {
<span class="lineNum"> 51 </span><span class="lineCov"> 652942 : return *(const tommy_uint32_t*)hash;</span>
<a name="52"><span class="lineNum"> 52 </span> : }</a>
<span class="lineNum"> 53 </span> :
<span class="lineNum"> 54 </span><span class="lineCov"> 1750 : static void import_file(struct snapraid_state* state, const char* path, uint64_t size)</span>
<span class="lineNum"> 55 </span> : {
<span class="lineNum"> 56 </span> : struct snapraid_import_file* file;
<span class="lineNum"> 57 </span> : block_off_t i;
<span class="lineNum"> 58 </span> : data_off_t offset;
<span class="lineNum"> 59 </span> : void* buffer;
<span class="lineNum"> 60 </span> : int ret;
<span class="lineNum"> 61 </span> : int f;
<span class="lineNum"> 62 </span> : int flags;
<span class="lineNum"> 63 </span><span class="lineCov"> 1750 : unsigned block_size = state-&gt;block_size;</span>
<span class="lineNum"> 64 </span> :
<span class="lineNum"> 65 </span><span class="lineCov"> 1750 : file = malloc_nofail(sizeof(struct snapraid_import_file));</span>
<span class="lineNum"> 66 </span><span class="lineCov"> 1750 : file-&gt;path = strdup_nofail(path);</span>
<span class="lineNum"> 67 </span><span class="lineCov"> 1750 : file-&gt;size = size;</span>
<span class="lineNum"> 68 </span><span class="lineCov"> 1750 : file-&gt;blockmax = (size + block_size - 1) / block_size;</span>
<span class="lineNum"> 69 </span><span class="lineCov"> 1750 : file-&gt;blockimp = malloc_nofail(file-&gt;blockmax * sizeof(struct snapraid_import_block));</span>
<span class="lineNum"> 70 </span> :
<span class="lineNum"> 71 </span><span class="lineCov"> 1750 : buffer = malloc_nofail(block_size);</span>
<span class="lineNum"> 72 </span> :
<span class="lineNum"> 73 </span> : /* open for read */
<span class="lineNum"> 74 </span> : /* O_SEQUENTIAL: opening in sequential mode in Windows */
<span class="lineNum"> 75 </span><span class="lineCov"> 1750 : flags = O_RDONLY | O_BINARY;</span>
<span class="lineNum"> 76 </span><span class="lineCov"> 1750 : if ((state-&gt;file_mode &amp; MODE_SEQUENTIAL) != 0)</span>
<span class="lineNum"> 77 </span><span class="lineCov"> 1750 : flags |= O_SEQUENTIAL;</span>
<span class="lineNum"> 78 </span><span class="lineCov"> 1750 : f = open(path, flags);</span>
<span class="lineNum"> 79 </span><span class="lineCov"> 1750 : if (f == -1) {</span>
<span class="lineNum"> 80 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 81 </span> : log_fatal(&quot;Error opening file '%s'. %s.\n&quot;, path, strerror(errno));
<span class="lineNum"> 82 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 83 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 84 </span> : }
<span class="lineNum"> 85 </span> :
<span class="lineNum"> 86 </span> : #if HAVE_POSIX_FADVISE
<span class="lineNum"> 87 </span><span class="lineCov"> 1750 : if ((state-&gt;file_mode &amp; MODE_SEQUENTIAL) != 0) {</span>
<span class="lineNum"> 88 </span> : /* advise sequential access */
<span class="lineNum"> 89 </span><span class="lineCov"> 1750 : ret = posix_fadvise(f, 0, 0, POSIX_FADV_SEQUENTIAL);</span>
<span class="lineNum"> 90 </span><span class="lineCov"> 1750 : if (ret != 0) {</span>
<span class="lineNum"> 91 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 92 </span> : log_fatal(&quot;Error advising file '%s'. %s.\n&quot;, path, strerror(ret));
<span class="lineNum"> 93 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 94 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 95 </span> : }
<span class="lineNum"> 96 </span> : }
<span class="lineNum"> 97 </span> : #endif
<span class="lineNum"> 98 </span> :
<span class="lineNum"> 99 </span><span class="lineCov"> 1750 : offset = 0;</span>
<span class="lineNum"> 100 </span><span class="lineCov"> 6222 : for (i = 0; i &lt; file-&gt;blockmax; ++i) {</span>
<span class="lineNum"> 101 </span><span class="lineCov"> 4472 : struct snapraid_import_block* block = &amp;file-&gt;blockimp[i];</span>
<span class="lineNum"> 102 </span><span class="lineCov"> 4472 : unsigned read_size = block_size;</span>
<span class="lineNum"> 103 </span><span class="lineCov"> 4472 : if (read_size &gt; size)</span>
<span class="lineNum"> 104 </span><span class="lineCov"> 1745 : read_size = size;</span>
<span class="lineNum"> 105 </span> :
<span class="lineNum"> 106 </span><span class="lineCov"> 4472 : ret = read(f, buffer, read_size);</span>
<span class="lineNum"> 107 </span><span class="lineCov"> 4472 : if (ret &lt; 0 || (unsigned)ret != read_size) {</span>
<span class="lineNum"> 108 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 109 </span> : log_fatal(&quot;Error reading file '%s'. %s.\n&quot;, path, strerror(errno));
<span class="lineNum"> 110 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 111 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 112 </span> : }
<span class="lineNum"> 113 </span> :
<span class="lineNum"> 114 </span><span class="lineCov"> 4472 : block-&gt;file = file;</span>
<span class="lineNum"> 115 </span><span class="lineCov"> 4472 : block-&gt;offset = offset;</span>
<span class="lineNum"> 116 </span><span class="lineCov"> 4472 : block-&gt;size = read_size;</span>
<span class="lineNum"> 117 </span> :
<span class="lineNum"> 118 </span><span class="lineCov"> 4472 : memhash(state-&gt;hash, state-&gt;hashseed, block-&gt;hash, buffer, read_size);</span>
<span class="lineNum"> 119 </span><span class="lineCov"> 4472 : tommy_hashdyn_insert(&amp;state-&gt;importset, &amp;block-&gt;nodeset, block, import_block_hash(block-&gt;hash));</span>
<span class="lineNum"> 120 </span> :
<span class="lineNum"> 121 </span> : /* if we are in a rehash state */
<span class="lineNum"> 122 </span><span class="lineCov"> 4472 : if (state-&gt;prevhash != HASH_UNDEFINED) {</span>
<span class="lineNum"> 123 </span> : /* compute also the previous hash */
<span class="lineNum"> 124 </span><span class="lineCov"> 4472 : memhash(state-&gt;prevhash, state-&gt;prevhashseed, block-&gt;prevhash, buffer, read_size);</span>
<span class="lineNum"> 125 </span><span class="lineCov"> 4472 : tommy_hashdyn_insert(&amp;state-&gt;previmportset, &amp;block-&gt;prevnodeset, block, import_block_hash(block-&gt;prevhash));</span>
<span class="lineNum"> 126 </span> : }
<span class="lineNum"> 127 </span> :
<span class="lineNum"> 128 </span><span class="lineCov"> 4472 : offset += read_size;</span>
<span class="lineNum"> 129 </span><span class="lineCov"> 4472 : size -= read_size;</span>
<span class="lineNum"> 130 </span> : }
<span class="lineNum"> 131 </span> :
<span class="lineNum"> 132 </span><span class="lineCov"> 1750 : ret = close(f);</span>
<span class="lineNum"> 133 </span><span class="lineCov"> 1750 : if (ret != 0) {</span>
<span class="lineNum"> 134 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 135 </span> : log_fatal(&quot;Error closing file '%s'. %s.\n&quot;, path, strerror(errno));
<span class="lineNum"> 136 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 137 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 138 </span> : }
<span class="lineNum"> 139 </span> :
<span class="lineNum"> 140 </span><span class="lineCov"> 1750 : tommy_list_insert_tail(&amp;state-&gt;importlist, &amp;file-&gt;nodelist, file);</span>
<span class="lineNum"> 141 </span> :
<span class="lineNum"> 142 </span><span class="lineCov"> 1750 : free(buffer);</span>
<a name="143"><span class="lineNum"> 143 </span><span class="lineCov"> 1750 : }</span></a>
<span class="lineNum"> 144 </span> :
<span class="lineNum"> 145 </span><span class="lineCov"> 1750 : void import_file_free(struct snapraid_import_file* file)</span>
<span class="lineNum"> 146 </span> : {
<span class="lineNum"> 147 </span><span class="lineCov"> 1750 : free(file-&gt;path);</span>
<span class="lineNum"> 148 </span><span class="lineCov"> 1750 : free(file-&gt;blockimp);</span>
<span class="lineNum"> 149 </span><span class="lineCov"> 1750 : free(file);</span>
<a name="150"><span class="lineNum"> 150 </span><span class="lineCov"> 1750 : }</span></a>
<span class="lineNum"> 151 </span> :
<span class="lineNum"> 152 </span><span class="lineCov"> 643998 : int state_import_fetch(struct snapraid_state* state, int rehash, struct snapraid_block* missing_block, unsigned char* buffer)</span>
<span class="lineNum"> 153 </span> : {
<span class="lineNum"> 154 </span> : struct snapraid_import_block* block;
<span class="lineNum"> 155 </span> : int ret;
<span class="lineNum"> 156 </span> : int f;
<span class="lineNum"> 157 </span><span class="lineCov"> 643998 : const unsigned char* hash = missing_block-&gt;hash;</span>
<span class="lineNum"> 158 </span><span class="lineCov"> 643998 : unsigned block_size = state-&gt;block_size;</span>
<span class="lineNum"> 159 </span> : unsigned read_size;
<span class="lineNum"> 160 </span> : unsigned char buffer_hash[HASH_SIZE];
<span class="lineNum"> 161 </span> : const char* path;
<span class="lineNum"> 162 </span> :
<span class="lineNum"> 163 </span><span class="lineCov"> 643998 : if (rehash) {</span>
<span class="lineNum"> 164 </span><span class="lineCov"> 28986 : block = tommy_hashdyn_search(&amp;state-&gt;previmportset, import_block_prevhash_compare, hash, import_block_hash(hash));</span>
<span class="lineNum"> 165 </span> : } else {
<span class="lineNum"> 166 </span><span class="lineCov"> 615012 : block = tommy_hashdyn_search(&amp;state-&gt;importset, import_block_hash_compare, hash, import_block_hash(hash));</span>
<span class="lineNum"> 167 </span> : }
<span class="lineNum"> 168 </span><span class="lineCov"> 643998 : if (!block)</span>
<span class="lineNum"> 169 </span><span class="lineCov"> 639526 : return -1;</span>
<span class="lineNum"> 170 </span> :
<span class="lineNum"> 171 </span><span class="lineCov"> 4472 : path = block-&gt;file-&gt;path;</span>
<span class="lineNum"> 172 </span><span class="lineCov"> 4472 : read_size = block-&gt;size;</span>
<span class="lineNum"> 173 </span> :
<span class="lineNum"> 174 </span><span class="lineCov"> 4472 : f = open(path, O_RDONLY | O_BINARY);</span>
<span class="lineNum"> 175 </span><span class="lineCov"> 4472 : if (f == -1) {</span>
<span class="lineNum"> 176 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 177 </span> : if (errno == ENOENT) {
<span class="lineNum"> 178 </span> : log_fatal(&quot;DANGER! file '%s' disappeared.\n&quot;, path);
<span class="lineNum"> 179 </span> : log_fatal(&quot;If you moved it, please rerun the same command.\n&quot;);
<span class="lineNum"> 180 </span> : } else {
<span class="lineNum"> 181 </span> : log_fatal(&quot;Error opening file '%s'. %s.\n&quot;, path, strerror(errno));
<span class="lineNum"> 182 </span> : }
<span class="lineNum"> 183 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 184 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 185 </span> : }
<span class="lineNum"> 186 </span> :
<span class="lineNum"> 187 </span><span class="lineCov"> 4472 : if (lseek(f, block-&gt;offset, SEEK_SET) != block-&gt;offset) {</span>
<span class="lineNum"> 188 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 189 </span> : log_fatal(&quot;Error seeking file '%s'. %s.\n&quot;, path, strerror(errno));
<span class="lineNum"> 190 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 191 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 192 </span> : }
<span class="lineNum"> 193 </span> :
<span class="lineNum"> 194 </span><span class="lineCov"> 4472 : ret = read(f, buffer, read_size);</span>
<span class="lineNum"> 195 </span><span class="lineCov"> 4472 : if (ret &lt; 0 || (unsigned)ret != read_size) {</span>
<span class="lineNum"> 196 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 197 </span> : log_fatal(&quot;Error reading file '%s'. %s.\n&quot;, path, strerror(errno));
<span class="lineNum"> 198 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 199 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 200 </span> : }
<span class="lineNum"> 201 </span> :
<span class="lineNum"> 202 </span><span class="lineCov"> 4472 : ret = close(f);</span>
<span class="lineNum"> 203 </span><span class="lineCov"> 4472 : if (ret != 0) {</span>
<span class="lineNum"> 204 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 205 </span> : log_fatal(&quot;Error closing file '%s'. %s.\n&quot;, path, strerror(errno));
<span class="lineNum"> 206 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 207 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 208 </span> : }
<span class="lineNum"> 209 </span> :
<span class="lineNum"> 210 </span><span class="lineCov"> 4472 : if (read_size != block_size) {</span>
<span class="lineNum"> 211 </span> : /* fill the remaining with 0 */
<span class="lineNum"> 212 </span><span class="lineCov"> 1745 : memset(buffer + read_size, 0, block_size - read_size);</span>
<span class="lineNum"> 213 </span> : }
<span class="lineNum"> 214 </span> :
<span class="lineNum"> 215 </span> : /* recheck the hash */
<span class="lineNum"> 216 </span><span class="lineCov"> 4472 : if (rehash)</span>
<span class="lineNum"> 217 </span><span class="lineCov"> 2238 : memhash(state-&gt;prevhash, state-&gt;prevhashseed, buffer_hash, buffer, read_size);</span>
<span class="lineNum"> 218 </span> : else
<span class="lineNum"> 219 </span><span class="lineCov"> 2234 : memhash(state-&gt;hash, state-&gt;hashseed, buffer_hash, buffer, read_size);</span>
<span class="lineNum"> 220 </span> :
<span class="lineNum"> 221 </span><span class="lineCov"> 4472 : if (memcmp(buffer_hash, hash, HASH_SIZE) != 0) {</span>
<span class="lineNum"> 222 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 223 </span> : log_fatal(&quot;Error in data reading file '%s'.\n&quot;, path);
<span class="lineNum"> 224 </span> : log_fatal(&quot;Please don't change imported files while running.\n&quot;);
<span class="lineNum"> 225 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 226 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 227 </span> : }
<span class="lineNum"> 228 </span> :
<span class="lineNum"> 229 </span><span class="lineCov"> 4472 : return 0;</span>
<a name="230"><span class="lineNum"> 230 </span> : }</a>
<span class="lineNum"> 231 </span> :
<span class="lineNum"> 232 </span><span class="lineCov"> 1 : static void import_dir(struct snapraid_state* state, const char* dir)</span>
<span class="lineNum"> 233 </span> : {
<span class="lineNum"> 234 </span> : DIR* d;
<span class="lineNum"> 235 </span> :
<span class="lineNum"> 236 </span><span class="lineCov"> 1 : d = opendir(dir);</span>
<span class="lineNum"> 237 </span><span class="lineCov"> 1 : if (!d) {</span>
<span class="lineNum"> 238 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 239 </span> : log_fatal(&quot;Error opening directory '%s'. %s.\n&quot;, dir, strerror(errno));
<span class="lineNum"> 240 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 241 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 242 </span> : }
<span class="lineNum"> 243 </span> :
<span class="lineNum"> 244 </span> : while (1) {
<span class="lineNum"> 245 </span> : char path_next[PATH_MAX];
<span class="lineNum"> 246 </span> : struct stat st;
<span class="lineNum"> 247 </span> : const char* name;
<span class="lineNum"> 248 </span> : struct dirent* dd;
<span class="lineNum"> 249 </span> :
<span class="lineNum"> 250 </span> : /* clear errno to detect erroneous conditions */
<span class="lineNum"> 251 </span><span class="lineCov"> 1812 : errno = 0;</span>
<span class="lineNum"> 252 </span><span class="lineCov"> 1812 : dd = readdir(d);</span>
<span class="lineNum"> 253 </span><span class="lineCov"> 1812 : if (dd == 0 &amp;&amp; errno != 0) {</span>
<span class="lineNum"> 254 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 255 </span> : log_fatal(&quot;Error reading directory '%s'. %s.\n&quot;, dir, strerror(errno));
<span class="lineNum"> 256 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 257 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 258 </span> : }
<span class="lineNum"> 259 </span><span class="lineCov"> 1812 : if (dd == 0) {</span>
<span class="lineNum"> 260 </span><span class="lineCov"> 1 : break; /* finished */</span>
<span class="lineNum"> 261 </span> : }
<span class="lineNum"> 262 </span> :
<span class="lineNum"> 263 </span> : /* skip &quot;.&quot; and &quot;..&quot; files */
<span class="lineNum"> 264 </span><span class="lineCov"> 1811 : name = dd-&gt;d_name;</span>
<span class="lineNum"> 265 </span><span class="lineCov"> 1811 : if (name[0] == '.' &amp;&amp; (name[1] == 0 || (name[1] == '.' &amp;&amp; name[2] == 0)))</span>
<span class="lineNum"> 266 </span><span class="lineCov"> 2 : continue;</span>
<span class="lineNum"> 267 </span> :
<span class="lineNum"> 268 </span><span class="lineCov"> 1809 : pathprint(path_next, sizeof(path_next), &quot;%s%s&quot;, dir, name);</span>
<span class="lineNum"> 269 </span> :
<span class="lineNum"> 270 </span> : #if HAVE_STRUCT_DIRENT_D_STAT
<span class="lineNum"> 271 </span> : /* convert dirent to lstat result */
<span class="lineNum"> 272 </span> : dirent_lstat(dd, &amp;st);
<span class="lineNum"> 273 </span> :
<span class="lineNum"> 274 </span> : /* if the st_mode field is missing, takes care to fill it using normal lstat() */
<span class="lineNum"> 275 </span> : /* at now this can happen only in Windows (with HAVE_STRUCT_DIRENT_D_STAT defined), */
<span class="lineNum"> 276 </span> : /* because we use a directory reading method that doesn't read info about ReparsePoint. */
<span class="lineNum"> 277 </span> : /* Note that here we cannot call here lstat_sync(), because we don't know what kind */
<span class="lineNum"> 278 </span> : /* of file is it, and lstat_sync() doesn't always work */
<span class="lineNum"> 279 </span> : if (st.st_mode == 0) {
<span class="lineNum"> 280 </span> : if (lstat(path_next, &amp;st) != 0) {
<span class="lineNum"> 281 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 282 </span> : log_fatal(&quot;Error in stat file/directory '%s'. %s.\n&quot;, path_next, strerror(errno));
<span class="lineNum"> 283 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 284 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 285 </span> : }
<span class="lineNum"> 286 </span> : }
<span class="lineNum"> 287 </span> : #else
<span class="lineNum"> 288 </span> : /* get lstat info about the file */
<span class="lineNum"> 289 </span><span class="lineCov"> 1809 : if (lstat(path_next, &amp;st) != 0) {</span>
<span class="lineNum"> 290 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 291 </span> : log_fatal(&quot;Error in stat file/directory '%s'. %s.\n&quot;, path_next, strerror(errno));
<span class="lineNum"> 292 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 293 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 294 </span> : }
<span class="lineNum"> 295 </span> : #endif
<span class="lineNum"> 296 </span> :
<span class="lineNum"> 297 </span><span class="lineCov"> 1809 : if (S_ISREG(st.st_mode)) {</span>
<span class="lineNum"> 298 </span><span class="lineCov"> 1750 : import_file(state, path_next, st.st_size);</span>
<span class="lineNum"> 299 </span><span class="lineCov"> 59 : } else if (S_ISDIR(st.st_mode)) {</span>
<span class="lineNum"> 300 </span><span class="lineNoCov"> 0 : pathslash(path_next, sizeof(path_next));</span>
<span class="lineNum"> 301 </span><span class="lineNoCov"> 0 : import_dir(state, path_next);</span>
<span class="lineNum"> 302 </span> : }
<span class="lineNum"> 303 </span><span class="lineCov"> 1811 : }</span>
<span class="lineNum"> 304 </span> :
<span class="lineNum"> 305 </span><span class="lineCov"> 1 : if (closedir(d) != 0) {</span>
<span class="lineNum"> 306 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 307 </span> : log_fatal(&quot;Error closing directory '%s'. %s.\n&quot;, dir, strerror(errno));
<span class="lineNum"> 308 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 309 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 310 </span> : }
<a name="311"><span class="lineNum"> 311 </span><span class="lineCov"> 1 : }</span></a>
<span class="lineNum"> 312 </span> :
<span class="lineNum"> 313 </span><span class="lineCov"> 1 : void state_import(struct snapraid_state* state, const char* dir)</span>
<span class="lineNum"> 314 </span> : {
<span class="lineNum"> 315 </span> : char path[PATH_MAX];
<span class="lineNum"> 316 </span> :
<span class="lineNum"> 317 </span><span class="lineCov"> 1 : msg_progress(&quot;Importing...\n&quot;);</span>
<span class="lineNum"> 318 </span> :
<span class="lineNum"> 319 </span> : /* add the final slash */
<span class="lineNum"> 320 </span><span class="lineCov"> 1 : pathimport(path, sizeof(path), dir);</span>
<span class="lineNum"> 321 </span><span class="lineCov"> 1 : pathslash(path, sizeof(path));</span>
<span class="lineNum"> 322 </span> :
<span class="lineNum"> 323 </span><span class="lineCov"> 1 : import_dir(state, path);</span>
<span class="lineNum"> 324 </span><span class="lineCov"> 1 : }</span>
<span class="lineNum"> 325 </span> :
<span class="lineNum"> 51 </span> : /* the hash data is not aligned, and we cannot access it with a direct cast */
<span class="lineNum"> 52 </span><span class="lineCov"> 657660 : return hash[0] | ((uint32_t)hash[1] &lt;&lt; 8) | ((uint32_t)hash[2] &lt;&lt; 16) | ((uint32_t)hash[3] &lt;&lt; 24);</span>
<a name="53"><span class="lineNum"> 53 </span> : }</a>
<span class="lineNum"> 54 </span> :
<span class="lineNum"> 55 </span><span class="lineCov"> 1750 : static void import_file(struct snapraid_state* state, const char* path, uint64_t size)</span>
<span class="lineNum"> 56 </span> : {
<span class="lineNum"> 57 </span> : struct snapraid_import_file* file;
<span class="lineNum"> 58 </span> : block_off_t i;
<span class="lineNum"> 59 </span> : data_off_t offset;
<span class="lineNum"> 60 </span> : void* buffer;
<span class="lineNum"> 61 </span> : int ret;
<span class="lineNum"> 62 </span> : int f;
<span class="lineNum"> 63 </span> : int flags;
<span class="lineNum"> 64 </span><span class="lineCov"> 1750 : unsigned block_size = state-&gt;block_size;</span>
<span class="lineNum"> 65 </span> :
<span class="lineNum"> 66 </span><span class="lineCov"> 1750 : file = malloc_nofail(sizeof(struct snapraid_import_file));</span>
<span class="lineNum"> 67 </span><span class="lineCov"> 1750 : file-&gt;path = strdup_nofail(path);</span>
<span class="lineNum"> 68 </span><span class="lineCov"> 1750 : file-&gt;size = size;</span>
<span class="lineNum"> 69 </span><span class="lineCov"> 1750 : file-&gt;blockmax = (size + block_size - 1) / block_size;</span>
<span class="lineNum"> 70 </span><span class="lineCov"> 1750 : file-&gt;blockimp = malloc_nofail(file-&gt;blockmax * sizeof(struct snapraid_import_block));</span>
<span class="lineNum"> 71 </span> :
<span class="lineNum"> 72 </span><span class="lineCov"> 1750 : buffer = malloc_nofail(block_size);</span>
<span class="lineNum"> 73 </span> :
<span class="lineNum"> 74 </span> : /* open for read */
<span class="lineNum"> 75 </span> : /* O_SEQUENTIAL: opening in sequential mode in Windows */
<span class="lineNum"> 76 </span><span class="lineCov"> 1750 : flags = O_RDONLY | O_BINARY;</span>
<span class="lineNum"> 77 </span><span class="lineCov"> 1750 : if ((state-&gt;file_mode &amp; MODE_SEQUENTIAL) != 0)</span>
<span class="lineNum"> 78 </span><span class="lineCov"> 1750 : flags |= O_SEQUENTIAL;</span>
<span class="lineNum"> 79 </span><span class="lineCov"> 1750 : f = open(path, flags);</span>
<span class="lineNum"> 80 </span><span class="lineCov"> 1750 : if (f == -1) {</span>
<span class="lineNum"> 81 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 82 </span> : log_fatal(&quot;Error opening file '%s'. %s.\n&quot;, path, strerror(errno));
<span class="lineNum"> 83 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 84 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 85 </span> : }
<span class="lineNum"> 86 </span> :
<span class="lineNum"> 87 </span> : #if HAVE_POSIX_FADVISE
<span class="lineNum"> 88 </span><span class="lineCov"> 1750 : if ((state-&gt;file_mode &amp; MODE_SEQUENTIAL) != 0) {</span>
<span class="lineNum"> 89 </span> : /* advise sequential access */
<span class="lineNum"> 90 </span><span class="lineCov"> 1750 : ret = posix_fadvise(f, 0, 0, POSIX_FADV_SEQUENTIAL);</span>
<span class="lineNum"> 91 </span><span class="lineCov"> 1750 : if (ret != 0) {</span>
<span class="lineNum"> 92 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 93 </span> : log_fatal(&quot;Error advising file '%s'. %s.\n&quot;, path, strerror(ret));
<span class="lineNum"> 94 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 95 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 96 </span> : }
<span class="lineNum"> 97 </span> : }
<span class="lineNum"> 98 </span> : #endif
<span class="lineNum"> 99 </span> :
<span class="lineNum"> 100 </span><span class="lineCov"> 1750 : offset = 0;</span>
<span class="lineNum"> 101 </span><span class="lineCov"> 6222 : for (i = 0; i &lt; file-&gt;blockmax; ++i) {</span>
<span class="lineNum"> 102 </span><span class="lineCov"> 4472 : struct snapraid_import_block* block = &amp;file-&gt;blockimp[i];</span>
<span class="lineNum"> 103 </span><span class="lineCov"> 4472 : unsigned read_size = block_size;</span>
<span class="lineNum"> 104 </span><span class="lineCov"> 4472 : if (read_size &gt; size)</span>
<span class="lineNum"> 105 </span><span class="lineCov"> 1745 : read_size = size;</span>
<span class="lineNum"> 106 </span> :
<span class="lineNum"> 107 </span><span class="lineCov"> 4472 : ret = read(f, buffer, read_size);</span>
<span class="lineNum"> 108 </span><span class="lineCov"> 4472 : if (ret &lt; 0 || (unsigned)ret != read_size) {</span>
<span class="lineNum"> 109 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 110 </span> : log_fatal(&quot;Error reading file '%s'. %s.\n&quot;, path, strerror(errno));
<span class="lineNum"> 111 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 112 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 113 </span> : }
<span class="lineNum"> 114 </span> :
<span class="lineNum"> 115 </span><span class="lineCov"> 4472 : block-&gt;file = file;</span>
<span class="lineNum"> 116 </span><span class="lineCov"> 4472 : block-&gt;offset = offset;</span>
<span class="lineNum"> 117 </span><span class="lineCov"> 4472 : block-&gt;size = read_size;</span>
<span class="lineNum"> 118 </span> :
<span class="lineNum"> 119 </span><span class="lineCov"> 4472 : memhash(state-&gt;hash, state-&gt;hashseed, block-&gt;hash, buffer, read_size);</span>
<span class="lineNum"> 120 </span><span class="lineCov"> 4472 : tommy_hashdyn_insert(&amp;state-&gt;importset, &amp;block-&gt;nodeset, block, import_block_hash(block-&gt;hash));</span>
<span class="lineNum"> 121 </span> :
<span class="lineNum"> 122 </span> : /* if we are in a rehash state */
<span class="lineNum"> 123 </span><span class="lineCov"> 4472 : if (state-&gt;prevhash != HASH_UNDEFINED) {</span>
<span class="lineNum"> 124 </span> : /* compute also the previous hash */
<span class="lineNum"> 125 </span><span class="lineNoCov"> 0 : memhash(state-&gt;prevhash, state-&gt;prevhashseed, block-&gt;prevhash, buffer, read_size);</span>
<span class="lineNum"> 126 </span><span class="lineNoCov"> 0 : tommy_hashdyn_insert(&amp;state-&gt;previmportset, &amp;block-&gt;prevnodeset, block, import_block_hash(block-&gt;prevhash));</span>
<span class="lineNum"> 127 </span> : }
<span class="lineNum"> 128 </span> :
<span class="lineNum"> 129 </span><span class="lineCov"> 4472 : offset += read_size;</span>
<span class="lineNum"> 130 </span><span class="lineCov"> 4472 : size -= read_size;</span>
<span class="lineNum"> 131 </span> : }
<span class="lineNum"> 132 </span> :
<span class="lineNum"> 133 </span><span class="lineCov"> 1750 : ret = close(f);</span>
<span class="lineNum"> 134 </span><span class="lineCov"> 1750 : if (ret != 0) {</span>
<span class="lineNum"> 135 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 136 </span> : log_fatal(&quot;Error closing file '%s'. %s.\n&quot;, path, strerror(errno));
<span class="lineNum"> 137 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 138 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 139 </span> : }
<span class="lineNum"> 140 </span> :
<span class="lineNum"> 141 </span><span class="lineCov"> 1750 : tommy_list_insert_tail(&amp;state-&gt;importlist, &amp;file-&gt;nodelist, file);</span>
<span class="lineNum"> 142 </span> :
<span class="lineNum"> 143 </span><span class="lineCov"> 1750 : free(buffer);</span>
<a name="144"><span class="lineNum"> 144 </span><span class="lineCov"> 1750 : }</span></a>
<span class="lineNum"> 145 </span> :
<span class="lineNum"> 146 </span><span class="lineCov"> 1750 : void import_file_free(struct snapraid_import_file* file)</span>
<span class="lineNum"> 147 </span> : {
<span class="lineNum"> 148 </span><span class="lineCov"> 1750 : free(file-&gt;path);</span>
<span class="lineNum"> 149 </span><span class="lineCov"> 1750 : free(file-&gt;blockimp);</span>
<span class="lineNum"> 150 </span><span class="lineCov"> 1750 : free(file);</span>
<a name="151"><span class="lineNum"> 151 </span><span class="lineCov"> 1750 : }</span></a>
<span class="lineNum"> 152 </span> :
<span class="lineNum"> 153 </span><span class="lineCov"> 653188 : int state_import_fetch(struct snapraid_state* state, int rehash, struct snapraid_block* missing_block, unsigned char* buffer)</span>
<span class="lineNum"> 154 </span> : {
<span class="lineNum"> 155 </span> : struct snapraid_import_block* block;
<span class="lineNum"> 156 </span> : int ret;
<span class="lineNum"> 157 </span> : int f;
<span class="lineNum"> 158 </span><span class="lineCov"> 653188 : const unsigned char* hash = missing_block-&gt;hash;</span>
<span class="lineNum"> 159 </span><span class="lineCov"> 653188 : unsigned block_size = state-&gt;block_size;</span>
<span class="lineNum"> 160 </span> : unsigned read_size;
<span class="lineNum"> 161 </span> : unsigned char buffer_hash[HASH_SIZE];
<span class="lineNum"> 162 </span> : const char* path;
<span class="lineNum"> 163 </span> :
<span class="lineNum"> 164 </span><span class="lineCov"> 653188 : if (rehash) {</span>
<span class="lineNum"> 165 </span><span class="lineNoCov"> 0 : block = tommy_hashdyn_search(&amp;state-&gt;previmportset, import_block_prevhash_compare, hash, import_block_hash(hash));</span>
<span class="lineNum"> 166 </span> : } else {
<span class="lineNum"> 167 </span><span class="lineCov"> 653188 : block = tommy_hashdyn_search(&amp;state-&gt;importset, import_block_hash_compare, hash, import_block_hash(hash));</span>
<span class="lineNum"> 168 </span> : }
<span class="lineNum"> 169 </span><span class="lineCov"> 653188 : if (!block)</span>
<span class="lineNum"> 170 </span><span class="lineCov"> 648716 : return -1;</span>
<span class="lineNum"> 171 </span> :
<span class="lineNum"> 172 </span><span class="lineCov"> 4472 : path = block-&gt;file-&gt;path;</span>
<span class="lineNum"> 173 </span><span class="lineCov"> 4472 : read_size = block-&gt;size;</span>
<span class="lineNum"> 174 </span> :
<span class="lineNum"> 175 </span><span class="lineCov"> 4472 : f = open(path, O_RDONLY | O_BINARY);</span>
<span class="lineNum"> 176 </span><span class="lineCov"> 4472 : if (f == -1) {</span>
<span class="lineNum"> 177 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 178 </span> : if (errno == ENOENT) {
<span class="lineNum"> 179 </span> : log_fatal(&quot;DANGER! file '%s' disappeared.\n&quot;, path);
<span class="lineNum"> 180 </span> : log_fatal(&quot;If you moved it, please rerun the same command.\n&quot;);
<span class="lineNum"> 181 </span> : } else {
<span class="lineNum"> 182 </span> : log_fatal(&quot;Error opening file '%s'. %s.\n&quot;, path, strerror(errno));
<span class="lineNum"> 183 </span> : }
<span class="lineNum"> 184 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 185 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 186 </span> : }
<span class="lineNum"> 187 </span> :
<span class="lineNum"> 188 </span><span class="lineCov"> 4472 : if (lseek(f, block-&gt;offset, SEEK_SET) != block-&gt;offset) {</span>
<span class="lineNum"> 189 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 190 </span> : log_fatal(&quot;Error seeking file '%s'. %s.\n&quot;, path, strerror(errno));
<span class="lineNum"> 191 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 192 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 193 </span> : }
<span class="lineNum"> 194 </span> :
<span class="lineNum"> 195 </span><span class="lineCov"> 4472 : ret = read(f, buffer, read_size);</span>
<span class="lineNum"> 196 </span><span class="lineCov"> 4472 : if (ret &lt; 0 || (unsigned)ret != read_size) {</span>
<span class="lineNum"> 197 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 198 </span> : log_fatal(&quot;Error reading file '%s'. %s.\n&quot;, path, strerror(errno));
<span class="lineNum"> 199 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 200 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 201 </span> : }
<span class="lineNum"> 202 </span> :
<span class="lineNum"> 203 </span><span class="lineCov"> 4472 : ret = close(f);</span>
<span class="lineNum"> 204 </span><span class="lineCov"> 4472 : if (ret != 0) {</span>
<span class="lineNum"> 205 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 206 </span> : log_fatal(&quot;Error closing file '%s'. %s.\n&quot;, path, strerror(errno));
<span class="lineNum"> 207 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 208 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 209 </span> : }
<span class="lineNum"> 210 </span> :
<span class="lineNum"> 211 </span><span class="lineCov"> 4472 : if (read_size != block_size) {</span>
<span class="lineNum"> 212 </span> : /* fill the remaining with 0 */
<span class="lineNum"> 213 </span><span class="lineCov"> 1745 : memset(buffer + read_size, 0, block_size - read_size);</span>
<span class="lineNum"> 214 </span> : }
<span class="lineNum"> 215 </span> :
<span class="lineNum"> 216 </span> : /* recheck the hash */
<span class="lineNum"> 217 </span><span class="lineCov"> 4472 : if (rehash)</span>
<span class="lineNum"> 218 </span><span class="lineNoCov"> 0 : memhash(state-&gt;prevhash, state-&gt;prevhashseed, buffer_hash, buffer, read_size);</span>
<span class="lineNum"> 219 </span> : else
<span class="lineNum"> 220 </span><span class="lineCov"> 4472 : memhash(state-&gt;hash, state-&gt;hashseed, buffer_hash, buffer, read_size);</span>
<span class="lineNum"> 221 </span> :
<span class="lineNum"> 222 </span><span class="lineCov"> 4472 : if (memcmp(buffer_hash, hash, HASH_SIZE) != 0) {</span>
<span class="lineNum"> 223 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 224 </span> : log_fatal(&quot;Error in data reading file '%s'.\n&quot;, path);
<span class="lineNum"> 225 </span> : log_fatal(&quot;Please don't change imported files while running.\n&quot;);
<span class="lineNum"> 226 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 227 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 228 </span> : }
<span class="lineNum"> 229 </span> :
<span class="lineNum"> 230 </span><span class="lineCov"> 4472 : return 0;</span>
<a name="231"><span class="lineNum"> 231 </span> : }</a>
<span class="lineNum"> 232 </span> :
<span class="lineNum"> 233 </span><span class="lineCov"> 1 : static void import_dir(struct snapraid_state* state, const char* dir)</span>
<span class="lineNum"> 234 </span> : {
<span class="lineNum"> 235 </span> : DIR* d;
<span class="lineNum"> 236 </span> :
<span class="lineNum"> 237 </span><span class="lineCov"> 1 : d = opendir(dir);</span>
<span class="lineNum"> 238 </span><span class="lineCov"> 1 : if (!d) {</span>
<span class="lineNum"> 239 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 240 </span> : log_fatal(&quot;Error opening directory '%s'. %s.\n&quot;, dir, strerror(errno));
<span class="lineNum"> 241 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 242 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 243 </span> : }
<span class="lineNum"> 244 </span> :
<span class="lineNum"> 245 </span> : while (1) {
<span class="lineNum"> 246 </span> : char path_next[PATH_MAX];
<span class="lineNum"> 247 </span> : struct stat st;
<span class="lineNum"> 248 </span> : const char* name;
<span class="lineNum"> 249 </span> : struct dirent* dd;
<span class="lineNum"> 250 </span> :
<span class="lineNum"> 251 </span> : /* clear errno to detect erroneous conditions */
<span class="lineNum"> 252 </span><span class="lineCov"> 1812 : errno = 0;</span>
<span class="lineNum"> 253 </span><span class="lineCov"> 1812 : dd = readdir(d);</span>
<span class="lineNum"> 254 </span><span class="lineCov"> 1812 : if (dd == 0 &amp;&amp; errno != 0) {</span>
<span class="lineNum"> 255 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 256 </span> : log_fatal(&quot;Error reading directory '%s'. %s.\n&quot;, dir, strerror(errno));
<span class="lineNum"> 257 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 258 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 259 </span> : }
<span class="lineNum"> 260 </span><span class="lineCov"> 1812 : if (dd == 0) {</span>
<span class="lineNum"> 261 </span><span class="lineCov"> 1 : break; /* finished */</span>
<span class="lineNum"> 262 </span> : }
<span class="lineNum"> 263 </span> :
<span class="lineNum"> 264 </span> : /* skip &quot;.&quot; and &quot;..&quot; files */
<span class="lineNum"> 265 </span><span class="lineCov"> 1811 : name = dd-&gt;d_name;</span>
<span class="lineNum"> 266 </span><span class="lineCov"> 1811 : if (name[0] == '.' &amp;&amp; (name[1] == 0 || (name[1] == '.' &amp;&amp; name[2] == 0)))</span>
<span class="lineNum"> 267 </span><span class="lineCov"> 2 : continue;</span>
<span class="lineNum"> 268 </span> :
<span class="lineNum"> 269 </span><span class="lineCov"> 1809 : pathprint(path_next, sizeof(path_next), &quot;%s%s&quot;, dir, name);</span>
<span class="lineNum"> 270 </span> :
<span class="lineNum"> 271 </span> : #if HAVE_STRUCT_DIRENT_D_STAT
<span class="lineNum"> 272 </span> : /* convert dirent to lstat result */
<span class="lineNum"> 273 </span> : dirent_lstat(dd, &amp;st);
<span class="lineNum"> 274 </span> :
<span class="lineNum"> 275 </span> : /* if the st_mode field is missing, takes care to fill it using normal lstat() */
<span class="lineNum"> 276 </span> : /* at now this can happen only in Windows (with HAVE_STRUCT_DIRENT_D_STAT defined), */
<span class="lineNum"> 277 </span> : /* because we use a directory reading method that doesn't read info about ReparsePoint. */
<span class="lineNum"> 278 </span> : /* Note that here we cannot call here lstat_sync(), because we don't know what kind */
<span class="lineNum"> 279 </span> : /* of file is it, and lstat_sync() doesn't always work */
<span class="lineNum"> 280 </span> : if (st.st_mode == 0) {
<span class="lineNum"> 281 </span> : if (lstat(path_next, &amp;st) != 0) {
<span class="lineNum"> 282 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 283 </span> : log_fatal(&quot;Error in stat file/directory '%s'. %s.\n&quot;, path_next, strerror(errno));
<span class="lineNum"> 284 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 285 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 286 </span> : }
<span class="lineNum"> 287 </span> : }
<span class="lineNum"> 288 </span> : #else
<span class="lineNum"> 289 </span> : /* get lstat info about the file */
<span class="lineNum"> 290 </span><span class="lineCov"> 1809 : if (lstat(path_next, &amp;st) != 0) {</span>
<span class="lineNum"> 291 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 292 </span> : log_fatal(&quot;Error in stat file/directory '%s'. %s.\n&quot;, path_next, strerror(errno));
<span class="lineNum"> 293 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 294 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 295 </span> : }
<span class="lineNum"> 296 </span> : #endif
<span class="lineNum"> 297 </span> :
<span class="lineNum"> 298 </span><span class="lineCov"> 1809 : if (S_ISREG(st.st_mode)) {</span>
<span class="lineNum"> 299 </span><span class="lineCov"> 1750 : import_file(state, path_next, st.st_size);</span>
<span class="lineNum"> 300 </span><span class="lineCov"> 59 : } else if (S_ISDIR(st.st_mode)) {</span>
<span class="lineNum"> 301 </span><span class="lineNoCov"> 0 : pathslash(path_next, sizeof(path_next));</span>
<span class="lineNum"> 302 </span><span class="lineNoCov"> 0 : import_dir(state, path_next);</span>
<span class="lineNum"> 303 </span> : }
<span class="lineNum"> 304 </span><span class="lineCov"> 1811 : }</span>
<span class="lineNum"> 305 </span> :
<span class="lineNum"> 306 </span><span class="lineCov"> 1 : if (closedir(d) != 0) {</span>
<span class="lineNum"> 307 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 308 </span> : log_fatal(&quot;Error closing directory '%s'. %s.\n&quot;, dir, strerror(errno));
<span class="lineNum"> 309 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 310 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 311 </span> : }
<a name="312"><span class="lineNum"> 312 </span><span class="lineCov"> 1 : }</span></a>
<span class="lineNum"> 313 </span> :
<span class="lineNum"> 314 </span><span class="lineCov"> 1 : void state_import(struct snapraid_state* state, const char* dir)</span>
<span class="lineNum"> 315 </span> : {
<span class="lineNum"> 316 </span> : char path[PATH_MAX];
<span class="lineNum"> 317 </span> :
<span class="lineNum"> 318 </span><span class="lineCov"> 1 : msg_progress(&quot;Importing...\n&quot;);</span>
<span class="lineNum"> 319 </span> :
<span class="lineNum"> 320 </span> : /* add the final slash */
<span class="lineNum"> 321 </span><span class="lineCov"> 1 : pathimport(path, sizeof(path), dir);</span>
<span class="lineNum"> 322 </span><span class="lineCov"> 1 : pathslash(path, sizeof(path));</span>
<span class="lineNum"> 323 </span> :
<span class="lineNum"> 324 </span><span class="lineCov"> 1 : import_dir(state, path);</span>
<span class="lineNum"> 325 </span><span class="lineCov"> 1 : }</span>
<span class="lineNum"> 326 </span> :
</pre>
</td>
</tr>

View file

@ -31,18 +31,18 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">7344</td>
<td class="headerCovTableEntry">8033</td>
<td class="headerCovTableEntryHi">91.4 %</td>
<td class="headerCovTableEntry">7401</td>
<td class="headerCovTableEntry">8084</td>
<td class="headerCovTableEntryHi">91.6 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">388</td>
<td class="headerCovTableEntry">397</td>
<td class="headerCovTableEntryHi">97.7 %</td>
<td class="headerCovTableEntry">390</td>
<td class="headerCovTableEntry">401</td>
<td class="headerCovTableEntryHi">97.3 %</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
@ -69,6 +69,16 @@
<td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
<td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
</tr>
<tr>
<td class="coverFile"><a href="import.c.gcov.html">import.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=90 height=10 alt="90.5%"><img src="../snow.png" width=10 height=10 alt="90.5%"></td></tr></table>
</td>
<td class="coverPerHi">90.5&nbsp;%</td>
<td class="coverNumHi">95 / 105</td>
<td class="coverPerMed">87.5&nbsp;%</td>
<td class="coverNumMed">7 / 8</td>
</tr>
<tr>
<td class="coverFile"><a href="parity.c.gcov.html">parity.c</a></td>
<td class="coverBar" align="center">
@ -92,22 +102,32 @@
<tr>
<td class="coverFile"><a href="unix.c.gcov.html">unix.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=79 height=10 alt="79.2%"><img src="../snow.png" width=21 height=10 alt="79.2%"></td></tr></table>
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=77 height=10 alt="76.8%"><img src="../snow.png" width=23 height=10 alt="76.8%"></td></tr></table>
</td>
<td class="coverPerMed">79.2&nbsp;%</td>
<td class="coverNumMed">229 / 289</td>
<td class="coverPerHi">91.3&nbsp;%</td>
<td class="coverNumHi">21 / 23</td>
<td class="coverPerMed">76.8&nbsp;%</td>
<td class="coverNumMed">255 / 332</td>
<td class="coverPerHi">92.0&nbsp;%</td>
<td class="coverNumHi">23 / 25</td>
</tr>
<tr>
<td class="coverFile"><a href="support.c.gcov.html">support.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=79 height=10 alt="79.2%"><img src="../snow.png" width=21 height=10 alt="79.2%"></td></tr></table>
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=80 height=10 alt="79.7%"><img src="../snow.png" width=20 height=10 alt="79.7%"></td></tr></table>
</td>
<td class="coverPerMed">79.2&nbsp;%</td>
<td class="coverNumMed">232 / 293</td>
<td class="coverPerHi">93.5&nbsp;%</td>
<td class="coverNumHi">29 / 31</td>
<td class="coverPerMed">79.7&nbsp;%</td>
<td class="coverNumMed">240 / 301</td>
<td class="coverPerHi">93.8&nbsp;%</td>
<td class="coverNumHi">30 / 32</td>
</tr>
<tr>
<td class="coverFile"><a href="stream.c.gcov.html">stream.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=92 height=10 alt="91.8%"><img src="../snow.png" width=8 height=10 alt="91.8%"></td></tr></table>
</td>
<td class="coverPerHi">91.8&nbsp;%</td>
<td class="coverNumHi">257 / 280</td>
<td class="coverPerHi">96.4&nbsp;%</td>
<td class="coverNumHi">27 / 28</td>
</tr>
<tr>
<td class="coverFile"><a href="elem.c.gcov.html">elem.c</a></td>
@ -115,19 +135,19 @@
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=94 height=10 alt="93.8%"><img src="../snow.png" width=6 height=10 alt="93.8%"></td></tr></table>
</td>
<td class="coverPerHi">93.8&nbsp;%</td>
<td class="coverNumHi">545 / 581</td>
<td class="coverNumHi">546 / 582</td>
<td class="coverPerHi">96.9&nbsp;%</td>
<td class="coverNumHi">62 / 64</td>
</tr>
<tr>
<td class="coverFile"><a href="state.c.gcov.html">state.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=92 height=10 alt="92.4%"><img src="../snow.png" width=8 height=10 alt="92.4%"></td></tr></table>
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=93 height=10 alt="92.6%"><img src="../snow.png" width=7 height=10 alt="92.6%"></td></tr></table>
</td>
<td class="coverPerHi">92.4&nbsp;%</td>
<td class="coverNumHi">1248 / 1351</td>
<td class="coverPerHi">97.2&nbsp;%</td>
<td class="coverNumHi">35 / 36</td>
<td class="coverPerHi">92.6&nbsp;%</td>
<td class="coverNumHi">1262 / 1363</td>
<td class="coverPerHi">97.3&nbsp;%</td>
<td class="coverNumHi">36 / 37</td>
</tr>
<tr>
<td class="coverFile"><a href="nano.c.gcov.html">nano.c</a></td>
@ -292,70 +312,60 @@
<tr>
<td class="coverFile"><a href="search.c.gcov.html">search.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=92 height=10 alt="92.0%"><img src="../snow.png" width=8 height=10 alt="92.0%"></td></tr></table>
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=91 height=10 alt="91.0%"><img src="../snow.png" width=9 height=10 alt="91.0%"></td></tr></table>
</td>
<td class="coverPerHi">92.0&nbsp;%</td>
<td class="coverNumHi">92 / 100</td>
<td class="coverPerHi">91.0&nbsp;%</td>
<td class="coverNumHi">91 / 100</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">7 / 7</td>
</tr>
<tr>
<td class="coverFile"><a href="import.c.gcov.html">import.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=98 height=10 alt="98.1%"><img src="../snow.png" width=2 height=10 alt="98.1%"></td></tr></table>
</td>
<td class="coverPerHi">98.1&nbsp;%</td>
<td class="coverNumHi">103 / 105</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">8 / 8</td>
</tr>
<tr>
<td class="coverFile"><a href="handle.c.gcov.html">handle.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=98 height=10 alt="97.7%"><img src="../snow.png" width=2 height=10 alt="97.7%"></td></tr></table>
</td>
<td class="coverPerHi">97.7&nbsp;%</td>
<td class="coverNumHi">125 / 128</td>
<td class="coverNumHi">126 / 129</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">8 / 8</td>
</tr>
<tr>
<td class="coverFile"><a href="selftest.c.gcov.html">selftest.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=84 height=10 alt="83.7%"><img src="../snow.png" width=16 height=10 alt="83.7%"></td></tr></table>
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
</td>
<td class="coverPerMed">83.7&nbsp;%</td>
<td class="coverNumMed">144 / 172</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">144 / 144</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">8 / 8</td>
</tr>
<tr>
<td class="coverFile"><a href="snapraid.c.gcov.html">snapraid.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=94 height=10 alt="94.1%"><img src="../snow.png" width=6 height=10 alt="94.1%"></td></tr></table>
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=94 height=10 alt="93.8%"><img src="../snow.png" width=6 height=10 alt="93.8%"></td></tr></table>
</td>
<td class="coverPerHi">94.1&nbsp;%</td>
<td class="coverNumHi">446 / 474</td>
<td class="coverPerHi">93.8&nbsp;%</td>
<td class="coverNumHi">454 / 484</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">8 / 8</td>
</tr>
<tr>
<td class="coverFile"><a href="check.c.gcov.html">check.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=91 height=10 alt="91.3%"><img src="../snow.png" width=9 height=10 alt="91.3%"></td></tr></table>
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=91 height=10 alt="91.2%"><img src="../snow.png" width=9 height=10 alt="91.2%"></td></tr></table>
</td>
<td class="coverPerHi">91.3&nbsp;%</td>
<td class="coverNumHi">713 / 781</td>
<td class="coverPerHi">91.2&nbsp;%</td>
<td class="coverNumHi">712 / 781</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">9 / 9</td>
</tr>
<tr>
<td class="coverFile"><a href="device.c.gcov.html">device.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=94 height=10 alt="94.3%"><img src="../snow.png" width=6 height=10 alt="94.3%"></td></tr></table>
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=94 height=10 alt="94.1%"><img src="../snow.png" width=6 height=10 alt="94.1%"></td></tr></table>
</td>
<td class="coverPerHi">94.3&nbsp;%</td>
<td class="coverNumHi">300 / 318</td>
<td class="coverPerHi">94.1&nbsp;%</td>
<td class="coverNumHi">301 / 320</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">11 / 11</td>
</tr>
@ -382,23 +392,13 @@
<tr>
<td class="coverFile"><a href="scan.c.gcov.html">scan.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=87 height=10 alt="87.4%"><img src="../snow.png" width=13 height=10 alt="87.4%"></td></tr></table>
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=89 height=10 alt="89.1%"><img src="../snow.png" width=11 height=10 alt="89.1%"></td></tr></table>
</td>
<td class="coverPerMed">87.4&nbsp;%</td>
<td class="coverNumMed">542 / 620</td>
<td class="coverPerMed">89.1&nbsp;%</td>
<td class="coverNumMed">554 / 622</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">23 / 23</td>
</tr>
<tr>
<td class="coverFile"><a href="stream.c.gcov.html">stream.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=93 height=10 alt="93.2%"><img src="../snow.png" width=7 height=10 alt="93.2%"></td></tr></table>
</td>
<td class="coverPerHi">93.2&nbsp;%</td>
<td class="coverNumHi">261 / 280</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">28 / 28</td>
</tr>
<tr>
<td class="coverFile"><a href="elem.h.gcov.html">elem.h</a></td>
<td class="coverBar" align="center">

View file

@ -31,18 +31,18 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">7344</td>
<td class="headerCovTableEntry">8033</td>
<td class="headerCovTableEntryHi">91.4 %</td>
<td class="headerCovTableEntry">7401</td>
<td class="headerCovTableEntry">8084</td>
<td class="headerCovTableEntryHi">91.6 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">388</td>
<td class="headerCovTableEntry">397</td>
<td class="headerCovTableEntryHi">97.7 %</td>
<td class="headerCovTableEntry">390</td>
<td class="headerCovTableEntry">401</td>
<td class="headerCovTableEntryHi">97.3 %</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
@ -70,14 +70,14 @@
<td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
</tr>
<tr>
<td class="coverFile"><a href="support.c.gcov.html">support.c</a></td>
<td class="coverFile"><a href="unix.c.gcov.html">unix.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=79 height=10 alt="79.2%"><img src="../snow.png" width=21 height=10 alt="79.2%"></td></tr></table>
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=77 height=10 alt="76.8%"><img src="../snow.png" width=23 height=10 alt="76.8%"></td></tr></table>
</td>
<td class="coverPerMed">79.2&nbsp;%</td>
<td class="coverNumMed">232 / 293</td>
<td class="coverPerHi">93.5&nbsp;%</td>
<td class="coverNumHi">29 / 31</td>
<td class="coverPerMed">76.8&nbsp;%</td>
<td class="coverNumMed">255 / 332</td>
<td class="coverPerHi">92.0&nbsp;%</td>
<td class="coverNumHi">23 / 25</td>
</tr>
<tr>
<td class="coverFile"><a href="parity.c.gcov.html">parity.c</a></td>
@ -89,16 +89,6 @@
<td class="coverPerHi">90.9&nbsp;%</td>
<td class="coverNumHi">10 / 11</td>
</tr>
<tr>
<td class="coverFile"><a href="unix.c.gcov.html">unix.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=79 height=10 alt="79.2%"><img src="../snow.png" width=21 height=10 alt="79.2%"></td></tr></table>
</td>
<td class="coverPerMed">79.2&nbsp;%</td>
<td class="coverNumMed">229 / 289</td>
<td class="coverPerHi">91.3&nbsp;%</td>
<td class="coverNumHi">21 / 23</td>
</tr>
<tr>
<td class="coverFile"><a href="scrub.c.gcov.html">scrub.c</a></td>
<td class="coverBar" align="center">
@ -110,14 +100,14 @@
<td class="coverNumHi">4 / 4</td>
</tr>
<tr>
<td class="coverFile"><a href="selftest.c.gcov.html">selftest.c</a></td>
<td class="coverFile"><a href="support.c.gcov.html">support.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=84 height=10 alt="83.7%"><img src="../snow.png" width=16 height=10 alt="83.7%"></td></tr></table>
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=80 height=10 alt="79.7%"><img src="../snow.png" width=20 height=10 alt="79.7%"></td></tr></table>
</td>
<td class="coverPerMed">83.7&nbsp;%</td>
<td class="coverNumMed">144 / 172</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">8 / 8</td>
<td class="coverPerMed">79.7&nbsp;%</td>
<td class="coverNumMed">240 / 301</td>
<td class="coverPerHi">93.8&nbsp;%</td>
<td class="coverNumHi">30 / 32</td>
</tr>
<tr>
<td class="coverFile"><a href="dry.c.gcov.html">dry.c</a></td>
@ -132,10 +122,10 @@
<tr>
<td class="coverFile"><a href="scan.c.gcov.html">scan.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=87 height=10 alt="87.4%"><img src="../snow.png" width=13 height=10 alt="87.4%"></td></tr></table>
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=89 height=10 alt="89.1%"><img src="../snow.png" width=11 height=10 alt="89.1%"></td></tr></table>
</td>
<td class="coverPerMed">87.4&nbsp;%</td>
<td class="coverNumMed">542 / 620</td>
<td class="coverPerMed">89.1&nbsp;%</td>
<td class="coverNumMed">554 / 622</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">23 / 23</td>
</tr>
@ -150,34 +140,54 @@
<td class="coverNumHi">10 / 11</td>
</tr>
<tr>
<td class="coverFile"><a href="check.c.gcov.html">check.c</a></td>
<td class="coverFile"><a href="import.c.gcov.html">import.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=91 height=10 alt="91.3%"><img src="../snow.png" width=9 height=10 alt="91.3%"></td></tr></table>
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=90 height=10 alt="90.5%"><img src="../snow.png" width=10 height=10 alt="90.5%"></td></tr></table>
</td>
<td class="coverPerHi">91.3&nbsp;%</td>
<td class="coverNumHi">713 / 781</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">9 / 9</td>
<td class="coverPerHi">90.5&nbsp;%</td>
<td class="coverNumHi">95 / 105</td>
<td class="coverPerMed">87.5&nbsp;%</td>
<td class="coverNumMed">7 / 8</td>
</tr>
<tr>
<td class="coverFile"><a href="search.c.gcov.html">search.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=92 height=10 alt="92.0%"><img src="../snow.png" width=8 height=10 alt="92.0%"></td></tr></table>
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=91 height=10 alt="91.0%"><img src="../snow.png" width=9 height=10 alt="91.0%"></td></tr></table>
</td>
<td class="coverPerHi">92.0&nbsp;%</td>
<td class="coverNumHi">92 / 100</td>
<td class="coverPerHi">91.0&nbsp;%</td>
<td class="coverNumHi">91 / 100</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">7 / 7</td>
</tr>
<tr>
<td class="coverFile"><a href="check.c.gcov.html">check.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=91 height=10 alt="91.2%"><img src="../snow.png" width=9 height=10 alt="91.2%"></td></tr></table>
</td>
<td class="coverPerHi">91.2&nbsp;%</td>
<td class="coverNumHi">712 / 781</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">9 / 9</td>
</tr>
<tr>
<td class="coverFile"><a href="stream.c.gcov.html">stream.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=92 height=10 alt="91.8%"><img src="../snow.png" width=8 height=10 alt="91.8%"></td></tr></table>
</td>
<td class="coverPerHi">91.8&nbsp;%</td>
<td class="coverNumHi">257 / 280</td>
<td class="coverPerHi">96.4&nbsp;%</td>
<td class="coverNumHi">27 / 28</td>
</tr>
<tr>
<td class="coverFile"><a href="state.c.gcov.html">state.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=92 height=10 alt="92.4%"><img src="../snow.png" width=8 height=10 alt="92.4%"></td></tr></table>
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=93 height=10 alt="92.6%"><img src="../snow.png" width=7 height=10 alt="92.6%"></td></tr></table>
</td>
<td class="coverPerHi">92.4&nbsp;%</td>
<td class="coverNumHi">1248 / 1351</td>
<td class="coverPerHi">97.2&nbsp;%</td>
<td class="coverNumHi">35 / 36</td>
<td class="coverPerHi">92.6&nbsp;%</td>
<td class="coverNumHi">1262 / 1363</td>
<td class="coverPerHi">97.3&nbsp;%</td>
<td class="coverNumHi">36 / 37</td>
</tr>
<tr>
<td class="coverFile"><a href="sync.c.gcov.html">sync.c</a></td>
@ -199,16 +209,6 @@
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">18 / 18</td>
</tr>
<tr>
<td class="coverFile"><a href="stream.c.gcov.html">stream.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=93 height=10 alt="93.2%"><img src="../snow.png" width=7 height=10 alt="93.2%"></td></tr></table>
</td>
<td class="coverPerHi">93.2&nbsp;%</td>
<td class="coverNumHi">261 / 280</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">28 / 28</td>
</tr>
<tr>
<td class="coverFile"><a href="util.h.gcov.html">util.h</a></td>
<td class="coverBar" align="center">
@ -229,25 +229,35 @@
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">5 / 5</td>
</tr>
<tr>
<td class="coverFile"><a href="snapraid.c.gcov.html">snapraid.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=94 height=10 alt="93.8%"><img src="../snow.png" width=6 height=10 alt="93.8%"></td></tr></table>
</td>
<td class="coverPerHi">93.8&nbsp;%</td>
<td class="coverNumHi">454 / 484</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">8 / 8</td>
</tr>
<tr>
<td class="coverFile"><a href="elem.c.gcov.html">elem.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=94 height=10 alt="93.8%"><img src="../snow.png" width=6 height=10 alt="93.8%"></td></tr></table>
</td>
<td class="coverPerHi">93.8&nbsp;%</td>
<td class="coverNumHi">545 / 581</td>
<td class="coverNumHi">546 / 582</td>
<td class="coverPerHi">96.9&nbsp;%</td>
<td class="coverNumHi">62 / 64</td>
</tr>
<tr>
<td class="coverFile"><a href="snapraid.c.gcov.html">snapraid.c</a></td>
<td class="coverFile"><a href="device.c.gcov.html">device.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=94 height=10 alt="94.1%"><img src="../snow.png" width=6 height=10 alt="94.1%"></td></tr></table>
</td>
<td class="coverPerHi">94.1&nbsp;%</td>
<td class="coverNumHi">446 / 474</td>
<td class="coverNumHi">301 / 320</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">8 / 8</td>
<td class="coverNumHi">11 / 11</td>
</tr>
<tr>
<td class="coverFile"><a href="pool.c.gcov.html">pool.c</a></td>
@ -259,16 +269,6 @@
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">3 / 3</td>
</tr>
<tr>
<td class="coverFile"><a href="device.c.gcov.html">device.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=94 height=10 alt="94.3%"><img src="../snow.png" width=6 height=10 alt="94.3%"></td></tr></table>
</td>
<td class="coverPerHi">94.3&nbsp;%</td>
<td class="coverNumHi">300 / 318</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">11 / 11</td>
</tr>
<tr>
<td class="coverFile"><a href="rehash.c.gcov.html">rehash.c</a></td>
<td class="coverBar" align="center">
@ -305,17 +305,7 @@
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=98 height=10 alt="97.7%"><img src="../snow.png" width=2 height=10 alt="97.7%"></td></tr></table>
</td>
<td class="coverPerHi">97.7&nbsp;%</td>
<td class="coverNumHi">125 / 128</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">8 / 8</td>
</tr>
<tr>
<td class="coverFile"><a href="import.c.gcov.html">import.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=98 height=10 alt="98.1%"><img src="../snow.png" width=2 height=10 alt="98.1%"></td></tr></table>
</td>
<td class="coverPerHi">98.1&nbsp;%</td>
<td class="coverNumHi">103 / 105</td>
<td class="coverNumHi">126 / 129</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">8 / 8</td>
</tr>
@ -409,6 +399,16 @@
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">2 / 2</td>
</tr>
<tr>
<td class="coverFile"><a href="selftest.c.gcov.html">selftest.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">144 / 144</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">8 / 8</td>
</tr>
</table>
</center>
<br>

View file

@ -31,18 +31,18 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">7344</td>
<td class="headerCovTableEntry">8033</td>
<td class="headerCovTableEntryHi">91.4 %</td>
<td class="headerCovTableEntry">7401</td>
<td class="headerCovTableEntry">8084</td>
<td class="headerCovTableEntryHi">91.6 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">388</td>
<td class="headerCovTableEntry">397</td>
<td class="headerCovTableEntryHi">97.7 %</td>
<td class="headerCovTableEntry">390</td>
<td class="headerCovTableEntry">401</td>
<td class="headerCovTableEntryHi">97.3 %</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
@ -72,20 +72,20 @@
<tr>
<td class="coverFile"><a href="check.c.gcov.html">check.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=91 height=10 alt="91.3%"><img src="../snow.png" width=9 height=10 alt="91.3%"></td></tr></table>
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=91 height=10 alt="91.2%"><img src="../snow.png" width=9 height=10 alt="91.2%"></td></tr></table>
</td>
<td class="coverPerHi">91.3&nbsp;%</td>
<td class="coverNumHi">713 / 781</td>
<td class="coverPerHi">91.2&nbsp;%</td>
<td class="coverNumHi">712 / 781</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">9 / 9</td>
</tr>
<tr>
<td class="coverFile"><a href="device.c.gcov.html">device.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=94 height=10 alt="94.3%"><img src="../snow.png" width=6 height=10 alt="94.3%"></td></tr></table>
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=94 height=10 alt="94.1%"><img src="../snow.png" width=6 height=10 alt="94.1%"></td></tr></table>
</td>
<td class="coverPerHi">94.3&nbsp;%</td>
<td class="coverNumHi">300 / 318</td>
<td class="coverPerHi">94.1&nbsp;%</td>
<td class="coverNumHi">301 / 320</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">11 / 11</td>
</tr>
@ -115,7 +115,7 @@
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=94 height=10 alt="93.8%"><img src="../snow.png" width=6 height=10 alt="93.8%"></td></tr></table>
</td>
<td class="coverPerHi">93.8&nbsp;%</td>
<td class="coverNumHi">545 / 581</td>
<td class="coverNumHi">546 / 582</td>
<td class="coverPerHi">96.9&nbsp;%</td>
<td class="coverNumHi">62 / 64</td>
</tr>
@ -135,19 +135,19 @@
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=98 height=10 alt="97.7%"><img src="../snow.png" width=2 height=10 alt="97.7%"></td></tr></table>
</td>
<td class="coverPerHi">97.7&nbsp;%</td>
<td class="coverNumHi">125 / 128</td>
<td class="coverNumHi">126 / 129</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">8 / 8</td>
</tr>
<tr>
<td class="coverFile"><a href="import.c.gcov.html">import.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=98 height=10 alt="98.1%"><img src="../snow.png" width=2 height=10 alt="98.1%"></td></tr></table>
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=90 height=10 alt="90.5%"><img src="../snow.png" width=10 height=10 alt="90.5%"></td></tr></table>
</td>
<td class="coverPerHi">98.1&nbsp;%</td>
<td class="coverNumHi">103 / 105</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">8 / 8</td>
<td class="coverPerHi">90.5&nbsp;%</td>
<td class="coverNumHi">95 / 105</td>
<td class="coverPerMed">87.5&nbsp;%</td>
<td class="coverNumMed">7 / 8</td>
</tr>
<tr>
<td class="coverFile"><a href="list.c.gcov.html">list.c</a></td>
@ -242,10 +242,10 @@
<tr>
<td class="coverFile"><a href="scan.c.gcov.html">scan.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=87 height=10 alt="87.4%"><img src="../snow.png" width=13 height=10 alt="87.4%"></td></tr></table>
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=89 height=10 alt="89.1%"><img src="../snow.png" width=11 height=10 alt="89.1%"></td></tr></table>
</td>
<td class="coverPerMed">87.4&nbsp;%</td>
<td class="coverNumMed">542 / 620</td>
<td class="coverPerMed">89.1&nbsp;%</td>
<td class="coverNumMed">554 / 622</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">23 / 23</td>
</tr>
@ -262,30 +262,30 @@
<tr>
<td class="coverFile"><a href="search.c.gcov.html">search.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=92 height=10 alt="92.0%"><img src="../snow.png" width=8 height=10 alt="92.0%"></td></tr></table>
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=91 height=10 alt="91.0%"><img src="../snow.png" width=9 height=10 alt="91.0%"></td></tr></table>
</td>
<td class="coverPerHi">92.0&nbsp;%</td>
<td class="coverNumHi">92 / 100</td>
<td class="coverPerHi">91.0&nbsp;%</td>
<td class="coverNumHi">91 / 100</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">7 / 7</td>
</tr>
<tr>
<td class="coverFile"><a href="selftest.c.gcov.html">selftest.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=84 height=10 alt="83.7%"><img src="../snow.png" width=16 height=10 alt="83.7%"></td></tr></table>
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
</td>
<td class="coverPerMed">83.7&nbsp;%</td>
<td class="coverNumMed">144 / 172</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">144 / 144</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">8 / 8</td>
</tr>
<tr>
<td class="coverFile"><a href="snapraid.c.gcov.html">snapraid.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=94 height=10 alt="94.1%"><img src="../snow.png" width=6 height=10 alt="94.1%"></td></tr></table>
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=94 height=10 alt="93.8%"><img src="../snow.png" width=6 height=10 alt="93.8%"></td></tr></table>
</td>
<td class="coverPerHi">94.1&nbsp;%</td>
<td class="coverNumHi">446 / 474</td>
<td class="coverPerHi">93.8&nbsp;%</td>
<td class="coverNumHi">454 / 484</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">8 / 8</td>
</tr>
@ -312,12 +312,12 @@
<tr>
<td class="coverFile"><a href="state.c.gcov.html">state.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=92 height=10 alt="92.4%"><img src="../snow.png" width=8 height=10 alt="92.4%"></td></tr></table>
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=93 height=10 alt="92.6%"><img src="../snow.png" width=7 height=10 alt="92.6%"></td></tr></table>
</td>
<td class="coverPerHi">92.4&nbsp;%</td>
<td class="coverNumHi">1248 / 1351</td>
<td class="coverPerHi">97.2&nbsp;%</td>
<td class="coverNumHi">35 / 36</td>
<td class="coverPerHi">92.6&nbsp;%</td>
<td class="coverNumHi">1262 / 1363</td>
<td class="coverPerHi">97.3&nbsp;%</td>
<td class="coverNumHi">36 / 37</td>
</tr>
<tr>
<td class="coverFile"><a href="state.h.gcov.html">state.h</a></td>
@ -342,12 +342,12 @@
<tr>
<td class="coverFile"><a href="stream.c.gcov.html">stream.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=93 height=10 alt="93.2%"><img src="../snow.png" width=7 height=10 alt="93.2%"></td></tr></table>
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=92 height=10 alt="91.8%"><img src="../snow.png" width=8 height=10 alt="91.8%"></td></tr></table>
</td>
<td class="coverPerHi">93.2&nbsp;%</td>
<td class="coverNumHi">261 / 280</td>
<td class="coverPerHi">100.0&nbsp;%</td>
<td class="coverNumHi">28 / 28</td>
<td class="coverPerHi">91.8&nbsp;%</td>
<td class="coverNumHi">257 / 280</td>
<td class="coverPerHi">96.4&nbsp;%</td>
<td class="coverNumHi">27 / 28</td>
</tr>
<tr>
<td class="coverFile"><a href="stream.h.gcov.html">stream.h</a></td>
@ -362,12 +362,12 @@
<tr>
<td class="coverFile"><a href="support.c.gcov.html">support.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=79 height=10 alt="79.2%"><img src="../snow.png" width=21 height=10 alt="79.2%"></td></tr></table>
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=80 height=10 alt="79.7%"><img src="../snow.png" width=20 height=10 alt="79.7%"></td></tr></table>
</td>
<td class="coverPerMed">79.2&nbsp;%</td>
<td class="coverNumMed">232 / 293</td>
<td class="coverPerHi">93.5&nbsp;%</td>
<td class="coverNumHi">29 / 31</td>
<td class="coverPerMed">79.7&nbsp;%</td>
<td class="coverNumMed">240 / 301</td>
<td class="coverPerHi">93.8&nbsp;%</td>
<td class="coverNumHi">30 / 32</td>
</tr>
<tr>
<td class="coverFile"><a href="sync.c.gcov.html">sync.c</a></td>
@ -382,12 +382,12 @@
<tr>
<td class="coverFile"><a href="unix.c.gcov.html">unix.c</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=79 height=10 alt="79.2%"><img src="../snow.png" width=21 height=10 alt="79.2%"></td></tr></table>
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=77 height=10 alt="76.8%"><img src="../snow.png" width=23 height=10 alt="76.8%"></td></tr></table>
</td>
<td class="coverPerMed">79.2&nbsp;%</td>
<td class="coverNumMed">229 / 289</td>
<td class="coverPerHi">91.3&nbsp;%</td>
<td class="coverNumHi">21 / 23</td>
<td class="coverPerMed">76.8&nbsp;%</td>
<td class="coverNumMed">255 / 332</td>
<td class="coverPerHi">92.0&nbsp;%</td>
<td class="coverNumHi">23 / 25</td>
</tr>
<tr>
<td class="coverFile"><a href="util.c.gcov.html">util.c</a></td>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">1</td>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">1</td>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">1</td>
@ -110,34 +110,34 @@
<span class="lineNum"> 48 </span><span class="lineCov"> 18 : tommy_list_sort(&amp;disk-&gt;filelist, file_path_compare);</span>
<span class="lineNum"> 49 </span> :
<span class="lineNum"> 50 </span> : /* for each file */
<span class="lineNum"> 51 </span><span class="lineCov"> 16998 : for (j = disk-&gt;filelist; j != 0; j = j-&gt;next) {</span>
<span class="lineNum"> 52 </span><span class="lineCov"> 16980 : struct snapraid_file* file = j-&gt;data;</span>
<span class="lineNum"> 51 </span><span class="lineCov"> 17012 : for (j = disk-&gt;filelist; j != 0; j = j-&gt;next) {</span>
<span class="lineNum"> 52 </span><span class="lineCov"> 16994 : struct snapraid_file* file = j-&gt;data;</span>
<span class="lineNum"> 53 </span> : #if HAVE_LOCALTIME_R
<span class="lineNum"> 54 </span> : struct tm tm_res;
<span class="lineNum"> 55 </span> : #endif
<span class="lineNum"> 56 </span> : struct tm* tm;
<span class="lineNum"> 57 </span> : time_t t;
<span class="lineNum"> 58 </span> :
<span class="lineNum"> 59 </span><span class="lineCov"> 16980 : ++file_count;</span>
<span class="lineNum"> 60 </span><span class="lineCov"> 16980 : file_size += file-&gt;size;</span>
<span class="lineNum"> 59 </span><span class="lineCov"> 16994 : ++file_count;</span>
<span class="lineNum"> 60 </span><span class="lineCov"> 16994 : file_size += file-&gt;size;</span>
<span class="lineNum"> 61 </span> :
<span class="lineNum"> 62 </span><span class="lineCov"> 16980 : log_tag(&quot;file:%s:%s:%&quot; PRIu64 &quot;:%&quot; PRIi64 &quot;:%u:%&quot; PRIi64 &quot;\n&quot;, disk-&gt;name, esc(file-&gt;sub), file-&gt;size, file-&gt;mtime_sec, file-&gt;mtime_nsec, file-&gt;inode);</span>
<span class="lineNum"> 62 </span><span class="lineCov"> 16994 : log_tag(&quot;file:%s:%s:%&quot; PRIu64 &quot;:%&quot; PRIi64 &quot;:%u:%&quot; PRIi64 &quot;\n&quot;, disk-&gt;name, esc(file-&gt;sub), file-&gt;size, file-&gt;mtime_sec, file-&gt;mtime_nsec, file-&gt;inode);</span>
<span class="lineNum"> 63 </span> :
<span class="lineNum"> 64 </span><span class="lineCov"> 16980 : t = file-&gt;mtime_sec;</span>
<span class="lineNum"> 64 </span><span class="lineCov"> 16994 : t = file-&gt;mtime_sec;</span>
<span class="lineNum"> 65 </span> : #if HAVE_LOCALTIME_R
<span class="lineNum"> 66 </span><span class="lineCov"> 16980 : tm = localtime_r(&amp;t, &amp;tm_res);</span>
<span class="lineNum"> 66 </span><span class="lineCov"> 16994 : tm = localtime_r(&amp;t, &amp;tm_res);</span>
<span class="lineNum"> 67 </span> : #else
<span class="lineNum"> 68 </span> : tm = localtime(&amp;t);
<span class="lineNum"> 69 </span> : #endif
<span class="lineNum"> 70 </span> :
<span class="lineNum"> 71 </span><span class="lineCov"> 16980 : printf(&quot;%12&quot; PRIu64 &quot; &quot;, file-&gt;size);</span>
<span class="lineNum"> 72 </span><span class="lineCov"> 16980 : if (tm) {</span>
<span class="lineNum"> 73 </span><span class="lineCov"> 16980 : printf(&quot;%04u/%02u/%02u %02u:%02u&quot;, tm-&gt;tm_year + 1900, tm-&gt;tm_mon + 1, tm-&gt;tm_mday, tm-&gt;tm_hour, tm-&gt;tm_min);</span>
<span class="lineNum"> 74 </span><span class="lineCov"> 16980 : if (msg_level &gt;= MSG_VERBOSE)</span>
<span class="lineNum"> 75 </span><span class="lineCov"> 16980 : printf(&quot;:%02u.%03u&quot;, tm-&gt;tm_sec, file-&gt;mtime_nsec / 1000000);</span>
<span class="lineNum"> 76 </span><span class="lineCov"> 16980 : printf(&quot; &quot;);</span>
<span class="lineNum"> 71 </span><span class="lineCov"> 16994 : printf(&quot;%12&quot; PRIu64 &quot; &quot;, file-&gt;size);</span>
<span class="lineNum"> 72 </span><span class="lineCov"> 16994 : if (tm) {</span>
<span class="lineNum"> 73 </span><span class="lineCov"> 16994 : printf(&quot;%04u/%02u/%02u %02u:%02u&quot;, tm-&gt;tm_year + 1900, tm-&gt;tm_mon + 1, tm-&gt;tm_mday, tm-&gt;tm_hour, tm-&gt;tm_min);</span>
<span class="lineNum"> 74 </span><span class="lineCov"> 16994 : if (msg_level &gt;= MSG_VERBOSE)</span>
<span class="lineNum"> 75 </span><span class="lineCov"> 16994 : printf(&quot;:%02u.%03u&quot;, tm-&gt;tm_sec, file-&gt;mtime_nsec / 1000000);</span>
<span class="lineNum"> 76 </span><span class="lineCov"> 16994 : printf(&quot; &quot;);</span>
<span class="lineNum"> 77 </span> : }
<span class="lineNum"> 78 </span><span class="lineCov"> 16980 : printf(&quot;%s%s\n&quot;, disk-&gt;dir, file-&gt;sub);</span>
<span class="lineNum"> 78 </span><span class="lineCov"> 16994 : printf(&quot;%s%s\n&quot;, disk-&gt;dir, file-&gt;sub);</span>
<span class="lineNum"> 79 </span> : }
<span class="lineNum"> 80 </span> :
<span class="lineNum"> 81 </span> : /* sort by name */

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">2</td>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">2</td>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">2</td>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">18</td>
@ -61,23 +61,23 @@
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#28">rnd</a></td>
<td class="coverFnHi">50988385</td>
<td class="coverFnHi">50969532</td>
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#35">rndnz</a></td>
<td class="coverFnHi">50578180</td>
<td class="coverFnHi">50559223</td>
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#84">file_cmp</a></td>
<td class="coverFnHi">146608</td>
<td class="coverFnHi">146593</td>
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#43">rndnz_range</a></td>
<td class="coverFnHi">31195</td>
<td class="coverFnHi">31151</td>
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#70">rnd_name</a></td>
<td class="coverFnHi">26824</td>
<td class="coverFnHi">26849</td>
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#221">cmd_generate</a></td>
@ -93,19 +93,19 @@
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#289">cmd_write</a></td>
<td class="coverFnHi">4703</td>
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#457">cmd_append</a></td>
<td class="coverFnHi">3252</td>
<td class="coverFnHi">4719</td>
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#562">cmd_delete</a></td>
<td class="coverFnHi">3155</td>
<td class="coverFnHi">3209</td>
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#457">cmd_append</a></td>
<td class="coverFnHi">3192</td>
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#508">cmd_truncate</a></td>
<td class="coverFnHi">3151</td>
<td class="coverFnHi">3139</td>
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#360">cmd_damage</a></td>
@ -121,7 +121,7 @@
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#198">cmd_generate_symlink</a></td>
<td class="coverFnHi">915</td>
<td class="coverFnHi">940</td>
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#644">main</a></td>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">18</td>
@ -61,7 +61,7 @@
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#457">cmd_append</a></td>
<td class="coverFnHi">3252</td>
<td class="coverFnHi">3192</td>
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#576">cmd_change</a></td>
@ -73,7 +73,7 @@
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#562">cmd_delete</a></td>
<td class="coverFnHi">3155</td>
<td class="coverFnHi">3209</td>
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#221">cmd_generate</a></td>
@ -85,15 +85,15 @@
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#198">cmd_generate_symlink</a></td>
<td class="coverFnHi">915</td>
<td class="coverFnHi">940</td>
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#508">cmd_truncate</a></td>
<td class="coverFnHi">3151</td>
<td class="coverFnHi">3139</td>
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#289">cmd_write</a></td>
<td class="coverFnHi">4703</td>
<td class="coverFnHi">4719</td>
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#89">fallback</a></td>
@ -101,7 +101,7 @@
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#84">file_cmp</a></td>
<td class="coverFnHi">146608</td>
<td class="coverFnHi">146593</td>
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#632">help</a></td>
@ -113,15 +113,15 @@
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#28">rnd</a></td>
<td class="coverFnHi">50988385</td>
<td class="coverFnHi">50969532</td>
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#70">rnd_name</a></td>
<td class="coverFnHi">26824</td>
<td class="coverFnHi">26849</td>
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#35">rndnz</a></td>
<td class="coverFnHi">50578180</td>
<td class="coverFnHi">50559223</td>
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#51">rndnz_damage</a></td>
@ -129,7 +129,7 @@
</tr>
<tr>
<td class="coverFn"><a href="mktest.c.gcov.html#43">rndnz_range</a></td>
<td class="coverFnHi">31195</td>
<td class="coverFnHi">31151</td>
</tr>
</table>
<br>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">18</td>
@ -89,28 +89,28 @@
<span class="lineNum"> 27 </span> : */
<a name="28"><span class="lineNum"> 28 </span> : unsigned long long seed = 0;</a>
<span class="lineNum"> 29 </span> :
<span class="lineNum"> 30 </span><span class="lineCov"> 50988385 : unsigned rnd(unsigned max)</span>
<span class="lineNum"> 30 </span><span class="lineCov"> 50969532 : unsigned rnd(unsigned max)</span>
<span class="lineNum"> 31 </span> : {
<span class="lineNum"> 32 </span><span class="lineCov"> 50988385 : seed = seed * 6364136223846793005LL + 1442695040888963407LL;</span>
<span class="lineNum"> 32 </span><span class="lineCov"> 50969532 : seed = seed * 6364136223846793005LL + 1442695040888963407LL;</span>
<span class="lineNum"> 33 </span> :
<span class="lineNum"> 34 </span><span class="lineCov"> 50988385 : return (seed &gt;&gt; 32) % max;</span>
<span class="lineNum"> 34 </span><span class="lineCov"> 50969532 : return (seed &gt;&gt; 32) % max;</span>
<a name="35"><span class="lineNum"> 35 </span> : }</a>
<span class="lineNum"> 36 </span> :
<span class="lineNum"> 37 </span><span class="lineCov"> 50578180 : unsigned rndnz(unsigned max)</span>
<span class="lineNum"> 37 </span><span class="lineCov"> 50559223 : unsigned rndnz(unsigned max)</span>
<span class="lineNum"> 38 </span> : {
<span class="lineNum"> 39 </span><span class="lineCov"> 50578180 : if (max &lt;= 1)</span>
<span class="lineNum"> 39 </span><span class="lineCov"> 50559223 : if (max &lt;= 1)</span>
<span class="lineNum"> 40 </span><span class="lineCov"> 2831 : return 1;</span>
<span class="lineNum"> 41 </span> : else
<span class="lineNum"> 42 </span><span class="lineCov"> 50575349 : return rnd(max - 1) + 1;</span>
<span class="lineNum"> 42 </span><span class="lineCov"> 50556392 : return rnd(max - 1) + 1;</span>
<a name="43"><span class="lineNum"> 43 </span> : }</a>
<span class="lineNum"> 44 </span> :
<span class="lineNum"> 45 </span><span class="lineCov"> 31195 : void rndnz_range(unsigned char* data, int size)</span>
<span class="lineNum"> 45 </span><span class="lineCov"> 31151 : void rndnz_range(unsigned char* data, int size)</span>
<span class="lineNum"> 46 </span> : {
<span class="lineNum"> 47 </span> : int i;
<span class="lineNum"> 48 </span> :
<span class="lineNum"> 49 </span><span class="lineCov"> 50604116 : for (i = 0; i &lt; size; ++i)</span>
<span class="lineNum"> 50 </span><span class="lineCov"> 50572921 : data[i] = rndnz(256);</span>
<a name="51"><span class="lineNum"> 51 </span><span class="lineCov"> 31195 : }</span></a>
<span class="lineNum"> 49 </span><span class="lineCov"> 50585115 : for (i = 0; i &lt; size; ++i)</span>
<span class="lineNum"> 50 </span><span class="lineCov"> 50553964 : data[i] = rndnz(256);</span>
<a name="51"><span class="lineNum"> 51 </span><span class="lineCov"> 31151 : }</span></a>
<span class="lineNum"> 52 </span> :
<span class="lineNum"> 53 </span><span class="lineCov"> 1821 : void rndnz_damage(unsigned char* data, int size)</span>
<span class="lineNum"> 54 </span> : {
@ -131,23 +131,23 @@
<span class="lineNum"> 69 </span> : char CHARSET[] = &quot;qwertyuiopasdfghjklzxcvbnm1234567890 .-+&quot;;
<a name="70"><span class="lineNum"> 70 </span> : #define CHARSET_LEN (sizeof(CHARSET) - 1)</a>
<span class="lineNum"> 71 </span> :
<span class="lineNum"> 72 </span><span class="lineCov"> 26824 : void rnd_name(char* file)</span>
<span class="lineNum"> 72 </span><span class="lineCov"> 26849 : void rnd_name(char* file)</span>
<span class="lineNum"> 73 </span> : {
<span class="lineNum"> 74 </span><span class="lineCov"> 26824 : int l = 1 + rnd(20);</span>
<span class="lineNum"> 74 </span><span class="lineCov"> 26849 : int l = 1 + rnd(20);</span>
<span class="lineNum"> 75 </span> :
<span class="lineNum"> 76 </span><span class="lineCov"> 335360 : while (l) {</span>
<span class="lineNum"> 77 </span><span class="lineCov"> 281712 : *file++ = CHARSET[rnd(CHARSET_LEN)];</span>
<span class="lineNum"> 78 </span><span class="lineCov"> 281712 : --l;</span>
<span class="lineNum"> 76 </span><span class="lineCov"> 335469 : while (l) {</span>
<span class="lineNum"> 77 </span><span class="lineCov"> 281771 : *file++ = CHARSET[rnd(CHARSET_LEN)];</span>
<span class="lineNum"> 78 </span><span class="lineCov"> 281771 : --l;</span>
<span class="lineNum"> 79 </span> : }
<span class="lineNum"> 80 </span><span class="lineCov"> 26824 : *file = 0;</span>
<span class="lineNum"> 81 </span><span class="lineCov"> 26824 : }</span>
<span class="lineNum"> 80 </span><span class="lineCov"> 26849 : *file = 0;</span>
<span class="lineNum"> 81 </span><span class="lineCov"> 26849 : }</span>
<span class="lineNum"> 82 </span> :
<span class="lineNum"> 83 </span> : /****************************************************************************/
<a name="84"><span class="lineNum"> 84 </span> : /* file */</a>
<span class="lineNum"> 85 </span> :
<span class="lineNum"> 86 </span><span class="lineCov"> 146608 : int file_cmp(const void* a, const void* b)</span>
<span class="lineNum"> 86 </span><span class="lineCov"> 146593 : int file_cmp(const void* a, const void* b)</span>
<span class="lineNum"> 87 </span> : {
<span class="lineNum"> 88 </span><span class="lineCov"> 146608 : return strcmp(a, b);</span>
<span class="lineNum"> 88 </span><span class="lineCov"> 146593 : return strcmp(a, b);</span>
<a name="89"><span class="lineNum"> 89 </span> : }</a>
<span class="lineNum"> 90 </span> :
<span class="lineNum"> 91 </span><span class="lineCov"> 1821 : int fallback(int f, struct stat* st)</span>
@ -259,11 +259,11 @@
<span class="lineNum"> 197 </span> : * Create a symlink.
<a name="198"><span class="lineNum"> 198 </span> : * - If the file already exists, it's removed.</a>
<span class="lineNum"> 199 </span> : */
<span class="lineNum"> 200 </span><span class="lineCov"> 915 : void cmd_generate_symlink(const char* path, const char* linkto)</span>
<span class="lineNum"> 200 </span><span class="lineCov"> 940 : void cmd_generate_symlink(const char* path, const char* linkto)</span>
<span class="lineNum"> 201 </span> : {
<span class="lineNum"> 202 </span> : /* remove the existing file/symlink if any */
<span class="lineNum"> 203 </span><span class="lineCov"> 915 : if (remove(path) != 0) {</span>
<span class="lineNum"> 204 </span><span class="lineCov"> 894 : if (errno != ENOENT) {</span>
<span class="lineNum"> 203 </span><span class="lineCov"> 940 : if (remove(path) != 0) {</span>
<span class="lineNum"> 204 </span><span class="lineCov"> 919 : if (errno != ENOENT) {</span>
<span class="lineNum"> 205 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 206 </span> : log_fatal(&quot;Error removing file %s\n&quot;, path);
<span class="lineNum"> 207 </span> : exit(EXIT_FAILURE);
@ -271,13 +271,13 @@
<span class="lineNum"> 209 </span> : }
<span class="lineNum"> 210 </span> : }
<span class="lineNum"> 211 </span> :
<span class="lineNum"> 212 </span><span class="lineCov"> 915 : if (symlink(linkto, path) != 0) {</span>
<span class="lineNum"> 212 </span><span class="lineCov"> 940 : if (symlink(linkto, path) != 0) {</span>
<span class="lineNum"> 213 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 214 </span> : log_fatal(&quot;Error writing symlink %s\n&quot;, path);
<span class="lineNum"> 215 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 216 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 217 </span> : }
<span class="lineNum"> 218 </span><span class="lineCov"> 915 : }</span>
<span class="lineNum"> 218 </span><span class="lineCov"> 940 : }</span>
<span class="lineNum"> 219 </span> :
<span class="lineNum"> 220 </span> : /**
<a name="221"><span class="lineNum"> 221 </span> : * Create a file or a symlink with a random name.</a>
@ -350,68 +350,68 @@
<span class="lineNum"> 288 </span> : * - The written data may be equal or not at the already existing one.
<a name="289"><span class="lineNum"> 289 </span> : * - If it's a symlink nothing is done.</a>
<span class="lineNum"> 290 </span> : */
<span class="lineNum"> 291 </span><span class="lineCov"> 4703 : void cmd_write(const char* path, int size)</span>
<span class="lineNum"> 291 </span><span class="lineCov"> 4719 : void cmd_write(const char* path, int size)</span>
<span class="lineNum"> 292 </span> : {
<span class="lineNum"> 293 </span> : struct stat st;
<span class="lineNum"> 294 </span> :
<span class="lineNum"> 295 </span><span class="lineCov"> 4703 : if (lstat(path, &amp;st) != 0) {</span>
<span class="lineNum"> 295 </span><span class="lineCov"> 4719 : if (lstat(path, &amp;st) != 0) {</span>
<span class="lineNum"> 296 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 297 </span> : log_fatal(&quot;Error accessing %s\n&quot;, path);
<span class="lineNum"> 298 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 299 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 300 </span> : }
<span class="lineNum"> 301 </span> :
<span class="lineNum"> 302 </span><span class="lineCov"> 4703 : if (S_ISREG(st.st_mode)) {</span>
<span class="lineNum"> 302 </span><span class="lineCov"> 4719 : if (S_ISREG(st.st_mode)) {</span>
<span class="lineNum"> 303 </span> : unsigned char* data;
<span class="lineNum"> 304 </span> : off_t off;
<span class="lineNum"> 305 </span> : int f;
<span class="lineNum"> 306 </span> :
<span class="lineNum"> 307 </span> : /* not over the end */
<span class="lineNum"> 308 </span><span class="lineCov"> 4676 : if (size &gt; st.st_size)</span>
<span class="lineNum"> 309 </span><span class="lineCov"> 179 : size = st.st_size;</span>
<span class="lineNum"> 308 </span><span class="lineCov"> 4692 : if (size &gt; st.st_size)</span>
<span class="lineNum"> 309 </span><span class="lineCov"> 175 : size = st.st_size;</span>
<span class="lineNum"> 310 </span> :
<span class="lineNum"> 311 </span> : /* start at random position inside the file */
<span class="lineNum"> 312 </span><span class="lineCov"> 4676 : if (size &lt; st.st_size)</span>
<span class="lineNum"> 313 </span><span class="lineCov"> 4496 : off = rnd(st.st_size - size);</span>
<span class="lineNum"> 312 </span><span class="lineCov"> 4692 : if (size &lt; st.st_size)</span>
<span class="lineNum"> 313 </span><span class="lineCov"> 4517 : off = rnd(st.st_size - size);</span>
<span class="lineNum"> 314 </span> : else
<span class="lineNum"> 315 </span><span class="lineCov"> 180 : off = 0;</span>
<span class="lineNum"> 315 </span><span class="lineCov"> 175 : off = 0;</span>
<span class="lineNum"> 316 </span> :
<span class="lineNum"> 317 </span><span class="lineCov"> 4676 : data = malloc(size);</span>
<span class="lineNum"> 317 </span><span class="lineCov"> 4692 : data = malloc(size);</span>
<span class="lineNum"> 318 </span> :
<span class="lineNum"> 319 </span><span class="lineCov"> 4676 : rndnz_range(data, size);</span>
<span class="lineNum"> 319 </span><span class="lineCov"> 4692 : rndnz_range(data, size);</span>
<span class="lineNum"> 320 </span> :
<span class="lineNum"> 321 </span><span class="lineCov"> 4676 : f = open(path, O_WRONLY | O_BINARY | O_NOFOLLOW);</span>
<span class="lineNum"> 322 </span><span class="lineCov"> 4676 : if (f &lt; 0) {</span>
<span class="lineNum"> 321 </span><span class="lineCov"> 4692 : f = open(path, O_WRONLY | O_BINARY | O_NOFOLLOW);</span>
<span class="lineNum"> 322 </span><span class="lineCov"> 4692 : if (f &lt; 0) {</span>
<span class="lineNum"> 323 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 324 </span> : log_fatal(&quot;Error creating file %s\n&quot;, path);
<span class="lineNum"> 325 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 326 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 327 </span> : }
<span class="lineNum"> 328 </span> :
<span class="lineNum"> 329 </span><span class="lineCov"> 4676 : if (lseek(f, off, SEEK_SET) != off) {</span>
<span class="lineNum"> 329 </span><span class="lineCov"> 4692 : if (lseek(f, off, SEEK_SET) != off) {</span>
<span class="lineNum"> 330 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 331 </span> : log_fatal(&quot;Error seeking file %s\n&quot;, path);
<span class="lineNum"> 332 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 333 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 334 </span> : }
<span class="lineNum"> 335 </span> :
<span class="lineNum"> 336 </span><span class="lineCov"> 4676 : if (write(f, data, size) != size) {</span>
<span class="lineNum"> 336 </span><span class="lineCov"> 4692 : if (write(f, data, size) != size) {</span>
<span class="lineNum"> 337 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 338 </span> : log_fatal(&quot;Error writing file %s\n&quot;, path);
<span class="lineNum"> 339 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 340 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 341 </span> : }
<span class="lineNum"> 342 </span> :
<span class="lineNum"> 343 </span><span class="lineCov"> 4676 : if (close(f) != 0) {</span>
<span class="lineNum"> 343 </span><span class="lineCov"> 4692 : if (close(f) != 0) {</span>
<span class="lineNum"> 344 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 345 </span> : log_fatal(&quot;Error closing file %s\n&quot;, path);
<span class="lineNum"> 346 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 347 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 348 </span> : }
<span class="lineNum"> 349 </span> :
<span class="lineNum"> 350 </span><span class="lineCov"> 4676 : free(data);</span>
<span class="lineNum"> 350 </span><span class="lineCov"> 4692 : free(data);</span>
<span class="lineNum"> 351 </span> : }
<span class="lineNum"> 352 </span><span class="lineCov"> 4703 : }</span>
<span class="lineNum"> 352 </span><span class="lineCov"> 4719 : }</span>
<span class="lineNum"> 353 </span> :
<span class="lineNum"> 354 </span> : /**
<span class="lineNum"> 355 </span> : * Damage a file.
@ -518,50 +518,50 @@
<span class="lineNum"> 456 </span> : * - The file must exist.
<a name="457"><span class="lineNum"> 457 </span> : * - If it's a symlink nothing is done.</a>
<span class="lineNum"> 458 </span> : */
<span class="lineNum"> 459 </span><span class="lineCov"> 3252 : void cmd_append(const char* path, int size)</span>
<span class="lineNum"> 459 </span><span class="lineCov"> 3192 : void cmd_append(const char* path, int size)</span>
<span class="lineNum"> 460 </span> : {
<span class="lineNum"> 461 </span> : struct stat st;
<span class="lineNum"> 462 </span> :
<span class="lineNum"> 463 </span><span class="lineCov"> 3252 : if (lstat(path, &amp;st) != 0) {</span>
<span class="lineNum"> 463 </span><span class="lineCov"> 3192 : if (lstat(path, &amp;st) != 0) {</span>
<span class="lineNum"> 464 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 465 </span> : log_fatal(&quot;Error accessing %s\n&quot;, path);
<span class="lineNum"> 466 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 467 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 468 </span> : }
<span class="lineNum"> 469 </span> :
<span class="lineNum"> 470 </span><span class="lineCov"> 3252 : if (S_ISREG(st.st_mode)) {</span>
<span class="lineNum"> 470 </span><span class="lineCov"> 3192 : if (S_ISREG(st.st_mode)) {</span>
<span class="lineNum"> 471 </span> : unsigned char* data;
<span class="lineNum"> 472 </span> : int f;
<span class="lineNum"> 473 </span> :
<span class="lineNum"> 474 </span><span class="lineCov"> 3252 : data = malloc(size);</span>
<span class="lineNum"> 474 </span><span class="lineCov"> 3192 : data = malloc(size);</span>
<span class="lineNum"> 475 </span> :
<span class="lineNum"> 476 </span><span class="lineCov"> 3252 : rndnz_range(data, size);</span>
<span class="lineNum"> 476 </span><span class="lineCov"> 3192 : rndnz_range(data, size);</span>
<span class="lineNum"> 477 </span> :
<span class="lineNum"> 478 </span><span class="lineCov"> 3252 : f = open(path, O_WRONLY | O_APPEND | O_BINARY | O_NOFOLLOW);</span>
<span class="lineNum"> 479 </span><span class="lineCov"> 3252 : if (f &lt; 0) {</span>
<span class="lineNum"> 478 </span><span class="lineCov"> 3192 : f = open(path, O_WRONLY | O_APPEND | O_BINARY | O_NOFOLLOW);</span>
<span class="lineNum"> 479 </span><span class="lineCov"> 3192 : if (f &lt; 0) {</span>
<span class="lineNum"> 480 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 481 </span> : log_fatal(&quot;Error opening file %s\n&quot;, path);
<span class="lineNum"> 482 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 483 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 484 </span> : }
<span class="lineNum"> 485 </span> :
<span class="lineNum"> 486 </span><span class="lineCov"> 3252 : if (write(f, data, size) != size) {</span>
<span class="lineNum"> 486 </span><span class="lineCov"> 3192 : if (write(f, data, size) != size) {</span>
<span class="lineNum"> 487 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 488 </span> : log_fatal(&quot;Error writing file %s\n&quot;, path);
<span class="lineNum"> 489 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 490 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 491 </span> : }
<span class="lineNum"> 492 </span> :
<span class="lineNum"> 493 </span><span class="lineCov"> 3252 : if (close(f) != 0) {</span>
<span class="lineNum"> 493 </span><span class="lineCov"> 3192 : if (close(f) != 0) {</span>
<span class="lineNum"> 494 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 495 </span> : log_fatal(&quot;Error closing file %s\n&quot;, path);
<span class="lineNum"> 496 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 497 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 498 </span> : }
<span class="lineNum"> 499 </span> :
<span class="lineNum"> 500 </span><span class="lineCov"> 3252 : free(data);</span>
<span class="lineNum"> 500 </span><span class="lineCov"> 3192 : free(data);</span>
<span class="lineNum"> 501 </span> : }
<span class="lineNum"> 502 </span><span class="lineCov"> 3252 : }</span>
<span class="lineNum"> 502 </span><span class="lineCov"> 3192 : }</span>
<span class="lineNum"> 503 </span> :
<span class="lineNum"> 504 </span> : /**
<span class="lineNum"> 505 </span> : * Truncate a file.
@ -569,69 +569,69 @@
<span class="lineNum"> 507 </span> : * - The file is NEVER truncated to 0.
<a name="508"><span class="lineNum"> 508 </span> : * - If it's a symlink nothing is done.</a>
<span class="lineNum"> 509 </span> : */
<span class="lineNum"> 510 </span><span class="lineCov"> 3151 : void cmd_truncate(const char* path, int size)</span>
<span class="lineNum"> 510 </span><span class="lineCov"> 3139 : void cmd_truncate(const char* path, int size)</span>
<span class="lineNum"> 511 </span> : {
<span class="lineNum"> 512 </span> : struct stat st;
<span class="lineNum"> 513 </span> :
<span class="lineNum"> 514 </span><span class="lineCov"> 3151 : if (lstat(path, &amp;st) != 0) {</span>
<span class="lineNum"> 514 </span><span class="lineCov"> 3139 : if (lstat(path, &amp;st) != 0) {</span>
<span class="lineNum"> 515 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 516 </span> : log_fatal(&quot;Error accessing %s\n&quot;, path);
<span class="lineNum"> 517 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 518 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 519 </span> : }
<span class="lineNum"> 520 </span> :
<span class="lineNum"> 521 </span><span class="lineCov"> 3151 : if (S_ISREG(st.st_mode)) {</span>
<span class="lineNum"> 521 </span><span class="lineCov"> 3139 : if (S_ISREG(st.st_mode)) {</span>
<span class="lineNum"> 522 </span> : off_t off;
<span class="lineNum"> 523 </span> : int f;
<span class="lineNum"> 524 </span> :
<span class="lineNum"> 525 </span> : /* if file is empty, just rewrite it */
<span class="lineNum"> 526 </span><span class="lineCov"> 3151 : if (st.st_size == 0) {</span>
<span class="lineNum"> 527 </span><span class="lineCov"> 3 : size = 0;</span>
<span class="lineNum"> 526 </span><span class="lineCov"> 3139 : if (st.st_size == 0) {</span>
<span class="lineNum"> 527 </span><span class="lineCov"> 4 : size = 0;</span>
<span class="lineNum"> 528 </span> : } else {
<span class="lineNum"> 529 </span> : /* don't truncate files to 0 size to avoid ZERO file size protection */
<span class="lineNum"> 530 </span><span class="lineCov"> 3148 : if (size &gt;= st.st_size)</span>
<span class="lineNum"> 531 </span><span class="lineCov"> 193 : size = st.st_size - 1;</span>
<span class="lineNum"> 530 </span><span class="lineCov"> 3135 : if (size &gt;= st.st_size)</span>
<span class="lineNum"> 531 </span><span class="lineCov"> 211 : size = st.st_size - 1;</span>
<span class="lineNum"> 532 </span> : }
<span class="lineNum"> 533 </span> :
<span class="lineNum"> 534 </span><span class="lineCov"> 3151 : off = st.st_size - size;</span>
<span class="lineNum"> 534 </span><span class="lineCov"> 3139 : off = st.st_size - size;</span>
<span class="lineNum"> 535 </span> :
<span class="lineNum"> 536 </span><span class="lineCov"> 3151 : f = open(path, O_WRONLY | O_BINARY | O_NOFOLLOW);</span>
<span class="lineNum"> 537 </span><span class="lineCov"> 3151 : if (f &lt; 0) {</span>
<span class="lineNum"> 536 </span><span class="lineCov"> 3139 : f = open(path, O_WRONLY | O_BINARY | O_NOFOLLOW);</span>
<span class="lineNum"> 537 </span><span class="lineCov"> 3139 : if (f &lt; 0) {</span>
<span class="lineNum"> 538 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 539 </span> : log_fatal(&quot;Error opening file %s\n&quot;, path);
<span class="lineNum"> 540 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 541 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 542 </span> : }
<span class="lineNum"> 543 </span> :
<span class="lineNum"> 544 </span><span class="lineCov"> 3151 : if (ftruncate(f, off) != 0) {</span>
<span class="lineNum"> 544 </span><span class="lineCov"> 3139 : if (ftruncate(f, off) != 0) {</span>
<span class="lineNum"> 545 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 546 </span> : log_fatal(&quot;Error truncating file %s\n&quot;, path);
<span class="lineNum"> 547 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 548 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 549 </span> : }
<span class="lineNum"> 550 </span> :
<span class="lineNum"> 551 </span><span class="lineCov"> 3151 : if (close(f) != 0) {</span>
<span class="lineNum"> 551 </span><span class="lineCov"> 3139 : if (close(f) != 0) {</span>
<span class="lineNum"> 552 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 553 </span> : log_fatal(&quot;Error closing file %s\n&quot;, path);
<span class="lineNum"> 554 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 555 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 556 </span> : }
<span class="lineNum"> 557 </span> : }
<span class="lineNum"> 558 </span><span class="lineCov"> 3151 : }</span>
<span class="lineNum"> 558 </span><span class="lineCov"> 3139 : }</span>
<span class="lineNum"> 559 </span> :
<span class="lineNum"> 560 </span> : /**
<span class="lineNum"> 561 </span> : * Delete a file.
<a name="562"><span class="lineNum"> 562 </span> : * - The file must exist.</a>
<span class="lineNum"> 563 </span> : */
<span class="lineNum"> 564 </span><span class="lineCov"> 3155 : void cmd_delete(const char* path)</span>
<span class="lineNum"> 564 </span><span class="lineCov"> 3209 : void cmd_delete(const char* path)</span>
<span class="lineNum"> 565 </span> : {
<span class="lineNum"> 566 </span><span class="lineCov"> 3155 : if (remove(path) != 0) {</span>
<span class="lineNum"> 566 </span><span class="lineCov"> 3209 : if (remove(path) != 0) {</span>
<span class="lineNum"> 567 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 568 </span> : log_fatal(&quot;Error removing %s\n&quot;, path);
<span class="lineNum"> 569 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 570 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 571 </span> : }
<span class="lineNum"> 572 </span><span class="lineCov"> 3155 : }</span>
<span class="lineNum"> 572 </span><span class="lineCov"> 3209 : }</span>
<span class="lineNum"> 573 </span> :
<span class="lineNum"> 574 </span> : /**
<span class="lineNum"> 575 </span> : * Change a file. Or deleted/truncated/append/created.
@ -642,20 +642,20 @@
<span class="lineNum"> 580 </span> : struct stat st;
<span class="lineNum"> 581 </span> :
<span class="lineNum"> 582 </span><span class="lineCov"> 13128 : if (!size)</span>
<span class="lineNum"> 583 </span><span class="lineCov"> 13152 : return;</span>
<span class="lineNum"> 583 </span><span class="lineCov"> 13153 : return;</span>
<span class="lineNum"> 584 </span> :
<span class="lineNum"> 585 </span><span class="lineCov"> 13104 : if (lstat(path, &amp;st) != 0) {</span>
<span class="lineNum"> 585 </span><span class="lineCov"> 13103 : if (lstat(path, &amp;st) != 0) {</span>
<span class="lineNum"> 586 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 587 </span> : log_fatal(&quot;Error accessing %s\n&quot;, path);
<span class="lineNum"> 588 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 589 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 590 </span> : }
<span class="lineNum"> 591 </span> :
<span class="lineNum"> 592 </span><span class="lineCov"> 13104 : if (S_ISLNK(st.st_mode)) {</span>
<span class="lineNum"> 592 </span><span class="lineCov"> 13103 : if (S_ISLNK(st.st_mode)) {</span>
<span class="lineNum"> 593 </span> : /* symlink */
<span class="lineNum"> 594 </span><span class="lineCov"> 392 : if (rnd(2) == 0) {</span>
<span class="lineNum"> 594 </span><span class="lineCov"> 393 : if (rnd(2) == 0) {</span>
<span class="lineNum"> 595 </span> : /* delete */
<span class="lineNum"> 596 </span><span class="lineCov"> 210 : if (remove(path) != 0) {</span>
<span class="lineNum"> 596 </span><span class="lineCov"> 186 : if (remove(path) != 0) {</span>
<span class="lineNum"> 597 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 598 </span> : log_fatal(&quot;Error removing %s\n&quot;, path);
<span class="lineNum"> 599 </span> : exit(EXIT_FAILURE);
@ -665,30 +665,30 @@
<span class="lineNum"> 603 </span> : /* recreate */
<span class="lineNum"> 604 </span> : char linkto[PATH_MAX];
<span class="lineNum"> 605 </span> :
<span class="lineNum"> 606 </span><span class="lineCov"> 182 : if (remove(path) != 0) {</span>
<span class="lineNum"> 606 </span><span class="lineCov"> 207 : if (remove(path) != 0) {</span>
<span class="lineNum"> 607 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 608 </span> : log_fatal(&quot;Error removing %s\n&quot;, path);
<span class="lineNum"> 609 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 610 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 611 </span> : }
<span class="lineNum"> 612 </span> :
<span class="lineNum"> 613 </span><span class="lineCov"> 182 : rnd_name(linkto);</span>
<span class="lineNum"> 613 </span><span class="lineCov"> 207 : rnd_name(linkto);</span>
<span class="lineNum"> 614 </span> :
<span class="lineNum"> 615 </span><span class="lineCov"> 182 : cmd_generate_symlink(path, linkto);</span>
<span class="lineNum"> 615 </span><span class="lineCov"> 207 : cmd_generate_symlink(path, linkto);</span>
<span class="lineNum"> 616 </span> : }
<span class="lineNum"> 617 </span><span class="lineCov"> 12712 : } else if (S_ISREG(st.st_mode)) {</span>
<span class="lineNum"> 617 </span><span class="lineCov"> 12710 : } else if (S_ISREG(st.st_mode)) {</span>
<span class="lineNum"> 618 </span> : int r;
<span class="lineNum"> 619 </span> :
<span class="lineNum"> 620 </span><span class="lineCov"> 12712 : r = rnd(4);</span>
<span class="lineNum"> 620 </span><span class="lineCov"> 12710 : r = rnd(4);</span>
<span class="lineNum"> 621 </span> :
<span class="lineNum"> 622 </span><span class="lineCov"> 12712 : if (r == 0) {</span>
<span class="lineNum"> 623 </span><span class="lineCov"> 3154 : cmd_write(path, size);</span>
<span class="lineNum"> 624 </span><span class="lineCov"> 9558 : } else if (r == 1) {</span>
<span class="lineNum"> 625 </span><span class="lineCov"> 3252 : cmd_append(path, size);</span>
<span class="lineNum"> 626 </span><span class="lineCov"> 6306 : } else if (r == 2) {</span>
<span class="lineNum"> 627 </span><span class="lineCov"> 3151 : cmd_truncate(path, size);</span>
<span class="lineNum"> 622 </span><span class="lineCov"> 12710 : if (r == 0) {</span>
<span class="lineNum"> 623 </span><span class="lineCov"> 3170 : cmd_write(path, size);</span>
<span class="lineNum"> 624 </span><span class="lineCov"> 9540 : } else if (r == 1) {</span>
<span class="lineNum"> 625 </span><span class="lineCov"> 3192 : cmd_append(path, size);</span>
<span class="lineNum"> 626 </span><span class="lineCov"> 6348 : } else if (r == 2) {</span>
<span class="lineNum"> 627 </span><span class="lineCov"> 3139 : cmd_truncate(path, size);</span>
<span class="lineNum"> 628 </span> : } else {
<span class="lineNum"> 629 </span><span class="lineCov"> 3155 : cmd_delete(path);</span>
<span class="lineNum"> 629 </span><span class="lineCov"> 3209 : cmd_delete(path);</span>
<span class="lineNum"> 630 </span> : }
<span class="lineNum"> 631 </span> : }
<a name="632"><span class="lineNum"> 632 </span> : }</a>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">2</td>
@ -61,11 +61,11 @@
</tr>
<tr>
<td class="coverFn"><a href="murmur3.c.gcov.html#30">fmix32</a></td>
<td class="coverFnHi">9010328</td>
<td class="coverFnHi">7745044</td>
</tr>
<tr>
<td class="coverFn"><a href="murmur3.c.gcov.html#76">MurmurHash3_x86_128</a></td>
<td class="coverFnHi">2252582</td>
<td class="coverFnHi">1936261</td>
</tr>
</table>
<br>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">2</td>
@ -61,11 +61,11 @@
</tr>
<tr>
<td class="coverFn"><a href="murmur3.c.gcov.html#76">MurmurHash3_x86_128</a></td>
<td class="coverFnHi">2252582</td>
<td class="coverFnHi">1936261</td>
</tr>
<tr>
<td class="coverFn"><a href="murmur3.c.gcov.html#30">fmix32</a></td>
<td class="coverFnHi">9010328</td>
<td class="coverFnHi">7745044</td>
</tr>
</table>
<br>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">2</td>
@ -91,14 +91,14 @@
<span class="lineNum"> 29 </span> : // domain. The author hereby disclaims copyright to this source code.
<a name="30"><span class="lineNum"> 30 </span> : </a>
<span class="lineNum"> 31 </span> : /* Finalization mix - force all bits of a hash block to avalanche */
<span class="lineNum"> 32 </span><span class="lineCov"> 9010328 : static inline uint32_t fmix32(uint32_t h)</span>
<span class="lineNum"> 32 </span><span class="lineCov"> 7745044 : static inline uint32_t fmix32(uint32_t h)</span>
<span class="lineNum"> 33 </span> : {
<span class="lineNum"> 34 </span><span class="lineCov"> 9010328 : h ^= h &gt;&gt; 16;</span>
<span class="lineNum"> 35 </span><span class="lineCov"> 9010328 : h *= 0x85ebca6b;</span>
<span class="lineNum"> 36 </span><span class="lineCov"> 9010328 : h ^= h &gt;&gt; 13;</span>
<span class="lineNum"> 37 </span><span class="lineCov"> 9010328 : h *= 0xc2b2ae35;</span>
<span class="lineNum"> 38 </span><span class="lineCov"> 9010328 : h ^= h &gt;&gt; 16;</span>
<span class="lineNum"> 39 </span><span class="lineCov"> 9010328 : return h;</span>
<span class="lineNum"> 34 </span><span class="lineCov"> 7745044 : h ^= h &gt;&gt; 16;</span>
<span class="lineNum"> 35 </span><span class="lineCov"> 7745044 : h *= 0x85ebca6b;</span>
<span class="lineNum"> 36 </span><span class="lineCov"> 7745044 : h ^= h &gt;&gt; 13;</span>
<span class="lineNum"> 37 </span><span class="lineCov"> 7745044 : h *= 0xc2b2ae35;</span>
<span class="lineNum"> 38 </span><span class="lineCov"> 7745044 : h ^= h &gt;&gt; 16;</span>
<span class="lineNum"> 39 </span><span class="lineCov"> 7745044 : return h;</span>
<span class="lineNum"> 40 </span> : }
<span class="lineNum"> 41 </span> :
<span class="lineNum"> 42 </span> : /*
@ -137,17 +137,17 @@
<span class="lineNum"> 75 </span> : uint32_t c3 = 0x38b34ae5;
<a name="76"><span class="lineNum"> 76 </span> : uint32_t c4 = 0xa1e38b93;</a>
<span class="lineNum"> 77 </span> :
<span class="lineNum"> 78 </span><span class="lineCov"> 2252582 : void MurmurHash3_x86_128(const void* data, size_t size, const uint8_t* seed, void* digest)</span>
<span class="lineNum"> 78 </span><span class="lineCov"> 1936261 : void MurmurHash3_x86_128(const void* data, size_t size, const uint8_t* seed, void* digest)</span>
<span class="lineNum"> 79 </span> : {
<span class="lineNum"> 80 </span> : size_t nblocks;
<span class="lineNum"> 81 </span> : const uint32_t* blocks;
<span class="lineNum"> 82 </span> : const uint32_t* end;
<span class="lineNum"> 83 </span> : size_t size_remainder;
<span class="lineNum"> 84 </span> :
<span class="lineNum"> 85 </span><span class="lineCov"> 2252582 : uint32_t h1 = ((const uint32_t*)seed)[0];</span>
<span class="lineNum"> 86 </span><span class="lineCov"> 2252582 : uint32_t h2 = ((const uint32_t*)seed)[1];</span>
<span class="lineNum"> 87 </span><span class="lineCov"> 2252582 : uint32_t h3 = ((const uint32_t*)seed)[2];</span>
<span class="lineNum"> 88 </span><span class="lineCov"> 2252582 : uint32_t h4 = ((const uint32_t*)seed)[3];</span>
<span class="lineNum"> 85 </span><span class="lineCov"> 1936261 : uint32_t h1 = ((const uint32_t*)seed)[0];</span>
<span class="lineNum"> 86 </span><span class="lineCov"> 1936261 : uint32_t h2 = ((const uint32_t*)seed)[1];</span>
<span class="lineNum"> 87 </span><span class="lineCov"> 1936261 : uint32_t h3 = ((const uint32_t*)seed)[2];</span>
<span class="lineNum"> 88 </span><span class="lineCov"> 1936261 : uint32_t h4 = ((const uint32_t*)seed)[3];</span>
<span class="lineNum"> 89 </span> :
<span class="lineNum"> 90 </span> : #if WORDS_BIGENDIAN
<span class="lineNum"> 91 </span> : h1 = util_swap32(h1);
@ -156,16 +156,16 @@
<span class="lineNum"> 94 </span> : h4 = util_swap32(h4);
<span class="lineNum"> 95 </span> : #endif
<span class="lineNum"> 96 </span> :
<span class="lineNum"> 97 </span><span class="lineCov"> 2252582 : nblocks = size / 16;</span>
<span class="lineNum"> 98 </span><span class="lineCov"> 2252582 : blocks = data;</span>
<span class="lineNum"> 99 </span><span class="lineCov"> 2252582 : end = blocks + nblocks * 4;</span>
<span class="lineNum"> 97 </span><span class="lineCov"> 1936261 : nblocks = size / 16;</span>
<span class="lineNum"> 98 </span><span class="lineCov"> 1936261 : blocks = data;</span>
<span class="lineNum"> 99 </span><span class="lineCov"> 1936261 : end = blocks + nblocks * 4;</span>
<span class="lineNum"> 100 </span> :
<span class="lineNum"> 101 </span> : /* body */
<span class="lineNum"> 102 </span><span class="lineCov"> 119857435 : while (blocks &lt; end) {</span>
<span class="lineNum"> 103 </span><span class="lineCov"> 115352271 : uint32_t k1 = blocks[0];</span>
<span class="lineNum"> 104 </span><span class="lineCov"> 115352271 : uint32_t k2 = blocks[1];</span>
<span class="lineNum"> 105 </span><span class="lineCov"> 115352271 : uint32_t k3 = blocks[2];</span>
<span class="lineNum"> 106 </span><span class="lineCov"> 115352271 : uint32_t k4 = blocks[3];</span>
<span class="lineNum"> 102 </span><span class="lineCov"> 103248950 : while (blocks &lt; end) {</span>
<span class="lineNum"> 103 </span><span class="lineCov"> 99376428 : uint32_t k1 = blocks[0];</span>
<span class="lineNum"> 104 </span><span class="lineCov"> 99376428 : uint32_t k2 = blocks[1];</span>
<span class="lineNum"> 105 </span><span class="lineCov"> 99376428 : uint32_t k3 = blocks[2];</span>
<span class="lineNum"> 106 </span><span class="lineCov"> 99376428 : uint32_t k4 = blocks[3];</span>
<span class="lineNum"> 107 </span> :
<span class="lineNum"> 108 </span> : #if WORDS_BIGENDIAN
<span class="lineNum"> 109 </span> : k1 = util_swap32(k1);
@ -174,71 +174,71 @@
<span class="lineNum"> 112 </span> : k4 = util_swap32(k4);
<span class="lineNum"> 113 </span> : #endif
<span class="lineNum"> 114 </span> :
<span class="lineNum"> 115 </span><span class="lineCov"> 115352271 : k1 *= c1; k1 = util_rotl32(k1, 15); k1 *= c2; h1 ^= k1;</span>
<span class="lineNum"> 115 </span><span class="lineCov"> 99376428 : k1 *= c1; k1 = util_rotl32(k1, 15); k1 *= c2; h1 ^= k1;</span>
<span class="lineNum"> 116 </span> :
<span class="lineNum"> 117 </span><span class="lineCov"> 115352271 : h1 = util_rotl32(h1, 19); h1 += h2; h1 = h1 * 5 + 0x561ccd1b;</span>
<span class="lineNum"> 117 </span><span class="lineCov"> 99376428 : h1 = util_rotl32(h1, 19); h1 += h2; h1 = h1 * 5 + 0x561ccd1b;</span>
<span class="lineNum"> 118 </span> :
<span class="lineNum"> 119 </span><span class="lineCov"> 115352271 : k2 *= c2; k2 = util_rotl32(k2, 16); k2 *= c3; h2 ^= k2;</span>
<span class="lineNum"> 119 </span><span class="lineCov"> 99376428 : k2 *= c2; k2 = util_rotl32(k2, 16); k2 *= c3; h2 ^= k2;</span>
<span class="lineNum"> 120 </span> :
<span class="lineNum"> 121 </span><span class="lineCov"> 115352271 : h2 = util_rotl32(h2, 17); h2 += h3; h2 = h2 * 5 + 0x0bcaa747;</span>
<span class="lineNum"> 121 </span><span class="lineCov"> 99376428 : h2 = util_rotl32(h2, 17); h2 += h3; h2 = h2 * 5 + 0x0bcaa747;</span>
<span class="lineNum"> 122 </span> :
<span class="lineNum"> 123 </span><span class="lineCov"> 115352271 : k3 *= c3; k3 = util_rotl32(k3, 17); k3 *= c4; h3 ^= k3;</span>
<span class="lineNum"> 123 </span><span class="lineCov"> 99376428 : k3 *= c3; k3 = util_rotl32(k3, 17); k3 *= c4; h3 ^= k3;</span>
<span class="lineNum"> 124 </span> :
<span class="lineNum"> 125 </span><span class="lineCov"> 115352271 : h3 = util_rotl32(h3, 15); h3 += h4; h3 = h3 * 5 + 0x96cd1c35;</span>
<span class="lineNum"> 125 </span><span class="lineCov"> 99376428 : h3 = util_rotl32(h3, 15); h3 += h4; h3 = h3 * 5 + 0x96cd1c35;</span>
<span class="lineNum"> 126 </span> :
<span class="lineNum"> 127 </span><span class="lineCov"> 115352271 : k4 *= c4; k4 = util_rotl32(k4, 18); k4 *= c1; h4 ^= k4;</span>
<span class="lineNum"> 127 </span><span class="lineCov"> 99376428 : k4 *= c4; k4 = util_rotl32(k4, 18); k4 *= c1; h4 ^= k4;</span>
<span class="lineNum"> 128 </span> :
<span class="lineNum"> 129 </span><span class="lineCov"> 115352271 : h4 = util_rotl32(h4, 13); h4 += h1; h4 = h4 * 5 + 0x32ac3b17;</span>
<span class="lineNum"> 129 </span><span class="lineCov"> 99376428 : h4 = util_rotl32(h4, 13); h4 += h1; h4 = h4 * 5 + 0x32ac3b17;</span>
<span class="lineNum"> 130 </span> :
<span class="lineNum"> 131 </span><span class="lineCov"> 115352271 : blocks += 4;</span>
<span class="lineNum"> 131 </span><span class="lineCov"> 99376428 : blocks += 4;</span>
<span class="lineNum"> 132 </span> : }
<span class="lineNum"> 133 </span> :
<span class="lineNum"> 134 </span> : /* tail */
<span class="lineNum"> 135 </span><span class="lineCov"> 2252582 : size_remainder = size &amp; 15;</span>
<span class="lineNum"> 136 </span><span class="lineCov"> 2252582 : if (size_remainder != 0) {</span>
<span class="lineNum"> 137 </span><span class="lineCov"> 848153 : const uint8_t* tail = (const uint8_t*)blocks;</span>
<span class="lineNum"> 135 </span><span class="lineCov"> 1936261 : size_remainder = size &amp; 15;</span>
<span class="lineNum"> 136 </span><span class="lineCov"> 1936261 : if (size_remainder != 0) {</span>
<span class="lineNum"> 137 </span><span class="lineCov"> 726747 : const uint8_t* tail = (const uint8_t*)blocks;</span>
<span class="lineNum"> 138 </span> :
<span class="lineNum"> 139 </span><span class="lineCov"> 848153 : uint32_t k1 = 0;</span>
<span class="lineNum"> 140 </span><span class="lineCov"> 848153 : uint32_t k2 = 0;</span>
<span class="lineNum"> 141 </span><span class="lineCov"> 848153 : uint32_t k3 = 0;</span>
<span class="lineNum"> 142 </span><span class="lineCov"> 848153 : uint32_t k4 = 0;</span>
<span class="lineNum"> 139 </span><span class="lineCov"> 726747 : uint32_t k1 = 0;</span>
<span class="lineNum"> 140 </span><span class="lineCov"> 726747 : uint32_t k2 = 0;</span>
<span class="lineNum"> 141 </span><span class="lineCov"> 726747 : uint32_t k3 = 0;</span>
<span class="lineNum"> 142 </span><span class="lineCov"> 726747 : uint32_t k4 = 0;</span>
<span class="lineNum"> 143 </span> :
<span class="lineNum"> 144 </span><span class="lineCov"> 848153 : switch (size_remainder) {</span>
<span class="lineNum"> 145 </span><span class="lineCov"> 55834 : case 15 : k4 ^= tail[14] &lt;&lt; 16;</span>
<span class="lineNum"> 146 </span><span class="lineCov"> 112972 : case 14 : k4 ^= tail[13] &lt;&lt; 8;</span>
<span class="lineNum"> 147 </span><span class="lineCov"> 170132 : case 13 : k4 ^= tail[12] &lt;&lt; 0;</span>
<span class="lineNum"> 148 </span><span class="lineCov"> 170132 : k4 *= c4; k4 = util_rotl32(k4, 18); k4 *= c1; h4 ^= k4;</span>
<span class="lineNum"> 149 </span><span class="lineCov"> 227529 : case 12 : k3 ^= tail[11] &lt;&lt; 24;</span>
<span class="lineNum"> 150 </span><span class="lineCov"> 284808 : case 11 : k3 ^= tail[10] &lt;&lt; 16;</span>
<span class="lineNum"> 151 </span><span class="lineCov"> 341803 : case 10 : k3 ^= tail[ 9] &lt;&lt; 8;</span>
<span class="lineNum"> 152 </span><span class="lineCov"> 400242 : case 9 : k3 ^= tail[ 8] &lt;&lt; 0;</span>
<span class="lineNum"> 153 </span><span class="lineCov"> 400242 : k3 *= c3; k3 = util_rotl32(k3, 17); k3 *= c4; h3 ^= k3;</span>
<span class="lineNum"> 154 </span><span class="lineCov"> 458531 : case 8 : k2 ^= tail[ 7] &lt;&lt; 24;</span>
<span class="lineNum"> 155 </span><span class="lineCov"> 512645 : case 7 : k2 ^= tail[ 6] &lt;&lt; 16;</span>
<span class="lineNum"> 156 </span><span class="lineCov"> 569544 : case 6 : k2 ^= tail[ 5] &lt;&lt; 8;</span>
<span class="lineNum"> 157 </span><span class="lineCov"> 624516 : case 5 : k2 ^= tail[ 4] &lt;&lt; 0;</span>
<span class="lineNum"> 158 </span><span class="lineCov"> 624516 : k2 *= c2; k2 = util_rotl32(k2, 16); k2 *= c3; h2 ^= k2;</span>
<span class="lineNum"> 159 </span><span class="lineCov"> 680502 : case 4 : k1 ^= tail[ 3] &lt;&lt; 24;</span>
<span class="lineNum"> 160 </span><span class="lineCov"> 735518 : case 3 : k1 ^= tail[ 2] &lt;&lt; 16;</span>
<span class="lineNum"> 161 </span><span class="lineCov"> 791435 : case 2 : k1 ^= tail[ 1] &lt;&lt; 8;</span>
<span class="lineNum"> 162 </span><span class="lineCov"> 848153 : case 1 : k1 ^= tail[ 0] &lt;&lt; 0;</span>
<span class="lineNum"> 163 </span><span class="lineCov"> 848153 : k1 *= c1; k1 = util_rotl32(k1, 15); k1 *= c2; h1 ^= k1;</span>
<span class="lineNum"> 144 </span><span class="lineCov"> 726747 : switch (size_remainder) {</span>
<span class="lineNum"> 145 </span><span class="lineCov"> 47814 : case 15 : k4 ^= (uint32_t)tail[14] &lt;&lt; 16;</span>
<span class="lineNum"> 146 </span><span class="lineCov"> 97089 : case 14 : k4 ^= (uint32_t)tail[13] &lt;&lt; 8;</span>
<span class="lineNum"> 147 </span><span class="lineCov"> 145774 : case 13 : k4 ^= (uint32_t)tail[12] &lt;&lt; 0;</span>
<span class="lineNum"> 148 </span><span class="lineCov"> 145774 : k4 *= c4; k4 = util_rotl32(k4, 18); k4 *= c1; h4 ^= k4;</span>
<span class="lineNum"> 149 </span><span class="lineCov"> 194991 : case 12 : k3 ^= (uint32_t)tail[11] &lt;&lt; 24;</span>
<span class="lineNum"> 150 </span><span class="lineCov"> 244008 : case 11 : k3 ^= (uint32_t)tail[10] &lt;&lt; 16;</span>
<span class="lineNum"> 151 </span><span class="lineCov"> 292626 : case 10 : k3 ^= (uint32_t)tail[ 9] &lt;&lt; 8;</span>
<span class="lineNum"> 152 </span><span class="lineCov"> 342276 : case 9 : k3 ^= (uint32_t)tail[ 8] &lt;&lt; 0;</span>
<span class="lineNum"> 153 </span><span class="lineCov"> 342276 : k3 *= c3; k3 = util_rotl32(k3, 17); k3 *= c4; h3 ^= k3;</span>
<span class="lineNum"> 154 </span><span class="lineCov"> 392525 : case 8 : k2 ^= (uint32_t)tail[ 7] &lt;&lt; 24;</span>
<span class="lineNum"> 155 </span><span class="lineCov"> 438669 : case 7 : k2 ^= (uint32_t)tail[ 6] &lt;&lt; 16;</span>
<span class="lineNum"> 156 </span><span class="lineCov"> 487770 : case 6 : k2 ^= (uint32_t)tail[ 5] &lt;&lt; 8;</span>
<span class="lineNum"> 157 </span><span class="lineCov"> 534928 : case 5 : k2 ^= (uint32_t)tail[ 4] &lt;&lt; 0;</span>
<span class="lineNum"> 158 </span><span class="lineCov"> 534928 : k2 *= c2; k2 = util_rotl32(k2, 16); k2 *= c3; h2 ^= k2;</span>
<span class="lineNum"> 159 </span><span class="lineCov"> 583310 : case 4 : k1 ^= (uint32_t)tail[ 3] &lt;&lt; 24;</span>
<span class="lineNum"> 160 </span><span class="lineCov"> 630301 : case 3 : k1 ^= (uint32_t)tail[ 2] &lt;&lt; 16;</span>
<span class="lineNum"> 161 </span><span class="lineCov"> 678080 : case 2 : k1 ^= (uint32_t)tail[ 1] &lt;&lt; 8;</span>
<span class="lineNum"> 162 </span><span class="lineCov"> 726747 : case 1 : k1 ^= (uint32_t)tail[ 0] &lt;&lt; 0;</span>
<span class="lineNum"> 163 </span><span class="lineCov"> 726747 : k1 *= c1; k1 = util_rotl32(k1, 15); k1 *= c2; h1 ^= k1;</span>
<span class="lineNum"> 164 </span> : }
<span class="lineNum"> 165 </span> : }
<span class="lineNum"> 166 </span> :
<span class="lineNum"> 167 </span> : /* finalization */
<span class="lineNum"> 168 </span><span class="lineCov"> 2252582 : h1 ^= size; h2 ^= size; h3 ^= size; h4 ^= size;</span>
<span class="lineNum"> 168 </span><span class="lineCov"> 1936261 : h1 ^= size; h2 ^= size; h3 ^= size; h4 ^= size;</span>
<span class="lineNum"> 169 </span> :
<span class="lineNum"> 170 </span><span class="lineCov"> 2252582 : h1 += h2; h1 += h3; h1 += h4;</span>
<span class="lineNum"> 171 </span><span class="lineCov"> 2252582 : h2 += h1; h3 += h1; h4 += h1;</span>
<span class="lineNum"> 170 </span><span class="lineCov"> 1936261 : h1 += h2; h1 += h3; h1 += h4;</span>
<span class="lineNum"> 171 </span><span class="lineCov"> 1936261 : h2 += h1; h3 += h1; h4 += h1;</span>
<span class="lineNum"> 172 </span> :
<span class="lineNum"> 173 </span><span class="lineCov"> 2252582 : h1 = fmix32(h1);</span>
<span class="lineNum"> 174 </span><span class="lineCov"> 2252582 : h2 = fmix32(h2);</span>
<span class="lineNum"> 175 </span><span class="lineCov"> 2252582 : h3 = fmix32(h3);</span>
<span class="lineNum"> 176 </span><span class="lineCov"> 2252582 : h4 = fmix32(h4);</span>
<span class="lineNum"> 173 </span><span class="lineCov"> 1936261 : h1 = fmix32(h1);</span>
<span class="lineNum"> 174 </span><span class="lineCov"> 1936261 : h2 = fmix32(h2);</span>
<span class="lineNum"> 175 </span><span class="lineCov"> 1936261 : h3 = fmix32(h3);</span>
<span class="lineNum"> 176 </span><span class="lineCov"> 1936261 : h4 = fmix32(h4);</span>
<span class="lineNum"> 177 </span> :
<span class="lineNum"> 178 </span><span class="lineCov"> 2252582 : h1 += h2; h1 += h3; h1 += h4;</span>
<span class="lineNum"> 179 </span><span class="lineCov"> 2252582 : h2 += h1; h3 += h1; h4 += h1;</span>
<span class="lineNum"> 178 </span><span class="lineCov"> 1936261 : h1 += h2; h1 += h3; h1 += h4;</span>
<span class="lineNum"> 179 </span><span class="lineCov"> 1936261 : h2 += h1; h3 += h1; h4 += h1;</span>
<span class="lineNum"> 180 </span> :
<span class="lineNum"> 181 </span> : #if WORDS_BIGENDIAN
<span class="lineNum"> 182 </span> : h1 = util_swap32(h1);
@ -247,11 +247,11 @@
<span class="lineNum"> 185 </span> : h4 = util_swap32(h4);
<span class="lineNum"> 186 </span> : #endif
<span class="lineNum"> 187 </span> :
<span class="lineNum"> 188 </span><span class="lineCov"> 2252582 : ((uint32_t*)digest)[0] = h1;</span>
<span class="lineNum"> 189 </span><span class="lineCov"> 2252582 : ((uint32_t*)digest)[1] = h2;</span>
<span class="lineNum"> 190 </span><span class="lineCov"> 2252582 : ((uint32_t*)digest)[2] = h3;</span>
<span class="lineNum"> 191 </span><span class="lineCov"> 2252582 : ((uint32_t*)digest)[3] = h4;</span>
<span class="lineNum"> 192 </span><span class="lineCov"> 2252582 : }</span>
<span class="lineNum"> 188 </span><span class="lineCov"> 1936261 : ((uint32_t*)digest)[0] = h1;</span>
<span class="lineNum"> 189 </span><span class="lineCov"> 1936261 : ((uint32_t*)digest)[1] = h2;</span>
<span class="lineNum"> 190 </span><span class="lineCov"> 1936261 : ((uint32_t*)digest)[2] = h3;</span>
<span class="lineNum"> 191 </span><span class="lineCov"> 1936261 : ((uint32_t*)digest)[3] = h4;</span>
<span class="lineNum"> 192 </span><span class="lineCov"> 1936261 : }</span>
<span class="lineNum"> 193 </span> :
</pre>
</td>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">1</td>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">1</td>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">1</td>
@ -96,13 +96,13 @@
<span class="lineNum"> 34 </span> : tommy_node* j;
<span class="lineNum"> 35 </span> :
<span class="lineNum"> 36 </span> : /* for all files */
<span class="lineNum"> 37 </span><span class="lineCov"> 5724 : for (j = disk-&gt;filelist; j != 0; j = j-&gt;next) {</span>
<span class="lineNum"> 38 </span><span class="lineCov"> 5718 : struct snapraid_file* file = j-&gt;data;</span>
<span class="lineNum"> 37 </span><span class="lineCov"> 5731 : for (j = disk-&gt;filelist; j != 0; j = j-&gt;next) {</span>
<span class="lineNum"> 38 </span><span class="lineCov"> 5725 : struct snapraid_file* file = j-&gt;data;</span>
<span class="lineNum"> 39 </span> :
<span class="lineNum"> 40 </span> : /* if the file has a zero nanosecond timestamp */
<span class="lineNum"> 41 </span> : /* note that symbolic links are not in the file list */
<span class="lineNum"> 42 </span> : /* and then are not processed */
<span class="lineNum"> 43 </span><span class="lineCov"> 5718 : if (file-&gt;mtime_nsec == 0) {</span>
<span class="lineNum"> 43 </span><span class="lineCov"> 5725 : if (file-&gt;mtime_nsec == 0) {</span>
<span class="lineNum"> 44 </span> : char path[PATH_MAX];
<span class="lineNum"> 45 </span> : struct stat st;
<span class="lineNum"> 46 </span> : int f;
@ -180,7 +180,7 @@
<span class="lineNum"> 118 </span> :
<span class="lineNum"> 119 </span> : /* set the same nanosecond value in the content file */
<span class="lineNum"> 120 </span> : /* note that if the seconds value is already matching */
<span class="lineNum"> 121 </span> : /* the file won't be synched because the content file will */
<span class="lineNum"> 121 </span> : /* the file won't be synced because the content file will */
<span class="lineNum"> 122 </span> : /* contain the new updated timestamp */
<span class="lineNum"> 123 </span><span class="lineCov"> 16 : file-&gt;mtime_nsec = STAT_NSEC(&amp;st);</span>
<span class="lineNum"> 124 </span> :

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">10</td>
@ -61,39 +61,39 @@
</tr>
<tr>
<td class="coverFn"><a href="parity.c.gcov.html#470">parity_read</a></td>
<td class="coverFnHi">3488577</td>
<td class="coverFnHi">3492991</td>
</tr>
<tr>
<td class="coverFn"><a href="parity.c.gcov.html#425">parity_write</a></td>
<td class="coverFnHi">506040</td>
<td class="coverFnHi">559380</td>
</tr>
<tr>
<td class="coverFn"><a href="parity.c.gcov.html#399">parity_close</a></td>
<td class="coverFnHi">952</td>
<td class="coverFnHi">1000</td>
</tr>
<tr>
<td class="coverFn"><a href="parity.c.gcov.html#27">parity_allocated_size</a></td>
<td class="coverFnHi">589</td>
<td class="coverFnHi">616</td>
</tr>
<tr>
<td class="coverFn"><a href="parity.c.gcov.html#150">parity_create</a></td>
<td class="coverFnHi">551</td>
<td class="coverFnHi">599</td>
</tr>
<tr>
<td class="coverFn"><a href="parity.c.gcov.html#207">parity_chsize</a></td>
<td class="coverFnHi">551</td>
<td class="coverFnHi">599</td>
</tr>
<tr>
<td class="coverFn"><a href="parity.c.gcov.html#379">parity_sync</a></td>
<td class="coverFnHi">447</td>
</tr>
<tr>
<td class="coverFn"><a href="parity.c.gcov.html#324">parity_open</a></td>
<td class="coverFnHi">402</td>
</tr>
<tr>
<td class="coverFn"><a href="parity.c.gcov.html#379">parity_sync</a></td>
<td class="coverFnHi">399</td>
</tr>
<tr>
<td class="coverFn"><a href="parity.c.gcov.html#54">parity_used_size</a></td>
<td class="coverFnHi">72</td>
<td class="coverFnHi">80</td>
</tr>
<tr>
<td class="coverFn"><a href="parity.c.gcov.html#79">parity_is_invalid</a></td>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">10</td>
@ -61,19 +61,19 @@
</tr>
<tr>
<td class="coverFn"><a href="parity.c.gcov.html#27">parity_allocated_size</a></td>
<td class="coverFnHi">589</td>
<td class="coverFnHi">616</td>
</tr>
<tr>
<td class="coverFn"><a href="parity.c.gcov.html#207">parity_chsize</a></td>
<td class="coverFnHi">551</td>
<td class="coverFnHi">599</td>
</tr>
<tr>
<td class="coverFn"><a href="parity.c.gcov.html#399">parity_close</a></td>
<td class="coverFnHi">952</td>
<td class="coverFnHi">1000</td>
</tr>
<tr>
<td class="coverFn"><a href="parity.c.gcov.html#150">parity_create</a></td>
<td class="coverFnHi">551</td>
<td class="coverFnHi">599</td>
</tr>
<tr>
<td class="coverFn"><a href="parity.c.gcov.html#79">parity_is_invalid</a></td>
@ -89,19 +89,19 @@
</tr>
<tr>
<td class="coverFn"><a href="parity.c.gcov.html#470">parity_read</a></td>
<td class="coverFnHi">3488577</td>
<td class="coverFnHi">3492991</td>
</tr>
<tr>
<td class="coverFn"><a href="parity.c.gcov.html#379">parity_sync</a></td>
<td class="coverFnHi">399</td>
<td class="coverFnHi">447</td>
</tr>
<tr>
<td class="coverFn"><a href="parity.c.gcov.html#54">parity_used_size</a></td>
<td class="coverFnHi">72</td>
<td class="coverFnHi">80</td>
</tr>
<tr>
<td class="coverFn"><a href="parity.c.gcov.html#425">parity_write</a></td>
<td class="coverFnHi">506040</td>
<td class="coverFnHi">559380</td>
</tr>
</table>
<br>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">10</td>
@ -88,56 +88,56 @@
<span class="lineNum"> 26 </span> : /****************************************************************************/
<a name="27"><span class="lineNum"> 27 </span> : /* parity */</a>
<span class="lineNum"> 28 </span> :
<span class="lineNum"> 29 </span><span class="lineCov"> 589 : block_off_t parity_allocated_size(struct snapraid_state* state)</span>
<span class="lineNum"> 29 </span><span class="lineCov"> 616 : block_off_t parity_allocated_size(struct snapraid_state* state)</span>
<span class="lineNum"> 30 </span> : {
<span class="lineNum"> 31 </span> : block_off_t parity_block;
<span class="lineNum"> 32 </span> : tommy_node* i;
<span class="lineNum"> 33 </span> :
<span class="lineNum"> 34 </span> : /* compute the size of the parity file */
<span class="lineNum"> 35 </span><span class="lineCov"> 589 : parity_block = 0;</span>
<span class="lineNum"> 36 </span><span class="lineCov"> 4113 : for (i = state-&gt;disklist; i != 0; i = i-&gt;next) {</span>
<span class="lineNum"> 37 </span><span class="lineCov"> 3524 : struct snapraid_disk* disk = i-&gt;data;</span>
<span class="lineNum"> 35 </span><span class="lineCov"> 616 : parity_block = 0;</span>
<span class="lineNum"> 36 </span><span class="lineCov"> 4302 : for (i = state-&gt;disklist; i != 0; i = i-&gt;next) {</span>
<span class="lineNum"> 37 </span><span class="lineCov"> 3686 : struct snapraid_disk* disk = i-&gt;data;</span>
<span class="lineNum"> 38 </span> :
<span class="lineNum"> 39 </span> : /* start from the declared size */
<span class="lineNum"> 40 </span><span class="lineCov"> 3524 : block_off_t block = disk_size(disk);</span>
<span class="lineNum"> 40 </span><span class="lineCov"> 3686 : block_off_t block = disk_size(disk);</span>
<span class="lineNum"> 41 </span> :
<span class="lineNum"> 42 </span> : /* decrease the block until an allocated one, but part of a file */
<span class="lineNum"> 43 </span> : /* we don't stop at deleted blocks, because we want to have them cleared */
<span class="lineNum"> 44 </span> : /* if they are at the end of the parity */
<span class="lineNum"> 45 </span><span class="lineCov"> 189514 : while (block &gt; parity_block &amp;&amp; !block_has_file(fs_par2block_get(disk, block - 1)))</span>
<span class="lineNum"> 46 </span><span class="lineCov"> 182466 : --block;</span>
<span class="lineNum"> 45 </span><span class="lineCov"> 128726 : while (block &gt; parity_block &amp;&amp; !block_has_file(fs_par2block_get(disk, block - 1)))</span>
<span class="lineNum"> 46 </span><span class="lineCov"> 121354 : --block;</span>
<span class="lineNum"> 47 </span> :
<span class="lineNum"> 48 </span> : /* get the highest value */
<span class="lineNum"> 49 </span><span class="lineCov"> 3524 : if (block &gt; parity_block)</span>
<span class="lineNum"> 50 </span><span class="lineCov"> 2273 : parity_block = block;</span>
<span class="lineNum"> 49 </span><span class="lineCov"> 3686 : if (block &gt; parity_block)</span>
<span class="lineNum"> 50 </span><span class="lineCov"> 2201 : parity_block = block;</span>
<span class="lineNum"> 51 </span> : }
<span class="lineNum"> 52 </span> :
<span class="lineNum"> 53 </span><span class="lineCov"> 589 : return parity_block;</span>
<span class="lineNum"> 53 </span><span class="lineCov"> 616 : return parity_block;</span>
<a name="54"><span class="lineNum"> 54 </span> : }</a>
<span class="lineNum"> 55 </span> :
<span class="lineNum"> 56 </span><span class="lineCov"> 72 : block_off_t parity_used_size(struct snapraid_state* state)</span>
<span class="lineNum"> 56 </span><span class="lineCov"> 80 : block_off_t parity_used_size(struct snapraid_state* state)</span>
<span class="lineNum"> 57 </span> : {
<span class="lineNum"> 58 </span> : block_off_t parity_block;
<span class="lineNum"> 59 </span> : tommy_node* i;
<span class="lineNum"> 60 </span> :
<span class="lineNum"> 61 </span> : /* compute the size of the parity file */
<span class="lineNum"> 62 </span><span class="lineCov"> 72 : parity_block = 0;</span>
<span class="lineNum"> 63 </span><span class="lineCov"> 503 : for (i = state-&gt;disklist; i != 0; i = i-&gt;next) {</span>
<span class="lineNum"> 64 </span><span class="lineCov"> 431 : struct snapraid_disk* disk = i-&gt;data;</span>
<span class="lineNum"> 62 </span><span class="lineCov"> 80 : parity_block = 0;</span>
<span class="lineNum"> 63 </span><span class="lineCov"> 559 : for (i = state-&gt;disklist; i != 0; i = i-&gt;next) {</span>
<span class="lineNum"> 64 </span><span class="lineCov"> 479 : struct snapraid_disk* disk = i-&gt;data;</span>
<span class="lineNum"> 65 </span> :
<span class="lineNum"> 66 </span> : /* start from the declared size */
<span class="lineNum"> 67 </span><span class="lineCov"> 431 : block_off_t block = disk_size(disk);</span>
<span class="lineNum"> 67 </span><span class="lineCov"> 479 : block_off_t block = disk_size(disk);</span>
<span class="lineNum"> 68 </span> :
<span class="lineNum"> 69 </span> : /* decrease the block until an used one */
<span class="lineNum"> 70 </span><span class="lineCov"> 221700 : while (block &gt; parity_block &amp;&amp; !block_has_file_and_valid_parity(fs_par2block_get(disk, block - 1)))</span>
<span class="lineNum"> 71 </span><span class="lineCov"> 220838 : --block;</span>
<span class="lineNum"> 70 </span><span class="lineCov"> 258592 : while (block &gt; parity_block &amp;&amp; !block_has_file_and_valid_parity(fs_par2block_get(disk, block - 1)))</span>
<span class="lineNum"> 71 </span><span class="lineCov"> 257634 : --block;</span>
<span class="lineNum"> 72 </span> :
<span class="lineNum"> 73 </span> : /* get the highest value */
<span class="lineNum"> 74 </span><span class="lineCov"> 431 : if (block &gt; parity_block)</span>
<span class="lineNum"> 75 </span><span class="lineCov"> 262 : parity_block = block;</span>
<span class="lineNum"> 74 </span><span class="lineCov"> 479 : if (block &gt; parity_block)</span>
<span class="lineNum"> 75 </span><span class="lineCov"> 259 : parity_block = block;</span>
<span class="lineNum"> 76 </span> : }
<span class="lineNum"> 77 </span> :
<span class="lineNum"> 78 </span><span class="lineCov"> 72 : return parity_block;</span>
<span class="lineNum"> 78 </span><span class="lineCov"> 80 : return parity_block;</span>
<a name="79"><span class="lineNum"> 79 </span> : }</a>
<span class="lineNum"> 80 </span> :
<span class="lineNum"> 81 </span><span class="lineCov"> 1 : int parity_is_invalid(struct snapraid_state* state)</span>
@ -211,20 +211,20 @@
<span class="lineNum"> 149 </span> : }
<a name="150"><span class="lineNum"> 150 </span> : }</a>
<span class="lineNum"> 151 </span> :
<span class="lineNum"> 152 </span><span class="lineCov"> 551 : int parity_create(struct snapraid_parity_handle* parity, const char* path, data_off_t* out_size, int mode)</span>
<span class="lineNum"> 152 </span><span class="lineCov"> 599 : int parity_create(struct snapraid_parity_handle* parity, const char* path, data_off_t* out_size, int mode)</span>
<span class="lineNum"> 153 </span> : {
<span class="lineNum"> 154 </span> : int ret;
<span class="lineNum"> 155 </span> : int flags;
<span class="lineNum"> 156 </span> :
<span class="lineNum"> 157 </span><span class="lineCov"> 551 : pathcpy(parity-&gt;path, sizeof(parity-&gt;path), path);</span>
<span class="lineNum"> 157 </span><span class="lineCov"> 599 : pathcpy(parity-&gt;path, sizeof(parity-&gt;path), path);</span>
<span class="lineNum"> 158 </span> :
<span class="lineNum"> 159 </span> : /* opening in sequential mode in Windows */
<span class="lineNum"> 160 </span> : /* O_SEQUENTIAL: opening in sequential mode in Windows */
<span class="lineNum"> 161 </span><span class="lineCov"> 551 : flags = O_RDWR | O_CREAT | O_BINARY;</span>
<span class="lineNum"> 162 </span><span class="lineCov"> 551 : if ((mode &amp; MODE_SEQUENTIAL) != 0)</span>
<span class="lineNum"> 163 </span><span class="lineCov"> 551 : flags |= O_SEQUENTIAL;</span>
<span class="lineNum"> 164 </span><span class="lineCov"> 551 : parity-&gt;f = open(parity-&gt;path, flags, 0600);</span>
<span class="lineNum"> 165 </span><span class="lineCov"> 551 : if (parity-&gt;f == -1) {</span>
<span class="lineNum"> 161 </span><span class="lineCov"> 599 : flags = O_RDWR | O_CREAT | O_BINARY;</span>
<span class="lineNum"> 162 </span><span class="lineCov"> 599 : if ((mode &amp; MODE_SEQUENTIAL) != 0)</span>
<span class="lineNum"> 163 </span><span class="lineCov"> 599 : flags |= O_SEQUENTIAL;</span>
<span class="lineNum"> 164 </span><span class="lineCov"> 599 : parity-&gt;f = open(parity-&gt;path, flags, 0600);</span>
<span class="lineNum"> 165 </span><span class="lineCov"> 599 : if (parity-&gt;f == -1) {</span>
<span class="lineNum"> 166 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 167 </span> : log_fatal(&quot;Error opening parity file '%s'. %s.\n&quot;, parity-&gt;path, strerror(errno));
<span class="lineNum"> 168 </span> : return -1;
@ -232,8 +232,8 @@
<span class="lineNum"> 170 </span> : }
<span class="lineNum"> 171 </span> :
<span class="lineNum"> 172 </span> : /* get the stat info */
<span class="lineNum"> 173 </span><span class="lineCov"> 551 : ret = fstat(parity-&gt;f, &amp;parity-&gt;st);</span>
<span class="lineNum"> 174 </span><span class="lineCov"> 551 : if (ret != 0) {</span>
<span class="lineNum"> 173 </span><span class="lineCov"> 599 : ret = fstat(parity-&gt;f, &amp;parity-&gt;st);</span>
<span class="lineNum"> 174 </span><span class="lineCov"> 599 : if (ret != 0) {</span>
<span class="lineNum"> 175 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 176 </span> : log_fatal(&quot;Error accessing parity file '%s'. %s.\n&quot;, parity-&gt;path, strerror(errno));
<span class="lineNum"> 177 </span> : goto bail;
@ -241,10 +241,10 @@
<span class="lineNum"> 179 </span> : }
<span class="lineNum"> 180 </span> :
<span class="lineNum"> 181 </span> : #if HAVE_POSIX_FADVISE
<span class="lineNum"> 182 </span><span class="lineCov"> 551 : if ((mode &amp; MODE_SEQUENTIAL) != 0) {</span>
<span class="lineNum"> 182 </span><span class="lineCov"> 599 : if ((mode &amp; MODE_SEQUENTIAL) != 0) {</span>
<span class="lineNum"> 183 </span> : /* advise sequential access */
<span class="lineNum"> 184 </span><span class="lineCov"> 551 : ret = posix_fadvise(parity-&gt;f, 0, 0, POSIX_FADV_SEQUENTIAL);</span>
<span class="lineNum"> 185 </span><span class="lineCov"> 551 : if (ret != 0) {</span>
<span class="lineNum"> 184 </span><span class="lineCov"> 599 : ret = posix_fadvise(parity-&gt;f, 0, 0, POSIX_FADV_SEQUENTIAL);</span>
<span class="lineNum"> 185 </span><span class="lineCov"> 599 : if (ret != 0) {</span>
<span class="lineNum"> 186 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 187 </span> : log_fatal(&quot;Error advising parity file '%s'. %s.\n&quot;, parity-&gt;path, strerror(ret));
<span class="lineNum"> 188 </span> : goto bail;
@ -254,10 +254,10 @@
<span class="lineNum"> 192 </span> : #endif
<span class="lineNum"> 193 </span> :
<span class="lineNum"> 194 </span> : /* get the size of the existing data */
<span class="lineNum"> 195 </span><span class="lineCov"> 551 : parity-&gt;valid_size = parity-&gt;st.st_size;</span>
<span class="lineNum"> 196 </span><span class="lineCov"> 551 : *out_size = parity-&gt;st.st_size;</span>
<span class="lineNum"> 195 </span><span class="lineCov"> 599 : parity-&gt;valid_size = parity-&gt;st.st_size;</span>
<span class="lineNum"> 196 </span><span class="lineCov"> 599 : *out_size = parity-&gt;st.st_size;</span>
<span class="lineNum"> 197 </span> :
<span class="lineNum"> 198 </span><span class="lineCov"> 551 : return 0;</span>
<span class="lineNum"> 198 </span><span class="lineCov"> 599 : return 0;</span>
<span class="lineNum"> 199 </span> :
<span class="lineNum"> 200 </span> : bail:
<span class="lineNum"> 201 </span> : /* LCOV_EXCL_START */
@ -268,28 +268,28 @@
<span class="lineNum"> 206 </span> : /* LCOV_EXCL_STOP */
<a name="207"><span class="lineNum"> 207 </span> : }</a>
<span class="lineNum"> 208 </span> :
<span class="lineNum"> 209 </span><span class="lineCov"> 551 : int parity_chsize(struct snapraid_parity_handle* parity, data_off_t size, data_off_t* out_size, int skip_fallocate)</span>
<span class="lineNum"> 209 </span><span class="lineCov"> 599 : int parity_chsize(struct snapraid_parity_handle* parity, data_off_t size, data_off_t* out_size, int skip_fallocate)</span>
<span class="lineNum"> 210 </span> : {
<span class="lineNum"> 211 </span> : int ret;
<span class="lineNum"> 212 </span> :
<span class="lineNum"> 213 </span><span class="lineCov"> 551 : if (parity-&gt;st.st_size &lt; size) {</span>
<span class="lineNum"> 213 </span><span class="lineCov"> 599 : if (parity-&gt;st.st_size &lt; size) {</span>
<span class="lineNum"> 214 </span> : int f_ret;
<span class="lineNum"> 215 </span> : int f_errno;
<span class="lineNum"> 216 </span> : const char* call;
<span class="lineNum"> 217 </span> :
<span class="lineNum"> 218 </span> : #if HAVE_FALLOCATE
<span class="lineNum"> 219 </span><span class="lineCov"> 83 : call = &quot;fallocate&quot;;</span>
<span class="lineNum"> 220 </span><span class="lineCov"> 83 : if (!skip_fallocate) {</span>
<span class="lineNum"> 219 </span><span class="lineCov"> 95 : call = &quot;fallocate&quot;;</span>
<span class="lineNum"> 220 </span><span class="lineCov"> 95 : if (!skip_fallocate) {</span>
<span class="lineNum"> 221 </span> : /* allocate real space using the specific Linux fallocate() operation. */
<span class="lineNum"> 222 </span> : /* If the underline filesystem doesn't support it, this operation fails, */
<span class="lineNum"> 222 </span> : /* If the underline file-system doesn't support it, this operation fails, */
<span class="lineNum"> 223 </span> : /* instead posix_fallocate() fallbacks to write the whole file. */
<span class="lineNum"> 224 </span><span class="lineCov"> 82 : ret = fallocate(parity-&gt;f, 0, 0, size);</span>
<span class="lineNum"> 224 </span><span class="lineCov"> 94 : ret = fallocate(parity-&gt;f, 0, 0, size);</span>
<span class="lineNum"> 225 </span> :
<span class="lineNum"> 226 </span> : /* fallocate() returns the error number as positive integer, */
<span class="lineNum"> 227 </span> : /* and in this case it doesn't set errno, just like posix_fallocate() */
<span class="lineNum"> 228 </span> : /* Checking the glibc code (2.11.1 and 2.14.1) it seems that ENOSYS */
<span class="lineNum"> 229 </span> : /* may be returned in errno, so we support both the return way */
<span class="lineNum"> 230 </span><span class="lineCov"> 82 : if (ret &gt; 0) { /* if a positive error is returned, convert it to errno */</span>
<span class="lineNum"> 230 </span><span class="lineCov"> 94 : if (ret &gt; 0) { /* if a positive error is returned, convert it to errno */</span>
<span class="lineNum"> 231 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 232 </span> : errno = ret;
<span class="lineNum"> 233 </span> : ret = -1;
@ -302,7 +302,7 @@
<span class="lineNum"> 240 </span> :
<span class="lineNum"> 241 </span> : /* we get EOPNOTSUPP if the operation is not supported, like in ext3/ext2 */
<span class="lineNum"> 242 </span> : /* or ENOSYS with kernel before 2.6.23 */
<span class="lineNum"> 243 </span><span class="lineCov"> 83 : if (errno == EOPNOTSUPP || errno == ENOSYS) {</span>
<span class="lineNum"> 243 </span><span class="lineCov"> 95 : if (errno == EOPNOTSUPP || errno == ENOSYS) {</span>
<span class="lineNum"> 244 </span> : /* fallback using ftruncate() */
<span class="lineNum"> 245 </span><span class="lineCov"> 1 : call = &quot;ftruncate&quot;;</span>
<span class="lineNum"> 246 </span><span class="lineCov"> 1 : ret = ftruncate(parity-&gt;f, size);</span>
@ -315,12 +315,12 @@
<span class="lineNum"> 253 </span> : ret = ftruncate(parity-&gt;f, size);
<span class="lineNum"> 254 </span> : #endif
<span class="lineNum"> 255 </span> : /* save the state of the grow operation */
<span class="lineNum"> 256 </span><span class="lineCov"> 83 : f_ret = ret;</span>
<span class="lineNum"> 257 </span><span class="lineCov"> 83 : f_errno = errno;</span>
<span class="lineNum"> 256 </span><span class="lineCov"> 95 : f_ret = ret;</span>
<span class="lineNum"> 257 </span><span class="lineCov"> 95 : f_errno = errno;</span>
<span class="lineNum"> 258 </span> :
<span class="lineNum"> 259 </span> : /* get the stat info */
<span class="lineNum"> 260 </span><span class="lineCov"> 83 : ret = fstat(parity-&gt;f, &amp;parity-&gt;st);</span>
<span class="lineNum"> 261 </span><span class="lineCov"> 83 : if (ret != 0) {</span>
<span class="lineNum"> 260 </span><span class="lineCov"> 95 : ret = fstat(parity-&gt;f, &amp;parity-&gt;st);</span>
<span class="lineNum"> 261 </span><span class="lineCov"> 95 : if (ret != 0) {</span>
<span class="lineNum"> 262 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 263 </span> : log_fatal(&quot;Error accessing parity file '%s'. %s.\n&quot;, parity-&gt;path, strerror(errno));
<span class="lineNum"> 264 </span> : goto bail;
@ -328,10 +328,10 @@
<span class="lineNum"> 266 </span> : }
<span class="lineNum"> 267 </span> :
<span class="lineNum"> 268 </span> : /* return the new size */
<span class="lineNum"> 269 </span><span class="lineCov"> 83 : *out_size = parity-&gt;st.st_size;</span>
<span class="lineNum"> 269 </span><span class="lineCov"> 95 : *out_size = parity-&gt;st.st_size;</span>
<span class="lineNum"> 270 </span> :
<span class="lineNum"> 271 </span> : /* now check the error */
<span class="lineNum"> 272 </span><span class="lineCov"> 83 : if (f_ret != 0) {</span>
<span class="lineNum"> 272 </span><span class="lineCov"> 95 : if (f_ret != 0) {</span>
<span class="lineNum"> 273 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 274 </span> : if (f_errno == ENOSPC) {
<span class="lineNum"> 275 </span> : log_fatal(&quot;Failed to grow parity file '%s' to size %&quot; PRIu64 &quot; using %s due lack of space.\n&quot;, parity-&gt;path, size, call);
@ -341,20 +341,20 @@
<span class="lineNum"> 279 </span> : goto bail;
<span class="lineNum"> 280 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 281 </span> : }
<span class="lineNum"> 282 </span><span class="lineCov"> 468 : } else if (parity-&gt;st.st_size &gt; size) {</span>
<span class="lineNum"> 282 </span><span class="lineCov"> 504 : } else if (parity-&gt;st.st_size &gt; size) {</span>
<span class="lineNum"> 283 </span> : int f_ret;
<span class="lineNum"> 284 </span> : int f_errno;
<span class="lineNum"> 285 </span> :
<span class="lineNum"> 286 </span> : /* truncate the parity file */
<span class="lineNum"> 287 </span><span class="lineCov"> 48 : ret = ftruncate(parity-&gt;f, size);</span>
<span class="lineNum"> 287 </span><span class="lineCov"> 72 : ret = ftruncate(parity-&gt;f, size);</span>
<span class="lineNum"> 288 </span> :
<span class="lineNum"> 289 </span> : /* save the state of the shrink operation */
<span class="lineNum"> 290 </span><span class="lineCov"> 48 : f_ret = ret;</span>
<span class="lineNum"> 291 </span><span class="lineCov"> 48 : f_errno = errno;</span>
<span class="lineNum"> 290 </span><span class="lineCov"> 72 : f_ret = ret;</span>
<span class="lineNum"> 291 </span><span class="lineCov"> 72 : f_errno = errno;</span>
<span class="lineNum"> 292 </span> :
<span class="lineNum"> 293 </span> : /* get the stat info */
<span class="lineNum"> 294 </span><span class="lineCov"> 48 : ret = fstat(parity-&gt;f, &amp;parity-&gt;st);</span>
<span class="lineNum"> 295 </span><span class="lineCov"> 48 : if (ret != 0) {</span>
<span class="lineNum"> 294 </span><span class="lineCov"> 72 : ret = fstat(parity-&gt;f, &amp;parity-&gt;st);</span>
<span class="lineNum"> 295 </span><span class="lineCov"> 72 : if (ret != 0) {</span>
<span class="lineNum"> 296 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 297 </span> : log_fatal(&quot;Error accessing parity file '%s'. %s.\n&quot;, parity-&gt;path, strerror(errno));
<span class="lineNum"> 298 </span> : goto bail;
@ -362,10 +362,10 @@
<span class="lineNum"> 300 </span> : }
<span class="lineNum"> 301 </span> :
<span class="lineNum"> 302 </span> : /* return the new size */
<span class="lineNum"> 303 </span><span class="lineCov"> 48 : *out_size = parity-&gt;st.st_size;</span>
<span class="lineNum"> 303 </span><span class="lineCov"> 72 : *out_size = parity-&gt;st.st_size;</span>
<span class="lineNum"> 304 </span> :
<span class="lineNum"> 305 </span> : /* now check the error */
<span class="lineNum"> 306 </span><span class="lineCov"> 48 : if (f_ret != 0) {</span>
<span class="lineNum"> 306 </span><span class="lineCov"> 72 : if (f_ret != 0) {</span>
<span class="lineNum"> 307 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 308 </span> : log_fatal(&quot;Error truncating parity file '%s' to size %&quot; PRIu64 &quot;. %s.\n&quot;, parity-&gt;path, size, strerror(f_errno));
<span class="lineNum"> 309 </span> : goto bail;
@ -373,10 +373,10 @@
<span class="lineNum"> 311 </span> : }
<span class="lineNum"> 312 </span> :
<span class="lineNum"> 313 </span> : /* adjust the valid to the new size */
<span class="lineNum"> 314 </span><span class="lineCov"> 48 : parity-&gt;valid_size = size;</span>
<span class="lineNum"> 314 </span><span class="lineCov"> 72 : parity-&gt;valid_size = size;</span>
<span class="lineNum"> 315 </span> : }
<span class="lineNum"> 316 </span> :
<span class="lineNum"> 317 </span><span class="lineCov"> 551 : return 0;</span>
<span class="lineNum"> 317 </span><span class="lineCov"> 599 : return 0;</span>
<span class="lineNum"> 318 </span> :
<span class="lineNum"> 319 </span> : bail:
<span class="lineNum"> 320 </span> : /* LCOV_EXCL_START */
@ -413,7 +413,7 @@
<span class="lineNum"> 351 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 352 </span> : }
<span class="lineNum"> 353 </span> :
<span class="lineNum"> 354 </span> : /* get the size of the exising data */
<span class="lineNum"> 354 </span> : /* get the size of the existing data */
<span class="lineNum"> 355 </span><span class="lineCov"> 401 : parity-&gt;valid_size = parity-&gt;st.st_size;</span>
<span class="lineNum"> 356 </span> :
<span class="lineNum"> 357 </span> : #if HAVE_POSIX_FADVISE
@ -440,7 +440,7 @@
<span class="lineNum"> 378 </span> : /* LCOV_EXCL_STOP */
<a name="379"><span class="lineNum"> 379 </span> : }</a>
<span class="lineNum"> 380 </span> :
<span class="lineNum"> 381 </span><span class="lineCov"> 399 : int parity_sync(struct snapraid_parity_handle* parity)</span>
<span class="lineNum"> 381 </span><span class="lineCov"> 447 : int parity_sync(struct snapraid_parity_handle* parity)</span>
<span class="lineNum"> 382 </span> : {
<span class="lineNum"> 383 </span> : #if HAVE_FSYNC
<span class="lineNum"> 384 </span> : int ret;
@ -448,8 +448,8 @@
<span class="lineNum"> 386 </span> : /* Ensure that data changes are written to disk. */
<span class="lineNum"> 387 </span> : /* This is required to ensure that parity is more updated than content */
<span class="lineNum"> 388 </span> : /* in case of a system crash. */
<span class="lineNum"> 389 </span><span class="lineCov"> 399 : ret = fsync(parity-&gt;f);</span>
<span class="lineNum"> 390 </span><span class="lineCov"> 399 : if (ret != 0) {</span>
<span class="lineNum"> 389 </span><span class="lineCov"> 447 : ret = fsync(parity-&gt;f);</span>
<span class="lineNum"> 390 </span><span class="lineCov"> 447 : if (ret != 0) {</span>
<span class="lineNum"> 391 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 392 </span> : log_fatal(&quot;Error synching parity file '%s'. %s.\n&quot;, parity-&gt;path, strerror(errno));
<span class="lineNum"> 393 </span> : return -1;
@ -457,15 +457,15 @@
<span class="lineNum"> 395 </span> : }
<span class="lineNum"> 396 </span> : #endif
<span class="lineNum"> 397 </span> :
<span class="lineNum"> 398 </span><span class="lineCov"> 399 : return 0;</span>
<span class="lineNum"> 398 </span><span class="lineCov"> 447 : return 0;</span>
<a name="399"><span class="lineNum"> 399 </span> : }</a>
<span class="lineNum"> 400 </span> :
<span class="lineNum"> 401 </span><span class="lineCov"> 952 : int parity_close(struct snapraid_parity_handle* parity)</span>
<span class="lineNum"> 401 </span><span class="lineCov"> 1000 : int parity_close(struct snapraid_parity_handle* parity)</span>
<span class="lineNum"> 402 </span> : {
<span class="lineNum"> 403 </span> : int ret;
<span class="lineNum"> 404 </span> :
<span class="lineNum"> 405 </span><span class="lineCov"> 952 : ret = close(parity-&gt;f);</span>
<span class="lineNum"> 406 </span><span class="lineCov"> 952 : if (ret != 0) {</span>
<span class="lineNum"> 405 </span><span class="lineCov"> 1000 : ret = close(parity-&gt;f);</span>
<span class="lineNum"> 406 </span><span class="lineCov"> 1000 : if (ret != 0) {</span>
<span class="lineNum"> 407 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 408 </span> : /* invalidate for error */
<span class="lineNum"> 409 </span> : parity-&gt;f = -1;
@ -473,28 +473,28 @@
<span class="lineNum"> 411 </span> :
<span class="lineNum"> 412 </span> : /* This is a serious error, as it may be the result of a failed write */
<span class="lineNum"> 413 </span> : /* identified at later time. */
<span class="lineNum"> 414 </span> : /* In a normal filesystem (not NFS) it should never happen */
<span class="lineNum"> 414 </span> : /* In a normal file-system (not NFS) it should never happen */
<span class="lineNum"> 415 </span> : log_fatal(&quot;Error closing parity file '%s'. %s.\n&quot;, parity-&gt;path, strerror(errno));
<span class="lineNum"> 416 </span> : return -1;
<span class="lineNum"> 417 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 418 </span> : }
<span class="lineNum"> 419 </span> :
<span class="lineNum"> 420 </span> : /* reset the descriptor */
<span class="lineNum"> 421 </span><span class="lineCov"> 952 : parity-&gt;f = -1;</span>
<span class="lineNum"> 422 </span><span class="lineCov"> 952 : parity-&gt;valid_size = 0;</span>
<span class="lineNum"> 421 </span><span class="lineCov"> 1000 : parity-&gt;f = -1;</span>
<span class="lineNum"> 422 </span><span class="lineCov"> 1000 : parity-&gt;valid_size = 0;</span>
<span class="lineNum"> 423 </span> :
<span class="lineNum"> 424 </span><span class="lineCov"> 952 : return 0;</span>
<span class="lineNum"> 424 </span><span class="lineCov"> 1000 : return 0;</span>
<a name="425"><span class="lineNum"> 425 </span> : }</a>
<span class="lineNum"> 426 </span> :
<span class="lineNum"> 427 </span><span class="lineCov"> 506040 : int parity_write(struct snapraid_parity_handle* parity, block_off_t pos, unsigned char* block_buffer, unsigned block_size)</span>
<span class="lineNum"> 427 </span><span class="lineCov"> 559380 : int parity_write(struct snapraid_parity_handle* parity, block_off_t pos, unsigned char* block_buffer, unsigned block_size)</span>
<span class="lineNum"> 428 </span> : {
<span class="lineNum"> 429 </span> : ssize_t write_ret;
<span class="lineNum"> 430 </span> : data_off_t offset;
<span class="lineNum"> 431 </span> :
<span class="lineNum"> 432 </span><span class="lineCov"> 506040 : offset = pos * (data_off_t)block_size;</span>
<span class="lineNum"> 432 </span><span class="lineCov"> 559380 : offset = pos * (data_off_t)block_size;</span>
<span class="lineNum"> 433 </span> :
<span class="lineNum"> 434 </span> : #if HAVE_PWRITE
<span class="lineNum"> 435 </span><span class="lineCov"> 506040 : write_ret = pwrite(parity-&gt;f, block_buffer, block_size, offset);</span>
<span class="lineNum"> 435 </span><span class="lineCov"> 559380 : write_ret = pwrite(parity-&gt;f, block_buffer, block_size, offset);</span>
<span class="lineNum"> 436 </span> : #else
<span class="lineNum"> 437 </span> : if (lseek(parity-&gt;f, offset, SEEK_SET) != offset) {
<span class="lineNum"> 438 </span> : /* LCOV_EXCL_START */
@ -509,7 +509,7 @@
<span class="lineNum"> 447 </span> :
<span class="lineNum"> 448 </span> : write_ret = write(parity-&gt;f, block_buffer, block_size);
<span class="lineNum"> 449 </span> : #endif
<span class="lineNum"> 450 </span><span class="lineCov"> 506040 : if (write_ret != (ssize_t)block_size) { /* conversion is safe because block_size is always small */</span>
<span class="lineNum"> 450 </span><span class="lineCov"> 559380 : if (write_ret != (ssize_t)block_size) { /* conversion is safe because block_size is always small */</span>
<span class="lineNum"> 451 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 452 </span> : if (errno == ENOSPC) {
<span class="lineNum"> 453 </span> : log_fatal(&quot;Failed to grow parity file '%s' using write due lack of space.\n&quot;, parity-&gt;path);
@ -521,28 +521,28 @@
<span class="lineNum"> 459 </span> : }
<span class="lineNum"> 460 </span> :
<span class="lineNum"> 461 </span> : /* adjust the size of the valid data */
<span class="lineNum"> 462 </span><span class="lineCov"> 506040 : if (parity-&gt;valid_size &lt; offset + block_size) {</span>
<span class="lineNum"> 463 </span><span class="lineCov"> 170559 : parity-&gt;valid_size = offset + block_size;</span>
<span class="lineNum"> 462 </span><span class="lineCov"> 559380 : if (parity-&gt;valid_size &lt; offset + block_size) {</span>
<span class="lineNum"> 463 </span><span class="lineCov"> 171021 : parity-&gt;valid_size = offset + block_size;</span>
<span class="lineNum"> 464 </span> : }
<span class="lineNum"> 465 </span> :
<span class="lineNum"> 466 </span> : /* Here doesn't make sense to call posix_fadvise(..., POSIX_FADV_DONTNEED) because */
<span class="lineNum"> 467 </span> : /* at this time the data is still in not yet written and it cannot be discharged. */
<span class="lineNum"> 468 </span> :
<span class="lineNum"> 469 </span><span class="lineCov"> 506040 : return 0;</span>
<span class="lineNum"> 469 </span><span class="lineCov"> 559380 : return 0;</span>
<a name="470"><span class="lineNum"> 470 </span> : }</a>
<span class="lineNum"> 471 </span> :
<span class="lineNum"> 472 </span><span class="lineCov"> 3488577 : int parity_read(struct snapraid_parity_handle* parity, block_off_t pos, unsigned char* block_buffer, unsigned block_size, fptr* out)</span>
<span class="lineNum"> 472 </span><span class="lineCov"> 3492991 : int parity_read(struct snapraid_parity_handle* parity, block_off_t pos, unsigned char* block_buffer, unsigned block_size, fptr* out)</span>
<span class="lineNum"> 473 </span> : {
<span class="lineNum"> 474 </span> : ssize_t read_ret;
<span class="lineNum"> 475 </span> : data_off_t offset;
<span class="lineNum"> 476 </span> : unsigned count;
<span class="lineNum"> 477 </span> :
<span class="lineNum"> 478 </span><span class="lineCov"> 3488577 : offset = pos * (data_off_t)block_size;</span>
<span class="lineNum"> 478 </span><span class="lineCov"> 3492991 : offset = pos * (data_off_t)block_size;</span>
<span class="lineNum"> 479 </span> :
<span class="lineNum"> 480 </span> : /* check if we are going to read only not initialized data */
<span class="lineNum"> 481 </span><span class="lineCov"> 3488577 : if (offset &gt;= parity-&gt;valid_size) {</span>
<span class="lineNum"> 482 </span><span class="lineCov"> 90275 : out(&quot;Reading missing data from file '%s' at offset %&quot; PRIu64 &quot;.\n&quot;, parity-&gt;path, offset);</span>
<span class="lineNum"> 483 </span><span class="lineCov"> 90275 : return -1;</span>
<span class="lineNum"> 481 </span><span class="lineCov"> 3492991 : if (offset &gt;= parity-&gt;valid_size) {</span>
<span class="lineNum"> 482 </span><span class="lineCov"> 90295 : out(&quot;Reading missing data from file '%s' at offset %&quot; PRIu64 &quot;.\n&quot;, parity-&gt;path, offset);</span>
<span class="lineNum"> 483 </span><span class="lineCov"> 90295 : return -1;</span>
<span class="lineNum"> 484 </span> : }
<span class="lineNum"> 485 </span> :
<span class="lineNum"> 486 </span> : #if !HAVE_PREAD
@ -554,36 +554,36 @@
<span class="lineNum"> 492 </span> : }
<span class="lineNum"> 493 </span> : #endif
<span class="lineNum"> 494 </span> :
<span class="lineNum"> 495 </span><span class="lineCov"> 3398302 : count = 0;</span>
<span class="lineNum"> 495 </span><span class="lineCov"> 3402696 : count = 0;</span>
<span class="lineNum"> 496 </span> : do {
<span class="lineNum"> 497 </span> :
<span class="lineNum"> 498 </span> : #if HAVE_PREAD
<span class="lineNum"> 499 </span><span class="lineCov"> 3398302 : read_ret = pread(parity-&gt;f, block_buffer + count, block_size - count, offset + count);</span>
<span class="lineNum"> 499 </span><span class="lineCov"> 3402696 : read_ret = pread(parity-&gt;f, block_buffer + count, block_size - count, offset + count);</span>
<span class="lineNum"> 500 </span> : #else
<span class="lineNum"> 501 </span> : read_ret = read(parity-&gt;f, block_buffer + count, block_size - count);
<span class="lineNum"> 502 </span> : #endif
<span class="lineNum"> 503 </span><span class="lineCov"> 3398302 : if (read_ret &lt; 0) {</span>
<span class="lineNum"> 503 </span><span class="lineCov"> 3402696 : if (read_ret &lt; 0) {</span>
<span class="lineNum"> 504 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 505 </span> : out(&quot;Error reading file '%s' at offset %&quot; PRIu64 &quot; for size %u. %s.\n&quot;, parity-&gt;path, offset + count, block_size - count, strerror(errno));
<span class="lineNum"> 506 </span> : return -1;
<span class="lineNum"> 507 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 508 </span> : }
<span class="lineNum"> 509 </span><span class="lineCov"> 3398302 : if (read_ret == 0) {</span>
<span class="lineNum"> 509 </span><span class="lineCov"> 3402696 : if (read_ret == 0) {</span>
<span class="lineNum"> 510 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 511 </span> : out(&quot;Unexpected end of file '%s' at offset %&quot; PRIu64 &quot;. %s.\n&quot;, parity-&gt;path, offset, strerror(errno));
<span class="lineNum"> 512 </span> : return -1;
<span class="lineNum"> 513 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 514 </span> : }
<span class="lineNum"> 515 </span> :
<span class="lineNum"> 516 </span><span class="lineCov"> 3398302 : count += read_ret;</span>
<span class="lineNum"> 517 </span><span class="lineCov"> 3398302 : } while (count &lt; block_size);</span>
<span class="lineNum"> 516 </span><span class="lineCov"> 3402696 : count += read_ret;</span>
<span class="lineNum"> 517 </span><span class="lineCov"> 3402696 : } while (count &lt; block_size);</span>
<span class="lineNum"> 518 </span> :
<span class="lineNum"> 519 </span> : /* Here isn't needed to call posix_fadvise(..., POSIX_FADV_DONTNEED) */
<span class="lineNum"> 520 </span> : /* because we already advised sequential access with POSIX_FADV_SEQUENTIAL. */
<span class="lineNum"> 521 </span> : /* In Linux 2.6.33 it's enough to ensure that data is not kept in the cache. */
<span class="lineNum"> 522 </span> : /* Better to do nothing and save a syscall for each block. */
<span class="lineNum"> 523 </span> :
<span class="lineNum"> 524 </span><span class="lineCov"> 3398302 : return block_size;</span>
<span class="lineNum"> 524 </span><span class="lineCov"> 3402696 : return block_size;</span>
<span class="lineNum"> 525 </span> : }
<span class="lineNum"> 526 </span> :
</pre>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">3</td>
@ -61,7 +61,7 @@
</tr>
<tr>
<td class="coverFn"><a href="pool.c.gcov.html#148">make_link</a></td>
<td class="coverFnHi">17569</td>
<td class="coverFnHi">17583</td>
</tr>
<tr>
<td class="coverFn"><a href="pool.c.gcov.html#26">clean_dir</a></td>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">3</td>
@ -65,7 +65,7 @@
</tr>
<tr>
<td class="coverFn"><a href="pool.c.gcov.html#148">make_link</a></td>
<td class="coverFnHi">17569</td>
<td class="coverFnHi">17583</td>
</tr>
<tr>
<td class="coverFn"><a href="pool.c.gcov.html#199">state_pool</a></td>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">3</td>
@ -107,24 +107,24 @@
<span class="lineNum"> 45 </span> : struct dirent* dd;
<span class="lineNum"> 46 </span> :
<span class="lineNum"> 47 </span> : /* clear errno to detect erroneous conditions */
<span class="lineNum"> 48 </span><span class="lineCov"> 5760 : errno = 0;</span>
<span class="lineNum"> 49 </span><span class="lineCov"> 5760 : dd = readdir(d);</span>
<span class="lineNum"> 50 </span><span class="lineCov"> 5760 : if (dd == 0 &amp;&amp; errno != 0) {</span>
<span class="lineNum"> 48 </span><span class="lineCov"> 5767 : errno = 0;</span>
<span class="lineNum"> 49 </span><span class="lineCov"> 5767 : dd = readdir(d);</span>
<span class="lineNum"> 50 </span><span class="lineCov"> 5767 : if (dd == 0 &amp;&amp; errno != 0) {</span>
<span class="lineNum"> 51 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 52 </span> : log_fatal(&quot;Error reading pool directory '%s'. %s.\n&quot;, dir, strerror(errno));
<span class="lineNum"> 53 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 54 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 55 </span> : }
<span class="lineNum"> 56 </span><span class="lineCov"> 5760 : if (dd == 0 &amp;&amp; errno == 0) {</span>
<span class="lineNum"> 56 </span><span class="lineCov"> 5767 : if (dd == 0 &amp;&amp; errno == 0) {</span>
<span class="lineNum"> 57 </span><span class="lineCov"> 5 : break; /* finished */</span>
<span class="lineNum"> 58 </span> : }
<span class="lineNum"> 59 </span> :
<span class="lineNum"> 60 </span> : /* skip &quot;.&quot; and &quot;..&quot; files */
<span class="lineNum"> 61 </span><span class="lineCov"> 5755 : name = dd-&gt;d_name;</span>
<span class="lineNum"> 62 </span><span class="lineCov"> 5755 : if (name[0] == '.' &amp;&amp; (name[1] == 0 || (name[1] == '.' &amp;&amp; name[2] == 0)))</span>
<span class="lineNum"> 61 </span><span class="lineCov"> 5762 : name = dd-&gt;d_name;</span>
<span class="lineNum"> 62 </span><span class="lineCov"> 5762 : if (name[0] == '.' &amp;&amp; (name[1] == 0 || (name[1] == '.' &amp;&amp; name[2] == 0)))</span>
<span class="lineNum"> 63 </span><span class="lineCov"> 10 : continue;</span>
<span class="lineNum"> 64 </span> :
<span class="lineNum"> 65 </span><span class="lineCov"> 5745 : pathprint(path_next, sizeof(path_next), &quot;%s%s&quot;, dir, name);</span>
<span class="lineNum"> 65 </span><span class="lineCov"> 5752 : pathprint(path_next, sizeof(path_next), &quot;%s%s&quot;, dir, name);</span>
<span class="lineNum"> 66 </span> :
<span class="lineNum"> 67 </span> : #if HAVE_STRUCT_DIRENT_D_STAT
<span class="lineNum"> 68 </span> : /* convert dirent to lstat result */
@ -142,7 +142,7 @@
<span class="lineNum"> 80 </span> : }
<span class="lineNum"> 81 </span> : #else
<span class="lineNum"> 82 </span> : /* get lstat info about the file */
<span class="lineNum"> 83 </span><span class="lineCov"> 5745 : if (lstat(path_next, &amp;st) != 0) {</span>
<span class="lineNum"> 83 </span><span class="lineCov"> 5752 : if (lstat(path_next, &amp;st) != 0) {</span>
<span class="lineNum"> 84 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 85 </span> : log_fatal(&quot;Error in stat file/directory '%s'. %s.\n&quot;, path_next, strerror(errno));
<span class="lineNum"> 86 </span> : exit(EXIT_FAILURE);
@ -150,12 +150,12 @@
<span class="lineNum"> 88 </span> : }
<span class="lineNum"> 89 </span> : #endif
<span class="lineNum"> 90 </span> :
<span class="lineNum"> 91 </span><span class="lineCov"> 5745 : if (S_ISLNK(st.st_mode)) {</span>
<span class="lineNum"> 91 </span><span class="lineCov"> 5752 : if (S_ISLNK(st.st_mode)) {</span>
<span class="lineNum"> 92 </span> : int ret;
<span class="lineNum"> 93 </span> :
<span class="lineNum"> 94 </span> : /* delete the link */
<span class="lineNum"> 95 </span><span class="lineCov"> 5743 : ret = remove(path_next);</span>
<span class="lineNum"> 96 </span><span class="lineCov"> 5743 : if (ret &lt; 0) {</span>
<span class="lineNum"> 95 </span><span class="lineCov"> 5750 : ret = remove(path_next);</span>
<span class="lineNum"> 96 </span><span class="lineCov"> 5750 : if (ret &lt; 0) {</span>
<span class="lineNum"> 97 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 98 </span> : log_fatal(&quot;Error removing symlink '%s'. %s.\n&quot;, path_next, strerror(errno));
<span class="lineNum"> 99 </span> : exit(EXIT_FAILURE);
@ -194,7 +194,7 @@
<span class="lineNum"> 132 </span><span class="lineNoCov"> 0 : ignored = 1;</span>
<span class="lineNum"> 133 </span><span class="lineNoCov"> 0 : msg_verbose(&quot;Ignoring pool file '%s'\n&quot;, path_next);</span>
<span class="lineNum"> 134 </span> : }
<span class="lineNum"> 135 </span><span class="lineCov"> 5755 : }</span>
<span class="lineNum"> 135 </span><span class="lineCov"> 5762 : }</span>
<span class="lineNum"> 136 </span> :
<span class="lineNum"> 137 </span><span class="lineCov"> 5 : if (closedir(d) != 0) {</span>
<span class="lineNum"> 138 </span> : /* LCOV_EXCL_START */
@ -209,7 +209,7 @@
<span class="lineNum"> 147 </span> : /**
<a name="148"><span class="lineNum"> 148 </span> : * Create a link to the specified disk entry.</a>
<span class="lineNum"> 149 </span> : */
<span class="lineNum"> 150 </span><span class="lineCov"> 17569 : static void make_link(const char* pool_dir, const char* share_dir, struct snapraid_disk* disk, const char* sub)</span>
<span class="lineNum"> 150 </span><span class="lineCov"> 17583 : static void make_link(const char* pool_dir, const char* share_dir, struct snapraid_disk* disk, const char* sub)</span>
<span class="lineNum"> 151 </span> : {
<span class="lineNum"> 152 </span> : char path[PATH_MAX];
<span class="lineNum"> 153 </span> : char linkto[PATH_MAX];
@ -217,31 +217,31 @@
<span class="lineNum"> 155 </span> : int ret;
<span class="lineNum"> 156 </span> :
<span class="lineNum"> 157 </span> : /* make the source path */
<span class="lineNum"> 158 </span><span class="lineCov"> 17569 : pathprint(path, sizeof(path), &quot;%s%s&quot;, pool_dir, sub);</span>
<span class="lineNum"> 158 </span><span class="lineCov"> 17583 : pathprint(path, sizeof(path), &quot;%s%s&quot;, pool_dir, sub);</span>
<span class="lineNum"> 159 </span> :
<span class="lineNum"> 160 </span> : /* make the linkto path */
<span class="lineNum"> 161 </span><span class="lineCov"> 17569 : if (share_dir[0] != 0) {</span>
<span class="lineNum"> 161 </span><span class="lineCov"> 17583 : if (share_dir[0] != 0) {</span>
<span class="lineNum"> 162 </span> : /* with a shared directory, use it */
<span class="lineNum"> 163 </span><span class="lineCov"> 17569 : pathprint(linkto, sizeof(linkto), &quot;%s%s/%s&quot;, share_dir, disk-&gt;name, sub);</span>
<span class="lineNum"> 163 </span><span class="lineCov"> 17583 : pathprint(linkto, sizeof(linkto), &quot;%s%s/%s&quot;, share_dir, disk-&gt;name, sub);</span>
<span class="lineNum"> 164 </span> : } else {
<span class="lineNum"> 165 </span> : /* without a share directory, use the local disk paths */
<span class="lineNum"> 166 </span><span class="lineNoCov"> 0 : pathprint(linkto, sizeof(linkto), &quot;%s%s&quot;, disk-&gt;dir, sub);</span>
<span class="lineNum"> 167 </span> : }
<span class="lineNum"> 168 </span> :
<span class="lineNum"> 169 </span> : /* create the ancestor directories */
<span class="lineNum"> 170 </span><span class="lineCov"> 17569 : ret = mkancestor(path);</span>
<span class="lineNum"> 171 </span><span class="lineCov"> 17569 : if (ret != 0) {</span>
<span class="lineNum"> 170 </span><span class="lineCov"> 17583 : ret = mkancestor(path);</span>
<span class="lineNum"> 171 </span><span class="lineCov"> 17583 : if (ret != 0) {</span>
<span class="lineNum"> 172 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 173 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 174 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 175 </span> : }
<span class="lineNum"> 176 </span> :
<span class="lineNum"> 177 </span> : /* convert back slashes */
<span class="lineNum"> 178 </span><span class="lineCov"> 17569 : pathexport(linkto_exported, sizeof(linkto_exported), linkto);</span>
<span class="lineNum"> 178 </span><span class="lineCov"> 17583 : pathexport(linkto_exported, sizeof(linkto_exported), linkto);</span>
<span class="lineNum"> 179 </span> :
<span class="lineNum"> 180 </span> : /* create the symlink */
<span class="lineNum"> 181 </span><span class="lineCov"> 17569 : ret = symlink(linkto_exported, path);</span>
<span class="lineNum"> 182 </span><span class="lineCov"> 17569 : if (ret != 0) {</span>
<span class="lineNum"> 181 </span><span class="lineCov"> 17583 : ret = symlink(linkto_exported, path);</span>
<span class="lineNum"> 182 </span><span class="lineCov"> 17583 : if (ret != 0) {</span>
<span class="lineNum"> 183 </span><span class="lineCov"> 517 : if (errno == EEXIST) {</span>
<span class="lineNum"> 184 </span><span class="lineCov"> 517 : log_fatal(&quot;WARNING! Duplicate pooling for '%s'\n&quot;, path);</span>
<span class="lineNum"> 185 </span> : #ifdef _WIN32
@ -258,7 +258,7 @@
<span class="lineNum"> 196 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 197 </span> : }
<span class="lineNum"> 198 </span> : }
<a name="199"><span class="lineNum"> 199 </span><span class="lineCov"> 17569 : }</span></a>
<a name="199"><span class="lineNum"> 199 </span><span class="lineCov"> 17583 : }</span></a>
<span class="lineNum"> 200 </span> :
<span class="lineNum"> 201 </span><span class="lineCov"> 3 : void state_pool(struct snapraid_state* state)</span>
<span class="lineNum"> 202 </span> : {
@ -296,10 +296,10 @@
<span class="lineNum"> 234 </span><span class="lineCov"> 18 : struct snapraid_disk* disk = i-&gt;data;</span>
<span class="lineNum"> 235 </span> :
<span class="lineNum"> 236 </span> : /* for each file */
<span class="lineNum"> 237 </span><span class="lineCov"> 16998 : for (j = disk-&gt;filelist; j != 0; j = j-&gt;next) {</span>
<span class="lineNum"> 238 </span><span class="lineCov"> 16980 : struct snapraid_file* file = j-&gt;data;</span>
<span class="lineNum"> 239 </span><span class="lineCov"> 16980 : make_link(pool_dir, share_dir, disk, file-&gt;sub);</span>
<span class="lineNum"> 240 </span><span class="lineCov"> 16980 : ++count;</span>
<span class="lineNum"> 237 </span><span class="lineCov"> 17012 : for (j = disk-&gt;filelist; j != 0; j = j-&gt;next) {</span>
<span class="lineNum"> 238 </span><span class="lineCov"> 16994 : struct snapraid_file* file = j-&gt;data;</span>
<span class="lineNum"> 239 </span><span class="lineCov"> 16994 : make_link(pool_dir, share_dir, disk, file-&gt;sub);</span>
<span class="lineNum"> 240 </span><span class="lineCov"> 16994 : ++count;</span>
<span class="lineNum"> 241 </span> : }
<span class="lineNum"> 242 </span> :
<span class="lineNum"> 243 </span> : /* for each link */

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">1</td>
@ -60,7 +60,7 @@
<td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
</tr>
<tr>
<td class="coverFn"><a href="portable.h.gcov.html#255">hardlink</a></td>
<td class="coverFn"><a href="portable.h.gcov.html#278">hardlink</a></td>
<td class="coverFnHi">12</td>
</tr>
</table>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">1</td>
@ -60,7 +60,7 @@
<td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="portable.h.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
</tr>
<tr>
<td class="coverFn"><a href="portable.h.gcov.html#255">hardlink</a></td>
<td class="coverFn"><a href="portable.h.gcov.html#278">hardlink</a></td>
<td class="coverFnHi">12</td>
</tr>
</table>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">1</td>
@ -131,357 +131,385 @@
<span class="lineNum"> 69 </span> : #define __always_inline inline __attribute__((always_inline))
<span class="lineNum"> 70 </span> : #endif
<span class="lineNum"> 71 </span> :
<span class="lineNum"> 72 </span> : /**
<span class="lineNum"> 73 </span> : * Architecture.
<span class="lineNum"> 74 </span> : */
<span class="lineNum"> 75 </span> : #if defined(__i386__)
<span class="lineNum"> 76 </span> : #define CONFIG_X86 1
<span class="lineNum"> 77 </span> : #define CONFIG_X86_32 1
<span class="lineNum"> 78 </span> : #endif
<span class="lineNum"> 79 </span> :
<span class="lineNum"> 80 </span> : #if defined(__x86_64__)
<span class="lineNum"> 72 </span> : #ifndef __noreturn
<span class="lineNum"> 73 </span> : #define __noreturn __attribute__((noreturn))
<span class="lineNum"> 74 </span> : #endif
<span class="lineNum"> 75 </span> :
<span class="lineNum"> 76 </span> :
<span class="lineNum"> 77 </span> : /**
<span class="lineNum"> 78 </span> : * Architecture.
<span class="lineNum"> 79 </span> : */
<span class="lineNum"> 80 </span> : #if defined(__i386__)
<span class="lineNum"> 81 </span> : #define CONFIG_X86 1
<span class="lineNum"> 82 </span> : #define CONFIG_X86_64 1
<span class="lineNum"> 82 </span> : #define CONFIG_X86_32 1
<span class="lineNum"> 83 </span> : #endif
<span class="lineNum"> 84 </span> :
<span class="lineNum"> 85 </span> : /**
<span class="lineNum"> 86 </span> : * Includes some platform specific headers.
<span class="lineNum"> 87 </span> : */
<span class="lineNum"> 88 </span> : #if HAVE_SYS_PARAM_H
<span class="lineNum"> 89 </span> : #include &lt;sys/param.h&gt;
<span class="lineNum"> 90 </span> : #endif
<span class="lineNum"> 91 </span> :
<span class="lineNum"> 92 </span> : #if HAVE_SYS_MOUNT_H
<span class="lineNum"> 93 </span> : #include &lt;sys/mount.h&gt;
<span class="lineNum"> 94 </span> : #endif
<span class="lineNum"> 95 </span> :
<span class="lineNum"> 96 </span> : #if HAVE_SYS_VFS_H
<span class="lineNum"> 97 </span> : #include &lt;sys/vfs.h&gt;
<span class="lineNum"> 98 </span> : #endif
<span class="lineNum"> 99 </span> :
<span class="lineNum"> 100 </span> : #if HAVE_SYS_STATFS_H
<span class="lineNum"> 101 </span> : #include &lt;sys/statfs.h&gt;
<span class="lineNum"> 102 </span> : #endif
<span class="lineNum"> 103 </span> :
<span class="lineNum"> 104 </span> : #if HAVE_SYS_FILE_H
<span class="lineNum"> 105 </span> : #include &lt;sys/file.h&gt;
<span class="lineNum"> 106 </span> : #endif
<span class="lineNum"> 107 </span> :
<span class="lineNum"> 108 </span> : #if HAVE_SYS_IOCTL_H
<span class="lineNum"> 109 </span> : #include &lt;sys/ioctl.h&gt;
<span class="lineNum"> 110 </span> : #endif
<span class="lineNum"> 111 </span> :
<span class="lineNum"> 112 </span> : #if HAVE_LINUX_FS_H
<span class="lineNum"> 113 </span> : #include &lt;linux/fs.h&gt;
<span class="lineNum"> 114 </span> : #endif
<span class="lineNum"> 115 </span> :
<span class="lineNum"> 116 </span> : #if HAVE_LINUX_FIEMAP_H
<span class="lineNum"> 117 </span> : #include &lt;linux/fiemap.h&gt;
<span class="lineNum"> 118 </span> : #endif
<span class="lineNum"> 119 </span> :
<span class="lineNum"> 120 </span> : /**
<span class="lineNum"> 121 </span> : * Includes some standard headers.
<span class="lineNum"> 122 </span> : */
<span class="lineNum"> 123 </span> : #include &lt;stdio.h&gt;
<span class="lineNum"> 124 </span> : #include &lt;stdlib.h&gt; /* On many systems (e.g., Darwin), `stdio.h' is a prerequisite. */
<span class="lineNum"> 125 </span> : #include &lt;stdarg.h&gt;
<span class="lineNum"> 126 </span> : #include &lt;string.h&gt;
<span class="lineNum"> 127 </span> : #include &lt;ctype.h&gt;
<span class="lineNum"> 128 </span> : #include &lt;fcntl.h&gt;
<span class="lineNum"> 129 </span> : #include &lt;assert.h&gt;
<span class="lineNum"> 130 </span> : #include &lt;errno.h&gt;
<span class="lineNum"> 131 </span> : #include &lt;signal.h&gt;
<span class="lineNum"> 132 </span> : #include &lt;limits.h&gt;
<span class="lineNum"> 133 </span> :
<span class="lineNum"> 134 </span> : #if HAVE_STDINT_H
<span class="lineNum"> 135 </span> : #include &lt;stdint.h&gt;
<span class="lineNum"> 136 </span> : #endif
<span class="lineNum"> 137 </span> :
<span class="lineNum"> 138 </span> : #if HAVE_INTTYPES_H
<span class="lineNum"> 139 </span> : #include &lt;inttypes.h&gt;
<span class="lineNum"> 140 </span> : #endif
<span class="lineNum"> 141 </span> :
<span class="lineNum"> 142 </span> : #if HAVE_UNISTD_H
<span class="lineNum"> 143 </span> : #include &lt;unistd.h&gt;
<span class="lineNum"> 144 </span> : #endif
<span class="lineNum"> 85 </span> : #if defined(__x86_64__)
<span class="lineNum"> 86 </span> : #define CONFIG_X86 1
<span class="lineNum"> 87 </span> : #define CONFIG_X86_64 1
<span class="lineNum"> 88 </span> : #endif
<span class="lineNum"> 89 </span> :
<span class="lineNum"> 90 </span> : /**
<span class="lineNum"> 91 </span> : * Includes some platform specific headers.
<span class="lineNum"> 92 </span> : */
<span class="lineNum"> 93 </span> : #if HAVE_SYS_PARAM_H
<span class="lineNum"> 94 </span> : #include &lt;sys/param.h&gt;
<span class="lineNum"> 95 </span> : #endif
<span class="lineNum"> 96 </span> :
<span class="lineNum"> 97 </span> : #if HAVE_SYS_MOUNT_H
<span class="lineNum"> 98 </span> : #include &lt;sys/mount.h&gt;
<span class="lineNum"> 99 </span> : #endif
<span class="lineNum"> 100 </span> :
<span class="lineNum"> 101 </span> : #if HAVE_SYS_VFS_H
<span class="lineNum"> 102 </span> : #include &lt;sys/vfs.h&gt;
<span class="lineNum"> 103 </span> : #endif
<span class="lineNum"> 104 </span> :
<span class="lineNum"> 105 </span> : #if HAVE_SYS_STATFS_H
<span class="lineNum"> 106 </span> : #include &lt;sys/statfs.h&gt;
<span class="lineNum"> 107 </span> : #endif
<span class="lineNum"> 108 </span> :
<span class="lineNum"> 109 </span> : #if HAVE_SYS_FILE_H
<span class="lineNum"> 110 </span> : #include &lt;sys/file.h&gt;
<span class="lineNum"> 111 </span> : #endif
<span class="lineNum"> 112 </span> :
<span class="lineNum"> 113 </span> : #if HAVE_SYS_IOCTL_H
<span class="lineNum"> 114 </span> : #include &lt;sys/ioctl.h&gt;
<span class="lineNum"> 115 </span> : #endif
<span class="lineNum"> 116 </span> :
<span class="lineNum"> 117 </span> : #if HAVE_LINUX_FS_H
<span class="lineNum"> 118 </span> : #include &lt;linux/fs.h&gt;
<span class="lineNum"> 119 </span> : #endif
<span class="lineNum"> 120 </span> :
<span class="lineNum"> 121 </span> : #if HAVE_LINUX_FIEMAP_H
<span class="lineNum"> 122 </span> : #include &lt;linux/fiemap.h&gt;
<span class="lineNum"> 123 </span> : #endif
<span class="lineNum"> 124 </span> :
<span class="lineNum"> 125 </span> : #if HAVE_BLKID_BLKID_H
<span class="lineNum"> 126 </span> : #include &lt;blkid/blkid.h&gt;
<span class="lineNum"> 127 </span> : #if HAVE_BLKID_DEVNO_TO_DEVNAME &amp;&amp; HAVE_BLKID_GET_TAG_VALUE
<span class="lineNum"> 128 </span> : #define HAVE_BLKID 1
<span class="lineNum"> 129 </span> : #endif
<span class="lineNum"> 130 </span> : #endif
<span class="lineNum"> 131 </span> :
<span class="lineNum"> 132 </span> : /**
<span class="lineNum"> 133 </span> : * Includes some standard headers.
<span class="lineNum"> 134 </span> : */
<span class="lineNum"> 135 </span> : #include &lt;stdio.h&gt;
<span class="lineNum"> 136 </span> : #include &lt;stdlib.h&gt; /* On many systems (e.g., Darwin), `stdio.h' is a prerequisite. */
<span class="lineNum"> 137 </span> : #include &lt;stdarg.h&gt;
<span class="lineNum"> 138 </span> : #include &lt;string.h&gt;
<span class="lineNum"> 139 </span> : #include &lt;ctype.h&gt;
<span class="lineNum"> 140 </span> : #include &lt;fcntl.h&gt;
<span class="lineNum"> 141 </span> : #include &lt;assert.h&gt;
<span class="lineNum"> 142 </span> : #include &lt;errno.h&gt;
<span class="lineNum"> 143 </span> : #include &lt;signal.h&gt;
<span class="lineNum"> 144 </span> : #include &lt;limits.h&gt;
<span class="lineNum"> 145 </span> :
<span class="lineNum"> 146 </span> : #if TIME_WITH_SYS_TIME
<span class="lineNum"> 147 </span> : #include &lt;sys/time.h&gt;
<span class="lineNum"> 148 </span> : #include &lt;time.h&gt;
<span class="lineNum"> 149 </span> : #else
<span class="lineNum"> 150 </span> : #if HAVE_SYS_TIME_H
<span class="lineNum"> 151 </span> : #include &lt;sys/time.h&gt;
<span class="lineNum"> 152 </span> : #else
<span class="lineNum"> 153 </span> : #include &lt;time.h&gt;
<span class="lineNum"> 154 </span> : #endif
<span class="lineNum"> 155 </span> : #endif
<span class="lineNum"> 156 </span> :
<span class="lineNum"> 157 </span> : #if HAVE_MACH_MACH_TIME_H
<span class="lineNum"> 158 </span> : #include &lt;mach/mach_time.h&gt;
<span class="lineNum"> 159 </span> : #endif
<span class="lineNum"> 160 </span> :
<span class="lineNum"> 161 </span> : #if HAVE_DIRENT_H
<span class="lineNum"> 162 </span> : #include &lt;dirent.h&gt;
<span class="lineNum"> 163 </span> : #define NAMLEN(dirent) strlen((dirent)-&gt;d_name)
<span class="lineNum"> 146 </span> : #if HAVE_STDINT_H
<span class="lineNum"> 147 </span> : #include &lt;stdint.h&gt;
<span class="lineNum"> 148 </span> : #endif
<span class="lineNum"> 149 </span> :
<span class="lineNum"> 150 </span> : #if HAVE_INTTYPES_H
<span class="lineNum"> 151 </span> : #include &lt;inttypes.h&gt;
<span class="lineNum"> 152 </span> : #endif
<span class="lineNum"> 153 </span> :
<span class="lineNum"> 154 </span> : #if HAVE_UNISTD_H
<span class="lineNum"> 155 </span> : #include &lt;unistd.h&gt;
<span class="lineNum"> 156 </span> : #endif
<span class="lineNum"> 157 </span> :
<span class="lineNum"> 158 </span> : #if TIME_WITH_SYS_TIME
<span class="lineNum"> 159 </span> : #include &lt;sys/time.h&gt;
<span class="lineNum"> 160 </span> : #include &lt;time.h&gt;
<span class="lineNum"> 161 </span> : #else
<span class="lineNum"> 162 </span> : #if HAVE_SYS_TIME_H
<span class="lineNum"> 163 </span> : #include &lt;sys/time.h&gt;
<span class="lineNum"> 164 </span> : #else
<span class="lineNum"> 165 </span> : #define dirent direct
<span class="lineNum"> 166 </span> : #define NAMLEN(dirent) (dirent)-&gt;d_namlen
<span class="lineNum"> 167 </span> : #if HAVE_SYS_NDIR_H
<span class="lineNum"> 168 </span> : #include &lt;sys/ndir.h&gt;
<span class="lineNum"> 169 </span> : #endif
<span class="lineNum"> 170 </span> : #if HAVE_SYS_DIR_H
<span class="lineNum"> 171 </span> : #include &lt;sys/dir.h&gt;
<span class="lineNum"> 172 </span> : #endif
<span class="lineNum"> 173 </span> : #if HAVE_NDIR_H
<span class="lineNum"> 174 </span> : #include &lt;ndir.h&gt;
<span class="lineNum"> 175 </span> : #endif
<span class="lineNum"> 176 </span> : #endif
<span class="lineNum"> 177 </span> :
<span class="lineNum"> 178 </span> : #if HAVE_SYS_TYPES_H
<span class="lineNum"> 179 </span> : #include &lt;sys/types.h&gt;
<span class="lineNum"> 180 </span> : #endif
<span class="lineNum"> 181 </span> :
<span class="lineNum"> 182 </span> : #if HAVE_SYS_STAT_H
<span class="lineNum"> 183 </span> : #include &lt;sys/stat.h&gt;
<span class="lineNum"> 165 </span> : #include &lt;time.h&gt;
<span class="lineNum"> 166 </span> : #endif
<span class="lineNum"> 167 </span> : #endif
<span class="lineNum"> 168 </span> :
<span class="lineNum"> 169 </span> : #if HAVE_MACH_MACH_TIME_H
<span class="lineNum"> 170 </span> : #include &lt;mach/mach_time.h&gt;
<span class="lineNum"> 171 </span> : #endif
<span class="lineNum"> 172 </span> :
<span class="lineNum"> 173 </span> : #if HAVE_DIRENT_H
<span class="lineNum"> 174 </span> : #include &lt;dirent.h&gt;
<span class="lineNum"> 175 </span> : #define NAMLEN(dirent) strlen((dirent)-&gt;d_name)
<span class="lineNum"> 176 </span> : #else
<span class="lineNum"> 177 </span> : #define dirent direct
<span class="lineNum"> 178 </span> : #define NAMLEN(dirent) (dirent)-&gt;d_namlen
<span class="lineNum"> 179 </span> : #if HAVE_SYS_NDIR_H
<span class="lineNum"> 180 </span> : #include &lt;sys/ndir.h&gt;
<span class="lineNum"> 181 </span> : #endif
<span class="lineNum"> 182 </span> : #if HAVE_SYS_DIR_H
<span class="lineNum"> 183 </span> : #include &lt;sys/dir.h&gt;
<span class="lineNum"> 184 </span> : #endif
<span class="lineNum"> 185 </span> :
<span class="lineNum"> 186 </span> : #if HAVE_SYS_WAIT_H
<span class="lineNum"> 187 </span> : #include &lt;sys/wait.h&gt;
<span class="lineNum"> 185 </span> : #if HAVE_NDIR_H
<span class="lineNum"> 186 </span> : #include &lt;ndir.h&gt;
<span class="lineNum"> 187 </span> : #endif
<span class="lineNum"> 188 </span> : #endif
<span class="lineNum"> 189 </span> : #ifndef WEXITSTATUS
<span class="lineNum"> 190 </span> : #define WEXITSTATUS(stat_val) ((unsigned)(stat_val) &gt;&gt; 8)
<span class="lineNum"> 191 </span> : #endif
<span class="lineNum"> 192 </span> : #ifndef WIFEXITED
<span class="lineNum"> 193 </span> : #define WIFEXITED(stat_val) (((stat_val) &amp; 255) == 0)
<span class="lineNum"> 194 </span> : #endif
<span class="lineNum"> 195 </span> :
<span class="lineNum"> 196 </span> : #if HAVE_GETOPT_H
<span class="lineNum"> 197 </span> : #include &lt;getopt.h&gt;
<span class="lineNum"> 198 </span> : #endif
<span class="lineNum"> 199 </span> :
<span class="lineNum"> 200 </span> : #if HAVE_FNMATCH_H
<span class="lineNum"> 201 </span> : #include &lt;fnmatch.h&gt;
<span class="lineNum"> 202 </span> : #else
<span class="lineNum"> 203 </span> : #include &quot;fnmatch.h&quot;
<span class="lineNum"> 204 </span> : #endif
<span class="lineNum"> 205 </span> :
<span class="lineNum"> 206 </span> : #if HAVE_PTHREAD_H
<span class="lineNum"> 207 </span> : #include &lt;pthread.h&gt;
<span class="lineNum"> 208 </span> : #endif
<span class="lineNum"> 209 </span> :
<span class="lineNum"> 210 </span> : #if HAVE_MATH_H
<span class="lineNum"> 211 </span> : #include &lt;math.h&gt;
<span class="lineNum"> 212 </span> : #endif
<span class="lineNum"> 213 </span> :
<span class="lineNum"> 214 </span> : /**
<span class="lineNum"> 215 </span> : * Disable case check in Windows.
<span class="lineNum"> 216 </span> : */
<span class="lineNum"> 217 </span> : #ifdef _WIN32
<span class="lineNum"> 218 </span> : #define FNM_CASEINSENSITIVE_FOR_WIN FNM_CASEFOLD
<span class="lineNum"> 219 </span> : #else
<span class="lineNum"> 220 </span> : #define FNM_CASEINSENSITIVE_FOR_WIN 0
<span class="lineNum"> 221 </span> : #endif
<span class="lineNum"> 222 </span> :
<span class="lineNum"> 223 </span> : #if HAVE_IO_H
<span class="lineNum"> 224 </span> : #include &lt;io.h&gt;
<span class="lineNum"> 225 </span> : #endif
<span class="lineNum"> 226 </span> :
<span class="lineNum"> 227 </span> : #if HAVE_GETOPT_LONG
<span class="lineNum"> 228 </span> : #define SWITCH_GETOPT_LONG(a, b) a
<span class="lineNum"> 229 </span> : #else
<span class="lineNum"> 230 </span> : #define SWITCH_GETOPT_LONG(a, b) b
<span class="lineNum"> 231 </span> : #endif
<span class="lineNum"> 232 </span> :
<span class="lineNum"> 233 </span> : /**
<span class="lineNum"> 234 </span> : * Enables lock file support.
<span class="lineNum"> 235 </span> : */
<span class="lineNum"> 236 </span> : #if HAVE_FLOCK &amp;&amp; HAVE_FTRUNCATE
<span class="lineNum"> 237 </span> : #define HAVE_LOCKFILE 1
<span class="lineNum"> 238 </span> : #endif
<span class="lineNum"> 239 </span> :
<span class="lineNum"> 240 </span> : /**
<span class="lineNum"> 241 </span> : * Includes specific support for Windows or Linux.
<span class="lineNum"> 242 </span> : */
<span class="lineNum"> 243 </span> : #ifdef __MINGW32__
<span class="lineNum"> 244 </span> : #include &quot;mingw.h&quot;
<span class="lineNum"> 245 </span> : #else
<span class="lineNum"> 246 </span> : #include &quot;unix.h&quot;
<span class="lineNum"> 247 </span> : #endif
<span class="lineNum"> 248 </span> :
<span class="lineNum"> 249 </span> : /**
<span class="lineNum"> 250 </span> : * Include list support to have tommy_node.
<span class="lineNum"> 251 </span> : */
<span class="lineNum"> 252 </span> : #include &quot;tommyds/tommylist.h&quot;
<span class="lineNum"> 253 </span> :
<span class="lineNum"> 254 </span> : /**
<a name="255"><span class="lineNum"> 255 </span> : * Another name for link() to avoid confusion with local variables called &quot;link&quot;.</a>
<span class="lineNum"> 256 </span> : */
<span class="lineNum"> 257 </span><span class="lineCov"> 12 : static inline int hardlink(const char* a, const char* b)</span>
<span class="lineNum"> 258 </span> : {
<span class="lineNum"> 259 </span><span class="lineCov"> 12 : return link(a, b);</span>
<span class="lineNum"> 260 </span> : }
<span class="lineNum"> 261 </span> :
<span class="lineNum"> 262 </span> : /**
<span class="lineNum"> 263 </span> : * Get the device UUID.
<span class="lineNum"> 264 </span> : * Return 0 on success.
<span class="lineNum"> 189 </span> :
<span class="lineNum"> 190 </span> : #if HAVE_SYS_TYPES_H
<span class="lineNum"> 191 </span> : #include &lt;sys/types.h&gt;
<span class="lineNum"> 192 </span> : #endif
<span class="lineNum"> 193 </span> :
<span class="lineNum"> 194 </span> : #if HAVE_SYS_STAT_H
<span class="lineNum"> 195 </span> : #include &lt;sys/stat.h&gt;
<span class="lineNum"> 196 </span> : #endif
<span class="lineNum"> 197 </span> :
<span class="lineNum"> 198 </span> : #if HAVE_SYS_WAIT_H
<span class="lineNum"> 199 </span> : #include &lt;sys/wait.h&gt;
<span class="lineNum"> 200 </span> : #endif
<span class="lineNum"> 201 </span> : #ifndef WEXITSTATUS
<span class="lineNum"> 202 </span> : #define WEXITSTATUS(stat_val) ((unsigned)(stat_val) &gt;&gt; 8)
<span class="lineNum"> 203 </span> : #endif
<span class="lineNum"> 204 </span> : #ifndef WIFEXITED
<span class="lineNum"> 205 </span> : #define WIFEXITED(stat_val) (((stat_val) &amp; 255) == 0)
<span class="lineNum"> 206 </span> : #endif
<span class="lineNum"> 207 </span> :
<span class="lineNum"> 208 </span> : #if HAVE_GETOPT_H
<span class="lineNum"> 209 </span> : #include &lt;getopt.h&gt;
<span class="lineNum"> 210 </span> : #endif
<span class="lineNum"> 211 </span> :
<span class="lineNum"> 212 </span> : #if HAVE_FNMATCH_H
<span class="lineNum"> 213 </span> : #include &lt;fnmatch.h&gt;
<span class="lineNum"> 214 </span> : #else
<span class="lineNum"> 215 </span> : #include &quot;fnmatch.h&quot;
<span class="lineNum"> 216 </span> : #endif
<span class="lineNum"> 217 </span> :
<span class="lineNum"> 218 </span> : #if HAVE_PTHREAD_H
<span class="lineNum"> 219 </span> : #include &lt;pthread.h&gt;
<span class="lineNum"> 220 </span> : #endif
<span class="lineNum"> 221 </span> :
<span class="lineNum"> 222 </span> : #if HAVE_MATH_H
<span class="lineNum"> 223 </span> : #include &lt;math.h&gt;
<span class="lineNum"> 224 </span> : #endif
<span class="lineNum"> 225 </span> :
<span class="lineNum"> 226 </span> : #if HAVE_EXECINFO_H
<span class="lineNum"> 227 </span> : #include &lt;execinfo.h&gt;
<span class="lineNum"> 228 </span> : #endif
<span class="lineNum"> 229 </span> :
<span class="lineNum"> 230 </span> : /**
<span class="lineNum"> 231 </span> : * Enable thread use.
<span class="lineNum"> 232 </span> : */
<span class="lineNum"> 233 </span> : #if HAVE_PTHREAD_H &amp;&amp; HAVE_PTHREAD_CREATE
<span class="lineNum"> 234 </span> : #define HAVE_PTHREAD 1
<span class="lineNum"> 235 </span> : #endif
<span class="lineNum"> 236 </span> :
<span class="lineNum"> 237 </span> : /**
<span class="lineNum"> 238 </span> : * Disable case check in Windows.
<span class="lineNum"> 239 </span> : */
<span class="lineNum"> 240 </span> : #ifdef _WIN32
<span class="lineNum"> 241 </span> : #define FNM_CASEINSENSITIVE_FOR_WIN FNM_CASEFOLD
<span class="lineNum"> 242 </span> : #else
<span class="lineNum"> 243 </span> : #define FNM_CASEINSENSITIVE_FOR_WIN 0
<span class="lineNum"> 244 </span> : #endif
<span class="lineNum"> 245 </span> :
<span class="lineNum"> 246 </span> : #if HAVE_IO_H
<span class="lineNum"> 247 </span> : #include &lt;io.h&gt;
<span class="lineNum"> 248 </span> : #endif
<span class="lineNum"> 249 </span> :
<span class="lineNum"> 250 </span> : #if HAVE_GETOPT_LONG
<span class="lineNum"> 251 </span> : #define SWITCH_GETOPT_LONG(a, b) a
<span class="lineNum"> 252 </span> : #else
<span class="lineNum"> 253 </span> : #define SWITCH_GETOPT_LONG(a, b) b
<span class="lineNum"> 254 </span> : #endif
<span class="lineNum"> 255 </span> :
<span class="lineNum"> 256 </span> : /**
<span class="lineNum"> 257 </span> : * Enables lock file support.
<span class="lineNum"> 258 </span> : */
<span class="lineNum"> 259 </span> : #if HAVE_FLOCK &amp;&amp; HAVE_FTRUNCATE
<span class="lineNum"> 260 </span> : #define HAVE_LOCKFILE 1
<span class="lineNum"> 261 </span> : #endif
<span class="lineNum"> 262 </span> :
<span class="lineNum"> 263 </span> : /**
<span class="lineNum"> 264 </span> : * Includes specific support for Windows or Linux.
<span class="lineNum"> 265 </span> : */
<span class="lineNum"> 266 </span> : int devuuid(uint64_t device, char* uuid, size_t size);
<span class="lineNum"> 267 </span> :
<span class="lineNum"> 268 </span> : /**
<span class="lineNum"> 269 </span> : * Physical offset not yet read.
<span class="lineNum"> 270 </span> : */
<span class="lineNum"> 271 </span> : #define FILEPHY_UNREAD_OFFSET 0
<span class="lineNum"> 272 </span> :
<span class="lineNum"> 273 </span> : /**
<span class="lineNum"> 274 </span> : * Special value returned when the filesystem doesn't report any offset for unknown reason.
<span class="lineNum"> 275 </span> : */
<span class="lineNum"> 276 </span> : #define FILEPHY_UNREPORTED_OFFSET 1
<span class="lineNum"> 277 </span> :
<span class="lineNum"> 278 </span> : /**
<span class="lineNum"> 279 </span> : * Special value returned when the file doesn't have a real offset.
<span class="lineNum"> 280 </span> : * For example, because it's stored in the NTFS MFT.
<span class="lineNum"> 281 </span> : */
<span class="lineNum"> 282 </span> : #define FILEPHY_WITHOUT_OFFSET 2
<span class="lineNum"> 283 </span> :
<span class="lineNum"> 284 </span> : /**
<span class="lineNum"> 285 </span> : * Value indicating real offsets. All offsets greater or equal at this one are real.
<span class="lineNum"> 286 </span> : */
<span class="lineNum"> 287 </span> : #define FILEPHY_REAL_OFFSET 3
<span class="lineNum"> 288 </span> :
<span class="lineNum"> 289 </span> : /**
<span class="lineNum"> 290 </span> : * Get the physcal address of the specified file.
<span class="lineNum"> 291 </span> : * This is expected to be just a hint and not necessarely correct or unique.
<span class="lineNum"> 292 </span> : * Return 0 on success.
<span class="lineNum"> 266 </span> : #ifdef __MINGW32__
<span class="lineNum"> 267 </span> : #include &quot;mingw.h&quot;
<span class="lineNum"> 268 </span> : #else
<span class="lineNum"> 269 </span> : #include &quot;unix.h&quot;
<span class="lineNum"> 270 </span> : #endif
<span class="lineNum"> 271 </span> :
<span class="lineNum"> 272 </span> : /**
<span class="lineNum"> 273 </span> : * Include list support to have tommy_node.
<span class="lineNum"> 274 </span> : */
<span class="lineNum"> 275 </span> : #include &quot;tommyds/tommylist.h&quot;
<span class="lineNum"> 276 </span> :
<span class="lineNum"> 277 </span> : /**
<a name="278"><span class="lineNum"> 278 </span> : * Another name for link() to avoid confusion with local variables called &quot;link&quot;.</a>
<span class="lineNum"> 279 </span> : */
<span class="lineNum"> 280 </span><span class="lineCov"> 12 : static inline int hardlink(const char* a, const char* b)</span>
<span class="lineNum"> 281 </span> : {
<span class="lineNum"> 282 </span><span class="lineCov"> 12 : return link(a, b);</span>
<span class="lineNum"> 283 </span> : }
<span class="lineNum"> 284 </span> :
<span class="lineNum"> 285 </span> : /**
<span class="lineNum"> 286 </span> : * Get the device UUID.
<span class="lineNum"> 287 </span> : * Return 0 on success.
<span class="lineNum"> 288 </span> : */
<span class="lineNum"> 289 </span> : int devuuid(uint64_t device, char* uuid, size_t size);
<span class="lineNum"> 290 </span> :
<span class="lineNum"> 291 </span> : /**
<span class="lineNum"> 292 </span> : * Physical offset not yet read.
<span class="lineNum"> 293 </span> : */
<span class="lineNum"> 294 </span> : int filephy(const char* path, uint64_t size, uint64_t* physical);
<span class="lineNum"> 294 </span> : #define FILEPHY_UNREAD_OFFSET 0
<span class="lineNum"> 295 </span> :
<span class="lineNum"> 296 </span> : /**
<span class="lineNum"> 297 </span> : * Check if the underline filesystem support persistent inodes.
<span class="lineNum"> 298 </span> : * Return -1 on error, 0 on success.
<span class="lineNum"> 299 </span> : */
<span class="lineNum"> 300 </span> : int fsinfo(const char* path, int* has_persistent_inode, uint64_t* total_space, uint64_t* free_space);
<span class="lineNum"> 301 </span> :
<span class="lineNum"> 302 </span> : /**
<span class="lineNum"> 303 </span> : * Get the tick counter value.
<span class="lineNum"> 304 </span> : *
<span class="lineNum"> 305 </span> : * Note that the frequency is unspecified, because the time measure
<span class="lineNum"> 306 </span> : * is meant to be used to compare the ratio between usage times.
<span class="lineNum"> 307 </span> : */
<span class="lineNum"> 308 </span> : uint64_t tick(void);
<span class="lineNum"> 309 </span> :
<span class="lineNum"> 310 </span> : /**
<span class="lineNum"> 311 </span> : * Get the tick counter value in millisecond.
<span class="lineNum"> 312 </span> : */
<span class="lineNum"> 313 </span> : uint64_t tick_ms(void);
<span class="lineNum"> 314 </span> :
<span class="lineNum"> 315 </span> : /**
<span class="lineNum"> 316 </span> : * Initializes the system.
<span class="lineNum"> 317 </span> : */
<span class="lineNum"> 318 </span> : void os_init(int opt);
<span class="lineNum"> 319 </span> :
<span class="lineNum"> 320 </span> : /**
<span class="lineNum"> 321 </span> : * Deintialize the system.
<span class="lineNum"> 297 </span> : * Special value returned when the file-system doesn't report any offset for unknown reason.
<span class="lineNum"> 298 </span> : */
<span class="lineNum"> 299 </span> : #define FILEPHY_UNREPORTED_OFFSET 1
<span class="lineNum"> 300 </span> :
<span class="lineNum"> 301 </span> : /**
<span class="lineNum"> 302 </span> : * Special value returned when the file doesn't have a real offset.
<span class="lineNum"> 303 </span> : * For example, because it's stored in the NTFS MFT.
<span class="lineNum"> 304 </span> : */
<span class="lineNum"> 305 </span> : #define FILEPHY_WITHOUT_OFFSET 2
<span class="lineNum"> 306 </span> :
<span class="lineNum"> 307 </span> : /**
<span class="lineNum"> 308 </span> : * Value indicating real offsets. All offsets greater or equal at this one are real.
<span class="lineNum"> 309 </span> : */
<span class="lineNum"> 310 </span> : #define FILEPHY_REAL_OFFSET 3
<span class="lineNum"> 311 </span> :
<span class="lineNum"> 312 </span> : /**
<span class="lineNum"> 313 </span> : * Get the physcal address of the specified file.
<span class="lineNum"> 314 </span> : * This is expected to be just a hint and not necessarily correct or unique.
<span class="lineNum"> 315 </span> : * Return 0 on success.
<span class="lineNum"> 316 </span> : */
<span class="lineNum"> 317 </span> : int filephy(const char* path, uint64_t size, uint64_t* physical);
<span class="lineNum"> 318 </span> :
<span class="lineNum"> 319 </span> : /**
<span class="lineNum"> 320 </span> : * Check if the underline file-system support persistent inodes.
<span class="lineNum"> 321 </span> : * Return -1 on error, 0 on success.
<span class="lineNum"> 322 </span> : */
<span class="lineNum"> 323 </span> : void os_done(void);
<span class="lineNum"> 323 </span> : int fsinfo(const char* path, int* has_persistent_inode, uint64_t* total_space, uint64_t* free_space);
<span class="lineNum"> 324 </span> :
<span class="lineNum"> 325 </span> : /**
<span class="lineNum"> 326 </span> : * Log file.
<span class="lineNum"> 326 </span> : * Get the tick counter value.
<span class="lineNum"> 327 </span> : *
<span class="lineNum"> 328 </span> : * This stream if fully buffered.
<span class="lineNum"> 329 </span> : *
<span class="lineNum"> 330 </span> : * If no log file is selected, it's 0.
<span class="lineNum"> 331 </span> : */
<span class="lineNum"> 332 </span> : FILE* stdlog;
<span class="lineNum"> 333 </span> :
<span class="lineNum"> 334 </span> : /**
<span class="lineNum"> 335 </span> : * Exit codes for testing.
<span class="lineNum"> 336 </span> : */
<span class="lineNum"> 337 </span> : int exit_success;
<span class="lineNum"> 338 </span> : int exit_failure;
<span class="lineNum"> 339 </span> : int exit_sync_needed;
<span class="lineNum"> 340 </span> : #undef EXIT_SUCCESS
<span class="lineNum"> 341 </span> : #undef EXIT_FAILURE
<span class="lineNum"> 342 </span> : #define EXIT_SUCCESS exit_success
<span class="lineNum"> 343 </span> : #define EXIT_FAILURE exit_failure
<span class="lineNum"> 344 </span> : #define EXIT_SYNC_NEEDED exit_sync_needed
<span class="lineNum"> 345 </span> :
<span class="lineNum"> 346 </span> : /**
<span class="lineNum"> 347 </span> : * Fill memory with psudeo-random values.
<span class="lineNum"> 348 </span> : */
<span class="lineNum"> 349 </span> : int randomize(void* ptr, size_t size);
<span class="lineNum"> 350 </span> :
<span class="lineNum"> 351 </span> : /**
<span class="lineNum"> 352 </span> : * Additional SMART attributes.
<span class="lineNum"> 353 </span> : */
<span class="lineNum"> 354 </span> : #define SMART_ERROR 256 /**&lt; ATA Error count. */
<span class="lineNum"> 355 </span> : #define SMART_SIZE 257 /**&lt; Size in bytes. */
<span class="lineNum"> 356 </span> : #define SMART_ROTATION_RATE 258 /**&lt; Rotation speed. 0 for SSD. */
<span class="lineNum"> 357 </span> : #define SMART_FLAGS 259 /**&lt; Flags returned by smartctl. */
<span class="lineNum"> 358 </span> :
<span class="lineNum"> 359 </span> : /**
<span class="lineNum"> 360 </span> : * SMART attributes count.
<span class="lineNum"> 361 </span> : */
<span class="lineNum"> 362 </span> : #define SMART_COUNT 260
<span class="lineNum"> 363 </span> :
<span class="lineNum"> 364 </span> : /**
<span class="lineNum"> 365 </span> : * Flags returned by smartctl.
<span class="lineNum"> 366 </span> : */
<span class="lineNum"> 367 </span> : #define SMARTCTL_FLAG_UNSUPPORTED (1 &lt;&lt; 0) /**&lt; Device not recognized, requiring the -d option. */
<span class="lineNum"> 368 </span> : #define SMARTCTL_FLAG_OPEN (1 &lt;&lt; 1) /**&lt; Device open or identification failed. */
<span class="lineNum"> 369 </span> : #define SMARTCTL_FLAG_COMMAND (1 &lt;&lt; 2) /**&lt; Some SMART or ATA commands failed. This is a common error, also happening with full info gathering. */
<span class="lineNum"> 370 </span> : #define SMARTCTL_FLAG_FAIL (1 &lt;&lt; 3) /**&lt; SMART status check returned &quot;DISK FAILING&quot;. */
<span class="lineNum"> 371 </span> : #define SMARTCTL_FLAG_PREFAIL (1 &lt;&lt; 4) /**&lt; We found prefail Attributes &lt;= threshold. */
<span class="lineNum"> 372 </span> : #define SMARTCTL_FLAG_PREFAIL_LOGGED (1 &lt;&lt; 5) /**&lt; SMART status check returned &quot;DISK OK&quot; but we found that some (usage or prefail) Attributes have been &lt;= threshold at some time in the past. */
<span class="lineNum"> 373 </span> : #define SMARTCTL_FLAG_ERROR (1 &lt;&lt; 6) /**&lt; The device error log contains records of errors. */
<span class="lineNum"> 374 </span> : #define SMARTCTL_FLAG_ERROR_LOGGED (1 &lt;&lt; 7) /**&lt; The device self-test log contains records of errors. */
<span class="lineNum"> 375 </span> :
<span class="lineNum"> 376 </span> : /**
<span class="lineNum"> 377 </span> : * SMART max attribute length.
<span class="lineNum"> 378 </span> : */
<span class="lineNum"> 379 </span> : #define SMART_MAX 64
<span class="lineNum"> 380 </span> :
<span class="lineNum"> 381 </span> : /**
<span class="lineNum"> 382 </span> : * Value for unassigned SMART attribute.
<span class="lineNum"> 383 </span> : */
<span class="lineNum"> 384 </span> : #define SMART_UNASSIGNED 0xFFFFFFFFFFFFFFFFULL
<span class="lineNum"> 385 </span> :
<span class="lineNum"> 386 </span> : /**
<span class="lineNum"> 387 </span> : * Device info entry.
<span class="lineNum"> 388 </span> : */
<span class="lineNum"> 389 </span> : struct devinfo_struct {
<span class="lineNum"> 390 </span> : uint64_t device; /**&lt; Device ID. */
<span class="lineNum"> 391 </span> : char name[PATH_MAX]; /**&lt; Name of the disk. */
<span class="lineNum"> 392 </span> : char mount[PATH_MAX]; /**&lt; Mount point or other contained directory. */
<span class="lineNum"> 393 </span> : char smartctl[PATH_MAX]; /**&lt; Options for smartctl. */
<span class="lineNum"> 394 </span> : char file[PATH_MAX]; /**&lt; File device. */
<span class="lineNum"> 395 </span> : #ifdef _WIN32
<span class="lineNum"> 396 </span> : char wfile[PATH_MAX]; /**&lt; File device in Windows format. Like \\.\PhysicalDriveX, or \\?\Volume{X}. */
<span class="lineNum"> 397 </span> : #endif
<span class="lineNum"> 398 </span> : struct devinfo_struct* parent; /**&lt; Pointer at the parent if any. */
<span class="lineNum"> 399 </span> : uint64_t smart[SMART_COUNT]; /**&lt; SMART raw attributes. */
<span class="lineNum"> 400 </span> : char smart_serial[SMART_MAX]; /**&lt; SMART serial number. */
<span class="lineNum"> 401 </span> : #if HAVE_PTHREAD_CREATE
<span class="lineNum"> 402 </span> : pthread_t thread;
<span class="lineNum"> 403 </span> : #endif
<span class="lineNum"> 404 </span> : tommy_node node;
<span class="lineNum"> 405 </span> : };
<span class="lineNum"> 406 </span> : typedef struct devinfo_struct devinfo_t;
<span class="lineNum"> 407 </span> :
<span class="lineNum"> 408 </span> : #define DEVICE_LIST 0
<span class="lineNum"> 409 </span> : #define DEVICE_DOWN 1
<span class="lineNum"> 410 </span> : #define DEVICE_UP 2
<span class="lineNum"> 411 </span> : #define DEVICE_SMART 3
<span class="lineNum"> 412 </span> :
<span class="lineNum"> 413 </span> : /**
<span class="lineNum"> 414 </span> : * Query all the &quot;high&quot; level devices with the specified operation,
<span class="lineNum"> 415 </span> : * and produces a list of &quot;low&quot; level devices to operate on.
<span class="lineNum"> 416 </span> : *
<span class="lineNum"> 417 </span> : * The passed &quot;low&quot; device list must be already initialized.
<span class="lineNum"> 418 </span> : */
<span class="lineNum"> 419 </span> : int devquery(tommy_list* high, tommy_list* low, int operation);
<span class="lineNum"> 420 </span> :
<span class="lineNum"> 421 </span> : #endif
<span class="lineNum"> 422 </span> :
<span class="lineNum"> 328 </span> : * Note that the frequency is unspecified, because the time measure
<span class="lineNum"> 329 </span> : * is meant to be used to compare the ratio between usage times.
<span class="lineNum"> 330 </span> : */
<span class="lineNum"> 331 </span> : uint64_t tick(void);
<span class="lineNum"> 332 </span> :
<span class="lineNum"> 333 </span> : /**
<span class="lineNum"> 334 </span> : * Get the tick counter value in millisecond.
<span class="lineNum"> 335 </span> : */
<span class="lineNum"> 336 </span> : uint64_t tick_ms(void);
<span class="lineNum"> 337 </span> :
<span class="lineNum"> 338 </span> : /**
<span class="lineNum"> 339 </span> : * Initializes the system.
<span class="lineNum"> 340 </span> : */
<span class="lineNum"> 341 </span> : void os_init(int opt);
<span class="lineNum"> 342 </span> :
<span class="lineNum"> 343 </span> : /**
<span class="lineNum"> 344 </span> : * Deinitialize the system.
<span class="lineNum"> 345 </span> : */
<span class="lineNum"> 346 </span> : void os_done(void);
<span class="lineNum"> 347 </span> :
<span class="lineNum"> 348 </span> : /**
<span class="lineNum"> 349 </span> : * Abort the process with a stacktrace.
<span class="lineNum"> 350 </span> : */
<span class="lineNum"> 351 </span> : void os_abort(void) __noreturn;
<span class="lineNum"> 352 </span> :
<span class="lineNum"> 353 </span> : /**
<span class="lineNum"> 354 </span> : * Log file.
<span class="lineNum"> 355 </span> : *
<span class="lineNum"> 356 </span> : * This stream if fully buffered.
<span class="lineNum"> 357 </span> : *
<span class="lineNum"> 358 </span> : * If no log file is selected, it's 0.
<span class="lineNum"> 359 </span> : */
<span class="lineNum"> 360 </span> : FILE* stdlog;
<span class="lineNum"> 361 </span> :
<span class="lineNum"> 362 </span> : /**
<span class="lineNum"> 363 </span> : * Exit codes for testing.
<span class="lineNum"> 364 </span> : */
<span class="lineNum"> 365 </span> : int exit_success;
<span class="lineNum"> 366 </span> : int exit_failure;
<span class="lineNum"> 367 </span> : int exit_sync_needed;
<span class="lineNum"> 368 </span> : #undef EXIT_SUCCESS
<span class="lineNum"> 369 </span> : #undef EXIT_FAILURE
<span class="lineNum"> 370 </span> : #define EXIT_SUCCESS exit_success
<span class="lineNum"> 371 </span> : #define EXIT_FAILURE exit_failure
<span class="lineNum"> 372 </span> : #define EXIT_SYNC_NEEDED exit_sync_needed
<span class="lineNum"> 373 </span> :
<span class="lineNum"> 374 </span> : /**
<span class="lineNum"> 375 </span> : * Fill memory with psudeo-random values.
<span class="lineNum"> 376 </span> : */
<span class="lineNum"> 377 </span> : int randomize(void* ptr, size_t size);
<span class="lineNum"> 378 </span> :
<span class="lineNum"> 379 </span> : /**
<span class="lineNum"> 380 </span> : * Additional SMART attributes.
<span class="lineNum"> 381 </span> : */
<span class="lineNum"> 382 </span> : #define SMART_ERROR 256 /**&lt; ATA Error count. */
<span class="lineNum"> 383 </span> : #define SMART_SIZE 257 /**&lt; Size in bytes. */
<span class="lineNum"> 384 </span> : #define SMART_ROTATION_RATE 258 /**&lt; Rotation speed. 0 for SSD. */
<span class="lineNum"> 385 </span> : #define SMART_FLAGS 259 /**&lt; Flags returned by smartctl. */
<span class="lineNum"> 386 </span> :
<span class="lineNum"> 387 </span> : /**
<span class="lineNum"> 388 </span> : * SMART attributes count.
<span class="lineNum"> 389 </span> : */
<span class="lineNum"> 390 </span> : #define SMART_COUNT 260
<span class="lineNum"> 391 </span> :
<span class="lineNum"> 392 </span> : /**
<span class="lineNum"> 393 </span> : * Flags returned by smartctl.
<span class="lineNum"> 394 </span> : */
<span class="lineNum"> 395 </span> : #define SMARTCTL_FLAG_UNSUPPORTED (1 &lt;&lt; 0) /**&lt; Device not recognized, requiring the -d option. */
<span class="lineNum"> 396 </span> : #define SMARTCTL_FLAG_OPEN (1 &lt;&lt; 1) /**&lt; Device open or identification failed. */
<span class="lineNum"> 397 </span> : #define SMARTCTL_FLAG_COMMAND (1 &lt;&lt; 2) /**&lt; Some SMART or ATA commands failed. This is a common error, also happening with full info gathering. */
<span class="lineNum"> 398 </span> : #define SMARTCTL_FLAG_FAIL (1 &lt;&lt; 3) /**&lt; SMART status check returned &quot;DISK FAILING&quot;. */
<span class="lineNum"> 399 </span> : #define SMARTCTL_FLAG_PREFAIL (1 &lt;&lt; 4) /**&lt; We found prefail Attributes &lt;= threshold. */
<span class="lineNum"> 400 </span> : #define SMARTCTL_FLAG_PREFAIL_LOGGED (1 &lt;&lt; 5) /**&lt; SMART status check returned &quot;DISK OK&quot; but we found that some (usage or prefail) Attributes have been &lt;= threshold at some time in the past. */
<span class="lineNum"> 401 </span> : #define SMARTCTL_FLAG_ERROR (1 &lt;&lt; 6) /**&lt; The device error log contains records of errors. */
<span class="lineNum"> 402 </span> : #define SMARTCTL_FLAG_ERROR_LOGGED (1 &lt;&lt; 7) /**&lt; The device self-test log contains records of errors. */
<span class="lineNum"> 403 </span> :
<span class="lineNum"> 404 </span> : /**
<span class="lineNum"> 405 </span> : * SMART max attribute length.
<span class="lineNum"> 406 </span> : */
<span class="lineNum"> 407 </span> : #define SMART_MAX 64
<span class="lineNum"> 408 </span> :
<span class="lineNum"> 409 </span> : /**
<span class="lineNum"> 410 </span> : * Value for unassigned SMART attribute.
<span class="lineNum"> 411 </span> : */
<span class="lineNum"> 412 </span> : #define SMART_UNASSIGNED 0xFFFFFFFFFFFFFFFFULL
<span class="lineNum"> 413 </span> :
<span class="lineNum"> 414 </span> : /**
<span class="lineNum"> 415 </span> : * Device info entry.
<span class="lineNum"> 416 </span> : */
<span class="lineNum"> 417 </span> : struct devinfo_struct {
<span class="lineNum"> 418 </span> : uint64_t device; /**&lt; Device ID. */
<span class="lineNum"> 419 </span> : char name[PATH_MAX]; /**&lt; Name of the disk. */
<span class="lineNum"> 420 </span> : char mount[PATH_MAX]; /**&lt; Mount point or other contained directory. */
<span class="lineNum"> 421 </span> : char smartctl[PATH_MAX]; /**&lt; Options for smartctl. */
<span class="lineNum"> 422 </span> : char file[PATH_MAX]; /**&lt; File device. */
<span class="lineNum"> 423 </span> : #ifdef _WIN32
<span class="lineNum"> 424 </span> : char wfile[PATH_MAX]; /**&lt; File device in Windows format. Like \\.\PhysicalDriveX, or \\?\Volume{X}. */
<span class="lineNum"> 425 </span> : #endif
<span class="lineNum"> 426 </span> : struct devinfo_struct* parent; /**&lt; Pointer at the parent if any. */
<span class="lineNum"> 427 </span> : uint64_t smart[SMART_COUNT]; /**&lt; SMART raw attributes. */
<span class="lineNum"> 428 </span> : char smart_serial[SMART_MAX]; /**&lt; SMART serial number. */
<span class="lineNum"> 429 </span> : #if HAVE_PTHREAD
<span class="lineNum"> 430 </span> : pthread_t thread;
<span class="lineNum"> 431 </span> : #endif
<span class="lineNum"> 432 </span> : tommy_node node;
<span class="lineNum"> 433 </span> : };
<span class="lineNum"> 434 </span> : typedef struct devinfo_struct devinfo_t;
<span class="lineNum"> 435 </span> :
<span class="lineNum"> 436 </span> : #define DEVICE_LIST 0
<span class="lineNum"> 437 </span> : #define DEVICE_DOWN 1
<span class="lineNum"> 438 </span> : #define DEVICE_UP 2
<span class="lineNum"> 439 </span> : #define DEVICE_SMART 3
<span class="lineNum"> 440 </span> :
<span class="lineNum"> 441 </span> : /**
<span class="lineNum"> 442 </span> : * Query all the &quot;high&quot; level devices with the specified operation,
<span class="lineNum"> 443 </span> : * and produces a list of &quot;low&quot; level devices to operate on.
<span class="lineNum"> 444 </span> : *
<span class="lineNum"> 445 </span> : * The passed &quot;low&quot; device list must be already initialized.
<span class="lineNum"> 446 </span> : */
<span class="lineNum"> 447 </span> : int devquery(tommy_list* high, tommy_list* low, int operation);
<span class="lineNum"> 448 </span> :
<span class="lineNum"> 449 </span> : #endif
<span class="lineNum"> 450 </span> :
</pre>
</td>
</tr>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">1</td>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">1</td>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">1</td>
@ -126,28 +126,28 @@
<span class="lineNum"> 64 </span> : }
<span class="lineNum"> 65 </span> :
<span class="lineNum"> 66 </span> : /* mark all the block for rehashing */
<span class="lineNum"> 67 </span><span class="lineCov"> 9200 : for (i = 0; i &lt; blockmax; ++i) {</span>
<span class="lineNum"> 67 </span><span class="lineCov"> 9208 : for (i = 0; i &lt; blockmax; ++i) {</span>
<span class="lineNum"> 68 </span> : snapraid_info info;
<span class="lineNum"> 69 </span> :
<span class="lineNum"> 70 </span> : /* if it's unused */
<span class="lineNum"> 71 </span><span class="lineCov"> 9199 : info = info_get(&amp;state-&gt;infoarr, i);</span>
<span class="lineNum"> 72 </span><span class="lineCov"> 9199 : if (info == 0) {</span>
<span class="lineNum"> 71 </span><span class="lineCov"> 9207 : info = info_get(&amp;state-&gt;infoarr, i);</span>
<span class="lineNum"> 72 </span><span class="lineCov"> 9207 : if (info == 0) {</span>
<span class="lineNum"> 73 </span> : /* skip it */
<span class="lineNum"> 74 </span><span class="lineNoCov"> 0 : continue;</span>
<span class="lineNum"> 75 </span> : }
<span class="lineNum"> 76 </span> :
<span class="lineNum"> 77 </span><span class="lineCov"> 9199 : if (info_get_rehash(info)) {</span>
<span class="lineNum"> 77 </span><span class="lineCov"> 9207 : if (info_get_rehash(info)) {</span>
<span class="lineNum"> 78 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 79 </span> : log_fatal(&quot;Internal inconsistency for a rehash already in progress\n&quot;);
<span class="lineNum"> 80 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 80 </span> : os_abort();
<span class="lineNum"> 81 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 82 </span> : }
<span class="lineNum"> 83 </span> :
<span class="lineNum"> 84 </span> : /* enable the rehash */
<span class="lineNum"> 85 </span><span class="lineCov"> 9199 : info = info_set_rehash(info);</span>
<span class="lineNum"> 85 </span><span class="lineCov"> 9207 : info = info_set_rehash(info);</span>
<span class="lineNum"> 86 </span> :
<span class="lineNum"> 87 </span> : /* save it */
<span class="lineNum"> 88 </span><span class="lineCov"> 9199 : info_set(&amp;state-&gt;infoarr, i, info);</span>
<span class="lineNum"> 88 </span><span class="lineCov"> 9207 : info_set(&amp;state-&gt;infoarr, i, info);</span>
<span class="lineNum"> 89 </span> : }
<span class="lineNum"> 90 </span> :
<span class="lineNum"> 91 </span> : /* save the new content file */

View file

@ -31,13 +31,13 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">542</td>
<td class="headerCovTableEntry">620</td>
<td class="headerCovTableEntryMed">87.4 %</td>
<td class="headerCovTableEntry">554</td>
<td class="headerCovTableEntry">622</td>
<td class="headerCovTableEntryMed">89.1 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">23</td>
@ -61,59 +61,59 @@
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#1066">dd_name_compare</a></td>
<td class="coverFnHi">10485497</td>
<td class="coverFnHi">10959090</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#1085">dstat</a></td>
<td class="coverFnHi">1004217</td>
<td class="coverFnHi">1049496</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#593">scan_file</a></td>
<td class="coverFnHi">1003082</td>
<td class="coverFnHi">1048310</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#574">scan_file_keep</a></td>
<td class="coverFnHi">923721</td>
<td class="coverFnHi">968997</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#360">file_is_full_invalid_parity_and_stable</a></td>
<td class="coverFnHi">923721</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#1052">dd_ino_compare</a></td>
<td class="coverFnHi">103314</td>
<td class="coverFnHi">968997</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#331">scan_file_delayed_allocate</a></td>
<td class="coverFnHi">100975</td>
<td class="coverFnHi">103840</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#530">scan_file_insert</a></td>
<td class="coverFnHi">100975</td>
<td class="coverFnHi">103840</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#158">scan_file_allocate</a></td>
<td class="coverFnHi">100975</td>
<td class="coverFnHi">103840</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#1052">dd_ino_compare</a></td>
<td class="coverFnHi">103366</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#453">scan_file_refresh</a></td>
<td class="coverFnHi">79190</td>
<td class="coverFnHi">79133</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#549">scan_file_remove</a></td>
<td class="coverFnHi">56139</td>
<td class="coverFnHi">58983</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#257">scan_file_deallocate</a></td>
<td class="coverFnHi">56139</td>
<td class="coverFnHi">58983</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#84">scan_link</a></td>
<td class="coverFnHi">32837</td>
<td class="coverFnHi">34294</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#401">file_is_full_hashed_and_stable</a></td>
<td class="coverFnHi">23659</td>
<td class="coverFnHi">23661</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#68">scan_link_insert</a></td>
@ -121,7 +121,7 @@
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#1101">scan_dir</a></td>
<td class="coverFnHi">1614</td>
<td class="coverFnHi">1713</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#49">scan_link_remove</a></td>
@ -129,22 +129,22 @@
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#1000">scan_emptydir</a></td>
<td class="coverFnHi">227</td>
<td class="coverFnHi">239</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#1388">state_diffscan</a></td>
<td class="coverFnHi">80</td>
<td class="coverFn"><a href="scan.c.gcov.html#1390">state_diffscan</a></td>
<td class="coverFnHi">88</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#1831">state_scan</a></td>
<td class="coverFnHi">73</td>
<td class="coverFn"><a href="scan.c.gcov.html#1837">state_scan</a></td>
<td class="coverFnHi">81</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#984">scan_emptydir_insert</a></td>
<td class="coverFnHi">10</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#1826">state_diff</a></td>
<td class="coverFn"><a href="scan.c.gcov.html#1832">state_diff</a></td>
<td class="coverFnHi">7</td>
</tr>
<tr>

View file

@ -31,13 +31,13 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">542</td>
<td class="headerCovTableEntry">620</td>
<td class="headerCovTableEntryMed">87.4 %</td>
<td class="headerCovTableEntry">554</td>
<td class="headerCovTableEntry">622</td>
<td class="headerCovTableEntryMed">89.1 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">23</td>
@ -61,31 +61,31 @@
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#1052">dd_ino_compare</a></td>
<td class="coverFnHi">103314</td>
<td class="coverFnHi">103366</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#1066">dd_name_compare</a></td>
<td class="coverFnHi">10485497</td>
<td class="coverFnHi">10959090</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#1085">dstat</a></td>
<td class="coverFnHi">1004217</td>
<td class="coverFnHi">1049496</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#401">file_is_full_hashed_and_stable</a></td>
<td class="coverFnHi">23659</td>
<td class="coverFnHi">23661</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#360">file_is_full_invalid_parity_and_stable</a></td>
<td class="coverFnHi">923721</td>
<td class="coverFnHi">968997</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#1101">scan_dir</a></td>
<td class="coverFnHi">1614</td>
<td class="coverFnHi">1713</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#1000">scan_emptydir</a></td>
<td class="coverFnHi">227</td>
<td class="coverFnHi">239</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#984">scan_emptydir_insert</a></td>
@ -97,39 +97,39 @@
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#593">scan_file</a></td>
<td class="coverFnHi">1003082</td>
<td class="coverFnHi">1048310</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#158">scan_file_allocate</a></td>
<td class="coverFnHi">100975</td>
<td class="coverFnHi">103840</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#257">scan_file_deallocate</a></td>
<td class="coverFnHi">56139</td>
<td class="coverFnHi">58983</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#331">scan_file_delayed_allocate</a></td>
<td class="coverFnHi">100975</td>
<td class="coverFnHi">103840</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#530">scan_file_insert</a></td>
<td class="coverFnHi">100975</td>
<td class="coverFnHi">103840</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#574">scan_file_keep</a></td>
<td class="coverFnHi">923721</td>
<td class="coverFnHi">968997</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#453">scan_file_refresh</a></td>
<td class="coverFnHi">79190</td>
<td class="coverFnHi">79133</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#549">scan_file_remove</a></td>
<td class="coverFnHi">56139</td>
<td class="coverFnHi">58983</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#84">scan_link</a></td>
<td class="coverFnHi">32837</td>
<td class="coverFnHi">34294</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#68">scan_link_insert</a></td>
@ -140,16 +140,16 @@
<td class="coverFnHi">956</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#1826">state_diff</a></td>
<td class="coverFn"><a href="scan.c.gcov.html#1832">state_diff</a></td>
<td class="coverFnHi">7</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#1388">state_diffscan</a></td>
<td class="coverFnHi">80</td>
<td class="coverFn"><a href="scan.c.gcov.html#1390">state_diffscan</a></td>
<td class="coverFnHi">88</td>
</tr>
<tr>
<td class="coverFn"><a href="scan.c.gcov.html#1831">state_scan</a></td>
<td class="coverFnHi">73</td>
<td class="coverFn"><a href="scan.c.gcov.html#1837">state_scan</a></td>
<td class="coverFnHi">81</td>
</tr>
</table>
<br>

File diff suppressed because it is too large Load diff

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">4</td>
@ -61,7 +61,7 @@
</tr>
<tr>
<td class="coverFn"><a href="scrub.c.gcov.html#49">block_is_enabled</a></td>
<td class="coverFnHi">111818</td>
<td class="coverFnHi">111994</td>
</tr>
<tr>
<td class="coverFn"><a href="scrub.c.gcov.html#100">state_scrub_process</a></td>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">4</td>
@ -61,7 +61,7 @@
</tr>
<tr>
<td class="coverFn"><a href="scrub.c.gcov.html#49">block_is_enabled</a></td>
<td class="coverFnHi">111818</td>
<td class="coverFnHi">111994</td>
</tr>
<tr>
<td class="coverFn"><a href="scrub.c.gcov.html#560">md</a></td>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">4</td>
@ -110,55 +110,55 @@
<span class="lineNum"> 48 </span> : /**
<a name="49"><span class="lineNum"> 49 </span> : * Check if we have to process the specified block index ::i.</a>
<span class="lineNum"> 50 </span> : */
<span class="lineNum"> 51 </span><span class="lineCov"> 111818 : static int block_is_enabled(struct snapraid_state* state, block_off_t i, struct snapraid_plan* plan)</span>
<span class="lineNum"> 51 </span><span class="lineCov"> 111994 : static int block_is_enabled(struct snapraid_state* state, block_off_t i, struct snapraid_plan* plan)</span>
<span class="lineNum"> 52 </span> : {
<span class="lineNum"> 53 </span> : time_t blocktime;
<span class="lineNum"> 54 </span> : snapraid_info info;
<span class="lineNum"> 55 </span> :
<span class="lineNum"> 56 </span> : /* don't scrub unused blocks in all plans */
<span class="lineNum"> 57 </span><span class="lineCov"> 111818 : info = info_get(&amp;state-&gt;infoarr, i);</span>
<span class="lineNum"> 58 </span><span class="lineCov"> 111818 : if (info == 0)</span>
<span class="lineNum"> 57 </span><span class="lineCov"> 111994 : info = info_get(&amp;state-&gt;infoarr, i);</span>
<span class="lineNum"> 58 </span><span class="lineCov"> 111994 : if (info == 0)</span>
<span class="lineNum"> 59 </span><span class="lineNoCov"> 0 : return 0;</span>
<span class="lineNum"> 60 </span> :
<span class="lineNum"> 61 </span> : /* bad blocks are always scrubbed in all plans */
<span class="lineNum"> 62 </span><span class="lineCov"> 111818 : if (info_get_bad(info))</span>
<span class="lineNum"> 63 </span><span class="lineCov"> 3604 : return 1;</span>
<span class="lineNum"> 62 </span><span class="lineCov"> 111994 : if (info_get_bad(info))</span>
<span class="lineNum"> 63 </span><span class="lineCov"> 3542 : return 1;</span>
<span class="lineNum"> 64 </span> :
<span class="lineNum"> 65 </span><span class="lineCov"> 108214 : switch (plan-&gt;plan) {</span>
<span class="lineNum"> 65 </span><span class="lineCov"> 108452 : switch (plan-&gt;plan) {</span>
<span class="lineNum"> 66 </span> : case SCRUB_FULL :
<span class="lineNum"> 67 </span> : /* in 'full' plan everything is scrubbed */
<span class="lineNum"> 68 </span><span class="lineCov"> 16920 : return 1;</span>
<span class="lineNum"> 68 </span><span class="lineCov"> 17014 : return 1;</span>
<span class="lineNum"> 69 </span> : case SCRUB_EVEN :
<span class="lineNum"> 70 </span> : /* in 'even' plan, scrub only even blocks */
<span class="lineNum"> 71 </span><span class="lineCov"> 18398 : return i % 2 == 0;</span>
<span class="lineNum"> 71 </span><span class="lineCov"> 18414 : return i % 2 == 0;</span>
<span class="lineNum"> 72 </span> : case SCRUB_NEW :
<span class="lineNum"> 73 </span> : /* in 'sync' plan, only blocks never scrubbed */
<span class="lineNum"> 74 </span><span class="lineCov"> 9342 : return info_get_justsynced(info);</span>
<span class="lineNum"> 74 </span><span class="lineCov"> 9358 : return info_get_justsynced(info);</span>
<span class="lineNum"> 75 </span> : case SCRUB_BAD :
<span class="lineNum"> 76 </span> : /* in 'bad' plan, only bad blocks (already reported) */
<span class="lineNum"> 77 </span><span class="lineCov"> 7502 : return 0;</span>
<span class="lineNum"> 77 </span><span class="lineCov"> 7518 : return 0;</span>
<span class="lineNum"> 78 </span> : }
<span class="lineNum"> 79 </span> :
<span class="lineNum"> 80 </span> : /* if it's too new */
<span class="lineNum"> 81 </span><span class="lineCov"> 56052 : blocktime = info_get_time(info);</span>
<span class="lineNum"> 82 </span><span class="lineCov"> 56052 : if (blocktime &gt; plan-&gt;timelimit) {</span>
<span class="lineNum"> 81 </span><span class="lineCov"> 56148 : blocktime = info_get_time(info);</span>
<span class="lineNum"> 82 </span><span class="lineCov"> 56148 : if (blocktime &gt; plan-&gt;timelimit) {</span>
<span class="lineNum"> 83 </span> : /* skip it */
<span class="lineNum"> 84 </span><span class="lineCov"> 22506 : return 0;</span>
<span class="lineNum"> 84 </span><span class="lineCov"> 20662 : return 0;</span>
<span class="lineNum"> 85 </span> : }
<span class="lineNum"> 86 </span> :
<span class="lineNum"> 87 </span> : /* if the time is less than the limit, always include */
<span class="lineNum"> 88 </span> : /* otherwise, check if we reached the last limit count */
<span class="lineNum"> 89 </span><span class="lineCov"> 33546 : if (blocktime == plan-&gt;timelimit) {</span>
<span class="lineNum"> 89 </span><span class="lineCov"> 35486 : if (blocktime == plan-&gt;timelimit) {</span>
<span class="lineNum"> 90 </span> : /* if we reached the count limit */
<span class="lineNum"> 91 </span><span class="lineCov"> 16872 : if (plan-&gt;countlast &gt;= plan-&gt;lastlimit) {</span>
<span class="lineNum"> 91 </span><span class="lineCov"> 18980 : if (plan-&gt;countlast &gt;= plan-&gt;lastlimit) {</span>
<span class="lineNum"> 92 </span> : /* skip it */
<span class="lineNum"> 93 </span><span class="lineCov"> 11882 : return 0;</span>
<span class="lineNum"> 93 </span><span class="lineCov"> 13790 : return 0;</span>
<span class="lineNum"> 94 </span> : }
<span class="lineNum"> 95 </span> :
<span class="lineNum"> 96 </span><span class="lineCov"> 4990 : ++plan-&gt;countlast;</span>
<span class="lineNum"> 96 </span><span class="lineCov"> 5190 : ++plan-&gt;countlast;</span>
<span class="lineNum"> 97 </span> : }
<span class="lineNum"> 98 </span> :
<span class="lineNum"> 99 </span><span class="lineCov"> 21664 : return 1;</span>
<span class="lineNum"> 99 </span><span class="lineCov"> 21696 : return 1;</span>
<a name="100"><span class="lineNum"> 100 </span> : }</a>
<span class="lineNum"> 101 </span> :
<span class="lineNum"> 102 </span><span class="lineCov"> 11 : static int state_scrub_process(struct snapraid_state* state, struct snapraid_parity_handle** parity, block_off_t blockstart, block_off_t blockmax, struct snapraid_plan* plan, time_t now)</span>
@ -204,11 +204,11 @@
<span class="lineNum"> 142 </span> : /* first count the number of blocks to process */
<span class="lineNum"> 143 </span><span class="lineCov"> 11 : countmax = 0;</span>
<span class="lineNum"> 144 </span><span class="lineCov"> 11 : plan-&gt;countlast = 0;</span>
<span class="lineNum"> 145 </span><span class="lineCov"> 55920 : for (i = blockstart; i &lt; blockmax; ++i) {</span>
<span class="lineNum"> 146 </span><span class="lineCov"> 55909 : if (!block_is_enabled(state, i, plan))</span>
<span class="lineNum"> 147 </span><span class="lineCov"> 27950 : continue;</span>
<span class="lineNum"> 145 </span><span class="lineCov"> 56008 : for (i = blockstart; i &lt; blockmax; ++i) {</span>
<span class="lineNum"> 146 </span><span class="lineCov"> 55997 : if (!block_is_enabled(state, i, plan))</span>
<span class="lineNum"> 147 </span><span class="lineCov"> 28002 : continue;</span>
<span class="lineNum"> 148 </span> :
<span class="lineNum"> 149 </span><span class="lineCov"> 27959 : ++countmax;</span>
<span class="lineNum"> 149 </span><span class="lineCov"> 27995 : ++countmax;</span>
<span class="lineNum"> 150 </span> : }
<span class="lineNum"> 151 </span> :
<span class="lineNum"> 152 </span> : /* compute the autosave size for all disk, even if not read */
@ -225,7 +225,7 @@
<span class="lineNum"> 163 </span><span class="lineCov"> 11 : countpos = 0;</span>
<span class="lineNum"> 164 </span><span class="lineCov"> 11 : plan-&gt;countlast = 0;</span>
<span class="lineNum"> 165 </span><span class="lineCov"> 11 : state_progress_begin(state, blockstart, blockmax, countmax);</span>
<span class="lineNum"> 166 </span><span class="lineCov"> 55920 : for (i = blockstart; i &lt; blockmax; ++i) {</span>
<span class="lineNum"> 166 </span><span class="lineCov"> 56008 : for (i = blockstart; i &lt; blockmax; ++i) {</span>
<span class="lineNum"> 167 </span> : snapraid_info info;
<span class="lineNum"> 168 </span> : int error_on_this_block;
<span class="lineNum"> 169 </span> : int silent_error_on_this_block;
@ -233,65 +233,65 @@
<span class="lineNum"> 171 </span> : int block_is_unsynced;
<span class="lineNum"> 172 </span> : int rehash;
<span class="lineNum"> 173 </span> :
<span class="lineNum"> 174 </span><span class="lineCov"> 55909 : if (!block_is_enabled(state, i, plan))</span>
<span class="lineNum"> 175 </span><span class="lineCov"> 27950 : continue;</span>
<span class="lineNum"> 174 </span><span class="lineCov"> 55997 : if (!block_is_enabled(state, i, plan))</span>
<span class="lineNum"> 175 </span><span class="lineCov"> 28002 : continue;</span>
<span class="lineNum"> 176 </span> :
<span class="lineNum"> 177 </span> : /* one more block processed for autosave */
<span class="lineNum"> 178 </span><span class="lineCov"> 27959 : ++autosavedone;</span>
<span class="lineNum"> 179 </span><span class="lineCov"> 27959 : --autosavemissing;</span>
<span class="lineNum"> 178 </span><span class="lineCov"> 27995 : ++autosavedone;</span>
<span class="lineNum"> 179 </span><span class="lineCov"> 27995 : --autosavemissing;</span>
<span class="lineNum"> 180 </span> :
<span class="lineNum"> 181 </span> : /* by default process the block, and skip it if something goes wrong */
<span class="lineNum"> 182 </span><span class="lineCov"> 27959 : error_on_this_block = 0;</span>
<span class="lineNum"> 183 </span><span class="lineCov"> 27959 : silent_error_on_this_block = 0;</span>
<span class="lineNum"> 184 </span><span class="lineCov"> 27959 : io_error_on_this_block = 0;</span>
<span class="lineNum"> 182 </span><span class="lineCov"> 27995 : error_on_this_block = 0;</span>
<span class="lineNum"> 183 </span><span class="lineCov"> 27995 : silent_error_on_this_block = 0;</span>
<span class="lineNum"> 184 </span><span class="lineCov"> 27995 : io_error_on_this_block = 0;</span>
<span class="lineNum"> 185 </span> :
<span class="lineNum"> 186 </span> : /* if all the blocks at this address are synced */
<span class="lineNum"> 187 </span> : /* if not, parity is not even checked */
<span class="lineNum"> 188 </span><span class="lineCov"> 27959 : block_is_unsynced = 0;</span>
<span class="lineNum"> 188 </span><span class="lineCov"> 27995 : block_is_unsynced = 0;</span>
<span class="lineNum"> 189 </span> :
<span class="lineNum"> 190 </span> : /* get block specific info */
<span class="lineNum"> 191 </span><span class="lineCov"> 27959 : info = info_get(&amp;state-&gt;infoarr, i);</span>
<span class="lineNum"> 191 </span><span class="lineCov"> 27995 : info = info_get(&amp;state-&gt;infoarr, i);</span>
<span class="lineNum"> 192 </span> :
<span class="lineNum"> 193 </span> : /* if we have to use the old hash */
<span class="lineNum"> 194 </span><span class="lineCov"> 27959 : rehash = info_get_rehash(info);</span>
<span class="lineNum"> 194 </span><span class="lineCov"> 27995 : rehash = info_get_rehash(info);</span>
<span class="lineNum"> 195 </span> :
<span class="lineNum"> 196 </span> : /* for each disk, process the block */
<span class="lineNum"> 197 </span><span class="lineCov"> 195713 : for (j = 0; j &lt; diskmax; ++j) {</span>
<span class="lineNum"> 197 </span><span class="lineCov"> 195965 : for (j = 0; j &lt; diskmax; ++j) {</span>
<span class="lineNum"> 198 </span> : int read_size;
<span class="lineNum"> 199 </span> : unsigned char hash[HASH_SIZE];
<span class="lineNum"> 200 </span> : struct snapraid_block* block;
<span class="lineNum"> 201 </span> : int file_is_unsynced;
<span class="lineNum"> 202 </span><span class="lineCov"> 167754 : struct snapraid_disk* disk = handle[j].disk;</span>
<span class="lineNum"> 202 </span><span class="lineCov"> 167970 : struct snapraid_disk* disk = handle[j].disk;</span>
<span class="lineNum"> 203 </span> : struct snapraid_file* file;
<span class="lineNum"> 204 </span> : block_off_t file_pos;
<span class="lineNum"> 205 </span> :
<span class="lineNum"> 206 </span> : /* if the file on this disk is synced */
<span class="lineNum"> 207 </span> : /* if not, silent errors are assumed as expected error */
<span class="lineNum"> 208 </span><span class="lineCov"> 167754 : file_is_unsynced = 0;</span>
<span class="lineNum"> 208 </span><span class="lineCov"> 167970 : file_is_unsynced = 0;</span>
<span class="lineNum"> 209 </span> :
<span class="lineNum"> 210 </span> : /* by default no rehash in case of &quot;continue&quot; */
<span class="lineNum"> 211 </span><span class="lineCov"> 167754 : rehandle[j].block = 0;</span>
<span class="lineNum"> 211 </span><span class="lineCov"> 167970 : rehandle[j].block = 0;</span>
<span class="lineNum"> 212 </span> :
<span class="lineNum"> 213 </span> : /* if the disk position is not used */
<span class="lineNum"> 214 </span><span class="lineCov"> 167754 : if (!disk) {</span>
<span class="lineNum"> 214 </span><span class="lineCov"> 167970 : if (!disk) {</span>
<span class="lineNum"> 215 </span> : /* use an empty block */
<span class="lineNum"> 216 </span><span class="lineNoCov"> 0 : memset(buffer[j], 0, state-&gt;block_size);</span>
<span class="lineNum"> 217 </span><span class="lineCov"> 2433 : continue;</span>
<span class="lineNum"> 217 </span><span class="lineCov"> 2397 : continue;</span>
<span class="lineNum"> 218 </span> : }
<span class="lineNum"> 219 </span> :
<span class="lineNum"> 220 </span> : /* if the block is not used */
<span class="lineNum"> 221 </span><span class="lineCov"> 167754 : block = fs_par2block_get(disk, i);</span>
<span class="lineNum"> 222 </span><span class="lineCov"> 167754 : if (!block_has_file(block)) {</span>
<span class="lineNum"> 221 </span><span class="lineCov"> 167970 : block = fs_par2block_get(disk, i);</span>
<span class="lineNum"> 222 </span><span class="lineCov"> 167970 : if (!block_has_file(block)) {</span>
<span class="lineNum"> 223 </span> : /* use an empty block */
<span class="lineNum"> 224 </span><span class="lineCov"> 1513 : memset(buffer[j], 0, state-&gt;block_size);</span>
<span class="lineNum"> 225 </span><span class="lineCov"> 1513 : continue;</span>
<span class="lineNum"> 224 </span><span class="lineCov"> 1477 : memset(buffer[j], 0, state-&gt;block_size);</span>
<span class="lineNum"> 225 </span><span class="lineCov"> 1477 : continue;</span>
<span class="lineNum"> 226 </span> : }
<span class="lineNum"> 227 </span> :
<span class="lineNum"> 228 </span> : /* get the file of this block */
<span class="lineNum"> 229 </span><span class="lineCov"> 166241 : file = fs_par2file_get(disk, i, &amp;file_pos);</span>
<span class="lineNum"> 229 </span><span class="lineCov"> 166493 : file = fs_par2file_get(disk, i, &amp;file_pos);</span>
<span class="lineNum"> 230 </span> :
<span class="lineNum"> 231 </span> : /* if the block is unsynced, errors are expected */
<span class="lineNum"> 232 </span><span class="lineCov"> 166241 : if (block_has_invalid_parity(block)) {</span>
<span class="lineNum"> 232 </span><span class="lineCov"> 166493 : if (block_has_invalid_parity(block)) {</span>
<span class="lineNum"> 233 </span> : /* report that the block and the file are not synced */
<span class="lineNum"> 234 </span><span class="lineNoCov"> 0 : block_is_unsynced = 1;</span>
<span class="lineNum"> 235 </span><span class="lineNoCov"> 0 : file_is_unsynced = 1;</span>
@ -299,14 +299,14 @@
<span class="lineNum"> 237 </span> : }
<span class="lineNum"> 238 </span> :
<span class="lineNum"> 239 </span> : /* until now is CPU */
<span class="lineNum"> 240 </span><span class="lineCov"> 166241 : state_usage_cpu(state);</span>
<span class="lineNum"> 240 </span><span class="lineCov"> 166493 : state_usage_cpu(state);</span>
<span class="lineNum"> 241 </span> :
<span class="lineNum"> 242 </span> : /* if the file is different than the current one, close it */
<span class="lineNum"> 243 </span><span class="lineCov"> 166241 : if (handle[j].file != 0 &amp;&amp; handle[j].file != file) {</span>
<span class="lineNum"> 243 </span><span class="lineCov"> 166493 : if (handle[j].file != 0 &amp;&amp; handle[j].file != file) {</span>
<span class="lineNum"> 244 </span> : /* keep a pointer at the file we are going to close for error reporting */
<span class="lineNum"> 245 </span><span class="lineCov"> 78552 : struct snapraid_file* report = handle[j].file;</span>
<span class="lineNum"> 246 </span><span class="lineCov"> 78552 : ret = handle_close(&amp;handle[j]);</span>
<span class="lineNum"> 247 </span><span class="lineCov"> 78552 : if (ret == -1) {</span>
<span class="lineNum"> 245 </span><span class="lineCov"> 78228 : struct snapraid_file* report = handle[j].file;</span>
<span class="lineNum"> 246 </span><span class="lineCov"> 78228 : ret = handle_close(&amp;handle[j]);</span>
<span class="lineNum"> 247 </span><span class="lineCov"> 78228 : if (ret == -1) {</span>
<span class="lineNum"> 248 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 249 </span> : /* This one is really an unexpected error, because we are only reading */
<span class="lineNum"> 250 </span> : /* and closing a descriptor should never fail */
@ -329,8 +329,8 @@
<span class="lineNum"> 267 </span> : }
<span class="lineNum"> 268 </span> : }
<span class="lineNum"> 269 </span> :
<span class="lineNum"> 270 </span><span class="lineCov"> 166241 : ret = handle_open(&amp;handle[j], file, state-&gt;file_mode, log_error, 0);</span>
<span class="lineNum"> 271 </span><span class="lineCov"> 166241 : if (ret == -1) {</span>
<span class="lineNum"> 270 </span><span class="lineCov"> 166493 : ret = handle_open(&amp;handle[j], file, state-&gt;file_mode, log_error, 0);</span>
<span class="lineNum"> 271 </span><span class="lineCov"> 166493 : if (ret == -1) {</span>
<span class="lineNum"> 272 </span><span class="lineNoCov"> 0 : if (errno == EIO) {</span>
<span class="lineNum"> 273 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 274 </span> : log_tag(&quot;error:%u:%s:%s: Open EIO error. %s\n&quot;, i, disk-&gt;name, esc(file-&gt;sub), strerror(errno));
@ -349,14 +349,14 @@
<span class="lineNum"> 287 </span> : }
<span class="lineNum"> 288 </span> :
<span class="lineNum"> 289 </span> : /* check if the file is changed */
<span class="lineNum"> 290 </span><span class="lineCov"> 166241 : if (handle[j].st.st_size != file-&gt;size</span>
<span class="lineNum"> 291 </span><span class="lineCov"> 166241 : || handle[j].st.st_mtime != file-&gt;mtime_sec</span>
<span class="lineNum"> 292 </span><span class="lineCov"> 160522 : || STAT_NSEC(&amp;handle[j].st) != file-&gt;mtime_nsec</span>
<span class="lineNum"> 293 </span> : /* don't check the inode to support filesystem without persistent inodes */
<span class="lineNum"> 290 </span><span class="lineCov"> 166493 : if (handle[j].st.st_size != file-&gt;size</span>
<span class="lineNum"> 291 </span><span class="lineCov"> 166493 : || handle[j].st.st_mtime != file-&gt;mtime_sec</span>
<span class="lineNum"> 292 </span><span class="lineCov"> 160895 : || STAT_NSEC(&amp;handle[j].st) != file-&gt;mtime_nsec</span>
<span class="lineNum"> 293 </span> : /* don't check the inode to support file-system without persistent inodes */
<span class="lineNum"> 294 </span> : ) {
<span class="lineNum"> 295 </span> : /* report that the block and the file are not synced */
<span class="lineNum"> 296 </span><span class="lineCov"> 5719 : block_is_unsynced = 1;</span>
<span class="lineNum"> 297 </span><span class="lineCov"> 5719 : file_is_unsynced = 1;</span>
<span class="lineNum"> 296 </span><span class="lineCov"> 5598 : block_is_unsynced = 1;</span>
<span class="lineNum"> 297 </span><span class="lineCov"> 5598 : file_is_unsynced = 1;</span>
<span class="lineNum"> 298 </span> : /* follow */
<span class="lineNum"> 299 </span> : }
<span class="lineNum"> 300 </span> :
@ -364,8 +364,8 @@
<span class="lineNum"> 302 </span> : /* from the last sync, as we are expected to return errors if running */
<span class="lineNum"> 303 </span> : /* in an unsynced array. This is just like the check command. */
<span class="lineNum"> 304 </span> :
<span class="lineNum"> 305 </span><span class="lineCov"> 166241 : read_size = handle_read(&amp;handle[j], file_pos, buffer[j], state-&gt;block_size, log_error, 0);</span>
<span class="lineNum"> 306 </span><span class="lineCov"> 166241 : if (read_size == -1) {</span>
<span class="lineNum"> 305 </span><span class="lineCov"> 166493 : read_size = handle_read(&amp;handle[j], file_pos, buffer[j], state-&gt;block_size, log_error, 0);</span>
<span class="lineNum"> 306 </span><span class="lineCov"> 166493 : if (read_size == -1) {</span>
<span class="lineNum"> 307 </span><span class="lineNoCov"> 0 : if (errno == EIO) {</span>
<span class="lineNum"> 308 </span><span class="lineNoCov"> 0 : log_tag(&quot;error:%u:%s:%s: Read EIO error at position %u. %s\n&quot;, i, disk-&gt;name, esc(file-&gt;sub), file_pos, strerror(errno));</span>
<span class="lineNum"> 309 </span><span class="lineNoCov"> 0 : if (io_error &gt;= state-&gt;opt.io_error_limit) {</span>
@ -391,24 +391,24 @@
<span class="lineNum"> 329 </span> : }
<span class="lineNum"> 330 </span> :
<span class="lineNum"> 331 </span> : /* until now is disk */
<span class="lineNum"> 332 </span><span class="lineCov"> 166241 : state_usage_disk(state, disk);</span>
<span class="lineNum"> 332 </span><span class="lineCov"> 166493 : state_usage_disk(state, disk);</span>
<span class="lineNum"> 333 </span> :
<span class="lineNum"> 334 </span><span class="lineCov"> 166241 : countsize += read_size;</span>
<span class="lineNum"> 334 </span><span class="lineCov"> 166493 : countsize += read_size;</span>
<span class="lineNum"> 335 </span> :
<span class="lineNum"> 336 </span> : /* now compute the hash */
<span class="lineNum"> 337 </span><span class="lineCov"> 166241 : if (rehash) {</span>
<span class="lineNum"> 338 </span><span class="lineCov"> 27207 : memhash(state-&gt;prevhash, state-&gt;prevhashseed, hash, buffer[j], read_size);</span>
<span class="lineNum"> 337 </span><span class="lineCov"> 166493 : if (rehash) {</span>
<span class="lineNum"> 338 </span><span class="lineCov"> 27235 : memhash(state-&gt;prevhash, state-&gt;prevhashseed, hash, buffer[j], read_size);</span>
<span class="lineNum"> 339 </span> :
<span class="lineNum"> 340 </span> : /* compute the new hash, and store it */
<span class="lineNum"> 341 </span><span class="lineCov"> 27207 : rehandle[j].block = block;</span>
<span class="lineNum"> 342 </span><span class="lineCov"> 27207 : memhash(state-&gt;hash, state-&gt;hashseed, rehandle[j].hash, buffer[j], read_size);</span>
<span class="lineNum"> 341 </span><span class="lineCov"> 27235 : rehandle[j].block = block;</span>
<span class="lineNum"> 342 </span><span class="lineCov"> 27235 : memhash(state-&gt;hash, state-&gt;hashseed, rehandle[j].hash, buffer[j], read_size);</span>
<span class="lineNum"> 343 </span> : } else {
<span class="lineNum"> 344 </span><span class="lineCov"> 139034 : memhash(state-&gt;hash, state-&gt;hashseed, hash, buffer[j], read_size);</span>
<span class="lineNum"> 344 </span><span class="lineCov"> 139258 : memhash(state-&gt;hash, state-&gt;hashseed, hash, buffer[j], read_size);</span>
<span class="lineNum"> 345 </span> : }
<span class="lineNum"> 346 </span> :
<span class="lineNum"> 347 </span><span class="lineCov"> 166241 : if (block_has_updated_hash(block)) {</span>
<span class="lineNum"> 347 </span><span class="lineCov"> 166493 : if (block_has_updated_hash(block)) {</span>
<span class="lineNum"> 348 </span> : /* compare the hash */
<span class="lineNum"> 349 </span><span class="lineCov"> 166241 : if (memcmp(hash, block-&gt;hash, HASH_SIZE) != 0) {</span>
<span class="lineNum"> 349 </span><span class="lineCov"> 166493 : if (memcmp(hash, block-&gt;hash, HASH_SIZE) != 0) {</span>
<span class="lineNum"> 350 </span><span class="lineCov"> 920 : unsigned diff = memdiff(hash, block-&gt;hash, HASH_SIZE);</span>
<span class="lineNum"> 351 </span> :
<span class="lineNum"> 352 </span><span class="lineCov"> 920 : log_tag(&quot;error:%u:%s:%s: Data error at position %u, diff bits %u\n&quot;, i, disk-&gt;name, esc(file-&gt;sub), file_pos, diff);</span>
@ -428,22 +428,22 @@
<span class="lineNum"> 366 </span> : }
<span class="lineNum"> 367 </span> :
<span class="lineNum"> 368 </span> : /* if we have read all the data required and it's correct, proceed with the parity check */
<span class="lineNum"> 369 </span><span class="lineCov"> 27959 : if (!error_on_this_block &amp;&amp; !silent_error_on_this_block &amp;&amp; !io_error_on_this_block) {</span>
<span class="lineNum"> 369 </span><span class="lineCov"> 27995 : if (!error_on_this_block &amp;&amp; !silent_error_on_this_block &amp;&amp; !io_error_on_this_block) {</span>
<span class="lineNum"> 370 </span> : unsigned char* buffer_recov[LEV_MAX];
<span class="lineNum"> 371 </span> :
<span class="lineNum"> 372 </span> : /* until now is CPU */
<span class="lineNum"> 373 </span><span class="lineCov"> 27039 : state_usage_cpu(state);</span>
<span class="lineNum"> 373 </span><span class="lineCov"> 27075 : state_usage_cpu(state);</span>
<span class="lineNum"> 374 </span> :
<span class="lineNum"> 375 </span> : /* buffers for parity read and not computed */
<span class="lineNum"> 376 </span><span class="lineCov"> 189273 : for (l = 0; l &lt; state-&gt;level; ++l)</span>
<span class="lineNum"> 377 </span><span class="lineCov"> 162234 : buffer_recov[l] = buffer[diskmax + state-&gt;level + l];</span>
<span class="lineNum"> 378 </span><span class="lineCov"> 27039 : for (; l &lt; LEV_MAX; ++l)</span>
<span class="lineNum"> 376 </span><span class="lineCov"> 189525 : for (l = 0; l &lt; state-&gt;level; ++l)</span>
<span class="lineNum"> 377 </span><span class="lineCov"> 162450 : buffer_recov[l] = buffer[diskmax + state-&gt;level + l];</span>
<span class="lineNum"> 378 </span><span class="lineCov"> 27075 : for (; l &lt; LEV_MAX; ++l)</span>
<span class="lineNum"> 379 </span><span class="lineNoCov"> 0 : buffer_recov[l] = 0;</span>
<span class="lineNum"> 380 </span> :
<span class="lineNum"> 381 </span> : /* read the parity */
<span class="lineNum"> 382 </span><span class="lineCov"> 189273 : for (l = 0; l &lt; state-&gt;level; ++l) {</span>
<span class="lineNum"> 383 </span><span class="lineCov"> 162234 : ret = parity_read(parity[l], i, buffer_recov[l], state-&gt;block_size, log_error);</span>
<span class="lineNum"> 384 </span><span class="lineCov"> 162234 : if (ret == -1) {</span>
<span class="lineNum"> 382 </span><span class="lineCov"> 189525 : for (l = 0; l &lt; state-&gt;level; ++l) {</span>
<span class="lineNum"> 383 </span><span class="lineCov"> 162450 : ret = parity_read(parity[l], i, buffer_recov[l], state-&gt;block_size, log_error);</span>
<span class="lineNum"> 384 </span><span class="lineCov"> 162450 : if (ret == -1) {</span>
<span class="lineNum"> 385 </span><span class="lineNoCov"> 0 : buffer_recov[l] = 0;</span>
<span class="lineNum"> 386 </span> :
<span class="lineNum"> 387 </span><span class="lineNoCov"> 0 : if (errno == EIO) {</span>
@ -471,15 +471,15 @@
<span class="lineNum"> 409 </span> : }
<span class="lineNum"> 410 </span> :
<span class="lineNum"> 411 </span> : /* until now is parity */
<span class="lineNum"> 412 </span><span class="lineCov"> 162234 : state_usage_parity(state, l);</span>
<span class="lineNum"> 412 </span><span class="lineCov"> 162450 : state_usage_parity(state, l);</span>
<span class="lineNum"> 413 </span> : }
<span class="lineNum"> 414 </span> :
<span class="lineNum"> 415 </span> : /* compute the parity */
<span class="lineNum"> 416 </span><span class="lineCov"> 27039 : raid_gen(diskmax, state-&gt;level, state-&gt;block_size, buffer);</span>
<span class="lineNum"> 416 </span><span class="lineCov"> 27075 : raid_gen(diskmax, state-&gt;level, state-&gt;block_size, buffer);</span>
<span class="lineNum"> 417 </span> :
<span class="lineNum"> 418 </span> : /* compare the parity */
<span class="lineNum"> 419 </span><span class="lineCov"> 189273 : for (l = 0; l &lt; state-&gt;level; ++l) {</span>
<span class="lineNum"> 420 </span><span class="lineCov"> 162234 : if (buffer_recov[l] &amp;&amp; memcmp(buffer[diskmax + l], buffer_recov[l], state-&gt;block_size) != 0) {</span>
<span class="lineNum"> 419 </span><span class="lineCov"> 189525 : for (l = 0; l &lt; state-&gt;level; ++l) {</span>
<span class="lineNum"> 420 </span><span class="lineCov"> 162450 : if (buffer_recov[l] &amp;&amp; memcmp(buffer[diskmax + l], buffer_recov[l], state-&gt;block_size) != 0) {</span>
<span class="lineNum"> 421 </span><span class="lineNoCov"> 0 : unsigned diff = memdiff(buffer[diskmax + l], buffer_recov[l], state-&gt;block_size);</span>
<span class="lineNum"> 422 </span> :
<span class="lineNum"> 423 </span><span class="lineNoCov"> 0 : log_tag(&quot;parity_error:%u:%s: Data error, diff bits %u\n&quot;, i, lev_config_name(l), diff);</span>
@ -497,42 +497,42 @@
<span class="lineNum"> 435 </span> : }
<span class="lineNum"> 436 </span> : }
<span class="lineNum"> 437 </span> :
<span class="lineNum"> 438 </span><span class="lineCov"> 27959 : if (silent_error_on_this_block || io_error_on_this_block) {</span>
<span class="lineNum"> 438 </span><span class="lineCov"> 27995 : if (silent_error_on_this_block || io_error_on_this_block) {</span>
<span class="lineNum"> 439 </span> : /* set the error status keeping other info */
<span class="lineNum"> 440 </span><span class="lineCov"> 920 : info_set(&amp;state-&gt;infoarr, i, info_set_bad(info));</span>
<span class="lineNum"> 441 </span><span class="lineCov"> 27039 : } else if (error_on_this_block) {</span>
<span class="lineNum"> 441 </span><span class="lineCov"> 27075 : } else if (error_on_this_block) {</span>
<span class="lineNum"> 442 </span> : /* do nothing, as this is a generic error */
<span class="lineNum"> 443 </span> : /* likely caused by a not synced array */
<span class="lineNum"> 444 </span> : } else {
<span class="lineNum"> 445 </span> : /* if rehash is needed */
<span class="lineNum"> 446 </span><span class="lineCov"> 27039 : if (rehash) {</span>
<span class="lineNum"> 446 </span><span class="lineCov"> 27075 : if (rehash) {</span>
<span class="lineNum"> 447 </span> : /* store all the new hash already computed */
<span class="lineNum"> 448 </span><span class="lineCov"> 32200 : for (j = 0; j &lt; diskmax; ++j) {</span>
<span class="lineNum"> 449 </span><span class="lineCov"> 27600 : if (rehandle[j].block)</span>
<span class="lineNum"> 450 </span><span class="lineCov"> 27207 : memcpy(rehandle[j].block-&gt;hash, rehandle[j].hash, HASH_SIZE);</span>
<span class="lineNum"> 448 </span><span class="lineCov"> 32228 : for (j = 0; j &lt; diskmax; ++j) {</span>
<span class="lineNum"> 449 </span><span class="lineCov"> 27624 : if (rehandle[j].block)</span>
<span class="lineNum"> 450 </span><span class="lineCov"> 27235 : memcpy(rehandle[j].block-&gt;hash, rehandle[j].hash, HASH_SIZE);</span>
<span class="lineNum"> 451 </span> : }
<span class="lineNum"> 452 </span> : }
<span class="lineNum"> 453 </span> :
<span class="lineNum"> 454 </span> : /* update the time info of the block */
<span class="lineNum"> 455 </span> : /* and clear any other flag */
<span class="lineNum"> 456 </span><span class="lineCov"> 27039 : info_set(&amp;state-&gt;infoarr, i, info_make(now, 0, 0, 0));</span>
<span class="lineNum"> 456 </span><span class="lineCov"> 27075 : info_set(&amp;state-&gt;infoarr, i, info_make(now, 0, 0, 0));</span>
<span class="lineNum"> 457 </span> : }
<span class="lineNum"> 458 </span> :
<span class="lineNum"> 459 </span> : /* mark the state as needing write */
<span class="lineNum"> 460 </span><span class="lineCov"> 27959 : state-&gt;need_write = 1;</span>
<span class="lineNum"> 460 </span><span class="lineCov"> 27995 : state-&gt;need_write = 1;</span>
<span class="lineNum"> 461 </span> :
<span class="lineNum"> 462 </span> : /* count the number of processed block */
<span class="lineNum"> 463 </span><span class="lineCov"> 27959 : ++countpos;</span>
<span class="lineNum"> 463 </span><span class="lineCov"> 27995 : ++countpos;</span>
<span class="lineNum"> 464 </span> :
<span class="lineNum"> 465 </span> : /* progress */
<span class="lineNum"> 466 </span><span class="lineCov"> 27959 : if (state_progress(state, i, countpos, countmax, countsize)) {</span>
<span class="lineNum"> 466 </span><span class="lineCov"> 27995 : if (state_progress(state, i, countpos, countmax, countsize)) {</span>
<span class="lineNum"> 467 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 468 </span> : break;
<span class="lineNum"> 469 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 470 </span> : }
<span class="lineNum"> 471 </span> :
<span class="lineNum"> 472 </span> : /* autosave */
<span class="lineNum"> 473 </span><span class="lineCov"> 27959 : if (state-&gt;autosave != 0</span>
<span class="lineNum"> 473 </span><span class="lineCov"> 27995 : if (state-&gt;autosave != 0</span>
<span class="lineNum"> 474 </span><span class="lineNoCov"> 0 : &amp;&amp; autosavedone &gt;= autosavelimit /* if we have reached the limit */</span>
<span class="lineNum"> 475 </span><span class="lineNoCov"> 0 : &amp;&amp; autosavemissing &gt;= autosavelimit /* if we have at least a full step to do */</span>
<span class="lineNum"> 476 </span> : ) {
@ -705,14 +705,14 @@
<span class="lineNum"> 643 </span> : /* copy the info in the temp vector */
<span class="lineNum"> 644 </span><span class="lineCov"> 11 : count = 0;</span>
<span class="lineNum"> 645 </span><span class="lineCov"> 11 : log_tag(&quot;block_count:%u\n&quot;, blockmax);</span>
<span class="lineNum"> 646 </span><span class="lineCov"> 55920 : for (i = 0; i &lt; blockmax; ++i) {</span>
<span class="lineNum"> 647 </span><span class="lineCov"> 55909 : snapraid_info info = info_get(&amp;state-&gt;infoarr, i);</span>
<span class="lineNum"> 646 </span><span class="lineCov"> 56008 : for (i = 0; i &lt; blockmax; ++i) {</span>
<span class="lineNum"> 647 </span><span class="lineCov"> 55997 : snapraid_info info = info_get(&amp;state-&gt;infoarr, i);</span>
<span class="lineNum"> 648 </span> :
<span class="lineNum"> 649 </span> : /* skip unused blocks */
<span class="lineNum"> 650 </span><span class="lineCov"> 55909 : if (info == 0)</span>
<span class="lineNum"> 650 </span><span class="lineCov"> 55997 : if (info == 0)</span>
<span class="lineNum"> 651 </span><span class="lineNoCov"> 0 : continue;</span>
<span class="lineNum"> 652 </span> :
<span class="lineNum"> 653 </span><span class="lineCov"> 55909 : timemap[count++] = info_get_time(info);</span>
<span class="lineNum"> 653 </span><span class="lineCov"> 55997 : timemap[count++] = info_get_time(info);</span>
<span class="lineNum"> 654 </span> : }
<span class="lineNum"> 655 </span> :
<span class="lineNum"> 656 </span><span class="lineCov"> 11 : if (!count) {</span>
@ -728,12 +728,12 @@
<span class="lineNum"> 666 </span> : /* output the info map */
<span class="lineNum"> 667 </span><span class="lineCov"> 11 : i = 0;</span>
<span class="lineNum"> 668 </span><span class="lineCov"> 11 : log_tag(&quot;info_count:%u\n&quot;, count);</span>
<span class="lineNum"> 669 </span><span class="lineCov"> 54 : while (i &lt; count) {</span>
<span class="lineNum"> 670 </span><span class="lineCov"> 32 : unsigned j = i + 1;</span>
<span class="lineNum"> 671 </span><span class="lineCov"> 55941 : while (j &lt; count &amp;&amp; timemap[i] == timemap[j])</span>
<span class="lineNum"> 672 </span><span class="lineCov"> 55877 : ++j;</span>
<span class="lineNum"> 673 </span><span class="lineCov"> 32 : log_tag(&quot;info_time:%&quot; PRIu64 &quot;:%u\n&quot;, (uint64_t)timemap[i], j - i);</span>
<span class="lineNum"> 674 </span><span class="lineCov"> 32 : i = j;</span>
<span class="lineNum"> 669 </span><span class="lineCov"> 49 : while (i &lt; count) {</span>
<span class="lineNum"> 670 </span><span class="lineCov"> 27 : unsigned j = i + 1;</span>
<span class="lineNum"> 671 </span><span class="lineCov"> 56024 : while (j &lt; count &amp;&amp; timemap[i] == timemap[j])</span>
<span class="lineNum"> 672 </span><span class="lineCov"> 55970 : ++j;</span>
<span class="lineNum"> 673 </span><span class="lineCov"> 27 : log_tag(&quot;info_time:%&quot; PRIu64 &quot;:%u\n&quot;, (uint64_t)timemap[i], j - i);</span>
<span class="lineNum"> 674 </span><span class="lineCov"> 27 : i = j;</span>
<span class="lineNum"> 675 </span> : }
<span class="lineNum"> 676 </span> :
<span class="lineNum"> 677 </span> : /* compute the limits from count/recentlimit */
@ -754,8 +754,8 @@
<span class="lineNum"> 692 </span> : /* count how many entries for this exact time we have to scrub */
<span class="lineNum"> 693 </span> : /* if the blocks have all the same time, we end with countlimit == lastlimit */
<span class="lineNum"> 694 </span><span class="lineCov"> 5 : ps.lastlimit = 1;</span>
<span class="lineNum"> 695 </span><span class="lineCov"> 2500 : while (countlimit &gt; ps.lastlimit &amp;&amp; timemap[countlimit - ps.lastlimit - 1] == ps.timelimit)</span>
<span class="lineNum"> 696 </span><span class="lineCov"> 2490 : ++ps.lastlimit;</span>
<span class="lineNum"> 695 </span><span class="lineCov"> 2600 : while (countlimit &gt; ps.lastlimit &amp;&amp; timemap[countlimit - ps.lastlimit - 1] == ps.timelimit)</span>
<span class="lineNum"> 696 </span><span class="lineCov"> 2590 : ++ps.lastlimit;</span>
<span class="lineNum"> 697 </span> : } else {
<span class="lineNum"> 698 </span> : /* if nothing to scrub, disable also other limits */
<span class="lineNum"> 699 </span><span class="lineCov"> 1 : ps.timelimit = 0;</span>

View file

@ -31,13 +31,13 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">92</td>
<td class="headerCovTableEntry">91</td>
<td class="headerCovTableEntry">100</td>
<td class="headerCovTableEntryHi">92.0 %</td>
<td class="headerCovTableEntryHi">91.0 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">7</td>
@ -61,19 +61,19 @@
</tr>
<tr>
<td class="coverFn"><a href="search.c.gcov.html#24">search_file</a></td>
<td class="coverFnHi">1842576</td>
<td class="coverFnHi">1843303</td>
</tr>
<tr>
<td class="coverFn"><a href="search.c.gcov.html#40">search_file_free</a></td>
<td class="coverFnHi">1842576</td>
<td class="coverFnHi">1843303</td>
</tr>
<tr>
<td class="coverFn"><a href="search.c.gcov.html#131">state_search_fetch</a></td>
<td class="coverFnHi">630482</td>
<td class="coverFnHi">639672</td>
</tr>
<tr>
<td class="coverFn"><a href="search.c.gcov.html#56">search_file_compare</a></td>
<td class="coverFnHi">11531</td>
<td class="coverFnHi">20073</td>
</tr>
<tr>
<td class="coverFn"><a href="search.c.gcov.html#156">search_dir</a></td>

View file

@ -31,13 +31,13 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">92</td>
<td class="headerCovTableEntry">91</td>
<td class="headerCovTableEntry">100</td>
<td class="headerCovTableEntryHi">92.0 %</td>
<td class="headerCovTableEntryHi">91.0 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">7</td>
@ -65,15 +65,15 @@
</tr>
<tr>
<td class="coverFn"><a href="search.c.gcov.html#24">search_file</a></td>
<td class="coverFnHi">1842576</td>
<td class="coverFnHi">1843303</td>
</tr>
<tr>
<td class="coverFn"><a href="search.c.gcov.html#56">search_file_compare</a></td>
<td class="coverFnHi">11531</td>
<td class="coverFnHi">20073</td>
</tr>
<tr>
<td class="coverFn"><a href="search.c.gcov.html#40">search_file_free</a></td>
<td class="coverFnHi">1842576</td>
<td class="coverFnHi">1843303</td>
</tr>
<tr>
<td class="coverFn"><a href="search.c.gcov.html#262">state_search</a></td>
@ -85,7 +85,7 @@
</tr>
<tr>
<td class="coverFn"><a href="search.c.gcov.html#131">state_search_fetch</a></td>
<td class="coverFnHi">630482</td>
<td class="coverFnHi">639672</td>
</tr>
</table>
<br>

View file

@ -31,13 +31,13 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">92</td>
<td class="headerCovTableEntry">91</td>
<td class="headerCovTableEntry">100</td>
<td class="headerCovTableEntryHi">92.0 %</td>
<td class="headerCovTableEntryHi">91.0 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">7</td>
@ -85,27 +85,27 @@
<span class="lineNum"> 23 </span> : /****************************************************************************/
<a name="24"><span class="lineNum"> 24 </span> : /* search */</a>
<span class="lineNum"> 25 </span> :
<span class="lineNum"> 26 </span><span class="lineCov"> 1842576 : static void search_file(struct snapraid_state* state, const char* path, data_off_t size, int64_t mtime_sec, int mtime_nsec)</span>
<span class="lineNum"> 26 </span><span class="lineCov"> 1843303 : static void search_file(struct snapraid_state* state, const char* path, data_off_t size, int64_t mtime_sec, int mtime_nsec)</span>
<span class="lineNum"> 27 </span> : {
<span class="lineNum"> 28 </span> : struct snapraid_search_file* file;
<span class="lineNum"> 29 </span> : tommy_uint32_t file_hash;
<span class="lineNum"> 30 </span> :
<span class="lineNum"> 31 </span><span class="lineCov"> 1842576 : file = malloc_nofail(sizeof(struct snapraid_search_file));</span>
<span class="lineNum"> 32 </span><span class="lineCov"> 1842576 : file-&gt;path = strdup_nofail(path);</span>
<span class="lineNum"> 33 </span><span class="lineCov"> 1842576 : file-&gt;size = size;</span>
<span class="lineNum"> 34 </span><span class="lineCov"> 1842576 : file-&gt;mtime_sec = mtime_sec;</span>
<span class="lineNum"> 35 </span><span class="lineCov"> 1842576 : file-&gt;mtime_nsec = mtime_nsec;</span>
<span class="lineNum"> 31 </span><span class="lineCov"> 1843303 : file = malloc_nofail(sizeof(struct snapraid_search_file));</span>
<span class="lineNum"> 32 </span><span class="lineCov"> 1843303 : file-&gt;path = strdup_nofail(path);</span>
<span class="lineNum"> 33 </span><span class="lineCov"> 1843303 : file-&gt;size = size;</span>
<span class="lineNum"> 34 </span><span class="lineCov"> 1843303 : file-&gt;mtime_sec = mtime_sec;</span>
<span class="lineNum"> 35 </span><span class="lineCov"> 1843303 : file-&gt;mtime_nsec = mtime_nsec;</span>
<span class="lineNum"> 36 </span> :
<span class="lineNum"> 37 </span><span class="lineCov"> 1842576 : file_hash = file_stamp_hash(file-&gt;size, file-&gt;mtime_sec, file-&gt;mtime_nsec);</span>
<span class="lineNum"> 37 </span><span class="lineCov"> 1843303 : file_hash = file_stamp_hash(file-&gt;size, file-&gt;mtime_sec, file-&gt;mtime_nsec);</span>
<span class="lineNum"> 38 </span> :
<span class="lineNum"> 39 </span><span class="lineCov"> 1842576 : tommy_hashdyn_insert(&amp;state-&gt;searchset, &amp;file-&gt;node, file, file_hash);</span>
<a name="40"><span class="lineNum"> 40 </span><span class="lineCov"> 1842576 : }</span></a>
<span class="lineNum"> 39 </span><span class="lineCov"> 1843303 : tommy_hashdyn_insert(&amp;state-&gt;searchset, &amp;file-&gt;node, file, file_hash);</span>
<a name="40"><span class="lineNum"> 40 </span><span class="lineCov"> 1843303 : }</span></a>
<span class="lineNum"> 41 </span> :
<span class="lineNum"> 42 </span><span class="lineCov"> 1842576 : void search_file_free(struct snapraid_search_file* file)</span>
<span class="lineNum"> 42 </span><span class="lineCov"> 1843303 : void search_file_free(struct snapraid_search_file* file)</span>
<span class="lineNum"> 43 </span> : {
<span class="lineNum"> 44 </span><span class="lineCov"> 1842576 : free(file-&gt;path);</span>
<span class="lineNum"> 45 </span><span class="lineCov"> 1842576 : free(file);</span>
<span class="lineNum"> 46 </span><span class="lineCov"> 1842576 : }</span>
<span class="lineNum"> 44 </span><span class="lineCov"> 1843303 : free(file-&gt;path);</span>
<span class="lineNum"> 45 </span><span class="lineCov"> 1843303 : free(file);</span>
<span class="lineNum"> 46 </span><span class="lineCov"> 1843303 : }</span>
<span class="lineNum"> 47 </span> :
<span class="lineNum"> 48 </span> : struct search_file_compare_arg {
<span class="lineNum"> 49 </span> : const struct snapraid_state* state;
@ -117,29 +117,29 @@
<span class="lineNum"> 55 </span> : int prevhash;
<a name="56"><span class="lineNum"> 56 </span> : };</a>
<span class="lineNum"> 57 </span> :
<span class="lineNum"> 58 </span><span class="lineCov"> 11531 : int search_file_compare(const void* void_arg, const void* void_data)</span>
<span class="lineNum"> 58 </span><span class="lineCov"> 20073 : int search_file_compare(const void* void_arg, const void* void_data)</span>
<span class="lineNum"> 59 </span> : {
<span class="lineNum"> 60 </span><span class="lineCov"> 11531 : const struct search_file_compare_arg* arg = void_arg;</span>
<span class="lineNum"> 61 </span><span class="lineCov"> 11531 : const struct snapraid_search_file* file = void_data;</span>
<span class="lineNum"> 62 </span><span class="lineCov"> 11531 : const struct snapraid_state* state = arg-&gt;state;</span>
<span class="lineNum"> 60 </span><span class="lineCov"> 20073 : const struct search_file_compare_arg* arg = void_arg;</span>
<span class="lineNum"> 61 </span><span class="lineCov"> 20073 : const struct snapraid_search_file* file = void_data;</span>
<span class="lineNum"> 62 </span><span class="lineCov"> 20073 : const struct snapraid_state* state = arg-&gt;state;</span>
<span class="lineNum"> 63 </span> : unsigned char buffer_hash[HASH_SIZE];
<span class="lineNum"> 64 </span><span class="lineCov"> 11531 : const char* path = file-&gt;path;</span>
<span class="lineNum"> 64 </span><span class="lineCov"> 20073 : const char* path = file-&gt;path;</span>
<span class="lineNum"> 65 </span> : int f;
<span class="lineNum"> 66 </span> : ssize_t ret;
<span class="lineNum"> 67 </span> :
<span class="lineNum"> 68 </span> : /* compare file info */
<span class="lineNum"> 69 </span><span class="lineCov"> 11531 : if (arg-&gt;file-&gt;size != file-&gt;size)</span>
<span class="lineNum"> 69 </span><span class="lineCov"> 20073 : if (arg-&gt;file-&gt;size != file-&gt;size)</span>
<span class="lineNum"> 70 </span><span class="lineNoCov"> 0 : return -1;</span>
<span class="lineNum"> 71 </span> :
<span class="lineNum"> 72 </span><span class="lineCov"> 11531 : if (arg-&gt;file-&gt;mtime_sec != file-&gt;mtime_sec)</span>
<span class="lineNum"> 72 </span><span class="lineCov"> 20073 : if (arg-&gt;file-&gt;mtime_sec != file-&gt;mtime_sec)</span>
<span class="lineNum"> 73 </span><span class="lineNoCov"> 0 : return -1;</span>
<span class="lineNum"> 74 </span> :
<span class="lineNum"> 75 </span><span class="lineCov"> 11531 : if (arg-&gt;file-&gt;mtime_nsec != file-&gt;mtime_nsec)</span>
<span class="lineNum"> 75 </span><span class="lineCov"> 20073 : if (arg-&gt;file-&gt;mtime_nsec != file-&gt;mtime_nsec)</span>
<span class="lineNum"> 76 </span><span class="lineNoCov"> 0 : return -1;</span>
<span class="lineNum"> 77 </span> :
<span class="lineNum"> 78 </span> : /* read the block and compare the hash */
<span class="lineNum"> 79 </span><span class="lineCov"> 11531 : f = open(path, O_RDONLY | O_BINARY);</span>
<span class="lineNum"> 80 </span><span class="lineCov"> 11531 : if (f == -1) {</span>
<span class="lineNum"> 79 </span><span class="lineCov"> 20073 : f = open(path, O_RDONLY | O_BINARY);</span>
<span class="lineNum"> 80 </span><span class="lineCov"> 20073 : if (f == -1) {</span>
<span class="lineNum"> 81 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 82 </span> : if (errno == ENOENT) {
<span class="lineNum"> 83 </span> : log_fatal(&quot;DANGER! file '%s' disappeared.\n&quot;, path);
@ -151,23 +151,23 @@
<span class="lineNum"> 89 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 90 </span> : }
<span class="lineNum"> 91 </span> :
<span class="lineNum"> 92 </span><span class="lineCov"> 11531 : if (lseek(f, arg-&gt;offset, SEEK_SET) != arg-&gt;offset) {</span>
<span class="lineNum"> 92 </span><span class="lineCov"> 20073 : if (lseek(f, arg-&gt;offset, SEEK_SET) != arg-&gt;offset) {</span>
<span class="lineNum"> 93 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 94 </span> : log_fatal(&quot;Error seeking file '%s'. %s.\n&quot;, path, strerror(errno));
<span class="lineNum"> 95 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 96 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 97 </span> : }
<span class="lineNum"> 98 </span> :
<span class="lineNum"> 99 </span><span class="lineCov"> 11531 : ret = read(f, arg-&gt;buffer, arg-&gt;read_size);</span>
<span class="lineNum"> 100 </span><span class="lineCov"> 11531 : if (ret &lt; 0 || (unsigned)ret != arg-&gt;read_size) {</span>
<span class="lineNum"> 99 </span><span class="lineCov"> 20073 : ret = read(f, arg-&gt;buffer, arg-&gt;read_size);</span>
<span class="lineNum"> 100 </span><span class="lineCov"> 20073 : if (ret &lt; 0 || (unsigned)ret != arg-&gt;read_size) {</span>
<span class="lineNum"> 101 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 102 </span> : log_fatal(&quot;Error reading file '%s'. %s.\n&quot;, path, strerror(errno));
<span class="lineNum"> 103 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 104 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 105 </span> : }
<span class="lineNum"> 106 </span> :
<span class="lineNum"> 107 </span><span class="lineCov"> 11531 : ret = close(f);</span>
<span class="lineNum"> 108 </span><span class="lineCov"> 11531 : if (ret != 0) {</span>
<span class="lineNum"> 107 </span><span class="lineCov"> 20073 : ret = close(f);</span>
<span class="lineNum"> 108 </span><span class="lineCov"> 20073 : if (ret != 0) {</span>
<span class="lineNum"> 109 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 110 </span> : log_fatal(&quot;Error closing file '%s'. %s.\n&quot;, path, strerror(errno));
<span class="lineNum"> 111 </span> : exit(EXIT_FAILURE);
@ -175,46 +175,46 @@
<span class="lineNum"> 113 </span> : }
<span class="lineNum"> 114 </span> :
<span class="lineNum"> 115 </span> : /* compute the hash */
<span class="lineNum"> 116 </span><span class="lineCov"> 11531 : if (arg-&gt;prevhash)</span>
<span class="lineNum"> 117 </span><span class="lineCov"> 4492 : memhash(state-&gt;prevhash, state-&gt;prevhashseed, buffer_hash, arg-&gt;buffer, arg-&gt;read_size);</span>
<span class="lineNum"> 116 </span><span class="lineCov"> 20073 : if (arg-&gt;prevhash)</span>
<span class="lineNum"> 117 </span><span class="lineNoCov"> 0 : memhash(state-&gt;prevhash, state-&gt;prevhashseed, buffer_hash, arg-&gt;buffer, arg-&gt;read_size);</span>
<span class="lineNum"> 118 </span> : else
<span class="lineNum"> 119 </span><span class="lineCov"> 7039 : memhash(state-&gt;hash, state-&gt;hashseed, buffer_hash, arg-&gt;buffer, arg-&gt;read_size);</span>
<span class="lineNum"> 119 </span><span class="lineCov"> 20073 : memhash(state-&gt;hash, state-&gt;hashseed, buffer_hash, arg-&gt;buffer, arg-&gt;read_size);</span>
<span class="lineNum"> 120 </span> :
<span class="lineNum"> 121 </span> : /* check if the hash is matching */
<span class="lineNum"> 122 </span><span class="lineCov"> 11531 : if (memcmp(buffer_hash, arg-&gt;block-&gt;hash, HASH_SIZE) != 0)</span>
<span class="lineNum"> 123 </span><span class="lineCov"> 2119 : return -1;</span>
<span class="lineNum"> 122 </span><span class="lineCov"> 20073 : if (memcmp(buffer_hash, arg-&gt;block-&gt;hash, HASH_SIZE) != 0)</span>
<span class="lineNum"> 123 </span><span class="lineCov"> 2235 : return -1;</span>
<span class="lineNum"> 124 </span> :
<span class="lineNum"> 125 </span><span class="lineCov"> 9412 : if (arg-&gt;read_size != state-&gt;block_size) {</span>
<span class="lineNum"> 125 </span><span class="lineCov"> 17838 : if (arg-&gt;read_size != state-&gt;block_size) {</span>
<span class="lineNum"> 126 </span> : /* fill the remaining with 0 */
<span class="lineNum"> 127 </span><span class="lineCov"> 3956 : memset(arg-&gt;buffer + arg-&gt;read_size, 0, state-&gt;block_size - arg-&gt;read_size);</span>
<span class="lineNum"> 127 </span><span class="lineCov"> 7108 : memset(arg-&gt;buffer + arg-&gt;read_size, 0, state-&gt;block_size - arg-&gt;read_size);</span>
<span class="lineNum"> 128 </span> : }
<span class="lineNum"> 129 </span> :
<span class="lineNum"> 130 </span><span class="lineCov"> 9412 : return 0;</span>
<span class="lineNum"> 130 </span><span class="lineCov"> 17838 : return 0;</span>
<a name="131"><span class="lineNum"> 131 </span> : }</a>
<span class="lineNum"> 132 </span> :
<span class="lineNum"> 133 </span><span class="lineCov"> 630482 : int state_search_fetch(struct snapraid_state* state, int prevhash, struct snapraid_file* missing_file, block_off_t missing_file_pos, struct snapraid_block* missing_block, unsigned char* buffer)</span>
<span class="lineNum"> 133 </span><span class="lineCov"> 639672 : int state_search_fetch(struct snapraid_state* state, int prevhash, struct snapraid_file* missing_file, block_off_t missing_file_pos, struct snapraid_block* missing_block, unsigned char* buffer)</span>
<span class="lineNum"> 134 </span> : {
<span class="lineNum"> 135 </span> : struct snapraid_search_file* file;
<span class="lineNum"> 136 </span> : tommy_uint32_t file_hash;
<span class="lineNum"> 137 </span> : struct search_file_compare_arg arg;
<span class="lineNum"> 138 </span> :
<span class="lineNum"> 139 </span><span class="lineCov"> 630482 : arg.state = state;</span>
<span class="lineNum"> 140 </span><span class="lineCov"> 630482 : arg.block = missing_block;</span>
<span class="lineNum"> 141 </span><span class="lineCov"> 630482 : arg.file = missing_file;</span>
<span class="lineNum"> 142 </span><span class="lineCov"> 630482 : arg.buffer = buffer;</span>
<span class="lineNum"> 143 </span><span class="lineCov"> 630482 : arg.offset = state-&gt;block_size * (data_off_t)missing_file_pos;</span>
<span class="lineNum"> 144 </span><span class="lineCov"> 630482 : arg.read_size = file_block_size(missing_file, missing_file_pos, state-&gt;block_size);</span>
<span class="lineNum"> 145 </span><span class="lineCov"> 630482 : arg.prevhash = prevhash;</span>
<span class="lineNum"> 139 </span><span class="lineCov"> 639672 : arg.state = state;</span>
<span class="lineNum"> 140 </span><span class="lineCov"> 639672 : arg.block = missing_block;</span>
<span class="lineNum"> 141 </span><span class="lineCov"> 639672 : arg.file = missing_file;</span>
<span class="lineNum"> 142 </span><span class="lineCov"> 639672 : arg.buffer = buffer;</span>
<span class="lineNum"> 143 </span><span class="lineCov"> 639672 : arg.offset = state-&gt;block_size * (data_off_t)missing_file_pos;</span>
<span class="lineNum"> 144 </span><span class="lineCov"> 639672 : arg.read_size = file_block_size(missing_file, missing_file_pos, state-&gt;block_size);</span>
<span class="lineNum"> 145 </span><span class="lineCov"> 639672 : arg.prevhash = prevhash;</span>
<span class="lineNum"> 146 </span> :
<span class="lineNum"> 147 </span><span class="lineCov"> 630482 : file_hash = file_stamp_hash(arg.file-&gt;size, arg.file-&gt;mtime_sec, arg.file-&gt;mtime_nsec);</span>
<span class="lineNum"> 147 </span><span class="lineCov"> 639672 : file_hash = file_stamp_hash(arg.file-&gt;size, arg.file-&gt;mtime_sec, arg.file-&gt;mtime_nsec);</span>
<span class="lineNum"> 148 </span> :
<span class="lineNum"> 149 </span> : /* search in the hashtable, and also check if the data matches the hash */
<span class="lineNum"> 150 </span><span class="lineCov"> 630482 : file = tommy_hashdyn_search(&amp;state-&gt;searchset, search_file_compare, &amp;arg, file_hash);</span>
<span class="lineNum"> 151 </span><span class="lineCov"> 630482 : if (!file)</span>
<span class="lineNum"> 152 </span><span class="lineCov"> 621070 : return -1;</span>
<span class="lineNum"> 150 </span><span class="lineCov"> 639672 : file = tommy_hashdyn_search(&amp;state-&gt;searchset, search_file_compare, &amp;arg, file_hash);</span>
<span class="lineNum"> 151 </span><span class="lineCov"> 639672 : if (!file)</span>
<span class="lineNum"> 152 </span><span class="lineCov"> 621834 : return -1;</span>
<span class="lineNum"> 153 </span> :
<span class="lineNum"> 154 </span> : /* if found, buffer is already set with data */
<span class="lineNum"> 155 </span><span class="lineCov"> 9412 : return 0;</span>
<span class="lineNum"> 155 </span><span class="lineCov"> 17838 : return 0;</span>
<a name="156"><span class="lineNum"> 156 </span> : }</a>
<span class="lineNum"> 157 </span> :
<span class="lineNum"> 158 </span><span class="lineCov"> 2462 : static void search_dir(struct snapraid_state* state, struct snapraid_disk* disk, const char* dir, const char* sub)</span>
@ -233,40 +233,40 @@
<span class="lineNum"> 171 </span> : char path_next[PATH_MAX];
<span class="lineNum"> 172 </span> : char sub_next[PATH_MAX];
<span class="lineNum"> 173 </span> : char out[PATH_MAX];
<span class="lineNum"> 174 </span><span class="lineCov"> 2039164 : struct snapraid_filter* reason = 0;</span>
<span class="lineNum"> 174 </span><span class="lineCov"> 2039885 : struct snapraid_filter* reason = 0;</span>
<span class="lineNum"> 175 </span> : struct stat st;
<span class="lineNum"> 176 </span> : const char* name;
<span class="lineNum"> 177 </span> : struct dirent* dd;
<span class="lineNum"> 178 </span> :
<span class="lineNum"> 179 </span> : /* clear errno to detect erroneous conditions */
<span class="lineNum"> 180 </span><span class="lineCov"> 2039164 : errno = 0;</span>
<span class="lineNum"> 181 </span><span class="lineCov"> 2039164 : dd = readdir(d);</span>
<span class="lineNum"> 182 </span><span class="lineCov"> 2039164 : if (dd == 0 &amp;&amp; errno != 0) {</span>
<span class="lineNum"> 180 </span><span class="lineCov"> 2039885 : errno = 0;</span>
<span class="lineNum"> 181 </span><span class="lineCov"> 2039885 : dd = readdir(d);</span>
<span class="lineNum"> 182 </span><span class="lineCov"> 2039885 : if (dd == 0 &amp;&amp; errno != 0) {</span>
<span class="lineNum"> 183 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 184 </span> : log_fatal(&quot;Error reading directory '%s'. %s.\n&quot;, dir, strerror(errno));
<span class="lineNum"> 185 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 186 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 187 </span> : }
<span class="lineNum"> 188 </span><span class="lineCov"> 2039164 : if (dd == 0) {</span>
<span class="lineNum"> 188 </span><span class="lineCov"> 2039885 : if (dd == 0) {</span>
<span class="lineNum"> 189 </span><span class="lineCov"> 2462 : break; /* finished */</span>
<span class="lineNum"> 190 </span> : }
<span class="lineNum"> 191 </span> :
<span class="lineNum"> 192 </span> : /* skip &quot;.&quot; and &quot;..&quot; files */
<span class="lineNum"> 193 </span><span class="lineCov"> 2036702 : name = dd-&gt;d_name;</span>
<span class="lineNum"> 194 </span><span class="lineCov"> 2036702 : if (name[0] == '.' &amp;&amp; (name[1] == 0 || (name[1] == '.' &amp;&amp; name[2] == 0)))</span>
<span class="lineNum"> 193 </span><span class="lineCov"> 2037423 : name = dd-&gt;d_name;</span>
<span class="lineNum"> 194 </span><span class="lineCov"> 2037423 : if (name[0] == '.' &amp;&amp; (name[1] == 0 || (name[1] == '.' &amp;&amp; name[2] == 0)))</span>
<span class="lineNum"> 195 </span><span class="lineCov"> 9848 : continue;</span>
<span class="lineNum"> 196 </span> :
<span class="lineNum"> 197 </span><span class="lineCov"> 2031778 : pathprint(path_next, sizeof(path_next), &quot;%s%s&quot;, dir, name);</span>
<span class="lineNum"> 198 </span><span class="lineCov"> 2031778 : pathprint(sub_next, sizeof(sub_next), &quot;%s%s&quot;, sub, name);</span>
<span class="lineNum"> 197 </span><span class="lineCov"> 2032499 : pathprint(path_next, sizeof(path_next), &quot;%s%s&quot;, dir, name);</span>
<span class="lineNum"> 198 </span><span class="lineCov"> 2032499 : pathprint(sub_next, sizeof(sub_next), &quot;%s%s&quot;, sub, name);</span>
<span class="lineNum"> 199 </span> :
<span class="lineNum"> 200 </span> : /* exclude hidden files even before calling lstat() */
<span class="lineNum"> 201 </span><span class="lineCov"> 2031778 : if (disk != 0 &amp;&amp; filter_hidden(state-&gt;filter_hidden, dd) != 0) {</span>
<span class="lineNum"> 201 </span><span class="lineCov"> 2032499 : if (disk != 0 &amp;&amp; filter_hidden(state-&gt;filter_hidden, dd) != 0) {</span>
<span class="lineNum"> 202 </span><span class="lineNoCov"> 0 : msg_verbose(&quot;Excluding hidden '%s'\n&quot;, path_next);</span>
<span class="lineNum"> 203 </span><span class="lineNoCov"> 0 : continue;</span>
<span class="lineNum"> 204 </span> : }
<span class="lineNum"> 205 </span> :
<span class="lineNum"> 206 </span> : /* exclude content files even before calling lstat() */
<span class="lineNum"> 207 </span><span class="lineCov"> 2031778 : if (disk != 0 &amp;&amp; filter_content(&amp;state-&gt;contentlist, path_next) != 0) {</span>
<span class="lineNum"> 207 </span><span class="lineCov"> 2032499 : if (disk != 0 &amp;&amp; filter_content(&amp;state-&gt;contentlist, path_next) != 0) {</span>
<span class="lineNum"> 208 </span><span class="lineNoCov"> 0 : msg_verbose(&quot;Excluding content '%s'\n&quot;, path_next);</span>
<span class="lineNum"> 209 </span><span class="lineNoCov"> 0 : continue;</span>
<span class="lineNum"> 210 </span> : }
@ -290,7 +290,7 @@
<span class="lineNum"> 228 </span> : }
<span class="lineNum"> 229 </span> : #else
<span class="lineNum"> 230 </span> : /* get lstat info about the file */
<span class="lineNum"> 231 </span><span class="lineCov"> 2031778 : if (lstat(path_next, &amp;st) != 0) {</span>
<span class="lineNum"> 231 </span><span class="lineCov"> 2032499 : if (lstat(path_next, &amp;st) != 0) {</span>
<span class="lineNum"> 232 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 233 </span> : log_fatal(&quot;Error in stat file/directory '%s'. %s.\n&quot;, path_next, strerror(errno));
<span class="lineNum"> 234 </span> : exit(EXIT_FAILURE);
@ -298,13 +298,13 @@
<span class="lineNum"> 236 </span> : }
<span class="lineNum"> 237 </span> : #endif
<span class="lineNum"> 238 </span> :
<span class="lineNum"> 239 </span><span class="lineCov"> 2031778 : if (S_ISREG(st.st_mode)) {</span>
<span class="lineNum"> 240 </span><span class="lineCov"> 1967521 : if (disk == 0 || filter_path(&amp;state-&gt;filterlist, &amp;reason, disk-&gt;name, sub_next) == 0) {</span>
<span class="lineNum"> 241 </span><span class="lineCov"> 1842576 : search_file(state, path_next, st.st_size, st.st_mtime, STAT_NSEC(&amp;st));</span>
<span class="lineNum"> 239 </span><span class="lineCov"> 2032499 : if (S_ISREG(st.st_mode)) {</span>
<span class="lineNum"> 240 </span><span class="lineCov"> 1968182 : if (disk == 0 || filter_path(&amp;state-&gt;filterlist, &amp;reason, disk-&gt;name, sub_next) == 0) {</span>
<span class="lineNum"> 241 </span><span class="lineCov"> 1843303 : search_file(state, path_next, st.st_size, st.st_mtime, STAT_NSEC(&amp;st));</span>
<span class="lineNum"> 242 </span> : } else {
<span class="lineNum"> 243 </span><span class="lineCov"> 124945 : msg_verbose(&quot;Excluding link '%s' for rule '%s'\n&quot;, path_next, filter_type(reason, out, sizeof(out)));</span>
<span class="lineNum"> 243 </span><span class="lineCov"> 124879 : msg_verbose(&quot;Excluding link '%s' for rule '%s'\n&quot;, path_next, filter_type(reason, out, sizeof(out)));</span>
<span class="lineNum"> 244 </span> : }
<span class="lineNum"> 245 </span><span class="lineCov"> 64257 : } else if (S_ISDIR(st.st_mode)) {</span>
<span class="lineNum"> 245 </span><span class="lineCov"> 64317 : } else if (S_ISDIR(st.st_mode)) {</span>
<span class="lineNum"> 246 </span><span class="lineCov"> 1781 : if (disk == 0 || filter_dir(&amp;state-&gt;filterlist, &amp;reason, disk-&gt;name, sub_next) == 0) {</span>
<span class="lineNum"> 247 </span><span class="lineCov"> 1781 : pathslash(path_next, sizeof(path_next));</span>
<span class="lineNum"> 248 </span><span class="lineCov"> 1781 : pathslash(sub_next, sizeof(sub_next));</span>
@ -313,7 +313,7 @@
<span class="lineNum"> 251 </span><span class="lineNoCov"> 0 : msg_verbose(&quot;Excluding directory '%s' for rule '%s'\n&quot;, path_next, filter_type(reason, out, sizeof(out)));</span>
<span class="lineNum"> 252 </span> : }
<span class="lineNum"> 253 </span> : }
<span class="lineNum"> 254 </span><span class="lineCov"> 2036702 : }</span>
<span class="lineNum"> 254 </span><span class="lineCov"> 2037423 : }</span>
<span class="lineNum"> 255 </span> :
<span class="lineNum"> 256 </span><span class="lineCov"> 2462 : if (closedir(d) != 0) {</span>
<span class="lineNum"> 257 </span> : /* LCOV_EXCL_START */

View file

@ -32,12 +32,12 @@
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">144</td>
<td class="headerCovTableEntry">172</td>
<td class="headerCovTableEntryMed">83.7 %</td>
<td class="headerCovTableEntry">144</td>
<td class="headerCovTableEntryHi">100.0 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">8</td>
@ -88,7 +88,7 @@
<td class="coverFnHi">1</td>
</tr>
<tr>
<td class="coverFn"><a href="selftest.c.gcov.html#444">selftest</a></td>
<td class="coverFn"><a href="selftest.c.gcov.html#525">selftest</a></td>
<td class="coverFnHi">1</td>
</tr>
</table>

View file

@ -32,12 +32,12 @@
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">144</td>
<td class="headerCovTableEntry">172</td>
<td class="headerCovTableEntryMed">83.7 %</td>
<td class="headerCovTableEntry">144</td>
<td class="headerCovTableEntryHi">100.0 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">8</td>
@ -60,7 +60,7 @@
<td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="selftest.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
</tr>
<tr>
<td class="coverFn"><a href="selftest.c.gcov.html#444">selftest</a></td>
<td class="coverFn"><a href="selftest.c.gcov.html#525">selftest</a></td>
<td class="coverFnHi">1</td>
</tr>
<tr>

View file

@ -32,12 +32,12 @@
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">144</td>
<td class="headerCovTableEntry">172</td>
<td class="headerCovTableEntryMed">83.7 %</td>
<td class="headerCovTableEntry">144</td>
<td class="headerCovTableEntryHi">100.0 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">8</td>
@ -378,207 +378,288 @@
<span class="lineNum"> 316 </span><span class="lineCov"> 256 : *(unsigned*)tommy_arrayblkof_ref(&amp;arrayblkof, i) = i;</span>
<span class="lineNum"> 317 </span> : }
<span class="lineNum"> 318 </span> :
<span class="lineNum"> 319 </span><span class="lineCov"> 1 : if (tommy_array_memory_usage(&amp;array) &lt; TOMMY_SIZE * sizeof(void*))</span>
<span class="lineNum"> 320 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 321 </span><span class="lineCov"> 1 : if (tommy_arrayblk_memory_usage(&amp;arrayblk) &lt; TOMMY_SIZE * sizeof(void*))</span>
<span class="lineNum"> 322 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 323 </span><span class="lineCov"> 1 : if (tommy_arrayblkof_memory_usage(&amp;arrayblkof) &lt; TOMMY_SIZE * sizeof(unsigned))</span>
<span class="lineNum"> 324 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 325 </span> :
<span class="lineNum"> 326 </span><span class="lineCov"> 257 : for (i = 0; i &lt; TOMMY_SIZE; ++i) {</span>
<span class="lineNum"> 327 </span><span class="lineCov"> 256 : if (tommy_array_get(&amp;array, i) != &amp;node[i])</span>
<span class="lineNum"> 328 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 329 </span><span class="lineCov"> 256 : if (tommy_arrayblk_get(&amp;arrayblk, i) != &amp;node[i])</span>
<span class="lineNum"> 330 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 331 </span><span class="lineCov"> 256 : if (*(unsigned*)tommy_arrayblkof_ref(&amp;arrayblkof, i) != i)</span>
<span class="lineNum"> 332 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 319 </span><span class="lineCov"> 1 : if (tommy_array_memory_usage(&amp;array) &lt; TOMMY_SIZE * sizeof(void*)) {</span>
<span class="lineNum"> 320 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 321 </span> : goto bail;
<span class="lineNum"> 322 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 323 </span> : }
<span class="lineNum"> 324 </span><span class="lineCov"> 1 : if (tommy_arrayblk_memory_usage(&amp;arrayblk) &lt; TOMMY_SIZE * sizeof(void*)) {</span>
<span class="lineNum"> 325 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 326 </span> : goto bail;
<span class="lineNum"> 327 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 328 </span> : }
<span class="lineNum"> 329 </span><span class="lineCov"> 1 : if (tommy_arrayblkof_memory_usage(&amp;arrayblkof) &lt; TOMMY_SIZE * sizeof(unsigned)) {</span>
<span class="lineNum"> 330 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 331 </span> : goto bail;
<span class="lineNum"> 332 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 333 </span> : }
<span class="lineNum"> 334 </span> :
<span class="lineNum"> 335 </span><span class="lineCov"> 1 : tommy_arrayblkof_done(&amp;arrayblkof);</span>
<span class="lineNum"> 336 </span><span class="lineCov"> 1 : tommy_arrayblk_done(&amp;arrayblk);</span>
<span class="lineNum"> 337 </span><span class="lineCov"> 1 : tommy_array_done(&amp;array);</span>
<span class="lineNum"> 338 </span> :
<span class="lineNum"> 339 </span><span class="lineCov"> 1 : tommy_list_init(&amp;list);</span>
<span class="lineNum"> 340 </span> :
<span class="lineNum"> 341 </span><span class="lineCov"> 1 : if (!tommy_list_empty(&amp;list))</span>
<span class="lineNum"> 342 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 343 </span> :
<span class="lineNum"> 344 </span><span class="lineCov"> 1 : if (tommy_list_tail(&amp;list))</span>
<span class="lineNum"> 345 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 346 </span> :
<span class="lineNum"> 347 </span><span class="lineCov"> 1 : if (tommy_list_head(&amp;list))</span>
<span class="lineNum"> 348 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 349 </span> :
<span class="lineNum"> 350 </span><span class="lineCov"> 1 : tommy_hashdyn_init(&amp;hashdyn);</span>
<span class="lineNum"> 351 </span> :
<span class="lineNum"> 352 </span><span class="lineCov"> 257 : for (i = 0; i &lt; TOMMY_SIZE; ++i)</span>
<span class="lineNum"> 353 </span><span class="lineCov"> 256 : tommy_hashdyn_insert(&amp;hashdyn, &amp;node[i], &amp;node[i], i % 64);</span>
<span class="lineNum"> 354 </span> :
<span class="lineNum"> 355 </span><span class="lineCov"> 1 : if (tommy_hashdyn_count(&amp;hashdyn) != TOMMY_SIZE)</span>
<span class="lineNum"> 356 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 357 </span> :
<span class="lineNum"> 358 </span><span class="lineCov"> 1 : if (tommy_hashdyn_memory_usage(&amp;hashdyn) &lt; TOMMY_SIZE * sizeof(tommy_node))</span>
<span class="lineNum"> 359 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 360 </span> :
<span class="lineNum"> 361 </span><span class="lineCov"> 1 : tommy_test_foreach_count = 0;</span>
<span class="lineNum"> 362 </span><span class="lineCov"> 1 : tommy_hashdyn_foreach(&amp;hashdyn, tommy_test_foreach);</span>
<span class="lineNum"> 363 </span><span class="lineCov"> 1 : if (tommy_test_foreach_count != TOMMY_SIZE)</span>
<span class="lineNum"> 364 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 365 </span> :
<span class="lineNum"> 366 </span><span class="lineCov"> 1 : tommy_test_foreach_count = 0;</span>
<span class="lineNum"> 367 </span><span class="lineCov"> 1 : tommy_hashdyn_foreach_arg(&amp;hashdyn, tommy_test_foreach_arg, &amp;tommy_test_foreach_count);</span>
<span class="lineNum"> 368 </span><span class="lineCov"> 1 : if (tommy_test_foreach_count != TOMMY_SIZE)</span>
<span class="lineNum"> 369 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 335 </span><span class="lineCov"> 257 : for (i = 0; i &lt; TOMMY_SIZE; ++i) {</span>
<span class="lineNum"> 336 </span><span class="lineCov"> 256 : if (tommy_array_get(&amp;array, i) != &amp;node[i]) {</span>
<span class="lineNum"> 337 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 338 </span> : goto bail;
<span class="lineNum"> 339 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 340 </span> : }
<span class="lineNum"> 341 </span><span class="lineCov"> 256 : if (tommy_arrayblk_get(&amp;arrayblk, i) != &amp;node[i]) {</span>
<span class="lineNum"> 342 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 343 </span> : goto bail;
<span class="lineNum"> 344 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 345 </span> : }
<span class="lineNum"> 346 </span><span class="lineCov"> 256 : if (*(unsigned*)tommy_arrayblkof_ref(&amp;arrayblkof, i) != i) {</span>
<span class="lineNum"> 347 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 348 </span> : goto bail;
<span class="lineNum"> 349 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 350 </span> : }
<span class="lineNum"> 351 </span> : }
<span class="lineNum"> 352 </span> :
<span class="lineNum"> 353 </span><span class="lineCov"> 1 : tommy_arrayblkof_done(&amp;arrayblkof);</span>
<span class="lineNum"> 354 </span><span class="lineCov"> 1 : tommy_arrayblk_done(&amp;arrayblk);</span>
<span class="lineNum"> 355 </span><span class="lineCov"> 1 : tommy_array_done(&amp;array);</span>
<span class="lineNum"> 356 </span> :
<span class="lineNum"> 357 </span><span class="lineCov"> 1 : tommy_list_init(&amp;list);</span>
<span class="lineNum"> 358 </span> :
<span class="lineNum"> 359 </span><span class="lineCov"> 1 : if (!tommy_list_empty(&amp;list)) {</span>
<span class="lineNum"> 360 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 361 </span> : goto bail;
<span class="lineNum"> 362 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 363 </span> : }
<span class="lineNum"> 364 </span> :
<span class="lineNum"> 365 </span><span class="lineCov"> 1 : if (tommy_list_tail(&amp;list)) {</span>
<span class="lineNum"> 366 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 367 </span> : goto bail;
<span class="lineNum"> 368 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 369 </span> : }
<span class="lineNum"> 370 </span> :
<span class="lineNum"> 371 </span><span class="lineCov"> 129 : for (i = 0; i &lt; TOMMY_SIZE / 2; ++i)</span>
<span class="lineNum"> 372 </span><span class="lineCov"> 128 : tommy_hashdyn_remove_existing(&amp;hashdyn, &amp;node[i]);</span>
<span class="lineNum"> 373 </span> :
<span class="lineNum"> 374 </span><span class="lineCov"> 129 : for (i = 0; i &lt; TOMMY_SIZE / 2; ++i)</span>
<span class="lineNum"> 375 </span><span class="lineCov"> 128 : if (tommy_hashdyn_remove(&amp;hashdyn, tommy_test_search, &amp;node[i], i % 64) != 0)</span>
<span class="lineNum"> 376 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 377 </span> :
<span class="lineNum"> 378 </span><span class="lineCov"> 129 : for (i = TOMMY_SIZE / 2; i &lt; TOMMY_SIZE; ++i)</span>
<span class="lineNum"> 379 </span><span class="lineCov"> 128 : if (tommy_hashdyn_remove(&amp;hashdyn, tommy_test_search, &amp;node[i], i % 64) == 0)</span>
<span class="lineNum"> 380 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 371 </span><span class="lineCov"> 1 : if (tommy_list_head(&amp;list)) {</span>
<span class="lineNum"> 372 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 373 </span> : goto bail;
<span class="lineNum"> 374 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 375 </span> : }
<span class="lineNum"> 376 </span> :
<span class="lineNum"> 377 </span><span class="lineCov"> 1 : tommy_hashdyn_init(&amp;hashdyn);</span>
<span class="lineNum"> 378 </span> :
<span class="lineNum"> 379 </span><span class="lineCov"> 257 : for (i = 0; i &lt; TOMMY_SIZE; ++i)</span>
<span class="lineNum"> 380 </span><span class="lineCov"> 256 : tommy_hashdyn_insert(&amp;hashdyn, &amp;node[i], &amp;node[i], i % 64);</span>
<span class="lineNum"> 381 </span> :
<span class="lineNum"> 382 </span><span class="lineCov"> 1 : if (tommy_hashdyn_count(&amp;hashdyn) != 0)</span>
<span class="lineNum"> 383 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 384 </span> :
<span class="lineNum"> 385 </span><span class="lineCov"> 1 : tommy_hashdyn_done(&amp;hashdyn);</span>
<span class="lineNum"> 386 </span> :
<span class="lineNum"> 387 </span><span class="lineCov"> 1 : tommy_tree_init(&amp;tree, tommy_test_compare);</span>
<span class="lineNum"> 388 </span> :
<span class="lineNum"> 389 </span><span class="lineCov"> 257 : for (i = 0; i &lt; TOMMY_SIZE; ++i)</span>
<span class="lineNum"> 390 </span><span class="lineCov"> 256 : tommy_tree_insert(&amp;tree, &amp;node[i], (void*)(uintptr_t)(i+1));</span>
<span class="lineNum"> 391 </span> :
<span class="lineNum"> 392 </span> : /* try to insert a duplicate, count should not change */
<span class="lineNum"> 393 </span><span class="lineCov"> 1 : if (tommy_tree_insert(&amp;tree, &amp;node[TOMMY_SIZE], (void*)1) != (void*)1)</span>
<span class="lineNum"> 394 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 395 </span> :
<span class="lineNum"> 396 </span><span class="lineCov"> 1 : if (tommy_tree_count(&amp;tree) != TOMMY_SIZE)</span>
<span class="lineNum"> 397 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 398 </span> :
<span class="lineNum"> 399 </span><span class="lineCov"> 1 : if (tommy_tree_memory_usage(&amp;tree) &lt; TOMMY_SIZE * sizeof(tommy_node))</span>
<span class="lineNum"> 400 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 382 </span><span class="lineCov"> 1 : if (tommy_hashdyn_count(&amp;hashdyn) != TOMMY_SIZE) {</span>
<span class="lineNum"> 383 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 384 </span> : goto bail;
<span class="lineNum"> 385 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 386 </span> : }
<span class="lineNum"> 387 </span> :
<span class="lineNum"> 388 </span><span class="lineCov"> 1 : if (tommy_hashdyn_memory_usage(&amp;hashdyn) &lt; TOMMY_SIZE * sizeof(tommy_node)) {</span>
<span class="lineNum"> 389 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 390 </span> : goto bail;
<span class="lineNum"> 391 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 392 </span> : }
<span class="lineNum"> 393 </span> :
<span class="lineNum"> 394 </span><span class="lineCov"> 1 : tommy_test_foreach_count = 0;</span>
<span class="lineNum"> 395 </span><span class="lineCov"> 1 : tommy_hashdyn_foreach(&amp;hashdyn, tommy_test_foreach);</span>
<span class="lineNum"> 396 </span><span class="lineCov"> 1 : if (tommy_test_foreach_count != TOMMY_SIZE) {</span>
<span class="lineNum"> 397 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 398 </span> : goto bail;
<span class="lineNum"> 399 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 400 </span> : }
<span class="lineNum"> 401 </span> :
<span class="lineNum"> 402 </span><span class="lineCov"> 1 : if (tommy_tree_search(&amp;tree, (void*)1) != (void*)1)</span>
<span class="lineNum"> 403 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 404 </span> :
<span class="lineNum"> 405 </span><span class="lineCov"> 1 : if (tommy_tree_search(&amp;tree, (void*)-1) != 0)</span>
<span class="lineNum"> 406 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 407 </span> :
<span class="lineNum"> 408 </span><span class="lineCov"> 1 : if (tommy_tree_search_compare(&amp;tree, tommy_test_compare, (void*)1) != (void*)1)</span>
<span class="lineNum"> 409 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 410 </span> :
<span class="lineNum"> 411 </span><span class="lineCov"> 1 : if (tommy_tree_search_compare(&amp;tree, tommy_test_compare, (void*)-1) != 0)</span>
<span class="lineNum"> 412 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 413 </span> :
<span class="lineNum"> 414 </span><span class="lineCov"> 1 : tommy_test_foreach_count = 0;</span>
<span class="lineNum"> 415 </span><span class="lineCov"> 1 : tommy_tree_foreach(&amp;tree, tommy_test_foreach);</span>
<span class="lineNum"> 416 </span><span class="lineCov"> 1 : if (tommy_test_foreach_count != TOMMY_SIZE)</span>
<span class="lineNum"> 417 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 418 </span> :
<span class="lineNum"> 419 </span><span class="lineCov"> 1 : tommy_test_foreach_count = 0;</span>
<span class="lineNum"> 420 </span><span class="lineCov"> 1 : tommy_tree_foreach_arg(&amp;tree, tommy_test_foreach_arg, &amp;tommy_test_foreach_count);</span>
<span class="lineNum"> 421 </span><span class="lineCov"> 1 : if (tommy_test_foreach_count != TOMMY_SIZE)</span>
<span class="lineNum"> 422 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 423 </span> :
<span class="lineNum"> 424 </span><span class="lineCov"> 129 : for (i = 0; i &lt; TOMMY_SIZE / 2; ++i)</span>
<span class="lineNum"> 425 </span><span class="lineCov"> 128 : tommy_tree_remove_existing(&amp;tree, &amp;node[i]);</span>
<span class="lineNum"> 426 </span> :
<span class="lineNum"> 427 </span><span class="lineCov"> 129 : for (i = 0; i &lt; TOMMY_SIZE / 2; ++i)</span>
<span class="lineNum"> 428 </span><span class="lineCov"> 128 : if (tommy_tree_remove(&amp;tree, (void*)(uintptr_t)(i+1)) != 0)</span>
<span class="lineNum"> 429 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 430 </span> :
<span class="lineNum"> 431 </span><span class="lineCov"> 129 : for (i = TOMMY_SIZE / 2; i &lt; TOMMY_SIZE; ++i)</span>
<span class="lineNum"> 432 </span><span class="lineCov"> 128 : if (tommy_tree_remove(&amp;tree, (void*)(uintptr_t)(i+1)) == 0)</span>
<span class="lineNum"> 433 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 434 </span> :
<span class="lineNum"> 435 </span><span class="lineCov"> 1 : if (tommy_tree_count(&amp;tree) != 0)</span>
<span class="lineNum"> 436 </span><span class="lineNoCov"> 0 : goto bail;</span>
<span class="lineNum"> 402 </span><span class="lineCov"> 1 : tommy_test_foreach_count = 0;</span>
<span class="lineNum"> 403 </span><span class="lineCov"> 1 : tommy_hashdyn_foreach_arg(&amp;hashdyn, tommy_test_foreach_arg, &amp;tommy_test_foreach_count);</span>
<span class="lineNum"> 404 </span><span class="lineCov"> 1 : if (tommy_test_foreach_count != TOMMY_SIZE) {</span>
<span class="lineNum"> 405 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 406 </span> : goto bail;
<span class="lineNum"> 407 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 408 </span> : }
<span class="lineNum"> 409 </span> :
<span class="lineNum"> 410 </span><span class="lineCov"> 129 : for (i = 0; i &lt; TOMMY_SIZE / 2; ++i)</span>
<span class="lineNum"> 411 </span><span class="lineCov"> 128 : tommy_hashdyn_remove_existing(&amp;hashdyn, &amp;node[i]);</span>
<span class="lineNum"> 412 </span> :
<span class="lineNum"> 413 </span><span class="lineCov"> 129 : for (i = 0; i &lt; TOMMY_SIZE / 2; ++i) {</span>
<span class="lineNum"> 414 </span><span class="lineCov"> 128 : if (tommy_hashdyn_remove(&amp;hashdyn, tommy_test_search, &amp;node[i], i % 64) != 0) {</span>
<span class="lineNum"> 415 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 416 </span> : goto bail;
<span class="lineNum"> 417 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 418 </span> : }
<span class="lineNum"> 419 </span> : }
<span class="lineNum"> 420 </span><span class="lineCov"> 129 : for (i = TOMMY_SIZE / 2; i &lt; TOMMY_SIZE; ++i) {</span>
<span class="lineNum"> 421 </span><span class="lineCov"> 128 : if (tommy_hashdyn_remove(&amp;hashdyn, tommy_test_search, &amp;node[i], i % 64) == 0) {</span>
<span class="lineNum"> 422 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 423 </span> : goto bail;
<span class="lineNum"> 424 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 425 </span> : }
<span class="lineNum"> 426 </span> : }
<span class="lineNum"> 427 </span> :
<span class="lineNum"> 428 </span><span class="lineCov"> 1 : if (tommy_hashdyn_count(&amp;hashdyn) != 0) {</span>
<span class="lineNum"> 429 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 430 </span> : goto bail;
<span class="lineNum"> 431 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 432 </span> : }
<span class="lineNum"> 433 </span> :
<span class="lineNum"> 434 </span><span class="lineCov"> 1 : tommy_hashdyn_done(&amp;hashdyn);</span>
<span class="lineNum"> 435 </span> :
<span class="lineNum"> 436 </span><span class="lineCov"> 1 : tommy_tree_init(&amp;tree, tommy_test_compare);</span>
<span class="lineNum"> 437 </span> :
<span class="lineNum"> 438 </span><span class="lineCov"> 2 : return;</span>
<span class="lineNum"> 439 </span> : bail:
<span class="lineNum"> 440 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 441 </span> : log_fatal(&quot;Failed tommy test\n&quot;);
<span class="lineNum"> 442 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 443 </span> : /* LCOV_EXCL_STOP */
<a name="444"><span class="lineNum"> 444 </span> : }</a>
<span class="lineNum"> 445 </span> :
<span class="lineNum"> 446 </span><span class="lineCov"> 1 : void selftest(void)</span>
<span class="lineNum"> 447 </span> : {
<span class="lineNum"> 448 </span><span class="lineCov"> 1 : log_tag(&quot;selftest:\n&quot;);</span>
<span class="lineNum"> 449 </span><span class="lineCov"> 1 : log_flush();</span>
<span class="lineNum"> 450 </span> :
<span class="lineNum"> 451 </span><span class="lineCov"> 1 : msg_progress(&quot;Self test...\n&quot;);</span>
<span class="lineNum"> 452 </span> :
<span class="lineNum"> 453 </span> : /* large file check */
<span class="lineNum"> 454 </span> : if (sizeof(off_t) &lt; sizeof(uint64_t)) {
<span class="lineNum"> 455 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 456 </span> : log_fatal(&quot;Missing support for large files\n&quot;);
<span class="lineNum"> 457 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 458 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 459 </span> : }
<span class="lineNum"> 460 </span> :
<span class="lineNum"> 461 </span><span class="lineCov"> 1 : test_hash();</span>
<span class="lineNum"> 462 </span><span class="lineCov"> 1 : test_crc32c();</span>
<span class="lineNum"> 463 </span><span class="lineCov"> 1 : test_tommy();</span>
<span class="lineNum"> 464 </span><span class="lineCov"> 1 : if (raid_selftest() != 0) {</span>
<span class="lineNum"> 465 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 466 </span> : log_fatal(&quot;Failed SELF test\n&quot;);
<span class="lineNum"> 467 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 468 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 469 </span> : }
<span class="lineNum"> 470 </span><span class="lineCov"> 1 : if (raid_test_sort() != 0) {</span>
<span class="lineNum"> 471 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 472 </span> : log_fatal(&quot;Failed SORT test\n&quot;);
<span class="lineNum"> 473 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 474 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 475 </span> : }
<span class="lineNum"> 476 </span><span class="lineCov"> 1 : if (raid_test_insert() != 0) {</span>
<span class="lineNum"> 477 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 478 </span> : log_fatal(&quot;Failed INSERT test\n&quot;);
<span class="lineNum"> 479 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 480 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 481 </span> : }
<span class="lineNum"> 482 </span><span class="lineCov"> 1 : if (raid_test_combo() != 0) {</span>
<span class="lineNum"> 483 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 484 </span> : log_fatal(&quot;Failed COMBO test\n&quot;);
<span class="lineNum"> 485 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 486 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 487 </span> : }
<span class="lineNum"> 488 </span><span class="lineCov"> 1 : if (raid_test_par(RAID_MODE_VANDERMONDE, 32, 256) != 0) {</span>
<span class="lineNum"> 438 </span><span class="lineCov"> 257 : for (i = 0; i &lt; TOMMY_SIZE; ++i)</span>
<span class="lineNum"> 439 </span><span class="lineCov"> 256 : tommy_tree_insert(&amp;tree, &amp;node[i], (void*)(uintptr_t)(i+1));</span>
<span class="lineNum"> 440 </span> :
<span class="lineNum"> 441 </span> : /* try to insert a duplicate, count should not change */
<span class="lineNum"> 442 </span><span class="lineCov"> 1 : if (tommy_tree_insert(&amp;tree, &amp;node[TOMMY_SIZE], (void*)1) != (void*)1) {</span>
<span class="lineNum"> 443 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 444 </span> : goto bail;
<span class="lineNum"> 445 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 446 </span> : }
<span class="lineNum"> 447 </span><span class="lineCov"> 1 : if (tommy_tree_count(&amp;tree) != TOMMY_SIZE) {</span>
<span class="lineNum"> 448 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 449 </span> : goto bail;
<span class="lineNum"> 450 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 451 </span> : }
<span class="lineNum"> 452 </span><span class="lineCov"> 1 : if (tommy_tree_memory_usage(&amp;tree) &lt; TOMMY_SIZE * sizeof(tommy_node)) {</span>
<span class="lineNum"> 453 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 454 </span> : goto bail;
<span class="lineNum"> 455 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 456 </span> : }
<span class="lineNum"> 457 </span><span class="lineCov"> 1 : if (tommy_tree_search(&amp;tree, (void*)1) != (void*)1) {</span>
<span class="lineNum"> 458 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 459 </span> : goto bail;
<span class="lineNum"> 460 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 461 </span> : }
<span class="lineNum"> 462 </span><span class="lineCov"> 1 : if (tommy_tree_search(&amp;tree, (void*)-1) != 0) {</span>
<span class="lineNum"> 463 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 464 </span> : goto bail;
<span class="lineNum"> 465 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 466 </span> : }
<span class="lineNum"> 467 </span><span class="lineCov"> 1 : if (tommy_tree_search_compare(&amp;tree, tommy_test_compare, (void*)1) != (void*)1) {</span>
<span class="lineNum"> 468 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 469 </span> : goto bail;
<span class="lineNum"> 470 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 471 </span> : }
<span class="lineNum"> 472 </span><span class="lineCov"> 1 : if (tommy_tree_search_compare(&amp;tree, tommy_test_compare, (void*)-1) != 0) {</span>
<span class="lineNum"> 473 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 474 </span> : goto bail;
<span class="lineNum"> 475 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 476 </span> : }
<span class="lineNum"> 477 </span> :
<span class="lineNum"> 478 </span><span class="lineCov"> 1 : tommy_test_foreach_count = 0;</span>
<span class="lineNum"> 479 </span><span class="lineCov"> 1 : tommy_tree_foreach(&amp;tree, tommy_test_foreach);</span>
<span class="lineNum"> 480 </span><span class="lineCov"> 1 : if (tommy_test_foreach_count != TOMMY_SIZE) {</span>
<span class="lineNum"> 481 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 482 </span> : goto bail;
<span class="lineNum"> 483 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 484 </span> : }
<span class="lineNum"> 485 </span> :
<span class="lineNum"> 486 </span><span class="lineCov"> 1 : tommy_test_foreach_count = 0;</span>
<span class="lineNum"> 487 </span><span class="lineCov"> 1 : tommy_tree_foreach_arg(&amp;tree, tommy_test_foreach_arg, &amp;tommy_test_foreach_count);</span>
<span class="lineNum"> 488 </span><span class="lineCov"> 1 : if (tommy_test_foreach_count != TOMMY_SIZE) {</span>
<span class="lineNum"> 489 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 490 </span> : log_fatal(&quot;Failed GEN Vandermonde test\n&quot;);
<span class="lineNum"> 491 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 492 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 493 </span> : }
<span class="lineNum"> 494 </span><span class="lineCov"> 1 : if (raid_test_rec(RAID_MODE_VANDERMONDE, 12, 256) != 0) {</span>
<span class="lineNum"> 495 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 496 </span> : log_fatal(&quot;Failed REC Vandermonde test\n&quot;);
<span class="lineNum"> 497 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 498 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 499 </span> : }
<span class="lineNum"> 500 </span><span class="lineCov"> 1 : if (raid_test_par(RAID_MODE_CAUCHY, 32, 256) != 0) {</span>
<span class="lineNum"> 501 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 502 </span> : log_fatal(&quot;Failed GEN Cauchy test\n&quot;);
<span class="lineNum"> 503 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 504 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 505 </span> : }
<span class="lineNum"> 506 </span><span class="lineCov"> 1 : if (raid_test_rec(RAID_MODE_CAUCHY, 12, 256) != 0) {</span>
<span class="lineNum"> 507 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 508 </span> : log_fatal(&quot;Failed REC Cauchy test\n&quot;);
<span class="lineNum"> 509 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 510 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 490 </span> : goto bail;
<span class="lineNum"> 491 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 492 </span> : }
<span class="lineNum"> 493 </span> :
<span class="lineNum"> 494 </span><span class="lineCov"> 129 : for (i = 0; i &lt; TOMMY_SIZE / 2; ++i)</span>
<span class="lineNum"> 495 </span><span class="lineCov"> 128 : tommy_tree_remove_existing(&amp;tree, &amp;node[i]);</span>
<span class="lineNum"> 496 </span> :
<span class="lineNum"> 497 </span><span class="lineCov"> 129 : for (i = 0; i &lt; TOMMY_SIZE / 2; ++i) {</span>
<span class="lineNum"> 498 </span><span class="lineCov"> 128 : if (tommy_tree_remove(&amp;tree, (void*)(uintptr_t)(i+1)) != 0) {</span>
<span class="lineNum"> 499 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 500 </span> : goto bail;
<span class="lineNum"> 501 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 502 </span> : }
<span class="lineNum"> 503 </span> : }
<span class="lineNum"> 504 </span> :
<span class="lineNum"> 505 </span><span class="lineCov"> 129 : for (i = TOMMY_SIZE / 2; i &lt; TOMMY_SIZE; ++i) {</span>
<span class="lineNum"> 506 </span><span class="lineCov"> 128 : if (tommy_tree_remove(&amp;tree, (void*)(uintptr_t)(i+1)) == 0) {</span>
<span class="lineNum"> 507 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 508 </span> : goto bail;
<span class="lineNum"> 509 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 510 </span> : }
<span class="lineNum"> 511 </span> : }
<span class="lineNum"> 512 </span><span class="lineCov"> 1 : if (raid_test_par(RAID_MODE_CAUCHY, 1, 256) != 0) {</span>
<span class="lineNum"> 513 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 514 </span> : log_fatal(&quot;Failed GEN Cauchy test sigle data disk\n&quot;);
<span class="lineNum"> 515 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 512 </span> :
<span class="lineNum"> 513 </span><span class="lineCov"> 1 : if (tommy_tree_count(&amp;tree) != 0) {</span>
<span class="lineNum"> 514 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 515 </span> : goto bail;
<span class="lineNum"> 516 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 517 </span> : }
<span class="lineNum"> 518 </span><span class="lineCov"> 1 : }</span>
<span class="lineNum"> 519 </span> :
<span class="lineNum"> 518 </span> :
<span class="lineNum"> 519 </span><span class="lineCov"> 2 : return;</span>
<span class="lineNum"> 520 </span> : bail:
<span class="lineNum"> 521 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 522 </span> : log_fatal(&quot;Failed tommy test\n&quot;);
<span class="lineNum"> 523 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 524 </span> : /* LCOV_EXCL_STOP */
<a name="525"><span class="lineNum"> 525 </span> : }</a>
<span class="lineNum"> 526 </span> :
<span class="lineNum"> 527 </span><span class="lineCov"> 1 : void selftest(void)</span>
<span class="lineNum"> 528 </span> : {
<span class="lineNum"> 529 </span><span class="lineCov"> 1 : log_tag(&quot;selftest:\n&quot;);</span>
<span class="lineNum"> 530 </span><span class="lineCov"> 1 : log_flush();</span>
<span class="lineNum"> 531 </span> :
<span class="lineNum"> 532 </span><span class="lineCov"> 1 : msg_progress(&quot;Self test...\n&quot;);</span>
<span class="lineNum"> 533 </span> :
<span class="lineNum"> 534 </span> : /* large file check */
<span class="lineNum"> 535 </span> : if (sizeof(off_t) &lt; sizeof(uint64_t)) {
<span class="lineNum"> 536 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 537 </span> : log_fatal(&quot;Missing support for large files\n&quot;);
<span class="lineNum"> 538 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 539 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 540 </span> : }
<span class="lineNum"> 541 </span> :
<span class="lineNum"> 542 </span><span class="lineCov"> 1 : test_hash();</span>
<span class="lineNum"> 543 </span><span class="lineCov"> 1 : test_crc32c();</span>
<span class="lineNum"> 544 </span><span class="lineCov"> 1 : test_tommy();</span>
<span class="lineNum"> 545 </span><span class="lineCov"> 1 : if (raid_selftest() != 0) {</span>
<span class="lineNum"> 546 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 547 </span> : log_fatal(&quot;Failed SELF test\n&quot;);
<span class="lineNum"> 548 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 549 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 550 </span> : }
<span class="lineNum"> 551 </span><span class="lineCov"> 1 : if (raid_test_sort() != 0) {</span>
<span class="lineNum"> 552 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 553 </span> : log_fatal(&quot;Failed SORT test\n&quot;);
<span class="lineNum"> 554 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 555 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 556 </span> : }
<span class="lineNum"> 557 </span><span class="lineCov"> 1 : if (raid_test_insert() != 0) {</span>
<span class="lineNum"> 558 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 559 </span> : log_fatal(&quot;Failed INSERT test\n&quot;);
<span class="lineNum"> 560 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 561 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 562 </span> : }
<span class="lineNum"> 563 </span><span class="lineCov"> 1 : if (raid_test_combo() != 0) {</span>
<span class="lineNum"> 564 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 565 </span> : log_fatal(&quot;Failed COMBO test\n&quot;);
<span class="lineNum"> 566 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 567 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 568 </span> : }
<span class="lineNum"> 569 </span><span class="lineCov"> 1 : if (raid_test_par(RAID_MODE_VANDERMONDE, 32, 256) != 0) {</span>
<span class="lineNum"> 570 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 571 </span> : log_fatal(&quot;Failed GEN Vandermonde test\n&quot;);
<span class="lineNum"> 572 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 573 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 574 </span> : }
<span class="lineNum"> 575 </span><span class="lineCov"> 1 : if (raid_test_rec(RAID_MODE_VANDERMONDE, 12, 256) != 0) {</span>
<span class="lineNum"> 576 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 577 </span> : log_fatal(&quot;Failed REC Vandermonde test\n&quot;);
<span class="lineNum"> 578 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 579 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 580 </span> : }
<span class="lineNum"> 581 </span><span class="lineCov"> 1 : if (raid_test_par(RAID_MODE_CAUCHY, 32, 256) != 0) {</span>
<span class="lineNum"> 582 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 583 </span> : log_fatal(&quot;Failed GEN Cauchy test\n&quot;);
<span class="lineNum"> 584 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 585 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 586 </span> : }
<span class="lineNum"> 587 </span><span class="lineCov"> 1 : if (raid_test_rec(RAID_MODE_CAUCHY, 12, 256) != 0) {</span>
<span class="lineNum"> 588 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 589 </span> : log_fatal(&quot;Failed REC Cauchy test\n&quot;);
<span class="lineNum"> 590 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 591 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 592 </span> : }
<span class="lineNum"> 593 </span><span class="lineCov"> 1 : if (raid_test_par(RAID_MODE_CAUCHY, 1, 256) != 0) {</span>
<span class="lineNum"> 594 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 595 </span> : log_fatal(&quot;Failed GEN Cauchy test sigle data disk\n&quot;);
<span class="lineNum"> 596 </span> : exit(EXIT_FAILURE);
<span class="lineNum"> 597 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 598 </span> : }
<span class="lineNum"> 599 </span><span class="lineCov"> 1 : }</span>
<span class="lineNum"> 600 </span> :
</pre>
</td>
</tr>

View file

@ -31,13 +31,13 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">446</td>
<td class="headerCovTableEntry">474</td>
<td class="headerCovTableEntryHi">94.1 %</td>
<td class="headerCovTableEntry">454</td>
<td class="headerCovTableEntry">484</td>
<td class="headerCovTableEntryHi">93.8 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">8</td>
@ -60,28 +60,28 @@
<td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
</tr>
<tr>
<td class="coverFn"><a href="snapraid.c.gcov.html#418">main</a></td>
<td class="coverFnHi">257</td>
<td class="coverFn"><a href="snapraid.c.gcov.html#434">main</a></td>
<td class="coverFnHi">265</td>
</tr>
<tr>
<td class="coverFn"><a href="snapraid.c.gcov.html#193">config</a></td>
<td class="coverFnHi">257</td>
<td class="coverFnHi">265</td>
</tr>
<tr>
<td class="coverFn"><a href="snapraid.c.gcov.html#92">log_open</a></td>
<td class="coverFnHi">247</td>
<td class="coverFnHi">255</td>
</tr>
<tr>
<td class="coverFn"><a href="snapraid.c.gcov.html#176">log_close</a></td>
<td class="coverFnHi">225</td>
<td class="coverFnHi">233</td>
</tr>
<tr>
<td class="coverFn"><a href="snapraid.c.gcov.html#75">memory</a></td>
<td class="coverFnHi">222</td>
<td class="coverFnHi">230</td>
</tr>
<tr>
<td class="coverFn"><a href="snapraid.c.gcov.html#379">signal_init</a></td>
<td class="coverFnHi">208</td>
<td class="coverFn"><a href="snapraid.c.gcov.html#395">signal_init</a></td>
<td class="coverFnHi">216</td>
</tr>
<tr>
<td class="coverFn"><a href="snapraid.c.gcov.html#29">version</a></td>

View file

@ -31,13 +31,13 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">446</td>
<td class="headerCovTableEntry">474</td>
<td class="headerCovTableEntryHi">94.1 %</td>
<td class="headerCovTableEntry">454</td>
<td class="headerCovTableEntry">484</td>
<td class="headerCovTableEntryHi">93.8 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">8</td>
@ -61,27 +61,27 @@
</tr>
<tr>
<td class="coverFn"><a href="snapraid.c.gcov.html#193">config</a></td>
<td class="coverFnHi">257</td>
<td class="coverFnHi">265</td>
</tr>
<tr>
<td class="coverFn"><a href="snapraid.c.gcov.html#176">log_close</a></td>
<td class="coverFnHi">225</td>
<td class="coverFnHi">233</td>
</tr>
<tr>
<td class="coverFn"><a href="snapraid.c.gcov.html#92">log_open</a></td>
<td class="coverFnHi">247</td>
<td class="coverFnHi">255</td>
</tr>
<tr>
<td class="coverFn"><a href="snapraid.c.gcov.html#418">main</a></td>
<td class="coverFnHi">257</td>
<td class="coverFn"><a href="snapraid.c.gcov.html#434">main</a></td>
<td class="coverFnHi">265</td>
</tr>
<tr>
<td class="coverFn"><a href="snapraid.c.gcov.html#75">memory</a></td>
<td class="coverFnHi">222</td>
<td class="coverFnHi">230</td>
</tr>
<tr>
<td class="coverFn"><a href="snapraid.c.gcov.html#379">signal_init</a></td>
<td class="coverFnHi">208</td>
<td class="coverFn"><a href="snapraid.c.gcov.html#395">signal_init</a></td>
<td class="coverFnHi">216</td>
</tr>
<tr>
<td class="coverFn"><a href="snapraid.c.gcov.html#34">usage</a></td>

File diff suppressed because it is too large Load diff

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">2</td>
@ -61,7 +61,7 @@
</tr>
<tr>
<td class="coverFn"><a href="speed.c.gcov.html#39">diffgettimeofday</a></td>
<td class="coverFnHi">1866</td>
<td class="coverFnHi">1878</td>
</tr>
<tr>
<td class="coverFn"><a href="speed.c.gcov.html#76">speed</a></td>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">2</td>
@ -61,7 +61,7 @@
</tr>
<tr>
<td class="coverFn"><a href="speed.c.gcov.html#39">diffgettimeofday</a></td>
<td class="coverFnHi">1866</td>
<td class="coverFnHi">1878</td>
</tr>
<tr>
<td class="coverFn"><a href="speed.c.gcov.html#76">speed</a></td>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">2</td>
@ -100,14 +100,14 @@
<span class="lineNum"> 38 </span> : /**
<a name="39"><span class="lineNum"> 39 </span> : * Differential us of two timeval.</a>
<span class="lineNum"> 40 </span> : */
<span class="lineNum"> 41 </span><span class="lineCov"> 1866 : static int64_t diffgettimeofday(struct timeval *start, struct timeval *stop)</span>
<span class="lineNum"> 41 </span><span class="lineCov"> 1878 : static int64_t diffgettimeofday(struct timeval *start, struct timeval *stop)</span>
<span class="lineNum"> 42 </span> : {
<span class="lineNum"> 43 </span> : int64_t d;
<span class="lineNum"> 44 </span> :
<span class="lineNum"> 45 </span><span class="lineCov"> 1866 : d = 1000000LL * (stop-&gt;tv_sec - start-&gt;tv_sec);</span>
<span class="lineNum"> 46 </span><span class="lineCov"> 1866 : d += stop-&gt;tv_usec - start-&gt;tv_usec;</span>
<span class="lineNum"> 45 </span><span class="lineCov"> 1878 : d = 1000000LL * (stop-&gt;tv_sec - start-&gt;tv_sec);</span>
<span class="lineNum"> 46 </span><span class="lineCov"> 1878 : d += stop-&gt;tv_usec - start-&gt;tv_usec;</span>
<span class="lineNum"> 47 </span> :
<span class="lineNum"> 48 </span><span class="lineCov"> 1866 : return d;</span>
<span class="lineNum"> 48 </span><span class="lineCov"> 1878 : return d;</span>
<span class="lineNum"> 49 </span> : }
<span class="lineNum"> 50 </span> :
<span class="lineNum"> 51 </span> : /**
@ -232,10 +232,10 @@
<span class="lineNum"> 170 </span><span class="lineCov"> 4 : printf(&quot;%8s&quot;, &quot;memset&quot;);</span>
<span class="lineNum"> 171 </span><span class="lineCov"> 4 : fflush(stdout);</span>
<span class="lineNum"> 172 </span> :
<span class="lineNum"> 173 </span><span class="lineCov"> 385 : SPEED_START {</span>
<span class="lineNum"> 174 </span><span class="lineCov"> 3429 : for (j = 0; j &lt; nd; ++j)</span>
<span class="lineNum"> 175 </span><span class="lineCov"> 3048 : memset(v[j], j, size);</span>
<span class="lineNum"> 176 </span><span class="lineCov"> 381 : } SPEED_STOP</span>
<span class="lineNum"> 173 </span><span class="lineCov"> 375 : SPEED_START {</span>
<span class="lineNum"> 174 </span><span class="lineCov"> 3339 : for (j = 0; j &lt; nd; ++j)</span>
<span class="lineNum"> 175 </span><span class="lineCov"> 2968 : memset(v[j], j, size);</span>
<span class="lineNum"> 176 </span><span class="lineCov"> 371 : } SPEED_STOP</span>
<span class="lineNum"> 177 </span> :
<span class="lineNum"> 178 </span><span class="lineCov"> 4 : printf(&quot;%8&quot; PRIu64, ds / dt);</span>
<span class="lineNum"> 179 </span><span class="lineCov"> 4 : printf(&quot;\n&quot;);</span>
@ -247,10 +247,10 @@
<span class="lineNum"> 185 </span><span class="lineCov"> 4 : printf(&quot;%8s&quot;, &quot;table&quot;);</span>
<span class="lineNum"> 186 </span><span class="lineCov"> 4 : fflush(stdout);</span>
<span class="lineNum"> 187 </span> :
<span class="lineNum"> 188 </span><span class="lineCov"> 46 : SPEED_START {</span>
<span class="lineNum"> 189 </span><span class="lineCov"> 378 : for (j = 0; j &lt; nd; ++j)</span>
<span class="lineNum"> 190 </span><span class="lineCov"> 336 : side_effect += crc32c_gen(0, v[j], size);</span>
<span class="lineNum"> 191 </span><span class="lineCov"> 42 : } SPEED_STOP</span>
<span class="lineNum"> 188 </span><span class="lineCov"> 48 : SPEED_START {</span>
<span class="lineNum"> 189 </span><span class="lineCov"> 396 : for (j = 0; j &lt; nd; ++j)</span>
<span class="lineNum"> 190 </span><span class="lineCov"> 352 : side_effect += crc32c_gen(0, v[j], size);</span>
<span class="lineNum"> 191 </span><span class="lineCov"> 44 : } SPEED_STOP</span>
<span class="lineNum"> 192 </span> :
<span class="lineNum"> 193 </span><span class="lineCov"> 4 : printf(&quot;%8&quot; PRIu64, ds / dt);</span>
<span class="lineNum"> 194 </span><span class="lineCov"> 4 : printf(&quot;\n&quot;);</span>
@ -302,10 +302,10 @@
<span class="lineNum"> 240 </span><span class="lineCov"> 4 : printf(&quot;%8&quot; PRIu64, ds / dt);</span>
<span class="lineNum"> 241 </span><span class="lineCov"> 4 : fflush(stdout);</span>
<span class="lineNum"> 242 </span> :
<span class="lineNum"> 243 </span><span class="lineCov"> 35 : SPEED_START {</span>
<span class="lineNum"> 244 </span><span class="lineCov"> 279 : for (j = 0; j &lt; nd; ++j)</span>
<span class="lineNum"> 245 </span><span class="lineCov"> 248 : memhash(HASH_SPOOKY2, seed, digest, v[j], size);</span>
<span class="lineNum"> 246 </span><span class="lineCov"> 31 : } SPEED_STOP</span>
<span class="lineNum"> 243 </span><span class="lineCov"> 36 : SPEED_START {</span>
<span class="lineNum"> 244 </span><span class="lineCov"> 288 : for (j = 0; j &lt; nd; ++j)</span>
<span class="lineNum"> 245 </span><span class="lineCov"> 256 : memhash(HASH_SPOOKY2, seed, digest, v[j], size);</span>
<span class="lineNum"> 246 </span><span class="lineCov"> 32 : } SPEED_STOP</span>
<span class="lineNum"> 247 </span> :
<span class="lineNum"> 248 </span><span class="lineCov"> 4 : printf(&quot;%8&quot; PRIu64, ds / dt);</span>
<span class="lineNum"> 249 </span><span class="lineCov"> 4 : printf(&quot;\n&quot;);</span>
@ -341,16 +341,16 @@
<span class="lineNum"> 279 </span> :
<span class="lineNum"> 280 </span><span class="lineCov"> 4 : printf(&quot;%8s&quot;, &quot;&quot;);</span>
<span class="lineNum"> 281 </span> :
<span class="lineNum"> 282 </span><span class="lineCov"> 118 : SPEED_START {</span>
<span class="lineNum"> 283 </span><span class="lineCov"> 114 : raid_gen1_int32(nd, size, v);</span>
<span class="lineNum"> 284 </span><span class="lineCov"> 114 : } SPEED_STOP</span>
<span class="lineNum"> 282 </span><span class="lineCov"> 120 : SPEED_START {</span>
<span class="lineNum"> 283 </span><span class="lineCov"> 116 : raid_gen1_int32(nd, size, v);</span>
<span class="lineNum"> 284 </span><span class="lineCov"> 116 : } SPEED_STOP</span>
<span class="lineNum"> 285 </span> :
<span class="lineNum"> 286 </span><span class="lineCov"> 4 : printf(&quot;%8&quot; PRIu64, ds / dt);</span>
<span class="lineNum"> 287 </span><span class="lineCov"> 4 : fflush(stdout);</span>
<span class="lineNum"> 288 </span> :
<span class="lineNum"> 289 </span><span class="lineCov"> 189 : SPEED_START {</span>
<span class="lineNum"> 290 </span><span class="lineCov"> 185 : raid_gen1_int64(nd, size, v);</span>
<span class="lineNum"> 291 </span><span class="lineCov"> 185 : } SPEED_STOP</span>
<span class="lineNum"> 289 </span><span class="lineCov"> 192 : SPEED_START {</span>
<span class="lineNum"> 290 </span><span class="lineCov"> 188 : raid_gen1_int64(nd, size, v);</span>
<span class="lineNum"> 291 </span><span class="lineCov"> 188 : } SPEED_STOP</span>
<span class="lineNum"> 292 </span> :
<span class="lineNum"> 293 </span><span class="lineCov"> 4 : printf(&quot;%8&quot; PRIu64, ds / dt);</span>
<span class="lineNum"> 294 </span><span class="lineCov"> 4 : fflush(stdout);</span>
@ -358,9 +358,9 @@
<span class="lineNum"> 296 </span> : #ifdef CONFIG_X86
<span class="lineNum"> 297 </span> : #ifdef CONFIG_SSE2
<span class="lineNum"> 298 </span><span class="lineCov"> 4 : if (raid_cpu_has_sse2()) {</span>
<span class="lineNum"> 299 </span><span class="lineCov"> 310 : SPEED_START {</span>
<span class="lineNum"> 300 </span><span class="lineCov"> 306 : raid_gen1_sse2(nd, size, v);</span>
<span class="lineNum"> 301 </span><span class="lineCov"> 306 : } SPEED_STOP</span>
<span class="lineNum"> 299 </span><span class="lineCov"> 317 : SPEED_START {</span>
<span class="lineNum"> 300 </span><span class="lineCov"> 313 : raid_gen1_sse2(nd, size, v);</span>
<span class="lineNum"> 301 </span><span class="lineCov"> 313 : } SPEED_STOP</span>
<span class="lineNum"> 302 </span> :
<span class="lineNum"> 303 </span><span class="lineCov"> 4 : printf(&quot;%8&quot; PRIu64, ds / dt);</span>
<span class="lineNum"> 304 </span><span class="lineCov"> 4 : fflush(stdout);</span>
@ -411,9 +411,9 @@
<span class="lineNum"> 349 </span> : #ifdef CONFIG_X86
<span class="lineNum"> 350 </span> : #ifdef CONFIG_SSE2
<span class="lineNum"> 351 </span><span class="lineCov"> 4 : if (raid_cpu_has_sse2()) {</span>
<span class="lineNum"> 352 </span><span class="lineCov"> 147 : SPEED_START {</span>
<span class="lineNum"> 353 </span><span class="lineCov"> 143 : raid_gen2_sse2(nd, size, v);</span>
<span class="lineNum"> 354 </span><span class="lineCov"> 143 : } SPEED_STOP</span>
<span class="lineNum"> 352 </span><span class="lineCov"> 151 : SPEED_START {</span>
<span class="lineNum"> 353 </span><span class="lineCov"> 147 : raid_gen2_sse2(nd, size, v);</span>
<span class="lineNum"> 354 </span><span class="lineCov"> 147 : } SPEED_STOP</span>
<span class="lineNum"> 355 </span> :
<span class="lineNum"> 356 </span><span class="lineCov"> 4 : printf(&quot;%8&quot; PRIu64, ds / dt);</span>
<span class="lineNum"> 357 </span><span class="lineCov"> 4 : fflush(stdout);</span>
@ -470,9 +470,9 @@
<span class="lineNum"> 408 </span> : #ifdef CONFIG_X86
<span class="lineNum"> 409 </span> : #ifdef CONFIG_SSE2
<span class="lineNum"> 410 </span><span class="lineCov"> 4 : if (raid_cpu_has_sse2()) {</span>
<span class="lineNum"> 411 </span><span class="lineCov"> 88 : SPEED_START {</span>
<span class="lineNum"> 412 </span><span class="lineCov"> 84 : raid_genz_sse2(nd, size, v);</span>
<span class="lineNum"> 413 </span><span class="lineCov"> 84 : } SPEED_STOP</span>
<span class="lineNum"> 411 </span><span class="lineCov"> 89 : SPEED_START {</span>
<span class="lineNum"> 412 </span><span class="lineCov"> 85 : raid_genz_sse2(nd, size, v);</span>
<span class="lineNum"> 413 </span><span class="lineCov"> 85 : } SPEED_STOP</span>
<span class="lineNum"> 414 </span> :
<span class="lineNum"> 415 </span><span class="lineCov"> 4 : printf(&quot;%8&quot; PRIu64, ds / dt);</span>
<span class="lineNum"> 416 </span><span class="lineCov"> 4 : fflush(stdout);</span>
@ -707,9 +707,9 @@
<span class="lineNum"> 645 </span><span class="lineCov"> 4 : printf(&quot;%8s&quot;, raid_gen6_tag());</span>
<span class="lineNum"> 646 </span><span class="lineCov"> 4 : fflush(stdout);</span>
<span class="lineNum"> 647 </span> :
<span class="lineNum"> 648 </span><span class="lineCov"> 10 : SPEED_START {</span>
<span class="lineNum"> 649 </span><span class="lineCov"> 6 : raid_gen6_int8(nd, size, v);</span>
<span class="lineNum"> 650 </span><span class="lineCov"> 6 : } SPEED_STOP</span>
<span class="lineNum"> 648 </span><span class="lineCov"> 12 : SPEED_START {</span>
<span class="lineNum"> 649 </span><span class="lineCov"> 8 : raid_gen6_int8(nd, size, v);</span>
<span class="lineNum"> 650 </span><span class="lineCov"> 8 : } SPEED_STOP</span>
<span class="lineNum"> 651 </span> :
<span class="lineNum"> 652 </span><span class="lineCov"> 4 : printf(&quot;%8&quot; PRIu64, ds / dt);</span>
<span class="lineNum"> 653 </span><span class="lineCov"> 4 : fflush(stdout);</span>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">1</td>
@ -61,7 +61,7 @@
</tr>
<tr>
<td class="coverFn"><a href="spooky2.c.gcov.html#109">SpookyHash128</a></td>
<td class="coverFnHi">3472174</td>
<td class="coverFnHi">3855152</td>
</tr>
</table>
<br>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">1</td>
@ -61,7 +61,7 @@
</tr>
<tr>
<td class="coverFn"><a href="spooky2.c.gcov.html#109">SpookyHash128</a></td>
<td class="coverFnHi">3472174</td>
<td class="coverFnHi">3855152</td>
</tr>
</table>
<br>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">1</td>
@ -170,7 +170,7 @@
<span class="lineNum"> 108 </span> : //
<a name="109"><span class="lineNum"> 109 </span> : #define sc_const 0xdeadbeefdeadbeefLL</a>
<span class="lineNum"> 110 </span> :
<span class="lineNum"> 111 </span><span class="lineCov"> 3472174 : void SpookyHash128(const void* data, size_t size, const uint8_t* seed, uint8_t* digest)</span>
<span class="lineNum"> 111 </span><span class="lineCov"> 3855152 : void SpookyHash128(const void* data, size_t size, const uint8_t* seed, uint8_t* digest)</span>
<span class="lineNum"> 112 </span> : {
<span class="lineNum"> 113 </span> : uint64_t h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11;
<span class="lineNum"> 114 </span> : uint64_t buf[sc_numVars];
@ -182,39 +182,39 @@
<span class="lineNum"> 120 </span> : unsigned i;
<span class="lineNum"> 121 </span> : #endif
<span class="lineNum"> 122 </span> :
<span class="lineNum"> 123 </span><span class="lineCov"> 3472174 : h9 = ((const uint64_t*)seed)[0];</span>
<span class="lineNum"> 124 </span><span class="lineCov"> 3472174 : h10 = ((const uint64_t*)seed)[1];</span>
<span class="lineNum"> 123 </span><span class="lineCov"> 3855152 : h9 = ((const uint64_t*)seed)[0];</span>
<span class="lineNum"> 124 </span><span class="lineCov"> 3855152 : h10 = ((const uint64_t*)seed)[1];</span>
<span class="lineNum"> 125 </span> :
<span class="lineNum"> 126 </span> : #if WORDS_BIGENDIAN
<span class="lineNum"> 127 </span> : h9 = util_swap64(h9);
<span class="lineNum"> 128 </span> : h10 = util_swap64(h10);
<span class="lineNum"> 129 </span> : #endif
<span class="lineNum"> 130 </span> :
<span class="lineNum"> 131 </span><span class="lineCov"> 3472174 : h0 = h3 = h6 = h9;</span>
<span class="lineNum"> 132 </span><span class="lineCov"> 3472174 : h1 = h4 = h7 = h10;</span>
<span class="lineNum"> 133 </span><span class="lineCov"> 3472174 : h2 = h5 = h8 = h11 = sc_const;</span>
<span class="lineNum"> 131 </span><span class="lineCov"> 3855152 : h0 = h3 = h6 = h9;</span>
<span class="lineNum"> 132 </span><span class="lineCov"> 3855152 : h1 = h4 = h7 = h10;</span>
<span class="lineNum"> 133 </span><span class="lineCov"> 3855152 : h2 = h5 = h8 = h11 = sc_const;</span>
<span class="lineNum"> 134 </span> :
<span class="lineNum"> 135 </span><span class="lineCov"> 3472174 : nblocks = size / sc_blockSize;</span>
<span class="lineNum"> 136 </span><span class="lineCov"> 3472174 : blocks = data;</span>
<span class="lineNum"> 137 </span><span class="lineCov"> 3472174 : end = blocks + nblocks * sc_numVars;</span>
<span class="lineNum"> 135 </span><span class="lineCov"> 3855152 : nblocks = size / sc_blockSize;</span>
<span class="lineNum"> 136 </span><span class="lineCov"> 3855152 : blocks = data;</span>
<span class="lineNum"> 137 </span><span class="lineCov"> 3855152 : end = blocks + nblocks * sc_numVars;</span>
<span class="lineNum"> 138 </span> :
<span class="lineNum"> 139 </span> : /* body */
<span class="lineNum"> 140 </span><span class="lineCov"> 34945798 : while (blocks &lt; end) {</span>
<span class="lineNum"> 140 </span><span class="lineCov"> 38762369 : while (blocks &lt; end) {</span>
<span class="lineNum"> 141 </span> : #if WORDS_BIGENDIAN
<span class="lineNum"> 142 </span> : for (i = 0; i &lt; sc_numVars; ++i)
<span class="lineNum"> 143 </span> : buf[i] = util_swap64(blocks[i]);
<span class="lineNum"> 144 </span> : Mix(buf, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11);
<span class="lineNum"> 145 </span> : #else
<span class="lineNum"> 146 </span><span class="lineCov"> 28001450 : Mix(blocks, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11);</span>
<span class="lineNum"> 146 </span><span class="lineCov"> 31052065 : Mix(blocks, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11);</span>
<span class="lineNum"> 147 </span> : #endif
<span class="lineNum"> 148 </span><span class="lineCov"> 28001450 : blocks += sc_numVars;</span>
<span class="lineNum"> 148 </span><span class="lineCov"> 31052065 : blocks += sc_numVars;</span>
<span class="lineNum"> 149 </span> : }
<span class="lineNum"> 150 </span> :
<span class="lineNum"> 151 </span> : /* tail */
<span class="lineNum"> 152 </span><span class="lineCov"> 3472174 : size_remainder = (size - ((const uint8_t*)end - (const uint8_t*)data));</span>
<span class="lineNum"> 153 </span><span class="lineCov"> 3472174 : memcpy(buf, end, size_remainder);</span>
<span class="lineNum"> 154 </span><span class="lineCov"> 3472174 : memset(((uint8_t*)buf) + size_remainder, 0, sc_blockSize - size_remainder);</span>
<span class="lineNum"> 155 </span><span class="lineCov"> 3472174 : ((uint8_t*)buf)[sc_blockSize - 1] = size_remainder;</span>
<span class="lineNum"> 152 </span><span class="lineCov"> 3855152 : size_remainder = (size - ((const uint8_t*)end - (const uint8_t*)data));</span>
<span class="lineNum"> 153 </span><span class="lineCov"> 3855152 : memcpy(buf, end, size_remainder);</span>
<span class="lineNum"> 154 </span><span class="lineCov"> 3855152 : memset(((uint8_t*)buf) + size_remainder, 0, sc_blockSize - size_remainder);</span>
<span class="lineNum"> 155 </span><span class="lineCov"> 3855152 : ((uint8_t*)buf)[sc_blockSize - 1] = size_remainder;</span>
<span class="lineNum"> 156 </span> :
<span class="lineNum"> 157 </span> : /* finalization */
<span class="lineNum"> 158 </span> : #if WORDS_BIGENDIAN
@ -222,16 +222,16 @@
<span class="lineNum"> 160 </span> : buf[i] = util_swap64(buf[i]);
<span class="lineNum"> 161 </span> : #endif
<span class="lineNum"> 162 </span> :
<span class="lineNum"> 163 </span><span class="lineCov"> 3472174 : End(buf, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11);</span>
<span class="lineNum"> 163 </span><span class="lineCov"> 3855152 : End(buf, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11);</span>
<span class="lineNum"> 164 </span> :
<span class="lineNum"> 165 </span> : #if WORDS_BIGENDIAN
<span class="lineNum"> 166 </span> : h0 = util_swap64(h0);
<span class="lineNum"> 167 </span> : h1 = util_swap64(h1);
<span class="lineNum"> 168 </span> : #endif
<span class="lineNum"> 169 </span> :
<span class="lineNum"> 170 </span><span class="lineCov"> 3472174 : ((uint64_t*)digest)[0] = h0;</span>
<span class="lineNum"> 171 </span><span class="lineCov"> 3472174 : ((uint64_t*)digest)[1] = h1;</span>
<span class="lineNum"> 172 </span><span class="lineCov"> 3472174 : }</span>
<span class="lineNum"> 170 </span><span class="lineCov"> 3855152 : ((uint64_t*)digest)[0] = h0;</span>
<span class="lineNum"> 171 </span><span class="lineCov"> 3855152 : ((uint64_t*)digest)[1] = h1;</span>
<span class="lineNum"> 172 </span><span class="lineCov"> 3855152 : }</span>
<span class="lineNum"> 173 </span> :
</pre>
</td>

View file

@ -31,18 +31,18 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">1248</td>
<td class="headerCovTableEntry">1351</td>
<td class="headerCovTableEntryHi">92.4 %</td>
<td class="headerCovTableEntry">1262</td>
<td class="headerCovTableEntry">1363</td>
<td class="headerCovTableEntryHi">92.6 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">35</td>
<td class="headerCovTableEntry">36</td>
<td class="headerCovTableEntryHi">97.2 %</td>
<td class="headerCovTableEntry">37</td>
<td class="headerCovTableEntryHi">97.3 %</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
@ -60,147 +60,151 @@
<td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#1531">fs_is_block_deleted_ts</a></td>
<td class="coverFnHi">29344162</td>
<td class="coverFn"><a href="state.c.gcov.html#1600">fs_is_block_deleted_ts</a></td>
<td class="coverFnHi">4507856</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#1494">fs_info_is_required</a></td>
<td class="coverFnHi">1491820</td>
<td class="coverFn"><a href="state.c.gcov.html#1563">fs_info_is_required</a></td>
<td class="coverFnHi">1513218</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3715">state_progress</a></td>
<td class="coverFnHi">1038958</td>
<td class="coverFn"><a href="state.c.gcov.html#3887">state_progress</a></td>
<td class="coverFnHi">1048979</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#1465">fs_position_is_required</a></td>
<td class="coverFnHi">729418</td>
<td class="coverFn"><a href="state.c.gcov.html#1534">fs_position_is_required</a></td>
<td class="coverFnHi">752491</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#42">lev_config_name</a></td>
<td class="coverFnHi">178766</td>
<td class="coverFn"><a href="state.c.gcov.html#62">lev_config_name</a></td>
<td class="coverFnHi">178997</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#1138">find_disk</a></td>
<td class="coverFnHi">11051</td>
<td class="coverFn"><a href="state.c.gcov.html#1176">find_disk_by_name</a></td>
<td class="coverFnHi">6723</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#56">lev_config_scan</a></td>
<td class="coverFnHi">5905</td>
<td class="coverFn"><a href="state.c.gcov.html#76">lev_config_scan</a></td>
<td class="coverFnHi">6118</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#2511">state_write_thread</a></td>
<td class="coverFnHi">913</td>
<td class="coverFn"><a href="state.c.gcov.html#3501">state_verify_thread</a></td>
<td class="coverFnHi">990</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3323">state_verify_thread</a></td>
<td class="coverFnHi">912</td>
<td class="coverFn"><a href="state.c.gcov.html#4066">state_fscheck</a></td>
<td class="coverFnHi">474</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3894">state_fscheck</a></td>
<td class="coverFnHi">447</td>
<td class="coverFn"><a href="state.c.gcov.html#480">validate_smartctl</a></td>
<td class="coverFnHi">358</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#458">validate_smartctl</a></td>
<td class="coverFnHi">344</td>
<td class="coverFn"><a href="state.c.gcov.html#135">state_init</a></td>
<td class="coverFnHi">256</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#115">state_init</a></td>
<td class="coverFnHi">248</td>
<td class="coverFn"><a href="state.c.gcov.html#505">state_config</a></td>
<td class="coverFnHi">255</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#483">state_config</a></td>
<td class="coverFnHi">247</td>
<td class="coverFn"><a href="state.c.gcov.html#118">lev_raid_name</a></td>
<td class="coverFnHi">254</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#98">lev_raid_name</a></td>
<td class="coverFnHi">246</td>
<td class="coverFn"><a href="state.c.gcov.html#197">state_config_check</a></td>
<td class="coverFnHi">254</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#177">state_config_check</a></td>
<td class="coverFnHi">246</td>
<td class="coverFn"><a href="state.c.gcov.html#3340">state_read</a></td>
<td class="coverFnHi">250</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3164">state_read</a></td>
<td class="coverFn"><a href="state.c.gcov.html#1236">state_map</a></td>
<td class="coverFnHi">249</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#1659">state_read_content</a></td>
<td class="coverFnHi">243</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#1503">state_content_check</a></td>
<td class="coverFnHi">242</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#1165">state_map</a></td>
<td class="coverFnHi">241</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#1590">state_read_content</a></td>
<td class="coverFnHi">235</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#1434">state_content_check</a></td>
<td class="coverFn"><a href="state.c.gcov.html#180">state_done</a></td>
<td class="coverFnHi">234</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#160">state_done</a></td>
<td class="coverFnHi">226</td>
<td class="coverFn"><a href="state.c.gcov.html#3832">state_progress_end</a></td>
<td class="coverFnHi">214</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3660">state_progress_end</a></td>
<td class="coverFnHi">206</td>
<td class="coverFn"><a href="state.c.gcov.html#3800">state_progress_begin</a></td>
<td class="coverFnHi">214</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3628">state_progress_begin</a></td>
<td class="coverFnHi">206</td>
<td class="coverFn"><a href="state.c.gcov.html#1439">state_refresh</a></td>
<td class="coverFnHi">160</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#1370">state_refresh</a></td>
<td class="coverFnHi">144</td>
<td class="coverFn"><a href="state.c.gcov.html#3659">state_write</a></td>
<td class="coverFnHi">145</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3487">state_write</a></td>
<td class="coverFnHi">134</td>
<td class="coverFn"><a href="state.c.gcov.html#2604">state_write_thread</a></td>
<td class="coverFnHi">145</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#2987">state_write_content</a></td>
<td class="coverFnHi">134</td>
<td class="coverFn"><a href="state.c.gcov.html#3035">state_write_content</a></td>
<td class="coverFnHi">145</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3392">state_verify_content</a></td>
<td class="coverFnHi">134</td>
<td class="coverFn"><a href="state.c.gcov.html#3542">state_verify_content</a></td>
<td class="coverFnHi">145</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3465">state_rename_content</a></td>
<td class="coverFnHi">134</td>
<td class="coverFn"><a href="state.c.gcov.html#3637">state_rename_content</a></td>
<td class="coverFnHi">145</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3504">state_skip</a></td>
<td class="coverFn"><a href="state.c.gcov.html#3676">state_skip</a></td>
<td class="coverFnHi">122</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3536">state_filter</a></td>
<td class="coverFn"><a href="state.c.gcov.html#3708">state_filter</a></td>
<td class="coverFnHi">122</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3845">state_usage_print</a></td>
<td class="coverFnHi">81</td>
<td class="coverFn"><a href="state.c.gcov.html#4017">state_usage_print</a></td>
<td class="coverFnHi">89</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#28">lev_name</a></td>
<td class="coverFn"><a href="state.c.gcov.html#48">lev_name</a></td>
<td class="coverFnHi">7</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3699">state_progress_restart</a></td>
<td class="coverFn"><a href="state.c.gcov.html#1203">find_disk_by_uuid</a></td>
<td class="coverFnHi">2</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3871">state_progress_restart</a></td>
<td class="coverFnHi">1</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3911">generate_configuration</a></td>
<td class="coverFn"><a href="state.c.gcov.html#4083">generate_configuration</a></td>
<td class="coverFnHi">1</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#1542">decoding_error</a></td>
<td class="coverFn"><a href="state.c.gcov.html#1611">decoding_error</a></td>
<td class="coverFnHi">1</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3685">state_progress_stop</a></td>
<td class="coverFn"><a href="state.c.gcov.html#3857">state_progress_stop</a></td>
<td class="coverFnHi">1</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#1511">fs_position_clear_deleted</a></td>
<td class="coverFn"><a href="state.c.gcov.html#1580">fs_position_clear_deleted</a></td>
<td class="coverFnLo">0</td>
</tr>
</table>

View file

@ -31,18 +31,18 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">1248</td>
<td class="headerCovTableEntry">1351</td>
<td class="headerCovTableEntryHi">92.4 %</td>
<td class="headerCovTableEntry">1262</td>
<td class="headerCovTableEntry">1363</td>
<td class="headerCovTableEntryHi">92.6 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">35</td>
<td class="headerCovTableEntry">36</td>
<td class="headerCovTableEntryHi">97.2 %</td>
<td class="headerCovTableEntry">37</td>
<td class="headerCovTableEntryHi">97.3 %</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
@ -60,148 +60,152 @@
<td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="state.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#1542">decoding_error</a></td>
<td class="coverFn"><a href="state.c.gcov.html#1611">decoding_error</a></td>
<td class="coverFnHi">1</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#1138">find_disk</a></td>
<td class="coverFnHi">11051</td>
<td class="coverFn"><a href="state.c.gcov.html#1176">find_disk_by_name</a></td>
<td class="coverFnHi">6723</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#1494">fs_info_is_required</a></td>
<td class="coverFnHi">1491820</td>
<td class="coverFn"><a href="state.c.gcov.html#1203">find_disk_by_uuid</a></td>
<td class="coverFnHi">2</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#1531">fs_is_block_deleted_ts</a></td>
<td class="coverFnHi">29344162</td>
<td class="coverFn"><a href="state.c.gcov.html#1563">fs_info_is_required</a></td>
<td class="coverFnHi">1513218</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#1511">fs_position_clear_deleted</a></td>
<td class="coverFn"><a href="state.c.gcov.html#1600">fs_is_block_deleted_ts</a></td>
<td class="coverFnHi">4507856</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#1580">fs_position_clear_deleted</a></td>
<td class="coverFnLo">0</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#1465">fs_position_is_required</a></td>
<td class="coverFnHi">729418</td>
<td class="coverFn"><a href="state.c.gcov.html#1534">fs_position_is_required</a></td>
<td class="coverFnHi">752491</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3911">generate_configuration</a></td>
<td class="coverFn"><a href="state.c.gcov.html#4083">generate_configuration</a></td>
<td class="coverFnHi">1</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#42">lev_config_name</a></td>
<td class="coverFnHi">178766</td>
<td class="coverFn"><a href="state.c.gcov.html#62">lev_config_name</a></td>
<td class="coverFnHi">178997</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#56">lev_config_scan</a></td>
<td class="coverFnHi">5905</td>
<td class="coverFn"><a href="state.c.gcov.html#76">lev_config_scan</a></td>
<td class="coverFnHi">6118</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#28">lev_name</a></td>
<td class="coverFn"><a href="state.c.gcov.html#48">lev_name</a></td>
<td class="coverFnHi">7</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#98">lev_raid_name</a></td>
<td class="coverFnHi">246</td>
<td class="coverFn"><a href="state.c.gcov.html#118">lev_raid_name</a></td>
<td class="coverFnHi">254</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#483">state_config</a></td>
<td class="coverFnHi">247</td>
<td class="coverFn"><a href="state.c.gcov.html#505">state_config</a></td>
<td class="coverFnHi">255</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#177">state_config_check</a></td>
<td class="coverFnHi">246</td>
<td class="coverFn"><a href="state.c.gcov.html#197">state_config_check</a></td>
<td class="coverFnHi">254</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#1434">state_content_check</a></td>
<td class="coverFnHi">234</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#160">state_done</a></td>
<td class="coverFnHi">226</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3536">state_filter</a></td>
<td class="coverFnHi">122</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3894">state_fscheck</a></td>
<td class="coverFnHi">447</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#115">state_init</a></td>
<td class="coverFnHi">248</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#1165">state_map</a></td>
<td class="coverFnHi">241</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3715">state_progress</a></td>
<td class="coverFnHi">1038958</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3628">state_progress_begin</a></td>
<td class="coverFnHi">206</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3660">state_progress_end</a></td>
<td class="coverFnHi">206</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3699">state_progress_restart</a></td>
<td class="coverFnHi">1</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3685">state_progress_stop</a></td>
<td class="coverFnHi">1</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3164">state_read</a></td>
<td class="coverFn"><a href="state.c.gcov.html#1503">state_content_check</a></td>
<td class="coverFnHi">242</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#1590">state_read_content</a></td>
<td class="coverFnHi">235</td>
<td class="coverFn"><a href="state.c.gcov.html#180">state_done</a></td>
<td class="coverFnHi">234</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#1370">state_refresh</a></td>
<td class="coverFnHi">144</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3465">state_rename_content</a></td>
<td class="coverFnHi">134</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3504">state_skip</a></td>
<td class="coverFn"><a href="state.c.gcov.html#3708">state_filter</a></td>
<td class="coverFnHi">122</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3845">state_usage_print</a></td>
<td class="coverFnHi">81</td>
<td class="coverFn"><a href="state.c.gcov.html#4066">state_fscheck</a></td>
<td class="coverFnHi">474</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3392">state_verify_content</a></td>
<td class="coverFnHi">134</td>
<td class="coverFn"><a href="state.c.gcov.html#135">state_init</a></td>
<td class="coverFnHi">256</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3323">state_verify_thread</a></td>
<td class="coverFnHi">912</td>
<td class="coverFn"><a href="state.c.gcov.html#1236">state_map</a></td>
<td class="coverFnHi">249</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3487">state_write</a></td>
<td class="coverFnHi">134</td>
<td class="coverFn"><a href="state.c.gcov.html#3887">state_progress</a></td>
<td class="coverFnHi">1048979</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#2987">state_write_content</a></td>
<td class="coverFnHi">134</td>
<td class="coverFn"><a href="state.c.gcov.html#3800">state_progress_begin</a></td>
<td class="coverFnHi">214</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#2511">state_write_thread</a></td>
<td class="coverFnHi">913</td>
<td class="coverFn"><a href="state.c.gcov.html#3832">state_progress_end</a></td>
<td class="coverFnHi">214</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#458">validate_smartctl</a></td>
<td class="coverFnHi">344</td>
<td class="coverFn"><a href="state.c.gcov.html#3871">state_progress_restart</a></td>
<td class="coverFnHi">1</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3857">state_progress_stop</a></td>
<td class="coverFnHi">1</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3340">state_read</a></td>
<td class="coverFnHi">250</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#1659">state_read_content</a></td>
<td class="coverFnHi">243</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#1439">state_refresh</a></td>
<td class="coverFnHi">160</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3637">state_rename_content</a></td>
<td class="coverFnHi">145</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3676">state_skip</a></td>
<td class="coverFnHi">122</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#4017">state_usage_print</a></td>
<td class="coverFnHi">89</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3542">state_verify_content</a></td>
<td class="coverFnHi">145</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3501">state_verify_thread</a></td>
<td class="coverFnHi">990</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3659">state_write</a></td>
<td class="coverFnHi">145</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#3035">state_write_content</a></td>
<td class="coverFnHi">145</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#2604">state_write_thread</a></td>
<td class="coverFnHi">145</td>
</tr>
<tr>
<td class="coverFn"><a href="state.c.gcov.html#480">validate_smartctl</a></td>
<td class="coverFnHi">358</td>
</tr>
</table>
<br>

File diff suppressed because it is too large Load diff

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">4</td>
@ -60,20 +60,20 @@
<td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
</tr>
<tr>
<td class="coverFn"><a href="state.h.gcov.html#333">state_usage_cpu</a></td>
<td class="coverFnHi">772778</td>
<td class="coverFn"><a href="state.h.gcov.html#337">state_usage_cpu</a></td>
<td class="coverFnHi">833206</td>
</tr>
<tr>
<td class="coverFn"><a href="state.h.gcov.html#362">state_usage_parity</a></td>
<td class="coverFnHi">653350</td>
<td class="coverFn"><a href="state.h.gcov.html#366">state_usage_parity</a></td>
<td class="coverFnHi">706913</td>
</tr>
<tr>
<td class="coverFn"><a href="state.h.gcov.html#347">state_usage_disk</a></td>
<td class="coverFnHi">622545</td>
<td class="coverFn"><a href="state.h.gcov.html#351">state_usage_disk</a></td>
<td class="coverFnHi">673880</td>
</tr>
<tr>
<td class="coverFn"><a href="state.h.gcov.html#323">state_usage_waste</a></td>
<td class="coverFnHi">89</td>
<td class="coverFn"><a href="state.h.gcov.html#327">state_usage_waste</a></td>
<td class="coverFnHi">97</td>
</tr>
</table>
<br>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">4</td>
@ -60,20 +60,20 @@
<td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="state.h.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
</tr>
<tr>
<td class="coverFn"><a href="state.h.gcov.html#333">state_usage_cpu</a></td>
<td class="coverFnHi">772778</td>
<td class="coverFn"><a href="state.h.gcov.html#337">state_usage_cpu</a></td>
<td class="coverFnHi">833206</td>
</tr>
<tr>
<td class="coverFn"><a href="state.h.gcov.html#347">state_usage_disk</a></td>
<td class="coverFnHi">622545</td>
<td class="coverFn"><a href="state.h.gcov.html#351">state_usage_disk</a></td>
<td class="coverFnHi">673880</td>
</tr>
<tr>
<td class="coverFn"><a href="state.h.gcov.html#362">state_usage_parity</a></td>
<td class="coverFnHi">653350</td>
<td class="coverFn"><a href="state.h.gcov.html#366">state_usage_parity</a></td>
<td class="coverFnHi">706913</td>
</tr>
<tr>
<td class="coverFn"><a href="state.h.gcov.html#323">state_usage_waste</a></td>
<td class="coverFnHi">89</td>
<td class="coverFn"><a href="state.h.gcov.html#327">state_usage_waste</a></td>
<td class="coverFnHi">97</td>
</tr>
</table>
<br>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">4</td>
@ -136,11 +136,11 @@
<span class="lineNum"> 74 </span> : int syncedonly; /**&lt; In fix, fixes only files that are synced. */
<span class="lineNum"> 75 </span> : int prehash; /**&lt; Enables the prehash mode for sync. */
<span class="lineNum"> 76 </span> : unsigned io_error_limit; /**&lt; Max number of input/output errors before aborting. */
<span class="lineNum"> 77 </span> : int force_zero; /**&lt; Forced dangerous operations of synching files now with zero size. */
<span class="lineNum"> 78 </span> : int force_empty; /**&lt; Forced dangerous operations of synching disks now empty. */
<span class="lineNum"> 79 </span> : int force_uuid; /**&lt; Forced dangerous operations of synching disks with uuid changed. */
<span class="lineNum"> 77 </span> : int force_zero; /**&lt; Forced dangerous operations of syncing files now with zero size. */
<span class="lineNum"> 78 </span> : int force_empty; /**&lt; Forced dangerous operations of syncing disks now empty. */
<span class="lineNum"> 79 </span> : int force_uuid; /**&lt; Forced dangerous operations of syncing disks with uuid changed. */
<span class="lineNum"> 80 </span> : int force_device; /**&lt; Forced dangerous operations of using disks with save device id. */
<span class="lineNum"> 81 </span> : int force_nocopy; /**&lt; Force dangerous operations of synching files without using copy detection. */
<span class="lineNum"> 81 </span> : int force_nocopy; /**&lt; Force dangerous operations of syncing files without using copy detection. */
<span class="lineNum"> 82 </span> : int force_full; /**&lt; Force a full sync when using an old content file. */
<span class="lineNum"> 83 </span> : int expect_unrecoverable; /**&lt; Expect presence of unrecoverable error in checking or fixing. */
<span class="lineNum"> 84 </span> : int expect_recoverable; /**&lt; Expect presence of recoverable error in checking. */
@ -165,299 +165,303 @@
<span class="lineNum"> 103 </span> : int force_progress; /**&lt; Force the use of the progress status. */
<span class="lineNum"> 104 </span> : unsigned force_autosave_at; /**&lt; Force autosave at the specified block. */
<span class="lineNum"> 105 </span> : int fake_device; /**&lt; Fake device data. */
<span class="lineNum"> 106 </span> : int expected_missing; /**&lt; If missing files are expected and should not be reported. */
<span class="lineNum"> 107 </span> : };
<span class="lineNum"> 108 </span> :
<span class="lineNum"> 109 </span> : /**
<span class="lineNum"> 110 </span> : * Number of measures of the operation progress.
<span class="lineNum"> 111 </span> : */
<span class="lineNum"> 112 </span> : #define PROGRESS_MAX 100
<span class="lineNum"> 113 </span> :
<span class="lineNum"> 114 </span> : struct snapraid_state {
<span class="lineNum"> 115 </span> : struct snapraid_option opt; /**&lt; Setup options. */
<span class="lineNum"> 116 </span> : int filter_hidden; /**&lt; Filter out hidden files. */
<span class="lineNum"> 117 </span> : uint64_t autosave; /**&lt; Autosave after the specified amount of data. 0 to disable. */
<span class="lineNum"> 118 </span> : int need_write; /**&lt; If the state is changed. */
<span class="lineNum"> 119 </span> : int checked_read; /**&lt; If the state was read and checked. */
<span class="lineNum"> 120 </span> : uint32_t block_size; /**&lt; Block size in bytes. */
<span class="lineNum"> 121 </span> : unsigned raid_mode; /**&lt; Raid mode to use. RAID_MODE_DEFAULT or RAID_MODE_ALTERNATE. */
<span class="lineNum"> 122 </span> : int file_mode; /**&lt; File access mode. Combination of MODE_* flags. */
<span class="lineNum"> 123 </span> : struct snapraid_parity parity[LEV_MAX]; /**&lt; Parity vector. */
<span class="lineNum"> 124 </span> : char share[PATH_MAX]; /**&lt; Path of the share tree. If !=0 pool links are created in a different way. */
<span class="lineNum"> 125 </span> : char pool[PATH_MAX]; /**&lt; Path of the pool tree. */
<span class="lineNum"> 126 </span> : uint64_t pool_device; /**&lt; Device identifier of the pool. */
<span class="lineNum"> 127 </span> : unsigned char hashseed[HASH_SIZE]; /**&lt; Hash seed. Just after a uint64 to provide a minimal alignment. */
<span class="lineNum"> 128 </span> : unsigned char prevhashseed[HASH_SIZE]; /**&lt; Previous hash seed. In case of rehash. */
<span class="lineNum"> 129 </span> : char lockfile[PATH_MAX]; /**&lt; Path of the lock file to use. */
<span class="lineNum"> 130 </span> : unsigned level; /**&lt; Number of parity levels. 1 for PAR1, 2 for PAR2. */
<span class="lineNum"> 131 </span> : unsigned hash; /**&lt; Hash kind used. */
<span class="lineNum"> 132 </span> : unsigned prevhash; /**&lt; Previous hash kind used. In case of rehash. */
<span class="lineNum"> 133 </span> : unsigned besthash; /**&lt; Best hash suggested. */
<span class="lineNum"> 134 </span> : const char* command; /**&lt; Command running. */
<span class="lineNum"> 135 </span> : tommy_list contentlist; /**&lt; List of content files. */
<span class="lineNum"> 136 </span> : tommy_list disklist; /**&lt; List of all the disks. */
<span class="lineNum"> 137 </span> : tommy_list maplist; /**&lt; List of all the disk mappings. */
<span class="lineNum"> 138 </span> : tommy_list filterlist; /**&lt; List of inclusion/exclusion. */
<span class="lineNum"> 139 </span> : tommy_list importlist; /**&lt; List of import file. */
<span class="lineNum"> 140 </span> : tommy_hashdyn importset; /**&lt; Hashtable by hash of all the import blocks. */
<span class="lineNum"> 141 </span> : tommy_hashdyn previmportset; /**&lt; Hashtable by prevhash of all the import blocks. Valid only if we are in a rehash state. */
<span class="lineNum"> 142 </span> : tommy_hashdyn searchset; /**&lt; Hashtable by timestamp of all the search files. */
<span class="lineNum"> 143 </span> : tommy_arrayblkof infoarr; /**&lt; Block information array. */
<span class="lineNum"> 144 </span> :
<span class="lineNum"> 145 </span> : /**
<span class="lineNum"> 146 </span> : * Cumulative time used for computations.
<span class="lineNum"> 147 </span> : */
<span class="lineNum"> 148 </span> : uint64_t tick_cpu;
<span class="lineNum"> 149 </span> :
<span class="lineNum"> 150 </span> : /**
<span class="lineNum"> 151 </span> : * Cumulative time used for all io operations of disks.
<span class="lineNum"> 152 </span> : */
<span class="lineNum"> 153 </span> : uint64_t tick_io;
<span class="lineNum"> 154 </span> :
<span class="lineNum"> 155 </span> : /**
<span class="lineNum"> 156 </span> : * Last time used for time measure.
<span class="lineNum"> 157 </span> : */
<span class="lineNum"> 158 </span> : uint64_t tick_last;
<span class="lineNum"> 159 </span> :
<span class="lineNum"> 160 </span> : int clear_past_hash; /**&lt; Clear all the hash from CHG and DELETED blocks when reading the state from an incomplete sync. */
<span class="lineNum"> 161 </span> :
<span class="lineNum"> 162 </span> : time_t progress_whole_start; /**&lt; Initial start of the whole process. */
<span class="lineNum"> 163 </span> : time_t progress_interruption; /**&lt; Time of the start of the progress interruption. */
<span class="lineNum"> 164 </span> : time_t progress_wasted; /**&lt; Time wasted in interruptions. */
<span class="lineNum"> 106 </span> : int no_warnings; /**&lt; Remove some warning messages. */
<span class="lineNum"> 107 </span> : int expected_missing; /**&lt; If missing files are expected and should not be reported. */
<span class="lineNum"> 108 </span> : int fake_uuid; /**&lt; Set fakes UUID for testing. */
<span class="lineNum"> 109 </span> : int match_first_uuid; /**&lt; Force the matching of the first UUID. */
<span class="lineNum"> 110 </span> : int force_parity_update; /**&lt; Force parity update even if data is not changed. */
<span class="lineNum"> 111 </span> : };
<span class="lineNum"> 112 </span> :
<span class="lineNum"> 113 </span> : /**
<span class="lineNum"> 114 </span> : * Number of measures of the operation progress.
<span class="lineNum"> 115 </span> : */
<span class="lineNum"> 116 </span> : #define PROGRESS_MAX 100
<span class="lineNum"> 117 </span> :
<span class="lineNum"> 118 </span> : struct snapraid_state {
<span class="lineNum"> 119 </span> : struct snapraid_option opt; /**&lt; Setup options. */
<span class="lineNum"> 120 </span> : int filter_hidden; /**&lt; Filter out hidden files. */
<span class="lineNum"> 121 </span> : uint64_t autosave; /**&lt; Autosave after the specified amount of data. 0 to disable. */
<span class="lineNum"> 122 </span> : int need_write; /**&lt; If the state is changed. */
<span class="lineNum"> 123 </span> : int checked_read; /**&lt; If the state was read and checked. */
<span class="lineNum"> 124 </span> : uint32_t block_size; /**&lt; Block size in bytes. */
<span class="lineNum"> 125 </span> : unsigned raid_mode; /**&lt; Raid mode to use. RAID_MODE_DEFAULT or RAID_MODE_ALTERNATE. */
<span class="lineNum"> 126 </span> : int file_mode; /**&lt; File access mode. Combination of MODE_* flags. */
<span class="lineNum"> 127 </span> : struct snapraid_parity parity[LEV_MAX]; /**&lt; Parity vector. */
<span class="lineNum"> 128 </span> : char share[PATH_MAX]; /**&lt; Path of the share tree. If !=0 pool links are created in a different way. */
<span class="lineNum"> 129 </span> : char pool[PATH_MAX]; /**&lt; Path of the pool tree. */
<span class="lineNum"> 130 </span> : uint64_t pool_device; /**&lt; Device identifier of the pool. */
<span class="lineNum"> 131 </span> : unsigned char hashseed[HASH_SIZE]; /**&lt; Hash seed. Just after a uint64 to provide a minimal alignment. */
<span class="lineNum"> 132 </span> : unsigned char prevhashseed[HASH_SIZE]; /**&lt; Previous hash seed. In case of rehash. */
<span class="lineNum"> 133 </span> : char lockfile[PATH_MAX]; /**&lt; Path of the lock file to use. */
<span class="lineNum"> 134 </span> : unsigned level; /**&lt; Number of parity levels. 1 for PAR1, 2 for PAR2. */
<span class="lineNum"> 135 </span> : unsigned hash; /**&lt; Hash kind used. */
<span class="lineNum"> 136 </span> : unsigned prevhash; /**&lt; Previous hash kind used. In case of rehash. */
<span class="lineNum"> 137 </span> : unsigned besthash; /**&lt; Best hash suggested. */
<span class="lineNum"> 138 </span> : const char* command; /**&lt; Command running. */
<span class="lineNum"> 139 </span> : tommy_list contentlist; /**&lt; List of content files. */
<span class="lineNum"> 140 </span> : tommy_list disklist; /**&lt; List of all the disks. */
<span class="lineNum"> 141 </span> : tommy_list maplist; /**&lt; List of all the disk mappings. */
<span class="lineNum"> 142 </span> : tommy_list filterlist; /**&lt; List of inclusion/exclusion. */
<span class="lineNum"> 143 </span> : tommy_list importlist; /**&lt; List of import file. */
<span class="lineNum"> 144 </span> : tommy_hashdyn importset; /**&lt; Hashtable by hash of all the import blocks. */
<span class="lineNum"> 145 </span> : tommy_hashdyn previmportset; /**&lt; Hashtable by prevhash of all the import blocks. Valid only if we are in a rehash state. */
<span class="lineNum"> 146 </span> : tommy_hashdyn searchset; /**&lt; Hashtable by timestamp of all the search files. */
<span class="lineNum"> 147 </span> : tommy_arrayblkof infoarr; /**&lt; Block information array. */
<span class="lineNum"> 148 </span> :
<span class="lineNum"> 149 </span> : /**
<span class="lineNum"> 150 </span> : * Cumulative time used for computations.
<span class="lineNum"> 151 </span> : */
<span class="lineNum"> 152 </span> : uint64_t tick_cpu;
<span class="lineNum"> 153 </span> :
<span class="lineNum"> 154 </span> : /**
<span class="lineNum"> 155 </span> : * Cumulative time used for all io operations of disks.
<span class="lineNum"> 156 </span> : */
<span class="lineNum"> 157 </span> : uint64_t tick_io;
<span class="lineNum"> 158 </span> :
<span class="lineNum"> 159 </span> : /**
<span class="lineNum"> 160 </span> : * Last time used for time measure.
<span class="lineNum"> 161 </span> : */
<span class="lineNum"> 162 </span> : uint64_t tick_last;
<span class="lineNum"> 163 </span> :
<span class="lineNum"> 164 </span> : int clear_past_hash; /**&lt; Clear all the hash from CHG and DELETED blocks when reading the state from an incomplete sync. */
<span class="lineNum"> 165 </span> :
<span class="lineNum"> 166 </span> : time_t progress_time[PROGRESS_MAX]; /**&lt; Last times of progress. */
<span class="lineNum"> 167 </span> : block_off_t progress_pos[PROGRESS_MAX]; /**&lt; Last positions of progress. */
<span class="lineNum"> 168 </span> : data_off_t progress_size[PROGRESS_MAX]; /**&lt; Last sizes of progress. */
<span class="lineNum"> 169 </span> : uint64_t progress_tick_cpu[PROGRESS_MAX]; /**&lt; Last cpu ticks of progress. */
<span class="lineNum"> 170 </span> : uint64_t progress_tick_total[PROGRESS_MAX]; /**&lt; Last total ticks of progress. */
<span class="lineNum"> 171 </span> :
<span class="lineNum"> 172 </span> : int progress_ptr; /**&lt; Pointer to the next position to fill. Rolling over. */
<span class="lineNum"> 173 </span> : int progress_tick; /**&lt; Number of measures done. */
<span class="lineNum"> 174 </span> :
<span class="lineNum"> 175 </span> : int no_conf; /**&lt; Automatically add missing info. Used to load content without a configuration file. */
<span class="lineNum"> 176 </span> : };
<span class="lineNum"> 177 </span> :
<span class="lineNum"> 178 </span> : /**
<span class="lineNum"> 179 </span> : * Initialize the state.
<span class="lineNum"> 180 </span> : */
<span class="lineNum"> 181 </span> : void state_init(struct snapraid_state* state);
<span class="lineNum"> 182 </span> :
<span class="lineNum"> 183 </span> : /**
<span class="lineNum"> 184 </span> : * Deinitialize the state.
<span class="lineNum"> 185 </span> : */
<span class="lineNum"> 186 </span> : void state_done(struct snapraid_state* state);
<span class="lineNum"> 187 </span> :
<span class="lineNum"> 188 </span> : /**
<span class="lineNum"> 189 </span> : * Read the configuration file.
<span class="lineNum"> 190 </span> : */
<span class="lineNum"> 191 </span> : void state_config(struct snapraid_state* state, const char* path, const char* command, struct snapraid_option* opt, tommy_list* filterlist_disk);
<span class="lineNum"> 192 </span> :
<span class="lineNum"> 193 </span> : /**
<span class="lineNum"> 194 </span> : * Read the state.
<span class="lineNum"> 195 </span> : */
<span class="lineNum"> 196 </span> : void state_read(struct snapraid_state* state);
<span class="lineNum"> 197 </span> :
<span class="lineNum"> 198 </span> : /**
<span class="lineNum"> 199 </span> : * Write the new state.
<span class="lineNum"> 200 </span> : */
<span class="lineNum"> 201 </span> : void state_write(struct snapraid_state* state);
<span class="lineNum"> 202 </span> :
<span class="lineNum"> 203 </span> : /**
<span class="lineNum"> 204 </span> : * Diff all the disks.
<span class="lineNum"> 205 </span> : */
<span class="lineNum"> 206 </span> : int state_diff(struct snapraid_state* state);
<span class="lineNum"> 207 </span> :
<span class="lineNum"> 208 </span> : /**
<span class="lineNum"> 209 </span> : * Scan all the disks to update the state.
<span class="lineNum"> 210 </span> : */
<span class="lineNum"> 211 </span> : void state_scan(struct snapraid_state* state);
<span class="lineNum"> 212 </span> :
<span class="lineNum"> 213 </span> : /**
<span class="lineNum"> 214 </span> : * Set the nanosecond timestamp of all files that have a zero value.
<span class="lineNum"> 215 </span> : */
<span class="lineNum"> 216 </span> : void state_nano(struct snapraid_state* state);
<span class="lineNum"> 217 </span> :
<span class="lineNum"> 218 </span> : /**
<span class="lineNum"> 219 </span> : * Devices operations.
<span class="lineNum"> 220 </span> : */
<span class="lineNum"> 221 </span> : void state_device(struct snapraid_state* state, int operation);
<span class="lineNum"> 222 </span> :
<span class="lineNum"> 223 </span> : /**
<span class="lineNum"> 224 </span> : * Sync the parity data.
<span class="lineNum"> 225 </span> : */
<span class="lineNum"> 226 </span> : int state_sync(struct snapraid_state* state, block_off_t blockstart, block_off_t blockcount);
<span class="lineNum"> 227 </span> :
<span class="lineNum"> 228 </span> : /**
<span class="lineNum"> 229 </span> : * Check (and fixes) all the files and parity data.
<span class="lineNum"> 230 </span> : * \param fix If we have to fix, after checking.
<span class="lineNum"> 231 </span> : */
<span class="lineNum"> 232 </span> : int state_check(struct snapraid_state* state, int fix, block_off_t blockstart, block_off_t blockcount);
<span class="lineNum"> 233 </span> :
<span class="lineNum"> 234 </span> : /**
<span class="lineNum"> 235 </span> : * Dry the files.
<span class="lineNum"> 236 </span> : */
<span class="lineNum"> 237 </span> : void state_dry(struct snapraid_state* state, block_off_t blockstart, block_off_t blockcount);
<span class="lineNum"> 238 </span> :
<span class="lineNum"> 239 </span> : /**
<span class="lineNum"> 240 </span> : * Rehash the files.
<span class="lineNum"> 241 </span> : */
<span class="lineNum"> 242 </span> : void state_rehash(struct snapraid_state* state);
<span class="lineNum"> 243 </span> :
<span class="lineNum"> 244 </span> : /**
<span class="lineNum"> 245 </span> : * Scrub levels.
<span class="lineNum"> 246 </span> : */
<span class="lineNum"> 247 </span> : #define SCRUB_AUTO -1 /**&lt; Automatic selection. */
<span class="lineNum"> 248 </span> : #define SCRUB_BAD -2 /**&lt; Scrub only the bad blocks. */
<span class="lineNum"> 249 </span> : #define SCRUB_NEW -3 /**&lt; Scub the new blocks. */
<span class="lineNum"> 250 </span> : #define SCRUB_FULL -4 /**&lt; Scrub everything. */
<span class="lineNum"> 251 </span> : #define SCRUB_EVEN -5 /**&lt; Even blocks. */
<span class="lineNum"> 252 </span> :
<span class="lineNum"> 253 </span> : /**
<span class="lineNum"> 254 </span> : * Scrub the files.
<span class="lineNum"> 255 </span> : */
<span class="lineNum"> 256 </span> : int state_scrub(struct snapraid_state* state, int plan, int olderthan);
<span class="lineNum"> 257 </span> :
<span class="lineNum"> 258 </span> : /**
<span class="lineNum"> 259 </span> : * Print the status.
<span class="lineNum"> 260 </span> : */
<span class="lineNum"> 261 </span> : int state_status(struct snapraid_state* state);
<span class="lineNum"> 262 </span> :
<span class="lineNum"> 263 </span> : /**
<span class="lineNum"> 264 </span> : * Find duplicates.
<span class="lineNum"> 265 </span> : */
<span class="lineNum"> 266 </span> : void state_dup(struct snapraid_state* state);
<span class="lineNum"> 267 </span> :
<span class="lineNum"> 268 </span> : /**
<span class="lineNum"> 269 </span> : * List content.
<span class="lineNum"> 270 </span> : */
<span class="lineNum"> 271 </span> : void state_list(struct snapraid_state* state);
<span class="lineNum"> 272 </span> :
<span class="lineNum"> 273 </span> : /**
<span class="lineNum"> 274 </span> : * Create pool tree.
<span class="lineNum"> 275 </span> : */
<span class="lineNum"> 276 </span> : void state_pool(struct snapraid_state* state);
<span class="lineNum"> 277 </span> :
<span class="lineNum"> 278 </span> : /**
<span class="lineNum"> 279 </span> : * Refresh the free space info.
<span class="lineNum"> 280 </span> : *
<span class="lineNum"> 281 </span> : * Note that it requires disks access.
<span class="lineNum"> 282 </span> : */
<span class="lineNum"> 283 </span> : void state_refresh(struct snapraid_state* state);
<span class="lineNum"> 284 </span> :
<span class="lineNum"> 285 </span> : /**
<span class="lineNum"> 286 </span> : * Skip files, symlinks and dirs.
<span class="lineNum"> 287 </span> : * Apply any skip access disk.
<span class="lineNum"> 288 </span> : */
<span class="lineNum"> 289 </span> : void state_skip(struct snapraid_state* state);
<span class="lineNum"> 290 </span> :
<span class="lineNum"> 291 </span> : /**
<span class="lineNum"> 292 </span> : * Filter files, symlinks and dirs.
<span class="lineNum"> 293 </span> : * Apply an additional filter to the list currently loaded.
<span class="lineNum"> 294 </span> : */
<span class="lineNum"> 295 </span> : void state_filter(struct snapraid_state* state, tommy_list* filterlist_file, tommy_list* filterlist_disk, int filter_missing, int filter_error);
<span class="lineNum"> 296 </span> :
<span class="lineNum"> 297 </span> : /**
<span class="lineNum"> 298 </span> : * Begin the progress visualization.
<span class="lineNum"> 299 </span> : */
<span class="lineNum"> 300 </span> : int state_progress_begin(struct snapraid_state* state, block_off_t blockstart, block_off_t blockmax, block_off_t countmax);
<span class="lineNum"> 301 </span> :
<span class="lineNum"> 302 </span> : /**
<span class="lineNum"> 303 </span> : * End the progress visualization.
<span class="lineNum"> 304 </span> : */
<span class="lineNum"> 305 </span> : void state_progress_end(struct snapraid_state* state, block_off_t countpos, block_off_t countmax, data_off_t countsize);
<span class="lineNum"> 306 </span> :
<span class="lineNum"> 307 </span> : /**
<span class="lineNum"> 308 </span> : * Write the progress.
<span class="lineNum"> 309 </span> : */
<span class="lineNum"> 310 </span> : int state_progress(struct snapraid_state* state, block_off_t blockpos, block_off_t countpos, block_off_t countmax, data_off_t countsize);
<span class="lineNum"> 311 </span> :
<span class="lineNum"> 312 </span> : /**
<span class="lineNum"> 313 </span> : * Stop temporarely the progress.
<span class="lineNum"> 314 </span> : */
<span class="lineNum"> 315 </span> : void state_progress_stop(struct snapraid_state* state);
<span class="lineNum"> 316 </span> :
<span class="lineNum"> 317 </span> : /**
<span class="lineNum"> 318 </span> : * Restart the progress.
<span class="lineNum"> 319 </span> : */
<span class="lineNum"> 320 </span> : void state_progress_restart(struct snapraid_state* state);
<span class="lineNum"> 321 </span> :
<span class="lineNum"> 322 </span> : /**
<a name="323"><span class="lineNum"> 323 </span> : * Set the usage time as wasted one not counted.</a>
<span class="lineNum"> 324 </span> : */
<span class="lineNum"> 325 </span><span class="lineCov"> 89 : static inline void state_usage_waste(struct snapraid_state* state)</span>
<span class="lineNum"> 326 </span> : {
<span class="lineNum"> 327 </span><span class="lineCov"> 89 : uint64_t now = tick();</span>
<span class="lineNum"> 328 </span> :
<span class="lineNum"> 329 </span><span class="lineCov"> 89 : state-&gt;tick_last = now;</span>
<span class="lineNum"> 330 </span><span class="lineCov"> 89 : }</span>
<span class="lineNum"> 331 </span> :
<span class="lineNum"> 332 </span> : /**
<a name="333"><span class="lineNum"> 333 </span> : * Set the usage time for CPU.</a>
<span class="lineNum"> 334 </span> : */
<span class="lineNum"> 335 </span><span class="lineCov"> 772778 : static inline void state_usage_cpu(struct snapraid_state* state)</span>
<span class="lineNum"> 336 </span> : {
<span class="lineNum"> 337 </span><span class="lineCov"> 772778 : uint64_t now = tick();</span>
<span class="lineNum"> 338 </span><span class="lineCov"> 772778 : uint64_t delta = now - state-&gt;tick_last;</span>
<span class="lineNum"> 339 </span> :
<span class="lineNum"> 340 </span> : /* increment the time spent in computations */
<span class="lineNum"> 341 </span><span class="lineCov"> 772778 : state-&gt;tick_cpu += delta;</span>
<span class="lineNum"> 342 </span> :
<span class="lineNum"> 343 </span><span class="lineCov"> 772778 : state-&gt;tick_last = now;</span>
<span class="lineNum"> 344 </span><span class="lineCov"> 772778 : }</span>
<span class="lineNum"> 345 </span> :
<span class="lineNum"> 346 </span> : /**
<a name="347"><span class="lineNum"> 347 </span> : * Set the usage time for data disk.</a>
<span class="lineNum"> 348 </span> : */
<span class="lineNum"> 349 </span><span class="lineCov"> 622545 : static inline void state_usage_disk(struct snapraid_state* state, struct snapraid_disk* disk)</span>
<span class="lineNum"> 350 </span> : {
<span class="lineNum"> 351 </span><span class="lineCov"> 622545 : uint64_t now = tick();</span>
<span class="lineNum"> 352 </span><span class="lineCov"> 622545 : uint64_t delta = now - state-&gt;tick_last;</span>
<span class="lineNum"> 353 </span> :
<span class="lineNum"> 354 </span> : /* increment the time spent in the data disk */
<span class="lineNum"> 355 </span><span class="lineCov"> 622545 : disk-&gt;tick += delta;</span>
<span class="lineNum"> 356 </span><span class="lineCov"> 622545 : state-&gt;tick_io += delta;</span>
<span class="lineNum"> 166 </span> : time_t progress_whole_start; /**&lt; Initial start of the whole process. */
<span class="lineNum"> 167 </span> : time_t progress_interruption; /**&lt; Time of the start of the progress interruption. */
<span class="lineNum"> 168 </span> : time_t progress_wasted; /**&lt; Time wasted in interruptions. */
<span class="lineNum"> 169 </span> :
<span class="lineNum"> 170 </span> : time_t progress_time[PROGRESS_MAX]; /**&lt; Last times of progress. */
<span class="lineNum"> 171 </span> : block_off_t progress_pos[PROGRESS_MAX]; /**&lt; Last positions of progress. */
<span class="lineNum"> 172 </span> : data_off_t progress_size[PROGRESS_MAX]; /**&lt; Last sizes of progress. */
<span class="lineNum"> 173 </span> : uint64_t progress_tick_cpu[PROGRESS_MAX]; /**&lt; Last cpu ticks of progress. */
<span class="lineNum"> 174 </span> : uint64_t progress_tick_total[PROGRESS_MAX]; /**&lt; Last total ticks of progress. */
<span class="lineNum"> 175 </span> :
<span class="lineNum"> 176 </span> : int progress_ptr; /**&lt; Pointer to the next position to fill. Rolling over. */
<span class="lineNum"> 177 </span> : int progress_tick; /**&lt; Number of measures done. */
<span class="lineNum"> 178 </span> :
<span class="lineNum"> 179 </span> : int no_conf; /**&lt; Automatically add missing info. Used to load content without a configuration file. */
<span class="lineNum"> 180 </span> : };
<span class="lineNum"> 181 </span> :
<span class="lineNum"> 182 </span> : /**
<span class="lineNum"> 183 </span> : * Initialize the state.
<span class="lineNum"> 184 </span> : */
<span class="lineNum"> 185 </span> : void state_init(struct snapraid_state* state);
<span class="lineNum"> 186 </span> :
<span class="lineNum"> 187 </span> : /**
<span class="lineNum"> 188 </span> : * Deinitialize the state.
<span class="lineNum"> 189 </span> : */
<span class="lineNum"> 190 </span> : void state_done(struct snapraid_state* state);
<span class="lineNum"> 191 </span> :
<span class="lineNum"> 192 </span> : /**
<span class="lineNum"> 193 </span> : * Read the configuration file.
<span class="lineNum"> 194 </span> : */
<span class="lineNum"> 195 </span> : void state_config(struct snapraid_state* state, const char* path, const char* command, struct snapraid_option* opt, tommy_list* filterlist_disk);
<span class="lineNum"> 196 </span> :
<span class="lineNum"> 197 </span> : /**
<span class="lineNum"> 198 </span> : * Read the state.
<span class="lineNum"> 199 </span> : */
<span class="lineNum"> 200 </span> : void state_read(struct snapraid_state* state);
<span class="lineNum"> 201 </span> :
<span class="lineNum"> 202 </span> : /**
<span class="lineNum"> 203 </span> : * Write the new state.
<span class="lineNum"> 204 </span> : */
<span class="lineNum"> 205 </span> : void state_write(struct snapraid_state* state);
<span class="lineNum"> 206 </span> :
<span class="lineNum"> 207 </span> : /**
<span class="lineNum"> 208 </span> : * Diff all the disks.
<span class="lineNum"> 209 </span> : */
<span class="lineNum"> 210 </span> : int state_diff(struct snapraid_state* state);
<span class="lineNum"> 211 </span> :
<span class="lineNum"> 212 </span> : /**
<span class="lineNum"> 213 </span> : * Scan all the disks to update the state.
<span class="lineNum"> 214 </span> : */
<span class="lineNum"> 215 </span> : void state_scan(struct snapraid_state* state);
<span class="lineNum"> 216 </span> :
<span class="lineNum"> 217 </span> : /**
<span class="lineNum"> 218 </span> : * Set the nanosecond timestamp of all files that have a zero value.
<span class="lineNum"> 219 </span> : */
<span class="lineNum"> 220 </span> : void state_nano(struct snapraid_state* state);
<span class="lineNum"> 221 </span> :
<span class="lineNum"> 222 </span> : /**
<span class="lineNum"> 223 </span> : * Devices operations.
<span class="lineNum"> 224 </span> : */
<span class="lineNum"> 225 </span> : void state_device(struct snapraid_state* state, int operation);
<span class="lineNum"> 226 </span> :
<span class="lineNum"> 227 </span> : /**
<span class="lineNum"> 228 </span> : * Sync the parity data.
<span class="lineNum"> 229 </span> : */
<span class="lineNum"> 230 </span> : int state_sync(struct snapraid_state* state, block_off_t blockstart, block_off_t blockcount);
<span class="lineNum"> 231 </span> :
<span class="lineNum"> 232 </span> : /**
<span class="lineNum"> 233 </span> : * Check (and fixes) all the files and parity data.
<span class="lineNum"> 234 </span> : * \param fix If we have to fix, after checking.
<span class="lineNum"> 235 </span> : */
<span class="lineNum"> 236 </span> : int state_check(struct snapraid_state* state, int fix, block_off_t blockstart, block_off_t blockcount);
<span class="lineNum"> 237 </span> :
<span class="lineNum"> 238 </span> : /**
<span class="lineNum"> 239 </span> : * Dry the files.
<span class="lineNum"> 240 </span> : */
<span class="lineNum"> 241 </span> : void state_dry(struct snapraid_state* state, block_off_t blockstart, block_off_t blockcount);
<span class="lineNum"> 242 </span> :
<span class="lineNum"> 243 </span> : /**
<span class="lineNum"> 244 </span> : * Rehash the files.
<span class="lineNum"> 245 </span> : */
<span class="lineNum"> 246 </span> : void state_rehash(struct snapraid_state* state);
<span class="lineNum"> 247 </span> :
<span class="lineNum"> 248 </span> : /**
<span class="lineNum"> 249 </span> : * Scrub levels.
<span class="lineNum"> 250 </span> : */
<span class="lineNum"> 251 </span> : #define SCRUB_AUTO -1 /**&lt; Automatic selection. */
<span class="lineNum"> 252 </span> : #define SCRUB_BAD -2 /**&lt; Scrub only the bad blocks. */
<span class="lineNum"> 253 </span> : #define SCRUB_NEW -3 /**&lt; Scub the new blocks. */
<span class="lineNum"> 254 </span> : #define SCRUB_FULL -4 /**&lt; Scrub everything. */
<span class="lineNum"> 255 </span> : #define SCRUB_EVEN -5 /**&lt; Even blocks. */
<span class="lineNum"> 256 </span> :
<span class="lineNum"> 257 </span> : /**
<span class="lineNum"> 258 </span> : * Scrub the files.
<span class="lineNum"> 259 </span> : */
<span class="lineNum"> 260 </span> : int state_scrub(struct snapraid_state* state, int plan, int olderthan);
<span class="lineNum"> 261 </span> :
<span class="lineNum"> 262 </span> : /**
<span class="lineNum"> 263 </span> : * Print the status.
<span class="lineNum"> 264 </span> : */
<span class="lineNum"> 265 </span> : int state_status(struct snapraid_state* state);
<span class="lineNum"> 266 </span> :
<span class="lineNum"> 267 </span> : /**
<span class="lineNum"> 268 </span> : * Find duplicates.
<span class="lineNum"> 269 </span> : */
<span class="lineNum"> 270 </span> : void state_dup(struct snapraid_state* state);
<span class="lineNum"> 271 </span> :
<span class="lineNum"> 272 </span> : /**
<span class="lineNum"> 273 </span> : * List content.
<span class="lineNum"> 274 </span> : */
<span class="lineNum"> 275 </span> : void state_list(struct snapraid_state* state);
<span class="lineNum"> 276 </span> :
<span class="lineNum"> 277 </span> : /**
<span class="lineNum"> 278 </span> : * Create pool tree.
<span class="lineNum"> 279 </span> : */
<span class="lineNum"> 280 </span> : void state_pool(struct snapraid_state* state);
<span class="lineNum"> 281 </span> :
<span class="lineNum"> 282 </span> : /**
<span class="lineNum"> 283 </span> : * Refresh the free space info.
<span class="lineNum"> 284 </span> : *
<span class="lineNum"> 285 </span> : * Note that it requires disks access.
<span class="lineNum"> 286 </span> : */
<span class="lineNum"> 287 </span> : void state_refresh(struct snapraid_state* state);
<span class="lineNum"> 288 </span> :
<span class="lineNum"> 289 </span> : /**
<span class="lineNum"> 290 </span> : * Skip files, symlinks and dirs.
<span class="lineNum"> 291 </span> : * Apply any skip access disk.
<span class="lineNum"> 292 </span> : */
<span class="lineNum"> 293 </span> : void state_skip(struct snapraid_state* state);
<span class="lineNum"> 294 </span> :
<span class="lineNum"> 295 </span> : /**
<span class="lineNum"> 296 </span> : * Filter files, symlinks and dirs.
<span class="lineNum"> 297 </span> : * Apply an additional filter to the list currently loaded.
<span class="lineNum"> 298 </span> : */
<span class="lineNum"> 299 </span> : void state_filter(struct snapraid_state* state, tommy_list* filterlist_file, tommy_list* filterlist_disk, int filter_missing, int filter_error);
<span class="lineNum"> 300 </span> :
<span class="lineNum"> 301 </span> : /**
<span class="lineNum"> 302 </span> : * Begin the progress visualization.
<span class="lineNum"> 303 </span> : */
<span class="lineNum"> 304 </span> : int state_progress_begin(struct snapraid_state* state, block_off_t blockstart, block_off_t blockmax, block_off_t countmax);
<span class="lineNum"> 305 </span> :
<span class="lineNum"> 306 </span> : /**
<span class="lineNum"> 307 </span> : * End the progress visualization.
<span class="lineNum"> 308 </span> : */
<span class="lineNum"> 309 </span> : void state_progress_end(struct snapraid_state* state, block_off_t countpos, block_off_t countmax, data_off_t countsize);
<span class="lineNum"> 310 </span> :
<span class="lineNum"> 311 </span> : /**
<span class="lineNum"> 312 </span> : * Write the progress.
<span class="lineNum"> 313 </span> : */
<span class="lineNum"> 314 </span> : int state_progress(struct snapraid_state* state, block_off_t blockpos, block_off_t countpos, block_off_t countmax, data_off_t countsize);
<span class="lineNum"> 315 </span> :
<span class="lineNum"> 316 </span> : /**
<span class="lineNum"> 317 </span> : * Stop temporarily the progress.
<span class="lineNum"> 318 </span> : */
<span class="lineNum"> 319 </span> : void state_progress_stop(struct snapraid_state* state);
<span class="lineNum"> 320 </span> :
<span class="lineNum"> 321 </span> : /**
<span class="lineNum"> 322 </span> : * Restart the progress.
<span class="lineNum"> 323 </span> : */
<span class="lineNum"> 324 </span> : void state_progress_restart(struct snapraid_state* state);
<span class="lineNum"> 325 </span> :
<span class="lineNum"> 326 </span> : /**
<a name="327"><span class="lineNum"> 327 </span> : * Set the usage time as wasted one not counted.</a>
<span class="lineNum"> 328 </span> : */
<span class="lineNum"> 329 </span><span class="lineCov"> 97 : static inline void state_usage_waste(struct snapraid_state* state)</span>
<span class="lineNum"> 330 </span> : {
<span class="lineNum"> 331 </span><span class="lineCov"> 97 : uint64_t now = tick();</span>
<span class="lineNum"> 332 </span> :
<span class="lineNum"> 333 </span><span class="lineCov"> 97 : state-&gt;tick_last = now;</span>
<span class="lineNum"> 334 </span><span class="lineCov"> 97 : }</span>
<span class="lineNum"> 335 </span> :
<span class="lineNum"> 336 </span> : /**
<a name="337"><span class="lineNum"> 337 </span> : * Set the usage time for CPU.</a>
<span class="lineNum"> 338 </span> : */
<span class="lineNum"> 339 </span><span class="lineCov"> 833206 : static inline void state_usage_cpu(struct snapraid_state* state)</span>
<span class="lineNum"> 340 </span> : {
<span class="lineNum"> 341 </span><span class="lineCov"> 833206 : uint64_t now = tick();</span>
<span class="lineNum"> 342 </span><span class="lineCov"> 833206 : uint64_t delta = now - state-&gt;tick_last;</span>
<span class="lineNum"> 343 </span> :
<span class="lineNum"> 344 </span> : /* increment the time spent in computations */
<span class="lineNum"> 345 </span><span class="lineCov"> 833206 : state-&gt;tick_cpu += delta;</span>
<span class="lineNum"> 346 </span> :
<span class="lineNum"> 347 </span><span class="lineCov"> 833206 : state-&gt;tick_last = now;</span>
<span class="lineNum"> 348 </span><span class="lineCov"> 833206 : }</span>
<span class="lineNum"> 349 </span> :
<span class="lineNum"> 350 </span> : /**
<a name="351"><span class="lineNum"> 351 </span> : * Set the usage time for data disk.</a>
<span class="lineNum"> 352 </span> : */
<span class="lineNum"> 353 </span><span class="lineCov"> 673880 : static inline void state_usage_disk(struct snapraid_state* state, struct snapraid_disk* disk)</span>
<span class="lineNum"> 354 </span> : {
<span class="lineNum"> 355 </span><span class="lineCov"> 673880 : uint64_t now = tick();</span>
<span class="lineNum"> 356 </span><span class="lineCov"> 673880 : uint64_t delta = now - state-&gt;tick_last;</span>
<span class="lineNum"> 357 </span> :
<span class="lineNum"> 358 </span><span class="lineCov"> 622545 : state-&gt;tick_last = now;</span>
<span class="lineNum"> 359 </span><span class="lineCov"> 622545 : }</span>
<span class="lineNum"> 360 </span> :
<span class="lineNum"> 361 </span> : /**
<a name="362"><span class="lineNum"> 362 </span> : * Set the usage time for parity disk.</a>
<span class="lineNum"> 363 </span> : */
<span class="lineNum"> 364 </span><span class="lineCov"> 653350 : static inline void state_usage_parity(struct snapraid_state* state, unsigned level)</span>
<span class="lineNum"> 365 </span> : {
<span class="lineNum"> 366 </span><span class="lineCov"> 653350 : uint64_t now = tick();</span>
<span class="lineNum"> 367 </span><span class="lineCov"> 653350 : uint64_t delta = now - state-&gt;tick_last;</span>
<span class="lineNum"> 368 </span> :
<span class="lineNum"> 369 </span><span class="lineCov"> 653350 : assert(level &lt; LEV_MAX);</span>
<span class="lineNum"> 370 </span> :
<span class="lineNum"> 371 </span> : /* increment the time spent in the parity disk */
<span class="lineNum"> 372 </span><span class="lineCov"> 653350 : state-&gt;parity[level].tick += delta;</span>
<span class="lineNum"> 373 </span><span class="lineCov"> 653350 : state-&gt;tick_io += delta;</span>
<span class="lineNum"> 358 </span> : /* increment the time spent in the data disk */
<span class="lineNum"> 359 </span><span class="lineCov"> 673880 : disk-&gt;tick += delta;</span>
<span class="lineNum"> 360 </span><span class="lineCov"> 673880 : state-&gt;tick_io += delta;</span>
<span class="lineNum"> 361 </span> :
<span class="lineNum"> 362 </span><span class="lineCov"> 673880 : state-&gt;tick_last = now;</span>
<span class="lineNum"> 363 </span><span class="lineCov"> 673880 : }</span>
<span class="lineNum"> 364 </span> :
<span class="lineNum"> 365 </span> : /**
<a name="366"><span class="lineNum"> 366 </span> : * Set the usage time for parity disk.</a>
<span class="lineNum"> 367 </span> : */
<span class="lineNum"> 368 </span><span class="lineCov"> 706913 : static inline void state_usage_parity(struct snapraid_state* state, unsigned level)</span>
<span class="lineNum"> 369 </span> : {
<span class="lineNum"> 370 </span><span class="lineCov"> 706913 : uint64_t now = tick();</span>
<span class="lineNum"> 371 </span><span class="lineCov"> 706913 : uint64_t delta = now - state-&gt;tick_last;</span>
<span class="lineNum"> 372 </span> :
<span class="lineNum"> 373 </span><span class="lineCov"> 706913 : assert(level &lt; LEV_MAX);</span>
<span class="lineNum"> 374 </span> :
<span class="lineNum"> 375 </span><span class="lineCov"> 653350 : state-&gt;tick_last = now;</span>
<span class="lineNum"> 376 </span><span class="lineCov"> 653350 : }</span>
<span class="lineNum"> 377 </span> :
<span class="lineNum"> 378 </span> : /**
<span class="lineNum"> 379 </span> : * Print the stats of the usage time.
<span class="lineNum"> 380 </span> : */
<span class="lineNum"> 381 </span> : void state_usage_print(struct snapraid_state* state);
<span class="lineNum"> 382 </span> :
<span class="lineNum"> 383 </span> : /**
<span class="lineNum"> 384 </span> : * Check the filesystem on all disks.
<span class="lineNum"> 385 </span> : * On error it aborts.
<span class="lineNum"> 386 </span> : */
<span class="lineNum"> 387 </span> : void state_fscheck(struct snapraid_state* state, const char* ope);
<span class="lineNum"> 388 </span> :
<span class="lineNum"> 389 </span> : /****************************************************************************/
<span class="lineNum"> 390 </span> : /* misc */
<span class="lineNum"> 391 </span> :
<span class="lineNum"> 392 </span> : /**
<span class="lineNum"> 393 </span> : * Generate a dummy configuration file from a content file.
<span class="lineNum"> 394 </span> : */
<span class="lineNum"> 395 </span> : void generate_configuration(const char* content);
<span class="lineNum"> 396 </span> :
<span class="lineNum"> 397 </span> : #endif
<span class="lineNum"> 398 </span> :
<span class="lineNum"> 375 </span> : /* increment the time spent in the parity disk */
<span class="lineNum"> 376 </span><span class="lineCov"> 706913 : state-&gt;parity[level].tick += delta;</span>
<span class="lineNum"> 377 </span><span class="lineCov"> 706913 : state-&gt;tick_io += delta;</span>
<span class="lineNum"> 378 </span> :
<span class="lineNum"> 379 </span><span class="lineCov"> 706913 : state-&gt;tick_last = now;</span>
<span class="lineNum"> 380 </span><span class="lineCov"> 706913 : }</span>
<span class="lineNum"> 381 </span> :
<span class="lineNum"> 382 </span> : /**
<span class="lineNum"> 383 </span> : * Print the stats of the usage time.
<span class="lineNum"> 384 </span> : */
<span class="lineNum"> 385 </span> : void state_usage_print(struct snapraid_state* state);
<span class="lineNum"> 386 </span> :
<span class="lineNum"> 387 </span> : /**
<span class="lineNum"> 388 </span> : * Check the file-system on all disks.
<span class="lineNum"> 389 </span> : * On error it aborts.
<span class="lineNum"> 390 </span> : */
<span class="lineNum"> 391 </span> : void state_fscheck(struct snapraid_state* state, const char* ope);
<span class="lineNum"> 392 </span> :
<span class="lineNum"> 393 </span> : /****************************************************************************/
<span class="lineNum"> 394 </span> : /* misc */
<span class="lineNum"> 395 </span> :
<span class="lineNum"> 396 </span> : /**
<span class="lineNum"> 397 </span> : * Generate a dummy configuration file from a content file.
<span class="lineNum"> 398 </span> : */
<span class="lineNum"> 399 </span> : void generate_configuration(const char* content);
<span class="lineNum"> 400 </span> :
<span class="lineNum"> 401 </span> : #endif
<span class="lineNum"> 402 </span> :
</pre>
</td>
</tr>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">3</td>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">3</td>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">3</td>
@ -159,9 +159,9 @@
<span class="lineNum"> 97 </span><span class="lineCov"> 84 : log_tag(&quot;summary:parity_block_total:%s:%u\n&quot;, lev_config_name(l), state-&gt;parity[l].total_blocks);</span>
<span class="lineNum"> 98 </span><span class="lineCov"> 84 : log_tag(&quot;summary:parity_block_free:%s:%u\n&quot;, lev_config_name(l), state-&gt;parity[l].free_blocks);</span>
<span class="lineNum"> 99 </span><span class="lineCov"> 84 : if (state-&gt;parity[l].free_blocks &lt; parity_block_free)</span>
<span class="lineNum"> 100 </span><span class="lineCov"> 4 : parity_block_free = state-&gt;parity[l].free_blocks;</span>
<span class="lineNum"> 100 </span><span class="lineCov"> 1 : parity_block_free = state-&gt;parity[l].free_blocks;</span>
<span class="lineNum"> 101 </span><span class="lineCov"> 84 : if (state-&gt;parity[l].free_blocks != 0)</span>
<span class="lineNum"> 102 </span><span class="lineCov"> 58 : free_not_zero = 1;</span>
<span class="lineNum"> 102 </span><span class="lineCov"> 73 : free_not_zero = 1;</span>
<span class="lineNum"> 103 </span> : }
<span class="lineNum"> 104 </span><span class="lineCov"> 14 : log_tag(&quot;summary:parity_block_free_min:%u\n&quot;, parity_block_free);</span>
<span class="lineNum"> 105 </span> :
@ -195,50 +195,50 @@
<span class="lineNum"> 133 </span> :
<span class="lineNum"> 134 </span> : /* for each file in the disk */
<span class="lineNum"> 135 </span><span class="lineCov"> 84 : node = disk-&gt;filelist;</span>
<span class="lineNum"> 136 </span><span class="lineCov"> 95610 : while (node) {</span>
<span class="lineNum"> 136 </span><span class="lineCov"> 95666 : while (node) {</span>
<span class="lineNum"> 137 </span> : struct snapraid_file* file;
<span class="lineNum"> 138 </span> :
<span class="lineNum"> 139 </span><span class="lineCov"> 95442 : file = node-&gt;data;</span>
<span class="lineNum"> 140 </span><span class="lineCov"> 95442 : node = node-&gt;next; /* next node */</span>
<span class="lineNum"> 139 </span><span class="lineCov"> 95498 : file = node-&gt;data;</span>
<span class="lineNum"> 140 </span><span class="lineCov"> 95498 : node = node-&gt;next; /* next node */</span>
<span class="lineNum"> 141 </span> :
<span class="lineNum"> 142 </span> : /* check fragmentation */
<span class="lineNum"> 143 </span><span class="lineCov"> 95442 : if (file-&gt;blockmax != 0) {</span>
<span class="lineNum"> 143 </span><span class="lineCov"> 95498 : if (file-&gt;blockmax != 0) {</span>
<span class="lineNum"> 144 </span> : block_off_t prev_pos;
<span class="lineNum"> 145 </span> : block_off_t last_pos;
<span class="lineNum"> 146 </span> : int fragmented;
<span class="lineNum"> 147 </span> :
<span class="lineNum"> 148 </span><span class="lineCov"> 95304 : fragmented = 0;</span>
<span class="lineNum"> 149 </span><span class="lineCov"> 95304 : prev_pos = fs_file2par_get(disk, file, 0);</span>
<span class="lineNum"> 150 </span><span class="lineCov"> 234999 : for (j = 1; j &lt; file-&gt;blockmax; ++j) {</span>
<span class="lineNum"> 151 </span><span class="lineCov"> 139695 : block_off_t parity_pos = fs_file2par_get(disk, file, j);</span>
<span class="lineNum"> 152 </span><span class="lineCov"> 139695 : if (prev_pos + 1 != parity_pos) {</span>
<span class="lineNum"> 148 </span><span class="lineCov"> 95360 : fragmented = 0;</span>
<span class="lineNum"> 149 </span><span class="lineCov"> 95360 : prev_pos = fs_file2par_get(disk, file, 0);</span>
<span class="lineNum"> 150 </span><span class="lineCov"> 235447 : for (j = 1; j &lt; file-&gt;blockmax; ++j) {</span>
<span class="lineNum"> 151 </span><span class="lineCov"> 140087 : block_off_t parity_pos = fs_file2par_get(disk, file, j);</span>
<span class="lineNum"> 152 </span><span class="lineCov"> 140087 : if (prev_pos + 1 != parity_pos) {</span>
<span class="lineNum"> 153 </span><span class="lineCov"> 698 : fragmented = 1;</span>
<span class="lineNum"> 154 </span><span class="lineCov"> 698 : ++extra_fragment;</span>
<span class="lineNum"> 155 </span><span class="lineCov"> 698 : ++disk_extra_fragment;</span>
<span class="lineNum"> 156 </span> : }
<span class="lineNum"> 157 </span><span class="lineCov"> 139695 : prev_pos = parity_pos;</span>
<span class="lineNum"> 157 </span><span class="lineCov"> 140087 : prev_pos = parity_pos;</span>
<span class="lineNum"> 158 </span> : }
<span class="lineNum"> 159 </span> :
<span class="lineNum"> 160 </span> : /* keep track of latest block used */
<span class="lineNum"> 161 </span><span class="lineCov"> 95304 : last_pos = fs_file2par_get(disk, file, file-&gt;blockmax - 1);</span>
<span class="lineNum"> 162 </span><span class="lineCov"> 95304 : if (last_pos &gt; disk_block_latest_used) {</span>
<span class="lineNum"> 163 </span><span class="lineCov"> 92447 : disk_block_latest_used = last_pos;</span>
<span class="lineNum"> 161 </span><span class="lineCov"> 95360 : last_pos = fs_file2par_get(disk, file, file-&gt;blockmax - 1);</span>
<span class="lineNum"> 162 </span><span class="lineCov"> 95360 : if (last_pos &gt; disk_block_latest_used) {</span>
<span class="lineNum"> 163 </span><span class="lineCov"> 92502 : disk_block_latest_used = last_pos;</span>
<span class="lineNum"> 164 </span> : }
<span class="lineNum"> 165 </span> :
<span class="lineNum"> 166 </span><span class="lineCov"> 95304 : if (fragmented) {</span>
<span class="lineNum"> 166 </span><span class="lineCov"> 95360 : if (fragmented) {</span>
<span class="lineNum"> 167 </span><span class="lineCov"> 582 : ++file_fragmented;</span>
<span class="lineNum"> 168 </span><span class="lineCov"> 582 : ++disk_file_fragmented;</span>
<span class="lineNum"> 169 </span> : }
<span class="lineNum"> 170 </span> :
<span class="lineNum"> 171 </span><span class="lineCov"> 95304 : disk_block_count += file-&gt;blockmax;</span>
<span class="lineNum"> 171 </span><span class="lineCov"> 95360 : disk_block_count += file-&gt;blockmax;</span>
<span class="lineNum"> 172 </span> : }
<span class="lineNum"> 173 </span> :
<span class="lineNum"> 174 </span> : /* count files */
<span class="lineNum"> 175 </span><span class="lineCov"> 95442 : ++file_count;</span>
<span class="lineNum"> 176 </span><span class="lineCov"> 95442 : ++disk_file_count;</span>
<span class="lineNum"> 177 </span><span class="lineCov"> 95442 : file_size += file-&gt;size;</span>
<span class="lineNum"> 178 </span><span class="lineCov"> 95442 : file_block_count += file-&gt;blockmax;</span>
<span class="lineNum"> 179 </span><span class="lineCov"> 95442 : disk_file_size += file-&gt;size;</span>
<span class="lineNum"> 175 </span><span class="lineCov"> 95498 : ++file_count;</span>
<span class="lineNum"> 176 </span><span class="lineCov"> 95498 : ++disk_file_count;</span>
<span class="lineNum"> 177 </span><span class="lineCov"> 95498 : file_size += file-&gt;size;</span>
<span class="lineNum"> 178 </span><span class="lineCov"> 95498 : file_block_count += file-&gt;blockmax;</span>
<span class="lineNum"> 179 </span><span class="lineCov"> 95498 : disk_file_size += file-&gt;size;</span>
<span class="lineNum"> 180 </span> : }
<span class="lineNum"> 181 </span> :
<span class="lineNum"> 182 </span><span class="lineCov"> 84 : if (disk-&gt;free_blocks != 0)</span>
@ -253,9 +253,9 @@
<span class="lineNum"> 191 </span> : /* the wasted space is the space that we have to leave */
<span class="lineNum"> 192 </span> : /* free on the data disk, when the parity is filled up */
<span class="lineNum"> 193 </span><span class="lineCov"> 84 : if (disk_block_max_by_space &lt; disk_block_max_by_parity) {</span>
<span class="lineNum"> 194 </span><span class="lineCov"> 50 : disk_block_max = disk_block_max_by_space;</span>
<span class="lineNum"> 194 </span><span class="lineCov"> 65 : disk_block_max = disk_block_max_by_space;</span>
<span class="lineNum"> 195 </span> : } else {
<span class="lineNum"> 196 </span><span class="lineCov"> 34 : disk_block_max = disk_block_max_by_parity;</span>
<span class="lineNum"> 196 </span><span class="lineCov"> 19 : disk_block_max = disk_block_max_by_parity;</span>
<span class="lineNum"> 197 </span> : }
<span class="lineNum"> 198 </span> :
<span class="lineNum"> 199 </span> : /* wasted space is the difference of the two maximum size */
@ -264,7 +264,7 @@
<span class="lineNum"> 202 </span><span class="lineCov"> 84 : wasted *= state-&gt;block_size;</span>
<span class="lineNum"> 203 </span> :
<span class="lineNum"> 204 </span><span class="lineCov"> 84 : if (wasted &gt; 0)</span>
<span class="lineNum"> 205 </span><span class="lineCov"> 24 : all_wasted += wasted;</span>
<span class="lineNum"> 205 </span><span class="lineCov"> 6 : all_wasted += wasted;</span>
<span class="lineNum"> 206 </span><span class="lineCov"> 84 : file_block_free += disk_block_max - disk_block_count;</span>
<span class="lineNum"> 207 </span> :
<span class="lineNum"> 208 </span><span class="lineCov"> 84 : printf(&quot;%8u&quot;, disk_file_count);</span>
@ -338,57 +338,57 @@
<span class="lineNum"> 276 </span><span class="lineCov"> 14 : unsynced_blocks = 0;</span>
<span class="lineNum"> 277 </span><span class="lineCov"> 14 : unscrubbed_blocks = 0;</span>
<span class="lineNum"> 278 </span><span class="lineCov"> 14 : log_tag(&quot;block_count:%u\n&quot;, blockmax);</span>
<span class="lineNum"> 279 </span><span class="lineCov"> 39620 : for (i = 0; i &lt; blockmax; ++i) {</span>
<span class="lineNum"> 279 </span><span class="lineCov"> 39702 : for (i = 0; i &lt; blockmax; ++i) {</span>
<span class="lineNum"> 280 </span> : int one_invalid;
<span class="lineNum"> 281 </span> : int one_valid;
<span class="lineNum"> 282 </span> :
<span class="lineNum"> 283 </span><span class="lineCov"> 39606 : snapraid_info info = info_get(&amp;state-&gt;infoarr, i);</span>
<span class="lineNum"> 283 </span><span class="lineCov"> 39688 : snapraid_info info = info_get(&amp;state-&gt;infoarr, i);</span>
<span class="lineNum"> 284 </span> :
<span class="lineNum"> 285 </span> : /* for each disk */
<span class="lineNum"> 286 </span><span class="lineCov"> 39606 : one_invalid = 0;</span>
<span class="lineNum"> 287 </span><span class="lineCov"> 39606 : one_valid = 0;</span>
<span class="lineNum"> 288 </span><span class="lineCov"> 277242 : for (node_disk = state-&gt;disklist; node_disk != 0; node_disk = node_disk-&gt;next) {</span>
<span class="lineNum"> 289 </span><span class="lineCov"> 237636 : struct snapraid_disk* disk = node_disk-&gt;data;</span>
<span class="lineNum"> 290 </span><span class="lineCov"> 237636 : struct snapraid_block* block = fs_par2block_get(disk, i);</span>
<span class="lineNum"> 286 </span><span class="lineCov"> 39688 : one_invalid = 0;</span>
<span class="lineNum"> 287 </span><span class="lineCov"> 39688 : one_valid = 0;</span>
<span class="lineNum"> 288 </span><span class="lineCov"> 277816 : for (node_disk = state-&gt;disklist; node_disk != 0; node_disk = node_disk-&gt;next) {</span>
<span class="lineNum"> 289 </span><span class="lineCov"> 238128 : struct snapraid_disk* disk = node_disk-&gt;data;</span>
<span class="lineNum"> 290 </span><span class="lineCov"> 238128 : struct snapraid_block* block = fs_par2block_get(disk, i);</span>
<span class="lineNum"> 291 </span> :
<span class="lineNum"> 292 </span><span class="lineCov"> 237636 : if (block_has_file(block))</span>
<span class="lineNum"> 293 </span><span class="lineCov"> 234999 : one_valid = 1;</span>
<span class="lineNum"> 294 </span><span class="lineCov"> 237636 : if (block_has_invalid_parity(block))</span>
<span class="lineNum"> 292 </span><span class="lineCov"> 238128 : if (block_has_file(block))</span>
<span class="lineNum"> 293 </span><span class="lineCov"> 235447 : one_valid = 1;</span>
<span class="lineNum"> 294 </span><span class="lineCov"> 238128 : if (block_has_invalid_parity(block))</span>
<span class="lineNum"> 295 </span><span class="lineNoCov"> 0 : one_invalid = 1;</span>
<span class="lineNum"> 296 </span> : }
<span class="lineNum"> 297 </span> :
<span class="lineNum"> 298 </span> : /* if both valid and invalid, we need to update */
<span class="lineNum"> 299 </span><span class="lineCov"> 39606 : if (one_invalid &amp;&amp; one_valid) {</span>
<span class="lineNum"> 299 </span><span class="lineCov"> 39688 : if (one_invalid &amp;&amp; one_valid) {</span>
<span class="lineNum"> 300 </span><span class="lineNoCov"> 0 : ++unsynced_blocks;</span>
<span class="lineNum"> 301 </span> : }
<span class="lineNum"> 302 </span> :
<span class="lineNum"> 303 </span> : /* skip unused blocks */
<span class="lineNum"> 304 </span><span class="lineCov"> 39606 : if (info != 0) {</span>
<span class="lineNum"> 304 </span><span class="lineCov"> 39688 : if (info != 0) {</span>
<span class="lineNum"> 305 </span> : time_t scrub_time;
<span class="lineNum"> 306 </span> :
<span class="lineNum"> 307 </span><span class="lineCov"> 39606 : if (info_get_bad(info)) {</span>
<span class="lineNum"> 308 </span><span class="lineCov"> 1802 : if (bad == 0)</span>
<span class="lineNum"> 307 </span><span class="lineCov"> 39688 : if (info_get_bad(info)) {</span>
<span class="lineNum"> 308 </span><span class="lineCov"> 1771 : if (bad == 0)</span>
<span class="lineNum"> 309 </span><span class="lineCov"> 2 : bad_first = i;</span>
<span class="lineNum"> 310 </span><span class="lineCov"> 1802 : bad_last = i;</span>
<span class="lineNum"> 311 </span><span class="lineCov"> 1802 : ++bad;</span>
<span class="lineNum"> 310 </span><span class="lineCov"> 1771 : bad_last = i;</span>
<span class="lineNum"> 311 </span><span class="lineCov"> 1771 : ++bad;</span>
<span class="lineNum"> 312 </span> : }
<span class="lineNum"> 313 </span> :
<span class="lineNum"> 314 </span><span class="lineCov"> 39606 : if (info_get_rehash(info))</span>
<span class="lineNum"> 315 </span><span class="lineCov"> 4599 : ++rehash;</span>
<span class="lineNum"> 314 </span><span class="lineCov"> 39688 : if (info_get_rehash(info))</span>
<span class="lineNum"> 315 </span><span class="lineCov"> 4603 : ++rehash;</span>
<span class="lineNum"> 316 </span> :
<span class="lineNum"> 317 </span><span class="lineCov"> 39606 : scrub_time = info_get_time(info);</span>
<span class="lineNum"> 317 </span><span class="lineCov"> 39688 : scrub_time = info_get_time(info);</span>
<span class="lineNum"> 318 </span> :
<span class="lineNum"> 319 </span><span class="lineCov"> 39606 : if (info_get_justsynced(info)) {</span>
<span class="lineNum"> 320 </span><span class="lineCov"> 20364 : ++unscrubbed_blocks;</span>
<span class="lineNum"> 319 </span><span class="lineCov"> 39688 : if (info_get_justsynced(info)) {</span>
<span class="lineNum"> 320 </span><span class="lineCov"> 20419 : ++unscrubbed_blocks;</span>
<span class="lineNum"> 321 </span> :
<span class="lineNum"> 322 </span> : /* mark the time as not scrubbed */
<span class="lineNum"> 323 </span><span class="lineCov"> 20364 : scrub_time |= TIME_NEW;</span>
<span class="lineNum"> 323 </span><span class="lineCov"> 20419 : scrub_time |= TIME_NEW;</span>
<span class="lineNum"> 324 </span> : }
<span class="lineNum"> 325 </span> :
<span class="lineNum"> 326 </span><span class="lineCov"> 39606 : timemap[count++] = scrub_time;</span>
<span class="lineNum"> 326 </span><span class="lineCov"> 39688 : timemap[count++] = scrub_time;</span>
<span class="lineNum"> 327 </span> : }
<span class="lineNum"> 328 </span> :
<span class="lineNum"> 329 </span><span class="lineCov"> 39606 : if (state-&gt;opt.gui) {</span>
<span class="lineNum"> 329 </span><span class="lineCov"> 39688 : if (state-&gt;opt.gui) {</span>
<span class="lineNum"> 330 </span><span class="lineNoCov"> 0 : if (info != 0)</span>
<span class="lineNum"> 331 </span><span class="lineNoCov"> 0 : log_tag(&quot;block:%u:%&quot; PRIu64 &quot;:%s:%s:%s:%s\n&quot;, i, (uint64_t)info_get_time(info), one_valid ? &quot;used&quot; : &quot;&quot;, one_invalid ? &quot;unsynced&quot; : &quot;&quot;, info_get_bad(info) ? &quot;bad&quot; : &quot;&quot;, info_get_rehash(info) ? &quot;rehash&quot; : &quot;&quot;);</span>
<span class="lineNum"> 332 </span> : else
@ -414,16 +414,16 @@
<span class="lineNum"> 352 </span> : /* output the info map */
<span class="lineNum"> 353 </span><span class="lineCov"> 8 : i = 0;</span>
<span class="lineNum"> 354 </span><span class="lineCov"> 8 : log_tag(&quot;info_count:%u\n&quot;, count);</span>
<span class="lineNum"> 355 </span><span class="lineCov"> 41 : while (i &lt; count) {</span>
<span class="lineNum"> 356 </span><span class="lineCov"> 25 : unsigned j = i + 1;</span>
<span class="lineNum"> 357 </span><span class="lineCov"> 39631 : while (j &lt; count &amp;&amp; timemap[i] == timemap[j])</span>
<span class="lineNum"> 358 </span><span class="lineCov"> 39581 : ++j;</span>
<span class="lineNum"> 359 </span><span class="lineCov"> 25 : if ((timemap[i] &amp; TIME_NEW) == 0) {</span>
<span class="lineNum"> 360 </span><span class="lineCov"> 9 : log_tag(&quot;info_time:%&quot; PRIu64 &quot;:%u:scrubbed\n&quot;, (uint64_t)timemap[i], j - i);</span>
<span class="lineNum"> 355 </span><span class="lineCov"> 39 : while (i &lt; count) {</span>
<span class="lineNum"> 356 </span><span class="lineCov"> 23 : unsigned j = i + 1;</span>
<span class="lineNum"> 357 </span><span class="lineCov"> 39711 : while (j &lt; count &amp;&amp; timemap[i] == timemap[j])</span>
<span class="lineNum"> 358 </span><span class="lineCov"> 39665 : ++j;</span>
<span class="lineNum"> 359 </span><span class="lineCov"> 23 : if ((timemap[i] &amp; TIME_NEW) == 0) {</span>
<span class="lineNum"> 360 </span><span class="lineCov"> 8 : log_tag(&quot;info_time:%&quot; PRIu64 &quot;:%u:scrubbed\n&quot;, (uint64_t)timemap[i], j - i);</span>
<span class="lineNum"> 361 </span> : } else {
<span class="lineNum"> 362 </span><span class="lineCov"> 16 : log_tag(&quot;info_time:%&quot; PRIu64 &quot;:%u:new\n&quot;, (uint64_t)(timemap[i] &amp; ~TIME_NEW), j - i);</span>
<span class="lineNum"> 362 </span><span class="lineCov"> 15 : log_tag(&quot;info_time:%&quot; PRIu64 &quot;:%u:new\n&quot;, (uint64_t)(timemap[i] &amp; ~TIME_NEW), j - i);</span>
<span class="lineNum"> 363 </span> : }
<span class="lineNum"> 364 </span><span class="lineCov"> 25 : i = j;</span>
<span class="lineNum"> 364 </span><span class="lineCov"> 23 : i = j;</span>
<span class="lineNum"> 365 </span> : }
<span class="lineNum"> 366 </span> :
<span class="lineNum"> 367 </span><span class="lineCov"> 8 : oldest = timemap[0];</span>
@ -444,12 +444,12 @@
<span class="lineNum"> 382 </span> :
<span class="lineNum"> 383 </span><span class="lineCov"> 560 : step_scrubbed = 0;</span>
<span class="lineNum"> 384 </span><span class="lineCov"> 560 : step_new = 0;</span>
<span class="lineNum"> 385 </span><span class="lineCov"> 40726 : while (barpos &lt; count &amp;&amp; timemap[barpos] &lt;= limit) {</span>
<span class="lineNum"> 386 </span><span class="lineCov"> 39606 : if ((timemap[barpos] &amp; TIME_NEW) != 0)</span>
<span class="lineNum"> 387 </span><span class="lineCov"> 20364 : ++step_new;</span>
<span class="lineNum"> 385 </span><span class="lineCov"> 40808 : while (barpos &lt; count &amp;&amp; timemap[barpos] &lt;= limit) {</span>
<span class="lineNum"> 386 </span><span class="lineCov"> 39688 : if ((timemap[barpos] &amp; TIME_NEW) != 0)</span>
<span class="lineNum"> 387 </span><span class="lineCov"> 20419 : ++step_new;</span>
<span class="lineNum"> 388 </span> : else
<span class="lineNum"> 389 </span><span class="lineCov"> 19242 : ++step_scrubbed;</span>
<span class="lineNum"> 390 </span><span class="lineCov"> 39606 : ++barpos;</span>
<span class="lineNum"> 389 </span><span class="lineCov"> 19269 : ++step_scrubbed;</span>
<span class="lineNum"> 390 </span><span class="lineCov"> 39688 : ++barpos;</span>
<span class="lineNum"> 391 </span> : }
<span class="lineNum"> 392 </span> :
<span class="lineNum"> 393 </span><span class="lineCov"> 560 : if (step_new + step_scrubbed &gt; barmax)</span>
@ -478,20 +478,20 @@
<span class="lineNum"> 416 </span><span class="lineCov"> 8400 : unsigned scrubbed = bar_scrubbed[x];</span>
<span class="lineNum"> 417 </span> :
<span class="lineNum"> 418 </span><span class="lineCov"> 8400 : if (both &gt; pivot_upper) {</span>
<span class="lineNum"> 419 </span><span class="lineCov"> 168 : if (scrubbed &gt; pivot_lower)</span>
<span class="lineNum"> 420 </span><span class="lineCov"> 74 : printf(&quot;*&quot;);</span>
<span class="lineNum"> 419 </span><span class="lineCov"> 171 : if (scrubbed &gt; pivot_lower)</span>
<span class="lineNum"> 420 </span><span class="lineCov"> 75 : printf(&quot;*&quot;);</span>
<span class="lineNum"> 421 </span> : else
<span class="lineNum"> 422 </span><span class="lineCov"> 94 : printf(&quot;o&quot;);</span>
<span class="lineNum"> 423 </span><span class="lineCov"> 8232 : } else if (both &gt; pivot_lower) {</span>
<span class="lineNum"> 424 </span><span class="lineCov"> 25 : if (scrubbed == both)</span>
<span class="lineNum"> 425 </span><span class="lineCov"> 9 : printf(&quot;*&quot;);</span>
<span class="lineNum"> 422 </span><span class="lineCov"> 96 : printf(&quot;o&quot;);</span>
<span class="lineNum"> 423 </span><span class="lineCov"> 8229 : } else if (both &gt; pivot_lower) {</span>
<span class="lineNum"> 424 </span><span class="lineCov"> 23 : if (scrubbed == both)</span>
<span class="lineNum"> 425 </span><span class="lineCov"> 8 : printf(&quot;*&quot;);</span>
<span class="lineNum"> 426 </span> : else
<span class="lineNum"> 427 </span><span class="lineCov"> 16 : printf(&quot;o&quot;);</span>
<span class="lineNum"> 427 </span><span class="lineCov"> 15 : printf(&quot;o&quot;);</span>
<span class="lineNum"> 428 </span> : } else {
<span class="lineNum"> 429 </span><span class="lineCov"> 8207 : if (y == GRAPH_ROW - 1)</span>
<span class="lineNum"> 430 </span><span class="lineCov"> 535 : printf(&quot;_&quot;);</span>
<span class="lineNum"> 429 </span><span class="lineCov"> 8206 : if (y == GRAPH_ROW - 1)</span>
<span class="lineNum"> 430 </span><span class="lineCov"> 537 : printf(&quot;_&quot;);</span>
<span class="lineNum"> 431 </span> : else
<span class="lineNum"> 432 </span><span class="lineCov"> 7672 : printf(&quot; &quot;);</span>
<span class="lineNum"> 432 </span><span class="lineCov"> 7669 : printf(&quot; &quot;);</span>
<span class="lineNum"> 433 </span> : }
<span class="lineNum"> 434 </span> : }
<span class="lineNum"> 435 </span><span class="lineCov"> 120 : printf(&quot;\n&quot;);</span>
@ -536,19 +536,19 @@
<span class="lineNum"> 474 </span> :
<span class="lineNum"> 475 </span> : /* print some of the errors */
<span class="lineNum"> 476 </span><span class="lineCov"> 2 : bad_print = 0;</span>
<span class="lineNum"> 477 </span><span class="lineCov"> 609 : for (i = 0; i &lt; blockmax; ++i) {</span>
<span class="lineNum"> 478 </span><span class="lineCov"> 609 : snapraid_info info = info_get(&amp;state-&gt;infoarr, i);</span>
<span class="lineNum"> 477 </span><span class="lineCov"> 709 : for (i = 0; i &lt; blockmax; ++i) {</span>
<span class="lineNum"> 478 </span><span class="lineCov"> 709 : snapraid_info info = info_get(&amp;state-&gt;infoarr, i);</span>
<span class="lineNum"> 479 </span> :
<span class="lineNum"> 480 </span> : /* skip unused blocks */
<span class="lineNum"> 481 </span><span class="lineCov"> 609 : if (info == 0)</span>
<span class="lineNum"> 481 </span><span class="lineCov"> 709 : if (info == 0)</span>
<span class="lineNum"> 482 </span><span class="lineNoCov"> 0 : continue;</span>
<span class="lineNum"> 483 </span> :
<span class="lineNum"> 484 </span><span class="lineCov"> 609 : if (info_get_bad(info)) {</span>
<span class="lineNum"> 484 </span><span class="lineCov"> 709 : if (info_get_bad(info)) {</span>
<span class="lineNum"> 485 </span><span class="lineCov"> 202 : printf(&quot; %u&quot;, i);</span>
<span class="lineNum"> 486 </span><span class="lineCov"> 202 : ++bad_print;</span>
<span class="lineNum"> 487 </span> : }
<span class="lineNum"> 488 </span> :
<span class="lineNum"> 489 </span><span class="lineCov"> 609 : if (bad_print &gt; 100) {</span>
<span class="lineNum"> 489 </span><span class="lineCov"> 709 : if (bad_print &gt; 100) {</span>
<span class="lineNum"> 490 </span><span class="lineCov"> 2 : printf(&quot; and %u more...&quot;, bad - bad_print);</span>
<span class="lineNum"> 491 </span><span class="lineCov"> 2 : break;</span>
<span class="lineNum"> 492 </span> : }

View file

@ -31,18 +31,18 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">261</td>
<td class="headerCovTableEntry">257</td>
<td class="headerCovTableEntry">280</td>
<td class="headerCovTableEntryHi">93.2 %</td>
<td class="headerCovTableEntryHi">91.8 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">27</td>
<td class="headerCovTableEntry">28</td>
<td class="headerCovTableEntry">28</td>
<td class="headerCovTableEntryHi">100.0 %</td>
<td class="headerCovTableEntryHi">96.4 %</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
@ -61,116 +61,116 @@
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#622">swrite</a></td>
<td class="coverFnHi">129597634</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#659">sputb32</a></td>
<td class="coverFnHi">62339359</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#680">sputb64</a></td>
<td class="coverFnHi">34173479</td>
<td class="coverFnHi">20661703</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#514">sgetb32</a></td>
<td class="coverFnHi">18710390</td>
<td class="coverFnHi">18259411</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#373">sread</a></td>
<td class="coverFnHi">12342909</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#713">sputbs</a></td>
<td class="coverFnHi">12306366</td>
<td class="coverFnHi">12515245</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#550">sgetb64</a></td>
<td class="coverFnHi">10465937</td>
<td class="coverFnHi">10605158</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#659">sputb32</a></td>
<td class="coverFnHi">9119259</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#680">sputb64</a></td>
<td class="coverFnHi">5293948</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#601">sgetbs</a></td>
<td class="coverFnHi">3732790</td>
<td class="coverFnHi">3782241</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#713">sputbs</a></td>
<td class="coverFnHi">1884788</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#191">sfill</a></td>
<td class="coverFnHi">606496</td>
<td class="coverFnHi">607118</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#328">sgetc_uncached</a></td>
<td class="coverFnHi">298585</td>
<td class="coverFnHi">298684</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#266">sflush</a></td>
<td class="coverFnHi">52590</td>
<td class="coverFnHi">39024</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#336">sgettok</a></td>
<td class="coverFnHi">7623</td>
<td class="coverFnHi">7892</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#404">sgetline</a></td>
<td class="coverFnHi">5069</td>
<td class="coverFnHi">5251</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#466">sgetlasttok</a></td>
<td class="coverFnHi">5035</td>
<td class="coverFnHi">5217</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#142">sclose</a></td>
<td class="coverFnHi">2575</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#318">scrc</a></td>
<td class="coverFnHi">2333</td>
<td class="coverFnHi">1903</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#27">sopen_read</a></td>
<td class="coverFnHi">1701</td>
<td class="coverFnHi">1794</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#318">scrc</a></td>
<td class="coverFnHi">1650</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#228">sdeplete</a></td>
<td class="coverFnHi">1042</td>
<td class="coverFnHi">1119</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#98">sopen_multi_file</a></td>
<td class="coverFnHi">1041</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#323">scrc_stream</a></td>
<td class="coverFnHi">929</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#701">sputble32</a></td>
<td class="coverFnHi">929</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#72">sopen_multi_write</a></td>
<td class="coverFnHi">928</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#130">sopen_write</a></td>
<td class="coverFnHi">913</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#727">ssync</a></td>
<td class="coverFnHi">912</td>
<td class="coverFnHi">1118</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#586">sgetble32</a></td>
<td class="coverFnHi">362</td>
<td class="coverFnHi">370</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#485">sgetu32</a></td>
<td class="coverFnHi">247</td>
<td class="coverFnHi">255</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#176">shandle</a></td>
<td class="coverFnHi">235</td>
<td class="coverFnHi">243</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#323">scrc_stream</a></td>
<td class="coverFnHi">161</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#72">sopen_multi_write</a></td>
<td class="coverFnHi">161</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#701">sputble32</a></td>
<td class="coverFnHi">161</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#727">ssync</a></td>
<td class="coverFnHi">145</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#313">stell</a></td>
<td class="coverFnHi">1</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#130">sopen_write</a></td>
<td class="coverFnLo">0</td>
</tr>
</table>
<br>
</center>

View file

@ -31,18 +31,18 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">261</td>
<td class="headerCovTableEntry">257</td>
<td class="headerCovTableEntry">280</td>
<td class="headerCovTableEntryHi">93.2 %</td>
<td class="headerCovTableEntryHi">91.8 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">27</td>
<td class="headerCovTableEntry">28</td>
<td class="headerCovTableEntry">28</td>
<td class="headerCovTableEntryHi">100.0 %</td>
<td class="headerCovTableEntryHi">96.4 %</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
@ -61,107 +61,107 @@
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#142">sclose</a></td>
<td class="coverFnHi">2575</td>
<td class="coverFnHi">1903</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#318">scrc</a></td>
<td class="coverFnHi">2333</td>
<td class="coverFnHi">1650</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#323">scrc_stream</a></td>
<td class="coverFnHi">929</td>
<td class="coverFnHi">161</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#228">sdeplete</a></td>
<td class="coverFnHi">1042</td>
<td class="coverFnHi">1119</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#191">sfill</a></td>
<td class="coverFnHi">606496</td>
<td class="coverFnHi">607118</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#266">sflush</a></td>
<td class="coverFnHi">52590</td>
<td class="coverFnHi">39024</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#514">sgetb32</a></td>
<td class="coverFnHi">18710390</td>
<td class="coverFnHi">18259411</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#550">sgetb64</a></td>
<td class="coverFnHi">10465937</td>
<td class="coverFnHi">10605158</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#586">sgetble32</a></td>
<td class="coverFnHi">362</td>
<td class="coverFnHi">370</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#601">sgetbs</a></td>
<td class="coverFnHi">3732790</td>
<td class="coverFnHi">3782241</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#328">sgetc_uncached</a></td>
<td class="coverFnHi">298585</td>
<td class="coverFnHi">298684</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#466">sgetlasttok</a></td>
<td class="coverFnHi">5035</td>
<td class="coverFnHi">5217</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#404">sgetline</a></td>
<td class="coverFnHi">5069</td>
<td class="coverFnHi">5251</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#336">sgettok</a></td>
<td class="coverFnHi">7623</td>
<td class="coverFnHi">7892</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#485">sgetu32</a></td>
<td class="coverFnHi">247</td>
<td class="coverFnHi">255</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#176">shandle</a></td>
<td class="coverFnHi">235</td>
<td class="coverFnHi">243</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#98">sopen_multi_file</a></td>
<td class="coverFnHi">1041</td>
<td class="coverFnHi">1118</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#72">sopen_multi_write</a></td>
<td class="coverFnHi">928</td>
<td class="coverFnHi">161</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#27">sopen_read</a></td>
<td class="coverFnHi">1701</td>
<td class="coverFnHi">1794</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#130">sopen_write</a></td>
<td class="coverFnHi">913</td>
<td class="coverFnLo">0</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#659">sputb32</a></td>
<td class="coverFnHi">62339359</td>
<td class="coverFnHi">9119259</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#680">sputb64</a></td>
<td class="coverFnHi">34173479</td>
<td class="coverFnHi">5293948</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#701">sputble32</a></td>
<td class="coverFnHi">929</td>
<td class="coverFnHi">161</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#713">sputbs</a></td>
<td class="coverFnHi">12306366</td>
<td class="coverFnHi">1884788</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#373">sread</a></td>
<td class="coverFnHi">12342909</td>
<td class="coverFnHi">12515245</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#727">ssync</a></td>
<td class="coverFnHi">912</td>
<td class="coverFnHi">145</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#313">stell</a></td>
@ -169,7 +169,7 @@
</tr>
<tr>
<td class="coverFn"><a href="stream.c.gcov.html#622">swrite</a></td>
<td class="coverFnHi">129597634</td>
<td class="coverFnHi">20661703</td>
</tr>
</table>
<br>

View file

@ -31,18 +31,18 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">261</td>
<td class="headerCovTableEntry">257</td>
<td class="headerCovTableEntry">280</td>
<td class="headerCovTableEntryHi">93.2 %</td>
<td class="headerCovTableEntryHi">91.8 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">27</td>
<td class="headerCovTableEntry">28</td>
<td class="headerCovTableEntry">28</td>
<td class="headerCovTableEntryHi">100.0 %</td>
<td class="headerCovTableEntryHi">96.4 %</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
@ -88,19 +88,19 @@
<span class="lineNum"> 26 </span> :
<a name="27"><span class="lineNum"> 27 </span> : unsigned STREAM_SIZE = 1024 * 64;</a>
<span class="lineNum"> 28 </span> :
<span class="lineNum"> 29 </span><span class="lineCov"> 1701 : STREAM* sopen_read(const char* file)</span>
<span class="lineNum"> 29 </span><span class="lineCov"> 1794 : STREAM* sopen_read(const char* file)</span>
<span class="lineNum"> 30 </span> : {
<span class="lineNum"> 31 </span> : #if HAVE_POSIX_FADVISE
<span class="lineNum"> 32 </span> : int ret;
<span class="lineNum"> 33 </span> : #endif
<span class="lineNum"> 34 </span><span class="lineCov"> 1701 : STREAM* s = malloc_nofail(sizeof(STREAM));</span>
<span class="lineNum"> 34 </span><span class="lineCov"> 1794 : STREAM* s = malloc_nofail(sizeof(STREAM));</span>
<span class="lineNum"> 35 </span> :
<span class="lineNum"> 36 </span><span class="lineCov"> 1701 : s-&gt;handle_size = 1;</span>
<span class="lineNum"> 37 </span><span class="lineCov"> 1701 : s-&gt;handle = malloc_nofail(sizeof(struct stream_handle));</span>
<span class="lineNum"> 36 </span><span class="lineCov"> 1794 : s-&gt;handle_size = 1;</span>
<span class="lineNum"> 37 </span><span class="lineCov"> 1794 : s-&gt;handle = malloc_nofail(sizeof(struct stream_handle));</span>
<span class="lineNum"> 38 </span> :
<span class="lineNum"> 39 </span><span class="lineCov"> 1700 : pathcpy(s-&gt;handle[0].path, sizeof(s-&gt;handle[0].path), file);</span>
<span class="lineNum"> 40 </span><span class="lineCov"> 1701 : s-&gt;handle[0].f = open(file, O_RDONLY | O_BINARY | O_SEQUENTIAL);</span>
<span class="lineNum"> 41 </span><span class="lineCov"> 1700 : if (s-&gt;handle[0].f == -1) {</span>
<span class="lineNum"> 39 </span><span class="lineCov"> 1794 : pathcpy(s-&gt;handle[0].path, sizeof(s-&gt;handle[0].path), file);</span>
<span class="lineNum"> 40 </span><span class="lineCov"> 1794 : s-&gt;handle[0].f = open(file, O_RDONLY | O_BINARY | O_SEQUENTIAL);</span>
<span class="lineNum"> 41 </span><span class="lineCov"> 1794 : if (s-&gt;handle[0].f == -1) {</span>
<span class="lineNum"> 42 </span><span class="lineCov"> 50 : free(s-&gt;handle);</span>
<span class="lineNum"> 43 </span><span class="lineCov"> 50 : free(s);</span>
<span class="lineNum"> 44 </span><span class="lineCov"> 50 : return 0;</span>
@ -108,8 +108,8 @@
<span class="lineNum"> 46 </span> :
<span class="lineNum"> 47 </span> : #if HAVE_POSIX_FADVISE
<span class="lineNum"> 48 </span> : /* advise sequential access */
<span class="lineNum"> 49 </span><span class="lineCov"> 1650 : ret = posix_fadvise(s-&gt;handle[0].f, 0, 0, POSIX_FADV_SEQUENTIAL);</span>
<span class="lineNum"> 50 </span><span class="lineCov"> 1644 : if (ret != 0) {</span>
<span class="lineNum"> 49 </span><span class="lineCov"> 1744 : ret = posix_fadvise(s-&gt;handle[0].f, 0, 0, POSIX_FADV_SEQUENTIAL);</span>
<span class="lineNum"> 50 </span><span class="lineCov"> 1744 : if (ret != 0) {</span>
<span class="lineNum"> 51 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 52 </span> : close(s-&gt;handle[0].f);
<span class="lineNum"> 53 </span> : free(s-&gt;handle);
@ -119,57 +119,57 @@
<span class="lineNum"> 57 </span> : }
<span class="lineNum"> 58 </span> : #endif
<span class="lineNum"> 59 </span> :
<span class="lineNum"> 60 </span><span class="lineCov"> 1644 : s-&gt;buffer = malloc_nofail_test(STREAM_SIZE);</span>
<span class="lineNum"> 61 </span><span class="lineCov"> 1650 : s-&gt;pos = s-&gt;buffer;</span>
<span class="lineNum"> 62 </span><span class="lineCov"> 1650 : s-&gt;end = s-&gt;buffer;</span>
<span class="lineNum"> 63 </span><span class="lineCov"> 1650 : s-&gt;state = STREAM_STATE_READ;</span>
<span class="lineNum"> 64 </span><span class="lineCov"> 1650 : s-&gt;state_index = 0;</span>
<span class="lineNum"> 65 </span><span class="lineCov"> 1650 : s-&gt;offset = 0;</span>
<span class="lineNum"> 66 </span><span class="lineCov"> 1650 : s-&gt;offset_uncached = 0;</span>
<span class="lineNum"> 67 </span><span class="lineCov"> 1650 : s-&gt;crc = 0;</span>
<span class="lineNum"> 68 </span><span class="lineCov"> 1650 : s-&gt;crc_uncached = 0;</span>
<span class="lineNum"> 69 </span><span class="lineCov"> 1650 : s-&gt;crc_stream = CRC_IV;</span>
<span class="lineNum"> 60 </span><span class="lineCov"> 1744 : s-&gt;buffer = malloc_nofail_test(STREAM_SIZE);</span>
<span class="lineNum"> 61 </span><span class="lineCov"> 1744 : s-&gt;pos = s-&gt;buffer;</span>
<span class="lineNum"> 62 </span><span class="lineCov"> 1744 : s-&gt;end = s-&gt;buffer;</span>
<span class="lineNum"> 63 </span><span class="lineCov"> 1744 : s-&gt;state = STREAM_STATE_READ;</span>
<span class="lineNum"> 64 </span><span class="lineCov"> 1744 : s-&gt;state_index = 0;</span>
<span class="lineNum"> 65 </span><span class="lineCov"> 1744 : s-&gt;offset = 0;</span>
<span class="lineNum"> 66 </span><span class="lineCov"> 1744 : s-&gt;offset_uncached = 0;</span>
<span class="lineNum"> 67 </span><span class="lineCov"> 1744 : s-&gt;crc = 0;</span>
<span class="lineNum"> 68 </span><span class="lineCov"> 1744 : s-&gt;crc_uncached = 0;</span>
<span class="lineNum"> 69 </span><span class="lineCov"> 1744 : s-&gt;crc_stream = CRC_IV;</span>
<span class="lineNum"> 70 </span> :
<span class="lineNum"> 71 </span><span class="lineCov"> 1650 : return s;</span>
<span class="lineNum"> 71 </span><span class="lineCov"> 1744 : return s;</span>
<a name="72"><span class="lineNum"> 72 </span> : }</a>
<span class="lineNum"> 73 </span> :
<span class="lineNum"> 74 </span><span class="lineCov"> 928 : STREAM* sopen_multi_write(unsigned count)</span>
<span class="lineNum"> 74 </span><span class="lineCov"> 161 : STREAM* sopen_multi_write(unsigned count)</span>
<span class="lineNum"> 75 </span> : {
<span class="lineNum"> 76 </span> : unsigned i;
<span class="lineNum"> 77 </span> :
<span class="lineNum"> 78 </span><span class="lineCov"> 928 : STREAM* s = malloc_nofail(sizeof(STREAM));</span>
<span class="lineNum"> 78 </span><span class="lineCov"> 161 : STREAM* s = malloc_nofail(sizeof(STREAM));</span>
<span class="lineNum"> 79 </span> :
<span class="lineNum"> 80 </span><span class="lineCov"> 929 : s-&gt;handle_size = count;</span>
<span class="lineNum"> 81 </span><span class="lineCov"> 929 : s-&gt;handle = malloc_nofail(count * sizeof(struct stream_handle));</span>
<span class="lineNum"> 80 </span><span class="lineCov"> 161 : s-&gt;handle_size = count;</span>
<span class="lineNum"> 81 </span><span class="lineCov"> 161 : s-&gt;handle = malloc_nofail(count * sizeof(struct stream_handle));</span>
<span class="lineNum"> 82 </span> :
<span class="lineNum"> 83 </span><span class="lineCov"> 1968 : for (i = 0; i &lt; count; ++i)</span>
<span class="lineNum"> 84 </span><span class="lineCov"> 1040 : s-&gt;handle[i].f = -1;</span>
<span class="lineNum"> 83 </span><span class="lineCov"> 1279 : for (i = 0; i &lt; count; ++i)</span>
<span class="lineNum"> 84 </span><span class="lineCov"> 1118 : s-&gt;handle[i].f = -1;</span>
<span class="lineNum"> 85 </span> :
<span class="lineNum"> 86 </span><span class="lineCov"> 928 : s-&gt;buffer = malloc_nofail_test(STREAM_SIZE);</span>
<span class="lineNum"> 87 </span><span class="lineCov"> 929 : s-&gt;pos = s-&gt;buffer;</span>
<span class="lineNum"> 88 </span><span class="lineCov"> 929 : s-&gt;end = s-&gt;buffer + STREAM_SIZE;</span>
<span class="lineNum"> 89 </span><span class="lineCov"> 929 : s-&gt;state = STREAM_STATE_WRITE;</span>
<span class="lineNum"> 90 </span><span class="lineCov"> 929 : s-&gt;state_index = 0;</span>
<span class="lineNum"> 91 </span><span class="lineCov"> 929 : s-&gt;offset = 0;</span>
<span class="lineNum"> 92 </span><span class="lineCov"> 929 : s-&gt;offset_uncached = 0;</span>
<span class="lineNum"> 93 </span><span class="lineCov"> 929 : s-&gt;crc = 0;</span>
<span class="lineNum"> 94 </span><span class="lineCov"> 929 : s-&gt;crc_uncached = 0;</span>
<span class="lineNum"> 95 </span><span class="lineCov"> 929 : s-&gt;crc_stream = CRC_IV;</span>
<span class="lineNum"> 86 </span><span class="lineCov"> 161 : s-&gt;buffer = malloc_nofail_test(STREAM_SIZE);</span>
<span class="lineNum"> 87 </span><span class="lineCov"> 161 : s-&gt;pos = s-&gt;buffer;</span>
<span class="lineNum"> 88 </span><span class="lineCov"> 161 : s-&gt;end = s-&gt;buffer + STREAM_SIZE;</span>
<span class="lineNum"> 89 </span><span class="lineCov"> 161 : s-&gt;state = STREAM_STATE_WRITE;</span>
<span class="lineNum"> 90 </span><span class="lineCov"> 161 : s-&gt;state_index = 0;</span>
<span class="lineNum"> 91 </span><span class="lineCov"> 161 : s-&gt;offset = 0;</span>
<span class="lineNum"> 92 </span><span class="lineCov"> 161 : s-&gt;offset_uncached = 0;</span>
<span class="lineNum"> 93 </span><span class="lineCov"> 161 : s-&gt;crc = 0;</span>
<span class="lineNum"> 94 </span><span class="lineCov"> 161 : s-&gt;crc_uncached = 0;</span>
<span class="lineNum"> 95 </span><span class="lineCov"> 161 : s-&gt;crc_stream = CRC_IV;</span>
<span class="lineNum"> 96 </span> :
<span class="lineNum"> 97 </span><span class="lineCov"> 929 : return s;</span>
<span class="lineNum"> 97 </span><span class="lineCov"> 161 : return s;</span>
<a name="98"><span class="lineNum"> 98 </span> : }</a>
<span class="lineNum"> 99 </span> :
<span class="lineNum"> 100 </span><span class="lineCov"> 1041 : int sopen_multi_file(STREAM* s, unsigned i, const char* file)</span>
<span class="lineNum"> 100 </span><span class="lineCov"> 1118 : int sopen_multi_file(STREAM* s, unsigned i, const char* file)</span>
<span class="lineNum"> 101 </span> : {
<span class="lineNum"> 102 </span> : #if HAVE_POSIX_FADVISE
<span class="lineNum"> 103 </span> : int ret;
<span class="lineNum"> 104 </span> : #endif
<span class="lineNum"> 105 </span> : int f;
<span class="lineNum"> 106 </span> :
<span class="lineNum"> 107 </span><span class="lineCov"> 1041 : pathcpy(s-&gt;handle[i].path, sizeof(s-&gt;handle[i].path), file);</span>
<span class="lineNum"> 107 </span><span class="lineCov"> 1118 : pathcpy(s-&gt;handle[i].path, sizeof(s-&gt;handle[i].path), file);</span>
<span class="lineNum"> 108 </span> :
<span class="lineNum"> 109 </span><span class="lineCov"> 1041 : f = open(file, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY | O_SEQUENTIAL, 0600);</span>
<span class="lineNum"> 110 </span><span class="lineCov"> 1041 : if (f == -1) {</span>
<span class="lineNum"> 109 </span><span class="lineCov"> 1118 : f = open(file, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY | O_SEQUENTIAL, 0600);</span>
<span class="lineNum"> 110 </span><span class="lineCov"> 1118 : if (f == -1) {</span>
<span class="lineNum"> 111 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 112 </span> : return -1;
<span class="lineNum"> 113 </span> : /* LCOV_EXCL_STOP */
@ -177,8 +177,8 @@
<span class="lineNum"> 115 </span> :
<span class="lineNum"> 116 </span> : #if HAVE_POSIX_FADVISE
<span class="lineNum"> 117 </span> : /* advise sequential access */
<span class="lineNum"> 118 </span><span class="lineCov"> 1041 : ret = posix_fadvise(f, 0, 0, POSIX_FADV_SEQUENTIAL);</span>
<span class="lineNum"> 119 </span><span class="lineCov"> 1041 : if (ret != 0) {</span>
<span class="lineNum"> 118 </span><span class="lineCov"> 1118 : ret = posix_fadvise(f, 0, 0, POSIX_FADV_SEQUENTIAL);</span>
<span class="lineNum"> 119 </span><span class="lineCov"> 1118 : if (ret != 0) {</span>
<span class="lineNum"> 120 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 121 </span> : close(f);
<span class="lineNum"> 122 </span> : return -1;
@ -186,167 +186,167 @@
<span class="lineNum"> 124 </span> : }
<span class="lineNum"> 125 </span> : #endif
<span class="lineNum"> 126 </span> :
<span class="lineNum"> 127 </span><span class="lineCov"> 1041 : s-&gt;handle[i].f = f;</span>
<span class="lineNum"> 127 </span><span class="lineCov"> 1118 : s-&gt;handle[i].f = f;</span>
<span class="lineNum"> 128 </span> :
<span class="lineNum"> 129 </span><span class="lineCov"> 1041 : return 0;</span>
<span class="lineNum"> 129 </span><span class="lineCov"> 1118 : return 0;</span>
<a name="130"><span class="lineNum"> 130 </span> : }</a>
<span class="lineNum"> 131 </span> :
<span class="lineNum"> 132 </span><span class="lineCov"> 913 : STREAM* sopen_write(const char* file)</span>
<span class="lineNum"> 132 </span><span class="lineNoCov"> 0 : STREAM* sopen_write(const char* file)</span>
<span class="lineNum"> 133 </span> : {
<span class="lineNum"> 134 </span><span class="lineCov"> 913 : STREAM* s = sopen_multi_write(1);</span>
<span class="lineNum"> 134 </span><span class="lineNoCov"> 0 : STREAM* s = sopen_multi_write(1);</span>
<span class="lineNum"> 135 </span> :
<span class="lineNum"> 136 </span><span class="lineCov"> 913 : if (sopen_multi_file(s, 0, file) != 0) {</span>
<span class="lineNum"> 136 </span><span class="lineNoCov"> 0 : if (sopen_multi_file(s, 0, file) != 0) {</span>
<span class="lineNum"> 137 </span><span class="lineNoCov"> 0 : sclose(s);</span>
<span class="lineNum"> 138 </span><span class="lineNoCov"> 0 : return 0;</span>
<span class="lineNum"> 139 </span> : }
<span class="lineNum"> 140 </span> :
<span class="lineNum"> 141 </span><span class="lineCov"> 913 : return s;</span>
<span class="lineNum"> 141 </span><span class="lineNoCov"> 0 : return s;</span>
<a name="142"><span class="lineNum"> 142 </span> : }</a>
<span class="lineNum"> 143 </span> :
<span class="lineNum"> 144 </span><span class="lineCov"> 2575 : int sclose(STREAM* s)</span>
<span class="lineNum"> 144 </span><span class="lineCov"> 1903 : int sclose(STREAM* s)</span>
<span class="lineNum"> 145 </span> : {
<span class="lineNum"> 146 </span><span class="lineCov"> 2575 : int fail = 0;</span>
<span class="lineNum"> 146 </span><span class="lineCov"> 1903 : int fail = 0;</span>
<span class="lineNum"> 147 </span> : unsigned i;
<span class="lineNum"> 148 </span> :
<span class="lineNum"> 149 </span><span class="lineCov"> 2575 : if (s-&gt;state == STREAM_STATE_WRITE) {</span>
<span class="lineNum"> 150 </span><span class="lineCov"> 927 : if (sflush(s) != 0) {</span>
<span class="lineNum"> 149 </span><span class="lineCov"> 1903 : if (s-&gt;state == STREAM_STATE_WRITE) {</span>
<span class="lineNum"> 150 </span><span class="lineCov"> 161 : if (sflush(s) != 0) {</span>
<span class="lineNum"> 151 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 152 </span> : fail = 1;
<span class="lineNum"> 153 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 154 </span> : }
<span class="lineNum"> 155 </span> : }
<span class="lineNum"> 156 </span> :
<span class="lineNum"> 157 </span><span class="lineCov"> 5266 : for (i = 0; i &lt; s-&gt;handle_size; ++i) {</span>
<span class="lineNum"> 158 </span><span class="lineCov"> 2688 : if (close(s-&gt;handle[i].f) != 0) {</span>
<span class="lineNum"> 157 </span><span class="lineCov"> 4763 : for (i = 0; i &lt; s-&gt;handle_size; ++i) {</span>
<span class="lineNum"> 158 </span><span class="lineCov"> 2860 : if (close(s-&gt;handle[i].f) != 0) {</span>
<span class="lineNum"> 159 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 160 </span> : fail = 1;
<span class="lineNum"> 161 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 162 </span> : }
<span class="lineNum"> 163 </span> : }
<span class="lineNum"> 164 </span> :
<span class="lineNum"> 165 </span><span class="lineCov"> 2578 : free(s-&gt;handle);</span>
<span class="lineNum"> 166 </span><span class="lineCov"> 2578 : free(s-&gt;buffer);</span>
<span class="lineNum"> 167 </span><span class="lineCov"> 2578 : free(s);</span>
<span class="lineNum"> 165 </span><span class="lineCov"> 1903 : free(s-&gt;handle);</span>
<span class="lineNum"> 166 </span><span class="lineCov"> 1903 : free(s-&gt;buffer);</span>
<span class="lineNum"> 167 </span><span class="lineCov"> 1903 : free(s);</span>
<span class="lineNum"> 168 </span> :
<span class="lineNum"> 169 </span><span class="lineCov"> 2578 : if (fail) {</span>
<span class="lineNum"> 169 </span><span class="lineCov"> 1903 : if (fail) {</span>
<span class="lineNum"> 170 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 171 </span> : return -1;
<span class="lineNum"> 172 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 173 </span> : }
<span class="lineNum"> 174 </span> :
<span class="lineNum"> 175 </span><span class="lineCov"> 2578 : return 0;</span>
<span class="lineNum"> 175 </span><span class="lineCov"> 1903 : return 0;</span>
<a name="176"><span class="lineNum"> 176 </span> : }</a>
<span class="lineNum"> 177 </span> :
<span class="lineNum"> 178 </span><span class="lineCov"> 235 : int shandle(STREAM* s)</span>
<span class="lineNum"> 178 </span><span class="lineCov"> 243 : int shandle(STREAM* s)</span>
<span class="lineNum"> 179 </span> : {
<span class="lineNum"> 180 </span><span class="lineCov"> 235 : if (!s-&gt;handle_size) {</span>
<span class="lineNum"> 180 </span><span class="lineCov"> 243 : if (!s-&gt;handle_size) {</span>
<span class="lineNum"> 181 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 182 </span> : return -1;
<span class="lineNum"> 183 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 184 </span> : }
<span class="lineNum"> 185 </span> :
<span class="lineNum"> 186 </span><span class="lineCov"> 235 : return s-&gt;handle[0].f;</span>
<span class="lineNum"> 186 </span><span class="lineCov"> 243 : return s-&gt;handle[0].f;</span>
<span class="lineNum"> 187 </span> : }
<span class="lineNum"> 188 </span> :
<span class="lineNum"> 189 </span> : /**
<span class="lineNum"> 190 </span> : * Fill the read stream buffer.
<a name="191"><span class="lineNum"> 191 </span> : * \return 0 if at least on char is read, or EOF on error.</a>
<span class="lineNum"> 192 </span> : */
<span class="lineNum"> 193 </span><span class="lineCov"> 606496 : static int sfill(STREAM* s)</span>
<span class="lineNum"> 193 </span><span class="lineCov"> 607118 : static int sfill(STREAM* s)</span>
<span class="lineNum"> 194 </span> : {
<span class="lineNum"> 195 </span> : ssize_t ret;
<span class="lineNum"> 196 </span> :
<span class="lineNum"> 197 </span><span class="lineCov"> 606496 : if (s-&gt;state != STREAM_STATE_READ) {</span>
<span class="lineNum"> 197 </span><span class="lineCov"> 607118 : if (s-&gt;state != STREAM_STATE_READ) {</span>
<span class="lineNum"> 198 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 199 </span> : return EOF;
<span class="lineNum"> 200 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 201 </span> : }
<span class="lineNum"> 202 </span> :
<span class="lineNum"> 203 </span><span class="lineCov"> 605512 : ret = read(s-&gt;handle[0].f, s-&gt;buffer, STREAM_SIZE);</span>
<span class="lineNum"> 203 </span><span class="lineCov"> 606102 : ret = read(s-&gt;handle[0].f, s-&gt;buffer, STREAM_SIZE);</span>
<span class="lineNum"> 204 </span> :
<span class="lineNum"> 205 </span><span class="lineCov"> 605512 : if (ret &lt; 0) {</span>
<span class="lineNum"> 205 </span><span class="lineCov"> 606102 : if (ret &lt; 0) {</span>
<span class="lineNum"> 206 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 207 </span> : s-&gt;state = STREAM_STATE_ERROR;
<span class="lineNum"> 208 </span> : return EOF;
<span class="lineNum"> 209 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 210 </span> : }
<span class="lineNum"> 211 </span><span class="lineCov"> 605512 : if (ret == 0) {</span>
<span class="lineNum"> 212 </span><span class="lineCov"> 1522 : s-&gt;state = STREAM_STATE_EOF;</span>
<span class="lineNum"> 213 </span><span class="lineCov"> 1522 : return EOF;</span>
<span class="lineNum"> 211 </span><span class="lineCov"> 606102 : if (ret == 0) {</span>
<span class="lineNum"> 212 </span><span class="lineCov"> 1615 : s-&gt;state = STREAM_STATE_EOF;</span>
<span class="lineNum"> 213 </span><span class="lineCov"> 1615 : return EOF;</span>
<span class="lineNum"> 214 </span> : }
<span class="lineNum"> 215 </span> :
<span class="lineNum"> 216 </span> : /* update the crc */
<span class="lineNum"> 217 </span><span class="lineCov"> 603990 : s-&gt;crc_uncached = s-&gt;crc;</span>
<span class="lineNum"> 218 </span><span class="lineCov"> 603990 : s-&gt;crc = crc32c(s-&gt;crc, s-&gt;buffer, ret);</span>
<span class="lineNum"> 217 </span><span class="lineCov"> 604487 : s-&gt;crc_uncached = s-&gt;crc;</span>
<span class="lineNum"> 218 </span><span class="lineCov"> 604487 : s-&gt;crc = crc32c(s-&gt;crc, s-&gt;buffer, ret);</span>
<span class="lineNum"> 219 </span> :
<span class="lineNum"> 220 </span> : /* update the offset */
<span class="lineNum"> 221 </span><span class="lineCov"> 603990 : s-&gt;offset_uncached = s-&gt;offset;</span>
<span class="lineNum"> 222 </span><span class="lineCov"> 603990 : s-&gt;offset += ret;</span>
<span class="lineNum"> 221 </span><span class="lineCov"> 604487 : s-&gt;offset_uncached = s-&gt;offset;</span>
<span class="lineNum"> 222 </span><span class="lineCov"> 604487 : s-&gt;offset += ret;</span>
<span class="lineNum"> 223 </span> :
<span class="lineNum"> 224 </span><span class="lineCov"> 603990 : s-&gt;pos = s-&gt;buffer;</span>
<span class="lineNum"> 225 </span><span class="lineCov"> 603990 : s-&gt;end = s-&gt;buffer + ret;</span>
<span class="lineNum"> 224 </span><span class="lineCov"> 604487 : s-&gt;pos = s-&gt;buffer;</span>
<span class="lineNum"> 225 </span><span class="lineCov"> 604487 : s-&gt;end = s-&gt;buffer + ret;</span>
<span class="lineNum"> 226 </span> :
<span class="lineNum"> 227 </span><span class="lineCov"> 603990 : return 0;</span>
<span class="lineNum"> 227 </span><span class="lineCov"> 604487 : return 0;</span>
<a name="228"><span class="lineNum"> 228 </span> : }</a>
<span class="lineNum"> 229 </span> :
<span class="lineNum"> 230 </span><span class="lineCov"> 1042 : int sdeplete(STREAM* s, unsigned char* last)</span>
<span class="lineNum"> 230 </span><span class="lineCov"> 1119 : int sdeplete(STREAM* s, unsigned char* last)</span>
<span class="lineNum"> 231 </span> : {
<span class="lineNum"> 232 </span> : /* last four bytes */
<span class="lineNum"> 233 </span><span class="lineCov"> 1042 : last[0] = 0;</span>
<span class="lineNum"> 234 </span><span class="lineCov"> 1042 : last[1] = 0;</span>
<span class="lineNum"> 235 </span><span class="lineCov"> 1042 : last[2] = 0;</span>
<span class="lineNum"> 236 </span><span class="lineCov"> 1042 : last[3] = 0;</span>
<span class="lineNum"> 233 </span><span class="lineCov"> 1119 : last[0] = 0;</span>
<span class="lineNum"> 234 </span><span class="lineCov"> 1119 : last[1] = 0;</span>
<span class="lineNum"> 235 </span><span class="lineCov"> 1119 : last[2] = 0;</span>
<span class="lineNum"> 236 </span><span class="lineCov"> 1119 : last[3] = 0;</span>
<span class="lineNum"> 237 </span> :
<span class="lineNum"> 238 </span> : while (1) {
<span class="lineNum"> 239 </span> : /* increase the position up to 4 bytes before the end */
<span class="lineNum"> 240 </span><span class="lineCov"> 307911 : if (s-&gt;pos + 4 &lt;= s-&gt;end)</span>
<span class="lineNum"> 241 </span><span class="lineCov"> 148134 : s-&gt;pos = s-&gt;end - 4;</span>
<span class="lineNum"> 240 </span><span class="lineCov"> 308434 : if (s-&gt;pos + 4 &lt;= s-&gt;end)</span>
<span class="lineNum"> 241 </span><span class="lineCov"> 148580 : s-&gt;pos = s-&gt;end - 4;</span>
<span class="lineNum"> 242 </span> :
<span class="lineNum"> 243 </span> : /* insert the last 4 bytes */
<span class="lineNum"> 244 </span><span class="lineCov"> 1468126 : while (s-&gt;pos &lt; s-&gt;end) {</span>
<span class="lineNum"> 245 </span><span class="lineCov"> 852304 : last[0] = last[1];</span>
<span class="lineNum"> 246 </span><span class="lineCov"> 852304 : last[1] = last[2];</span>
<span class="lineNum"> 247 </span><span class="lineCov"> 852304 : last[2] = last[3];</span>
<span class="lineNum"> 248 </span><span class="lineCov"> 852304 : last[3] = *s-&gt;pos++;</span>
<span class="lineNum"> 244 </span><span class="lineCov"> 1470956 : while (s-&gt;pos &lt; s-&gt;end) {</span>
<span class="lineNum"> 245 </span><span class="lineCov"> 854088 : last[0] = last[1];</span>
<span class="lineNum"> 246 </span><span class="lineCov"> 854088 : last[1] = last[2];</span>
<span class="lineNum"> 247 </span><span class="lineCov"> 854088 : last[2] = last[3];</span>
<span class="lineNum"> 248 </span><span class="lineCov"> 854088 : last[3] = *s-&gt;pos++;</span>
<span class="lineNum"> 249 </span> : }
<span class="lineNum"> 250 </span> :
<span class="lineNum"> 251 </span> : /* fill again the buffer until the end of the file */
<span class="lineNum"> 252 </span><span class="lineCov"> 307911 : if (sfill(s) != 0) {</span>
<span class="lineNum"> 252 </span><span class="lineCov"> 308434 : if (sfill(s) != 0) {</span>
<span class="lineNum"> 253 </span> : /* on error fail */
<span class="lineNum"> 254 </span><span class="lineCov"> 1042 : if (serror(s)) {</span>
<span class="lineNum"> 254 </span><span class="lineCov"> 1119 : if (serror(s)) {</span>
<span class="lineNum"> 255 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 256 </span> : return EOF;
<span class="lineNum"> 257 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 258 </span> : }
<span class="lineNum"> 259 </span> :
<span class="lineNum"> 260 </span> : /* on EOF terminate */
<span class="lineNum"> 261 </span><span class="lineCov"> 1042 : break;</span>
<span class="lineNum"> 261 </span><span class="lineCov"> 1119 : break;</span>
<span class="lineNum"> 262 </span> : }
<span class="lineNum"> 263 </span><span class="lineCov"> 306869 : }</span>
<span class="lineNum"> 263 </span><span class="lineCov"> 307315 : }</span>
<span class="lineNum"> 264 </span> :
<span class="lineNum"> 265 </span><span class="lineCov"> 1042 : return 0;</span>
<span class="lineNum"> 265 </span><span class="lineCov"> 1119 : return 0;</span>
<a name="266"><span class="lineNum"> 266 </span> : }</a>
<span class="lineNum"> 267 </span> :
<span class="lineNum"> 268 </span><span class="lineCov"> 52590 : int sflush(STREAM* s)</span>
<span class="lineNum"> 268 </span><span class="lineCov"> 39024 : int sflush(STREAM* s)</span>
<span class="lineNum"> 269 </span> : {
<span class="lineNum"> 270 </span> : ssize_t ret;
<span class="lineNum"> 271 </span> : ssize_t size;
<span class="lineNum"> 272 </span> : unsigned i;
<span class="lineNum"> 273 </span> :
<span class="lineNum"> 274 </span><span class="lineCov"> 52590 : if (s-&gt;state != STREAM_STATE_WRITE) {</span>
<span class="lineNum"> 274 </span><span class="lineCov"> 39024 : if (s-&gt;state != STREAM_STATE_WRITE) {</span>
<span class="lineNum"> 275 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 276 </span> : return EOF;
<span class="lineNum"> 277 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 278 </span> : }
<span class="lineNum"> 279 </span> :
<span class="lineNum"> 280 </span><span class="lineCov"> 52590 : size = s-&gt;pos - s-&gt;buffer;</span>
<span class="lineNum"> 281 </span><span class="lineCov"> 52590 : if (!size)</span>
<span class="lineNum"> 282 </span><span class="lineCov"> 909 : return 0;</span>
<span class="lineNum"> 280 </span><span class="lineCov"> 39024 : size = s-&gt;pos - s-&gt;buffer;</span>
<span class="lineNum"> 281 </span><span class="lineCov"> 39024 : if (!size)</span>
<span class="lineNum"> 282 </span><span class="lineCov"> 145 : return 0;</span>
<span class="lineNum"> 283 </span> :
<span class="lineNum"> 284 </span><span class="lineCov"> 359449 : for (i = 0; i &lt; s-&gt;handle_size; ++i) {</span>
<span class="lineNum"> 285 </span><span class="lineCov"> 307768 : ret = write(s-&gt;handle[i].f, s-&gt;buffer, size);</span>
<span class="lineNum"> 284 </span><span class="lineCov"> 347171 : for (i = 0; i &lt; s-&gt;handle_size; ++i) {</span>
<span class="lineNum"> 285 </span><span class="lineCov"> 308292 : ret = write(s-&gt;handle[i].f, s-&gt;buffer, size);</span>
<span class="lineNum"> 286 </span> :
<span class="lineNum"> 287 </span><span class="lineCov"> 307768 : if (ret != size) {</span>
<span class="lineNum"> 287 </span><span class="lineCov"> 308292 : if (ret != size) {</span>
<span class="lineNum"> 288 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 289 </span> : s-&gt;state = STREAM_STATE_ERROR;
<span class="lineNum"> 290 </span> : s-&gt;state_index = i;
@ -362,16 +362,16 @@
<span class="lineNum"> 300 </span> : * to be able to detect memory errors on the buffer,
<span class="lineNum"> 301 </span> : * happening during the write.
<span class="lineNum"> 302 </span> : */
<span class="lineNum"> 303 </span><span class="lineCov"> 51681 : s-&gt;crc = crc32c(s-&gt;crc, s-&gt;buffer, size);</span>
<span class="lineNum"> 304 </span><span class="lineCov"> 51680 : s-&gt;crc_uncached = s-&gt;crc;</span>
<span class="lineNum"> 303 </span><span class="lineCov"> 38879 : s-&gt;crc = crc32c(s-&gt;crc, s-&gt;buffer, size);</span>
<span class="lineNum"> 304 </span><span class="lineCov"> 38879 : s-&gt;crc_uncached = s-&gt;crc;</span>
<span class="lineNum"> 305 </span> :
<span class="lineNum"> 306 </span> : /* update the offset */
<span class="lineNum"> 307 </span><span class="lineCov"> 51680 : s-&gt;offset += size;</span>
<span class="lineNum"> 308 </span><span class="lineCov"> 51680 : s-&gt;offset_uncached = s-&gt;offset;</span>
<span class="lineNum"> 307 </span><span class="lineCov"> 38879 : s-&gt;offset += size;</span>
<span class="lineNum"> 308 </span><span class="lineCov"> 38879 : s-&gt;offset_uncached = s-&gt;offset;</span>
<span class="lineNum"> 309 </span> :
<span class="lineNum"> 310 </span><span class="lineCov"> 51680 : s-&gt;pos = s-&gt;buffer;</span>
<span class="lineNum"> 310 </span><span class="lineCov"> 38879 : s-&gt;pos = s-&gt;buffer;</span>
<span class="lineNum"> 311 </span> :
<span class="lineNum"> 312 </span><span class="lineCov"> 51680 : return 0;</span>
<span class="lineNum"> 312 </span><span class="lineCov"> 38879 : return 0;</span>
<a name="313"><span class="lineNum"> 313 </span> : }</a>
<span class="lineNum"> 314 </span> :
<span class="lineNum"> 315 </span><span class="lineCov"> 1 : int64_t stell(STREAM* s)</span>
@ -379,100 +379,100 @@
<span class="lineNum"> 317 </span><span class="lineCov"> 1 : return s-&gt;offset_uncached + (s-&gt;pos - s-&gt;buffer);</span>
<a name="318"><span class="lineNum"> 318 </span> : }</a>
<span class="lineNum"> 319 </span> :
<span class="lineNum"> 320 </span><span class="lineCov"> 2333 : uint32_t scrc(STREAM*s)</span>
<span class="lineNum"> 320 </span><span class="lineCov"> 1650 : uint32_t scrc(STREAM*s)</span>
<span class="lineNum"> 321 </span> : {
<span class="lineNum"> 322 </span><span class="lineCov"> 2333 : return crc32c(s-&gt;crc_uncached, s-&gt;buffer, s-&gt;pos - s-&gt;buffer);</span>
<span class="lineNum"> 322 </span><span class="lineCov"> 1650 : return crc32c(s-&gt;crc_uncached, s-&gt;buffer, s-&gt;pos - s-&gt;buffer);</span>
<a name="323"><span class="lineNum"> 323 </span> : }</a>
<span class="lineNum"> 324 </span> :
<span class="lineNum"> 325 </span><span class="lineCov"> 929 : uint32_t scrc_stream(STREAM*s)</span>
<span class="lineNum"> 325 </span><span class="lineCov"> 161 : uint32_t scrc_stream(STREAM*s)</span>
<span class="lineNum"> 326 </span> : {
<span class="lineNum"> 327 </span><span class="lineCov"> 929 : return s-&gt;crc_stream ^ CRC_IV;</span>
<span class="lineNum"> 327 </span><span class="lineCov"> 161 : return s-&gt;crc_stream ^ CRC_IV;</span>
<a name="328"><span class="lineNum"> 328 </span> : }</a>
<span class="lineNum"> 329 </span> :
<span class="lineNum"> 330 </span><span class="lineCov"> 298585 : int sgetc_uncached(STREAM* s)</span>
<span class="lineNum"> 330 </span><span class="lineCov"> 298684 : int sgetc_uncached(STREAM* s)</span>
<span class="lineNum"> 331 </span> : {
<span class="lineNum"> 332 </span> : /* if at the end of the buffer, fill it */
<span class="lineNum"> 333 </span><span class="lineCov"> 298585 : if (s-&gt;pos == s-&gt;end &amp;&amp; sfill(s) != 0)</span>
<span class="lineNum"> 334 </span><span class="lineCov"> 1464 : return EOF;</span>
<span class="lineNum"> 335 </span><span class="lineCov"> 297121 : return *s-&gt;pos++;</span>
<span class="lineNum"> 333 </span><span class="lineCov"> 298684 : if (s-&gt;pos == s-&gt;end &amp;&amp; sfill(s) != 0)</span>
<span class="lineNum"> 334 </span><span class="lineCov"> 1512 : return EOF;</span>
<span class="lineNum"> 335 </span><span class="lineCov"> 297172 : return *s-&gt;pos++;</span>
<a name="336"><span class="lineNum"> 336 </span> : }</a>
<span class="lineNum"> 337 </span> :
<span class="lineNum"> 338 </span><span class="lineCov"> 7623 : int sgettok(STREAM* f, char* str, int size)</span>
<span class="lineNum"> 338 </span><span class="lineCov"> 7892 : int sgettok(STREAM* f, char* str, int size)</span>
<span class="lineNum"> 339 </span> : {
<span class="lineNum"> 340 </span><span class="lineCov"> 7623 : char* i = str;</span>
<span class="lineNum"> 341 </span><span class="lineCov"> 7623 : char* send = str + size;</span>
<span class="lineNum"> 340 </span><span class="lineCov"> 7892 : char* i = str;</span>
<span class="lineNum"> 341 </span><span class="lineCov"> 7892 : char* send = str + size;</span>
<span class="lineNum"> 342 </span> : int c;
<span class="lineNum"> 343 </span> :
<span class="lineNum"> 344 </span> : while (1) {
<span class="lineNum"> 345 </span><span class="lineCov"> 50866 : c = sgetc(f);</span>
<span class="lineNum"> 346 </span><span class="lineCov"> 50866 : if (c == EOF) {</span>
<span class="lineNum"> 347 </span><span class="lineCov"> 246 : break;</span>
<span class="lineNum"> 345 </span><span class="lineCov"> 52707 : c = sgetc(f);</span>
<span class="lineNum"> 346 </span><span class="lineCov"> 52707 : if (c == EOF) {</span>
<span class="lineNum"> 347 </span><span class="lineCov"> 254 : break;</span>
<span class="lineNum"> 348 </span> : }
<span class="lineNum"> 349 </span><span class="lineCov"> 50620 : if (c == ' ' || c == '\t') {</span>
<span class="lineNum"> 350 </span><span class="lineCov"> 7131 : sungetc(c, f);</span>
<span class="lineNum"> 351 </span><span class="lineCov"> 7131 : break;</span>
<span class="lineNum"> 349 </span><span class="lineCov"> 52453 : if (c == ' ' || c == '\t') {</span>
<span class="lineNum"> 350 </span><span class="lineCov"> 7383 : sungetc(c, f);</span>
<span class="lineNum"> 351 </span><span class="lineCov"> 7383 : break;</span>
<span class="lineNum"> 352 </span> : }
<span class="lineNum"> 353 </span><span class="lineCov"> 43489 : if (c == '\n') {</span>
<span class="lineNum"> 353 </span><span class="lineCov"> 45070 : if (c == '\n') {</span>
<span class="lineNum"> 354 </span> : /* remove ending carrige return to support the Windows CR+LF format */
<span class="lineNum"> 355 </span><span class="lineCov"> 246 : if (i != str &amp;&amp; i[-1] == '\r')</span>
<span class="lineNum"> 355 </span><span class="lineCov"> 255 : if (i != str &amp;&amp; i[-1] == '\r')</span>
<span class="lineNum"> 356 </span><span class="lineNoCov"> 0 : --i;</span>
<span class="lineNum"> 357 </span><span class="lineCov"> 246 : sungetc(c, f);</span>
<span class="lineNum"> 358 </span><span class="lineCov"> 246 : break;</span>
<span class="lineNum"> 357 </span><span class="lineCov"> 255 : sungetc(c, f);</span>
<span class="lineNum"> 358 </span><span class="lineCov"> 255 : break;</span>
<span class="lineNum"> 359 </span> : }
<span class="lineNum"> 360 </span> :
<span class="lineNum"> 361 </span><span class="lineCov"> 43243 : *i++ = c;</span>
<span class="lineNum"> 361 </span><span class="lineCov"> 44815 : *i++ = c;</span>
<span class="lineNum"> 362 </span> :
<span class="lineNum"> 363 </span><span class="lineCov"> 43243 : if (i == send) {</span>
<span class="lineNum"> 363 </span><span class="lineCov"> 44815 : if (i == send) {</span>
<span class="lineNum"> 364 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 365 </span> : return -1;
<span class="lineNum"> 366 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 367 </span> : }
<span class="lineNum"> 368 </span><span class="lineCov"> 43243 : }</span>
<span class="lineNum"> 368 </span><span class="lineCov"> 44815 : }</span>
<span class="lineNum"> 369 </span> :
<span class="lineNum"> 370 </span><span class="lineCov"> 7623 : *i = 0;</span>
<span class="lineNum"> 370 </span><span class="lineCov"> 7892 : *i = 0;</span>
<span class="lineNum"> 371 </span> :
<span class="lineNum"> 372 </span><span class="lineCov"> 7623 : return i - str;</span>
<span class="lineNum"> 372 </span><span class="lineCov"> 7892 : return i - str;</span>
<a name="373"><span class="lineNum"> 373 </span> : }</a>
<span class="lineNum"> 374 </span> :
<span class="lineNum"> 375 </span><span class="lineCov"> 12342909 : int sread(STREAM* f, void* void_data, unsigned size)</span>
<span class="lineNum"> 375 </span><span class="lineCov"> 12515245 : int sread(STREAM* f, void* void_data, unsigned size)</span>
<span class="lineNum"> 376 </span> : {
<span class="lineNum"> 377 </span><span class="lineCov"> 12342909 : unsigned char* data = void_data;</span>
<span class="lineNum"> 377 </span><span class="lineCov"> 12515245 : unsigned char* data = void_data;</span>
<span class="lineNum"> 378 </span> :
<span class="lineNum"> 379 </span> : /* if there is enough space in memory */
<span class="lineNum"> 380 </span><span class="lineCov"> 12342909 : if (sptrlookup(f, size)) {</span>
<span class="lineNum"> 380 </span><span class="lineCov"> 12515245 : if (sptrlookup(f, size)) {</span>
<span class="lineNum"> 381 </span> : /* optimized version with all the data in memory */
<span class="lineNum"> 382 </span><span class="lineCov"> 12316849 : unsigned char* pos = sptrget(f);</span>
<span class="lineNum"> 382 </span><span class="lineCov"> 12489054 : unsigned char* pos = sptrget(f);</span>
<span class="lineNum"> 383 </span> :
<span class="lineNum"> 384 </span> : /* copy it */
<span class="lineNum"> 385 </span><span class="lineCov"> 209697747 : while (size--)</span>
<span class="lineNum"> 386 </span><span class="lineCov"> 185064049 : *data++ = *pos++;</span>
<span class="lineNum"> 385 </span><span class="lineCov"> 212622570 : while (size--)</span>
<span class="lineNum"> 386 </span><span class="lineCov"> 187644462 : *data++ = *pos++;</span>
<span class="lineNum"> 387 </span> :
<span class="lineNum"> 388 </span><span class="lineCov"> 12316849 : sptrset(f, pos);</span>
<span class="lineNum"> 388 </span><span class="lineCov"> 12489054 : sptrset(f, pos);</span>
<span class="lineNum"> 389 </span> : } else {
<span class="lineNum"> 390 </span> : /* standard version using sgetc() */
<span class="lineNum"> 391 </span><span class="lineCov"> 1373859 : while (size--) {</span>
<span class="lineNum"> 392 </span><span class="lineCov"> 1321739 : int c = sgetc(f);</span>
<span class="lineNum"> 393 </span><span class="lineCov"> 1321739 : if (c == EOF) {</span>
<span class="lineNum"> 391 </span><span class="lineCov"> 1376682 : while (size--) {</span>
<span class="lineNum"> 392 </span><span class="lineCov"> 1324300 : int c = sgetc(f);</span>
<span class="lineNum"> 393 </span><span class="lineCov"> 1324300 : if (c == EOF) {</span>
<span class="lineNum"> 394 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 395 </span> : return -1;
<span class="lineNum"> 396 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 397 </span> : }
<span class="lineNum"> 398 </span> :
<span class="lineNum"> 399 </span><span class="lineCov"> 1321739 : *data++ = c;</span>
<span class="lineNum"> 399 </span><span class="lineCov"> 1324300 : *data++ = c;</span>
<span class="lineNum"> 400 </span> : }
<span class="lineNum"> 401 </span> : }
<span class="lineNum"> 402 </span> :
<span class="lineNum"> 403 </span><span class="lineCov"> 12342909 : return 0;</span>
<span class="lineNum"> 403 </span><span class="lineCov"> 12515245 : return 0;</span>
<a name="404"><span class="lineNum"> 404 </span> : }</a>
<span class="lineNum"> 405 </span> :
<span class="lineNum"> 406 </span><span class="lineCov"> 5069 : int sgetline(STREAM* f, char* str, int size)</span>
<span class="lineNum"> 406 </span><span class="lineCov"> 5251 : int sgetline(STREAM* f, char* str, int size)</span>
<span class="lineNum"> 407 </span> : {
<span class="lineNum"> 408 </span><span class="lineCov"> 5069 : char* i = str;</span>
<span class="lineNum"> 409 </span><span class="lineCov"> 5069 : char* send = str + size;</span>
<span class="lineNum"> 408 </span><span class="lineCov"> 5251 : char* i = str;</span>
<span class="lineNum"> 409 </span><span class="lineCov"> 5251 : char* send = str + size;</span>
<span class="lineNum"> 410 </span> : int c;
<span class="lineNum"> 411 </span> :
<span class="lineNum"> 412 </span> : /* if there is enough data in memory */
<span class="lineNum"> 413 </span><span class="lineCov"> 5069 : if (sptrlookup(f, size)) {</span>
<span class="lineNum"> 413 </span><span class="lineCov"> 5251 : if (sptrlookup(f, size)) {</span>
<span class="lineNum"> 414 </span> : /* optimized version with all the data in memory */
<span class="lineNum"> 415 </span><span class="lineNoCov"> 0 : unsigned char* pos = sptrget(f);</span>
<span class="lineNum"> 416 </span> :
@ -498,75 +498,75 @@
<span class="lineNum"> 436 </span><span class="lineNoCov"> 0 : sptrset(f, pos);</span>
<span class="lineNum"> 437 </span> : } else {
<span class="lineNum"> 438 </span> : while (1) {
<span class="lineNum"> 439 </span><span class="lineCov"> 68948 : c = sgetc(f);</span>
<span class="lineNum"> 440 </span><span class="lineCov"> 68948 : if (c == EOF) {</span>
<span class="lineNum"> 439 </span><span class="lineCov"> 71440 : c = sgetc(f);</span>
<span class="lineNum"> 440 </span><span class="lineCov"> 71440 : if (c == EOF) {</span>
<span class="lineNum"> 441 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 442 </span> : break;
<span class="lineNum"> 443 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 444 </span> : }
<span class="lineNum"> 445 </span><span class="lineCov"> 68948 : if (c == '\n') {</span>
<span class="lineNum"> 445 </span><span class="lineCov"> 71440 : if (c == '\n') {</span>
<span class="lineNum"> 446 </span> : /* remove ending carrige return to support the Windows CR+LF format */
<span class="lineNum"> 447 </span><span class="lineCov"> 5069 : if (i != str &amp;&amp; i[-1] == '\r')</span>
<span class="lineNum"> 447 </span><span class="lineCov"> 5251 : if (i != str &amp;&amp; i[-1] == '\r')</span>
<span class="lineNum"> 448 </span><span class="lineNoCov"> 0 : --i;</span>
<span class="lineNum"> 449 </span><span class="lineCov"> 5069 : sungetc(c, f);</span>
<span class="lineNum"> 450 </span><span class="lineCov"> 5069 : break;</span>
<span class="lineNum"> 449 </span><span class="lineCov"> 5251 : sungetc(c, f);</span>
<span class="lineNum"> 450 </span><span class="lineCov"> 5251 : break;</span>
<span class="lineNum"> 451 </span> : }
<span class="lineNum"> 452 </span> :
<span class="lineNum"> 453 </span><span class="lineCov"> 63879 : *i++ = c;</span>
<span class="lineNum"> 453 </span><span class="lineCov"> 66189 : *i++ = c;</span>
<span class="lineNum"> 454 </span> :
<span class="lineNum"> 455 </span><span class="lineCov"> 63879 : if (i == send) {</span>
<span class="lineNum"> 455 </span><span class="lineCov"> 66189 : if (i == send) {</span>
<span class="lineNum"> 456 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 457 </span> : return -1;
<span class="lineNum"> 458 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 459 </span> : }
<span class="lineNum"> 460 </span><span class="lineCov"> 63879 : }</span>
<span class="lineNum"> 460 </span><span class="lineCov"> 66189 : }</span>
<span class="lineNum"> 461 </span> : }
<span class="lineNum"> 462 </span> :
<span class="lineNum"> 463 </span><span class="lineCov"> 5069 : *i = 0;</span>
<span class="lineNum"> 463 </span><span class="lineCov"> 5251 : *i = 0;</span>
<span class="lineNum"> 464 </span> :
<span class="lineNum"> 465 </span><span class="lineCov"> 5069 : return i - str;</span>
<span class="lineNum"> 465 </span><span class="lineCov"> 5251 : return i - str;</span>
<a name="466"><span class="lineNum"> 466 </span> : }</a>
<span class="lineNum"> 467 </span> :
<span class="lineNum"> 468 </span><span class="lineCov"> 5035 : int sgetlasttok(STREAM* f, char* str, int size)</span>
<span class="lineNum"> 468 </span><span class="lineCov"> 5217 : int sgetlasttok(STREAM* f, char* str, int size)</span>
<span class="lineNum"> 469 </span> : {
<span class="lineNum"> 470 </span> : int ret;
<span class="lineNum"> 471 </span> :
<span class="lineNum"> 472 </span><span class="lineCov"> 5035 : ret = sgetline(f, str, size);</span>
<span class="lineNum"> 473 </span><span class="lineCov"> 5035 : if (ret &lt; 0) {</span>
<span class="lineNum"> 472 </span><span class="lineCov"> 5217 : ret = sgetline(f, str, size);</span>
<span class="lineNum"> 473 </span><span class="lineCov"> 5217 : if (ret &lt; 0) {</span>
<span class="lineNum"> 474 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 475 </span> : return ret;
<span class="lineNum"> 476 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 477 </span> : }
<span class="lineNum"> 478 </span> :
<span class="lineNum"> 479 </span><span class="lineCov"> 10070 : while (ret &gt; 0 &amp;&amp; (str[ret - 1] == ' ' || str[ret - 1] == '\t'))</span>
<span class="lineNum"> 479 </span><span class="lineCov"> 10434 : while (ret &gt; 0 &amp;&amp; (str[ret - 1] == ' ' || str[ret - 1] == '\t'))</span>
<span class="lineNum"> 480 </span><span class="lineNoCov"> 0 : --ret;</span>
<span class="lineNum"> 481 </span> :
<span class="lineNum"> 482 </span><span class="lineCov"> 5035 : str[ret] = 0;</span>
<span class="lineNum"> 482 </span><span class="lineCov"> 5217 : str[ret] = 0;</span>
<span class="lineNum"> 483 </span> :
<span class="lineNum"> 484 </span><span class="lineCov"> 5035 : return ret;</span>
<span class="lineNum"> 484 </span><span class="lineCov"> 5217 : return ret;</span>
<a name="485"><span class="lineNum"> 485 </span> : }</a>
<span class="lineNum"> 486 </span> :
<span class="lineNum"> 487 </span><span class="lineCov"> 247 : int sgetu32(STREAM* f, uint32_t* value)</span>
<span class="lineNum"> 487 </span><span class="lineCov"> 255 : int sgetu32(STREAM* f, uint32_t* value)</span>
<span class="lineNum"> 488 </span> : {
<span class="lineNum"> 489 </span> : int c;
<span class="lineNum"> 490 </span> :
<span class="lineNum"> 491 </span><span class="lineCov"> 247 : c = sgetc(f);</span>
<span class="lineNum"> 492 </span><span class="lineCov"> 247 : if (c &gt;= '0' &amp;&amp; c &lt;= '9') {</span>
<span class="lineNum"> 491 </span><span class="lineCov"> 255 : c = sgetc(f);</span>
<span class="lineNum"> 492 </span><span class="lineCov"> 255 : if (c &gt;= '0' &amp;&amp; c &lt;= '9') {</span>
<span class="lineNum"> 493 </span> : uint32_t v;
<span class="lineNum"> 494 </span> :
<span class="lineNum"> 495 </span><span class="lineCov"> 247 : v = c - '0';</span>
<span class="lineNum"> 495 </span><span class="lineCov"> 255 : v = c - '0';</span>
<span class="lineNum"> 496 </span> :
<span class="lineNum"> 497 </span><span class="lineCov"> 247 : c = sgetc(f);</span>
<span class="lineNum"> 498 </span><span class="lineCov"> 494 : while (c &gt;= '0' &amp;&amp; c &lt;= '9') {</span>
<span class="lineNum"> 497 </span><span class="lineCov"> 255 : c = sgetc(f);</span>
<span class="lineNum"> 498 </span><span class="lineCov"> 510 : while (c &gt;= '0' &amp;&amp; c &lt;= '9') {</span>
<span class="lineNum"> 499 </span><span class="lineNoCov"> 0 : v *= 10;</span>
<span class="lineNum"> 500 </span><span class="lineNoCov"> 0 : v += c - '0';</span>
<span class="lineNum"> 501 </span><span class="lineNoCov"> 0 : c = sgetc(f);</span>
<span class="lineNum"> 502 </span> : }
<span class="lineNum"> 503 </span> :
<span class="lineNum"> 504 </span><span class="lineCov"> 247 : *value = v;</span>
<span class="lineNum"> 504 </span><span class="lineCov"> 255 : *value = v;</span>
<span class="lineNum"> 505 </span> :
<span class="lineNum"> 506 </span><span class="lineCov"> 247 : sungetc(c, f);</span>
<span class="lineNum"> 507 </span><span class="lineCov"> 247 : return 0;</span>
<span class="lineNum"> 506 </span><span class="lineCov"> 255 : sungetc(c, f);</span>
<span class="lineNum"> 507 </span><span class="lineCov"> 255 : return 0;</span>
<span class="lineNum"> 508 </span> : } else {
<span class="lineNum"> 509 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 510 </span> : /* nothing read */
@ -575,122 +575,122 @@
<span class="lineNum"> 513 </span> : }
<a name="514"><span class="lineNum"> 514 </span> : }</a>
<span class="lineNum"> 515 </span> :
<span class="lineNum"> 516 </span><span class="lineCov"> 18710390 : int sgetb32(STREAM* f, uint32_t* value)</span>
<span class="lineNum"> 516 </span><span class="lineCov"> 18259411 : int sgetb32(STREAM* f, uint32_t* value)</span>
<span class="lineNum"> 517 </span> : {
<span class="lineNum"> 518 </span> : uint32_t v;
<span class="lineNum"> 519 </span> : unsigned char b;
<span class="lineNum"> 520 </span> : unsigned char s;
<span class="lineNum"> 521 </span> : int c;
<span class="lineNum"> 522 </span> :
<span class="lineNum"> 523 </span><span class="lineCov"> 18710390 : v = 0;</span>
<span class="lineNum"> 524 </span><span class="lineCov"> 18710390 : s = 0;</span>
<span class="lineNum"> 523 </span><span class="lineCov"> 18259411 : v = 0;</span>
<span class="lineNum"> 524 </span><span class="lineCov"> 18259411 : s = 0;</span>
<span class="lineNum"> 525 </span> : loop:
<span class="lineNum"> 526 </span><span class="lineCov"> 35314985 : c = sgetc(f);</span>
<span class="lineNum"> 527 </span><span class="lineCov"> 35314985 : if (c == EOF) {</span>
<span class="lineNum"> 526 </span><span class="lineCov"> 35244347 : c = sgetc(f);</span>
<span class="lineNum"> 527 </span><span class="lineCov"> 35244347 : if (c == EOF) {</span>
<span class="lineNum"> 528 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 529 </span> : return -1;
<span class="lineNum"> 530 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 531 </span> : }
<span class="lineNum"> 532 </span> :
<span class="lineNum"> 533 </span><span class="lineCov"> 35314985 : b = (unsigned char)c;</span>
<span class="lineNum"> 534 </span><span class="lineCov"> 35314985 : if ((b &amp; 0x80) == 0) {</span>
<span class="lineNum"> 535 </span><span class="lineCov"> 16604595 : v |= (uint32_t)b &lt;&lt; s;</span>
<span class="lineNum"> 536 </span><span class="lineCov"> 16604595 : s += 7;</span>
<span class="lineNum"> 537 </span><span class="lineCov"> 16604595 : if (s &gt;= 32) {</span>
<span class="lineNum"> 533 </span><span class="lineCov"> 35244347 : b = (unsigned char)c;</span>
<span class="lineNum"> 534 </span><span class="lineCov"> 35244347 : if ((b &amp; 0x80) == 0) {</span>
<span class="lineNum"> 535 </span><span class="lineCov"> 16984936 : v |= (uint32_t)b &lt;&lt; s;</span>
<span class="lineNum"> 536 </span><span class="lineCov"> 16984936 : s += 7;</span>
<span class="lineNum"> 537 </span><span class="lineCov"> 16984936 : if (s &gt;= 32) {</span>
<span class="lineNum"> 538 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 539 </span> : return -1;
<span class="lineNum"> 540 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 541 </span> : }
<span class="lineNum"> 542 </span><span class="lineCov"> 16604595 : goto loop;</span>
<span class="lineNum"> 542 </span><span class="lineCov"> 16984936 : goto loop;</span>
<span class="lineNum"> 543 </span> : }
<span class="lineNum"> 544 </span> :
<span class="lineNum"> 545 </span><span class="lineCov"> 18710390 : v |= (uint32_t)(b &amp; 0x7f) &lt;&lt; s;</span>
<span class="lineNum"> 545 </span><span class="lineCov"> 18259411 : v |= (uint32_t)(b &amp; 0x7f) &lt;&lt; s;</span>
<span class="lineNum"> 546 </span> :
<span class="lineNum"> 547 </span><span class="lineCov"> 18710390 : *value = v;</span>
<span class="lineNum"> 547 </span><span class="lineCov"> 18259411 : *value = v;</span>
<span class="lineNum"> 548 </span> :
<span class="lineNum"> 549 </span><span class="lineCov"> 18710390 : return 0;</span>
<span class="lineNum"> 549 </span><span class="lineCov"> 18259411 : return 0;</span>
<a name="550"><span class="lineNum"> 550 </span> : }</a>
<span class="lineNum"> 551 </span> :
<span class="lineNum"> 552 </span><span class="lineCov"> 10465937 : int sgetb64(STREAM* f, uint64_t* value)</span>
<span class="lineNum"> 552 </span><span class="lineCov"> 10605158 : int sgetb64(STREAM* f, uint64_t* value)</span>
<span class="lineNum"> 553 </span> : {
<span class="lineNum"> 554 </span> : uint64_t v;
<span class="lineNum"> 555 </span> : unsigned char b;
<span class="lineNum"> 556 </span> : unsigned char s;
<span class="lineNum"> 557 </span> : int c;
<span class="lineNum"> 558 </span> :
<span class="lineNum"> 559 </span><span class="lineCov"> 10465937 : v = 0;</span>
<span class="lineNum"> 560 </span><span class="lineCov"> 10465937 : s = 0;</span>
<span class="lineNum"> 559 </span><span class="lineCov"> 10605158 : v = 0;</span>
<span class="lineNum"> 560 </span><span class="lineCov"> 10605158 : s = 0;</span>
<span class="lineNum"> 561 </span> : loop:
<span class="lineNum"> 562 </span><span class="lineCov"> 38271575 : c = sgetc(f);</span>
<span class="lineNum"> 563 </span><span class="lineCov"> 38271575 : if (c == EOF) {</span>
<span class="lineNum"> 562 </span><span class="lineCov"> 38780587 : c = sgetc(f);</span>
<span class="lineNum"> 563 </span><span class="lineCov"> 38780587 : if (c == EOF) {</span>
<span class="lineNum"> 564 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 565 </span> : return -1;
<span class="lineNum"> 566 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 567 </span> : }
<span class="lineNum"> 568 </span> :
<span class="lineNum"> 569 </span><span class="lineCov"> 38271575 : b = (unsigned char)c;</span>
<span class="lineNum"> 570 </span><span class="lineCov"> 38271575 : if ((b &amp; 0x80) == 0) {</span>
<span class="lineNum"> 571 </span><span class="lineCov"> 27805638 : v |= (uint64_t)b &lt;&lt; s;</span>
<span class="lineNum"> 572 </span><span class="lineCov"> 27805638 : s += 7;</span>
<span class="lineNum"> 573 </span><span class="lineCov"> 27805638 : if (s &gt;= 64) {</span>
<span class="lineNum"> 569 </span><span class="lineCov"> 38780587 : b = (unsigned char)c;</span>
<span class="lineNum"> 570 </span><span class="lineCov"> 38780587 : if ((b &amp; 0x80) == 0) {</span>
<span class="lineNum"> 571 </span><span class="lineCov"> 28175429 : v |= (uint64_t)b &lt;&lt; s;</span>
<span class="lineNum"> 572 </span><span class="lineCov"> 28175429 : s += 7;</span>
<span class="lineNum"> 573 </span><span class="lineCov"> 28175429 : if (s &gt;= 64) {</span>
<span class="lineNum"> 574 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 575 </span> : return -1;
<span class="lineNum"> 576 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 577 </span> : }
<span class="lineNum"> 578 </span><span class="lineCov"> 27805638 : goto loop;</span>
<span class="lineNum"> 578 </span><span class="lineCov"> 28175429 : goto loop;</span>
<span class="lineNum"> 579 </span> : }
<span class="lineNum"> 580 </span> :
<span class="lineNum"> 581 </span><span class="lineCov"> 10465937 : v |= (uint64_t)(b &amp; 0x7f) &lt;&lt; s;</span>
<span class="lineNum"> 581 </span><span class="lineCov"> 10605158 : v |= (uint64_t)(b &amp; 0x7f) &lt;&lt; s;</span>
<span class="lineNum"> 582 </span> :
<span class="lineNum"> 583 </span><span class="lineCov"> 10465937 : *value = v;</span>
<span class="lineNum"> 583 </span><span class="lineCov"> 10605158 : *value = v;</span>
<span class="lineNum"> 584 </span> :
<span class="lineNum"> 585 </span><span class="lineCov"> 10465937 : return 0;</span>
<span class="lineNum"> 585 </span><span class="lineCov"> 10605158 : return 0;</span>
<a name="586"><span class="lineNum"> 586 </span> : }</a>
<span class="lineNum"> 587 </span> :
<span class="lineNum"> 588 </span><span class="lineCov"> 362 : int sgetble32(STREAM* f, uint32_t* value)</span>
<span class="lineNum"> 588 </span><span class="lineCov"> 370 : int sgetble32(STREAM* f, uint32_t* value)</span>
<span class="lineNum"> 589 </span> : {
<span class="lineNum"> 590 </span> : unsigned char buf[4];
<span class="lineNum"> 591 </span> :
<span class="lineNum"> 592 </span><span class="lineCov"> 362 : if (sread(f, buf, 4) != 0) {</span>
<span class="lineNum"> 592 </span><span class="lineCov"> 370 : if (sread(f, buf, 4) != 0) {</span>
<span class="lineNum"> 593 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 594 </span> : return -1;
<span class="lineNum"> 595 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 596 </span> : }
<span class="lineNum"> 597 </span> :
<span class="lineNum"> 598 </span><span class="lineCov"> 362 : *value = buf[0] | (uint32_t)buf[1] &lt;&lt; 8 | (uint32_t)buf[2] &lt;&lt; 16 | (uint32_t)buf[3] &lt;&lt; 24;</span>
<span class="lineNum"> 598 </span><span class="lineCov"> 370 : *value = buf[0] | (uint32_t)buf[1] &lt;&lt; 8 | (uint32_t)buf[2] &lt;&lt; 16 | (uint32_t)buf[3] &lt;&lt; 24;</span>
<span class="lineNum"> 599 </span> :
<span class="lineNum"> 600 </span><span class="lineCov"> 362 : return 0;</span>
<span class="lineNum"> 600 </span><span class="lineCov"> 370 : return 0;</span>
<a name="601"><span class="lineNum"> 601 </span> : }</a>
<span class="lineNum"> 602 </span> :
<span class="lineNum"> 603 </span><span class="lineCov"> 3732790 : int sgetbs(STREAM* f, char* str, int size)</span>
<span class="lineNum"> 603 </span><span class="lineCov"> 3782241 : int sgetbs(STREAM* f, char* str, int size)</span>
<span class="lineNum"> 604 </span> : {
<span class="lineNum"> 605 </span> : uint32_t len;
<span class="lineNum"> 606 </span> :
<span class="lineNum"> 607 </span><span class="lineCov"> 3732790 : if (sgetb32(f, &amp;len) &lt; 0) {</span>
<span class="lineNum"> 607 </span><span class="lineCov"> 3782241 : if (sgetb32(f, &amp;len) &lt; 0) {</span>
<span class="lineNum"> 608 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 609 </span> : return -1;
<span class="lineNum"> 610 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 611 </span> : }
<span class="lineNum"> 612 </span> :
<span class="lineNum"> 613 </span><span class="lineCov"> 3732790 : if (len + 1 &gt; (uint32_t)size) {</span>
<span class="lineNum"> 613 </span><span class="lineCov"> 3782241 : if (len + 1 &gt; (uint32_t)size) {</span>
<span class="lineNum"> 614 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 615 </span> : return -1;
<span class="lineNum"> 616 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 617 </span> : }
<span class="lineNum"> 618 </span> :
<span class="lineNum"> 619 </span><span class="lineCov"> 3732790 : str[len] = 0;</span>
<span class="lineNum"> 619 </span><span class="lineCov"> 3782240 : str[len] = 0;</span>
<span class="lineNum"> 620 </span> :
<span class="lineNum"> 621 </span><span class="lineCov"> 3732790 : return sread(f, str, (int)len);</span>
<span class="lineNum"> 621 </span><span class="lineCov"> 3782240 : return sread(f, str, (int)len);</span>
<a name="622"><span class="lineNum"> 622 </span> : }</a>
<span class="lineNum"> 623 </span> :
<span class="lineNum"> 624 </span><span class="lineCov"> 129597634 : int swrite(const void* void_data, unsigned size, STREAM* f)</span>
<span class="lineNum"> 624 </span><span class="lineCov"> 20661703 : int swrite(const void* void_data, unsigned size, STREAM* f)</span>
<span class="lineNum"> 625 </span> : {
<span class="lineNum"> 626 </span><span class="lineCov"> 129597634 : const unsigned char* data = void_data;</span>
<span class="lineNum"> 626 </span><span class="lineCov"> 20661703 : const unsigned char* data = void_data;</span>
<span class="lineNum"> 627 </span> :
<span class="lineNum"> 628 </span> : /* if there is enough space in memory */
<span class="lineNum"> 629 </span><span class="lineCov"> 129597634 : if (sptrlookup(f, size)) {</span>
<span class="lineNum"> 629 </span><span class="lineCov"> 20661703 : if (sptrlookup(f, size)) {</span>
<span class="lineNum"> 630 </span> : /* optimized version with all the data in memory */
<span class="lineNum"> 631 </span><span class="lineCov"> 128366511 : unsigned char* pos = sptrget(f);</span>
<span class="lineNum"> 631 </span><span class="lineCov"> 20655549 : unsigned char* pos = sptrget(f);</span>
<span class="lineNum"> 632 </span> :
<span class="lineNum"> 633 </span> : /**
<span class="lineNum"> 634 </span> : * Update the crc *before* writing the data in the buffer
@ -699,17 +699,17 @@
<span class="lineNum"> 637 </span> : * to be able to detect memory errors on the buffer,
<span class="lineNum"> 638 </span> : * happening before we write it on the file.
<span class="lineNum"> 639 </span> : */
<span class="lineNum"> 640 </span><span class="lineCov"> 127220529 : f-&gt;crc_stream = crc32c_plain(f-&gt;crc_stream, data, size);</span>
<span class="lineNum"> 640 </span><span class="lineCov"> 20655549 : f-&gt;crc_stream = crc32c_plain(f-&gt;crc_stream, data, size);</span>
<span class="lineNum"> 641 </span> :
<span class="lineNum"> 642 </span> : /* copy it */
<span class="lineNum"> 643 </span><span class="lineCov"> 984312399 : while (size--)</span>
<span class="lineNum"> 644 </span><span class="lineCov"> 729779043 : *pos++ = *data++;</span>
<span class="lineNum"> 643 </span><span class="lineCov"> 172057609 : while (size--)</span>
<span class="lineNum"> 644 </span><span class="lineCov"> 130746511 : *pos++ = *data++;</span>
<span class="lineNum"> 645 </span> :
<span class="lineNum"> 646 </span><span class="lineCov"> 127266678 : sptrset(f, pos);</span>
<span class="lineNum"> 646 </span><span class="lineCov"> 20655549 : sptrset(f, pos);</span>
<span class="lineNum"> 647 </span> : } else {
<span class="lineNum"> 648 </span> : /* standard version using sputc() */
<span class="lineNum"> 649 </span><span class="lineCov"> 352837 : while (size--) {</span>
<span class="lineNum"> 650 </span><span class="lineCov"> 318158 : if (sputc(*data++, f) != 0) {</span>
<span class="lineNum"> 649 </span><span class="lineCov"> 201458 : while (size--) {</span>
<span class="lineNum"> 650 </span><span class="lineCov"> 189150 : if (sputc(*data++, f) != 0) {</span>
<span class="lineNum"> 651 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 652 </span> : return -1;
<span class="lineNum"> 653 </span> : /* LCOV_EXCL_STOP */
@ -717,83 +717,83 @@
<span class="lineNum"> 655 </span> : }
<span class="lineNum"> 656 </span> : }
<span class="lineNum"> 657 </span> :
<span class="lineNum"> 658 </span><span class="lineCov"> 129224881 : return 0;</span>
<span class="lineNum"> 658 </span><span class="lineCov"> 20661703 : return 0;</span>
<a name="659"><span class="lineNum"> 659 </span> : }</a>
<span class="lineNum"> 660 </span> :
<span class="lineNum"> 661 </span><span class="lineCov"> 62339359 : int sputb32(uint32_t value, STREAM* s)</span>
<span class="lineNum"> 661 </span><span class="lineCov"> 9119259 : int sputb32(uint32_t value, STREAM* s)</span>
<span class="lineNum"> 662 </span> : {
<span class="lineNum"> 663 </span> : unsigned char b;
<span class="lineNum"> 664 </span> : unsigned char buf[16];
<span class="lineNum"> 665 </span> : unsigned i;
<span class="lineNum"> 666 </span> :
<span class="lineNum"> 667 </span><span class="lineCov"> 62339359 : i = 0;</span>
<span class="lineNum"> 667 </span><span class="lineCov"> 9119259 : i = 0;</span>
<span class="lineNum"> 668 </span> : loop:
<span class="lineNum"> 669 </span><span class="lineCov"> 117525500 : b = value &amp; 0x7f;</span>
<span class="lineNum"> 670 </span><span class="lineCov"> 117525500 : value &gt;&gt;= 7;</span>
<span class="lineNum"> 669 </span><span class="lineCov"> 17637493 : b = value &amp; 0x7f;</span>
<span class="lineNum"> 670 </span><span class="lineCov"> 17637493 : value &gt;&gt;= 7;</span>
<span class="lineNum"> 671 </span> :
<span class="lineNum"> 672 </span><span class="lineCov"> 117525500 : if (value) {</span>
<span class="lineNum"> 673 </span><span class="lineCov"> 55186141 : buf[i++] = b;</span>
<span class="lineNum"> 674 </span><span class="lineCov"> 55186141 : goto loop;</span>
<span class="lineNum"> 672 </span><span class="lineCov"> 17637493 : if (value) {</span>
<span class="lineNum"> 673 </span><span class="lineCov"> 8518234 : buf[i++] = b;</span>
<span class="lineNum"> 674 </span><span class="lineCov"> 8518234 : goto loop;</span>
<span class="lineNum"> 675 </span> : }
<span class="lineNum"> 676 </span> :
<span class="lineNum"> 677 </span><span class="lineCov"> 62339359 : buf[i++] = b | 0x80;</span>
<span class="lineNum"> 677 </span><span class="lineCov"> 9119259 : buf[i++] = b | 0x80;</span>
<span class="lineNum"> 678 </span> :
<span class="lineNum"> 679 </span><span class="lineCov"> 62339359 : return swrite(buf, i, s);</span>
<span class="lineNum"> 679 </span><span class="lineCov"> 9119259 : return swrite(buf, i, s);</span>
<a name="680"><span class="lineNum"> 680 </span> : }</a>
<span class="lineNum"> 681 </span> :
<span class="lineNum"> 682 </span><span class="lineCov"> 34173479 : int sputb64(uint64_t value, STREAM* s)</span>
<span class="lineNum"> 682 </span><span class="lineCov"> 5293948 : int sputb64(uint64_t value, STREAM* s)</span>
<span class="lineNum"> 683 </span> : {
<span class="lineNum"> 684 </span> : unsigned char b;
<span class="lineNum"> 685 </span> : unsigned char buf[16];
<span class="lineNum"> 686 </span> : unsigned i;
<span class="lineNum"> 687 </span> :
<span class="lineNum"> 688 </span><span class="lineCov"> 34173479 : i = 0;</span>
<span class="lineNum"> 688 </span><span class="lineCov"> 5293948 : i = 0;</span>
<span class="lineNum"> 689 </span> : loop:
<span class="lineNum"> 690 </span><span class="lineCov"> 124705929 : b = value &amp; 0x7f;</span>
<span class="lineNum"> 691 </span><span class="lineCov"> 124705929 : value &gt;&gt;= 7;</span>
<span class="lineNum"> 690 </span><span class="lineCov"> 19354594 : b = value &amp; 0x7f;</span>
<span class="lineNum"> 691 </span><span class="lineCov"> 19354594 : value &gt;&gt;= 7;</span>
<span class="lineNum"> 692 </span> :
<span class="lineNum"> 693 </span><span class="lineCov"> 124705929 : if (value) {</span>
<span class="lineNum"> 694 </span><span class="lineCov"> 90532450 : buf[i++] = b;</span>
<span class="lineNum"> 695 </span><span class="lineCov"> 90532450 : goto loop;</span>
<span class="lineNum"> 693 </span><span class="lineCov"> 19354594 : if (value) {</span>
<span class="lineNum"> 694 </span><span class="lineCov"> 14060646 : buf[i++] = b;</span>
<span class="lineNum"> 695 </span><span class="lineCov"> 14060646 : goto loop;</span>
<span class="lineNum"> 696 </span> : }
<span class="lineNum"> 697 </span> :
<span class="lineNum"> 698 </span><span class="lineCov"> 34173479 : buf[i++] = b | 0x80;</span>
<span class="lineNum"> 698 </span><span class="lineCov"> 5293948 : buf[i++] = b | 0x80;</span>
<span class="lineNum"> 699 </span> :
<span class="lineNum"> 700 </span><span class="lineCov"> 34173479 : return swrite(buf, i, s);</span>
<span class="lineNum"> 700 </span><span class="lineCov"> 5293948 : return swrite(buf, i, s);</span>
<a name="701"><span class="lineNum"> 701 </span> : }</a>
<span class="lineNum"> 702 </span> :
<span class="lineNum"> 703 </span><span class="lineCov"> 929 : int sputble32(uint32_t value, STREAM* s)</span>
<span class="lineNum"> 703 </span><span class="lineCov"> 161 : int sputble32(uint32_t value, STREAM* s)</span>
<span class="lineNum"> 704 </span> : {
<span class="lineNum"> 705 </span> : unsigned char buf[4];
<span class="lineNum"> 706 </span> :
<span class="lineNum"> 707 </span><span class="lineCov"> 929 : buf[0] = value &amp; 0xFF;</span>
<span class="lineNum"> 708 </span><span class="lineCov"> 929 : buf[1] = (value &gt;&gt; 8) &amp; 0xFF;</span>
<span class="lineNum"> 709 </span><span class="lineCov"> 929 : buf[2] = (value &gt;&gt; 16) &amp; 0xFF;</span>
<span class="lineNum"> 710 </span><span class="lineCov"> 929 : buf[3] = (value &gt;&gt; 24) &amp; 0xFF;</span>
<span class="lineNum"> 707 </span><span class="lineCov"> 161 : buf[0] = value &amp; 0xFF;</span>
<span class="lineNum"> 708 </span><span class="lineCov"> 161 : buf[1] = (value &gt;&gt; 8) &amp; 0xFF;</span>
<span class="lineNum"> 709 </span><span class="lineCov"> 161 : buf[2] = (value &gt;&gt; 16) &amp; 0xFF;</span>
<span class="lineNum"> 710 </span><span class="lineCov"> 161 : buf[3] = (value &gt;&gt; 24) &amp; 0xFF;</span>
<span class="lineNum"> 711 </span> :
<span class="lineNum"> 712 </span><span class="lineCov"> 929 : return swrite(buf, 4, s);</span>
<span class="lineNum"> 712 </span><span class="lineCov"> 161 : return swrite(buf, 4, s);</span>
<a name="713"><span class="lineNum"> 713 </span> : }</a>
<span class="lineNum"> 714 </span> :
<span class="lineNum"> 715 </span><span class="lineCov"> 12306366 : int sputbs(const char* str, STREAM* f)</span>
<span class="lineNum"> 715 </span><span class="lineCov"> 1884788 : int sputbs(const char* str, STREAM* f)</span>
<span class="lineNum"> 716 </span> : {
<span class="lineNum"> 717 </span><span class="lineCov"> 12306366 : size_t len = strlen(str);</span>
<span class="lineNum"> 717 </span><span class="lineCov"> 1884788 : size_t len = strlen(str);</span>
<span class="lineNum"> 718 </span> :
<span class="lineNum"> 719 </span><span class="lineCov"> 12306366 : if (sputb32(len, f) != 0) {</span>
<span class="lineNum"> 719 </span><span class="lineCov"> 1884788 : if (sputb32(len, f) != 0) {</span>
<span class="lineNum"> 720 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 721 </span> : return -1;
<span class="lineNum"> 722 </span> : /* LCOV_EXCL_STOP */
<span class="lineNum"> 723 </span> : }
<span class="lineNum"> 724 </span> :
<span class="lineNum"> 725 </span><span class="lineCov"> 12287997 : return swrite(str, len, f);</span>
<span class="lineNum"> 725 </span><span class="lineCov"> 1884788 : return swrite(str, len, f);</span>
<span class="lineNum"> 726 </span> : }
<a name="727"><span class="lineNum"> 727 </span> : </a>
<span class="lineNum"> 728 </span> : #if HAVE_FSYNC
<span class="lineNum"> 729 </span><span class="lineCov"> 912 : int ssync(STREAM* s)</span>
<span class="lineNum"> 729 </span><span class="lineCov"> 145 : int ssync(STREAM* s)</span>
<span class="lineNum"> 730 </span> : {
<span class="lineNum"> 731 </span> : unsigned i;
<span class="lineNum"> 732 </span> :
<span class="lineNum"> 733 </span><span class="lineCov"> 1824 : for (i = 0; i &lt; s-&gt;handle_size; ++i) {</span>
<span class="lineNum"> 734 </span><span class="lineCov"> 913 : if (fsync(s-&gt;handle[i].f) != 0) {</span>
<span class="lineNum"> 733 </span><span class="lineCov"> 1135 : for (i = 0; i &lt; s-&gt;handle_size; ++i) {</span>
<span class="lineNum"> 734 </span><span class="lineCov"> 990 : if (fsync(s-&gt;handle[i].f) != 0) {</span>
<span class="lineNum"> 735 </span> : /* LCOV_EXCL_START */
<span class="lineNum"> 736 </span> : s-&gt;state = STREAM_STATE_ERROR;
<span class="lineNum"> 737 </span> : s-&gt;state_index = i;
@ -802,7 +802,7 @@
<span class="lineNum"> 740 </span> : }
<span class="lineNum"> 741 </span> : }
<span class="lineNum"> 742 </span> :
<span class="lineNum"> 743 </span><span class="lineCov"> 911 : return 0;</span>
<span class="lineNum"> 743 </span><span class="lineCov"> 145 : return 0;</span>
<span class="lineNum"> 744 </span> : }
<span class="lineNum"> 745 </span> : #endif
<span class="lineNum"> 746 </span> :

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">10</td>
@ -60,40 +60,40 @@
<td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
</tr>
<tr>
<td class="coverFn"><a href="stream.h.gcov.html#160">sptrlookup</a></td>
<td class="coverFnHi">140471390</td>
<td class="coverFn"><a href="stream.h.gcov.html#230">sgetc</a></td>
<td class="coverFnHi">82747474</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.h.gcov.html#168">sptrget</a></td>
<td class="coverFnHi">140020205</td>
<td class="coverFn"><a href="stream.h.gcov.html#160">sptrlookup</a></td>
<td class="coverFnHi">33182199</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.h.gcov.html#176">sptrset</a></td>
<td class="coverFnHi">138951723</td>
<td class="coverFnHi">33144603</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.h.gcov.html#230">sgetc</a></td>
<td class="coverFnHi">82206359</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.h.gcov.html#184">serror</a></td>
<td class="coverFnHi">24784868</td>
<td class="coverFn"><a href="stream.h.gcov.html#168">sptrget</a></td>
<td class="coverFnHi">33144603</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.h.gcov.html#346">sputc</a></td>
<td class="coverFnHi">23611223</td>
<td class="coverFnHi">3794625</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.h.gcov.html#184">serror</a></td>
<td class="coverFnHi">3632818</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.h.gcov.html#241">sungetc</a></td>
<td class="coverFnHi">32166</td>
<td class="coverFnHi">33308</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.h.gcov.html#271">sgetspace</a></td>
<td class="coverFnHi">19238</td>
<td class="coverFnHi">19921</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.h.gcov.html#256">sgeteol</a></td>
<td class="coverFnHi">5807</td>
<td class="coverFnHi">6014</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.h.gcov.html#192">seof</a></td>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">10</td>
@ -65,7 +65,7 @@
</tr>
<tr>
<td class="coverFn"><a href="stream.h.gcov.html#184">serror</a></td>
<td class="coverFnHi">24784868</td>
<td class="coverFnHi">3632818</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.h.gcov.html#208">serrorfile</a></td>
@ -73,35 +73,35 @@
</tr>
<tr>
<td class="coverFn"><a href="stream.h.gcov.html#230">sgetc</a></td>
<td class="coverFnHi">82206359</td>
<td class="coverFnHi">82747474</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.h.gcov.html#256">sgeteol</a></td>
<td class="coverFnHi">5807</td>
<td class="coverFnHi">6014</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.h.gcov.html#271">sgetspace</a></td>
<td class="coverFnHi">19238</td>
<td class="coverFnHi">19921</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.h.gcov.html#168">sptrget</a></td>
<td class="coverFnHi">140020205</td>
<td class="coverFnHi">33144603</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.h.gcov.html#160">sptrlookup</a></td>
<td class="coverFnHi">140471390</td>
<td class="coverFnHi">33182199</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.h.gcov.html#176">sptrset</a></td>
<td class="coverFnHi">138951723</td>
<td class="coverFnHi">33144603</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.h.gcov.html#346">sputc</a></td>
<td class="coverFnHi">23611223</td>
<td class="coverFnHi">3794625</td>
</tr>
<tr>
<td class="coverFn"><a href="stream.h.gcov.html#241">sungetc</a></td>
<td class="coverFnHi">32166</td>
<td class="coverFnHi">33308</td>
</tr>
</table>
<br>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">10</td>
@ -94,8 +94,8 @@
<span class="lineNum"> 32 </span> :
<span class="lineNum"> 33 </span> : #define STREAM_STATE_READ 0 /**&lt; The stream is in a normal state of read. */
<span class="lineNum"> 34 </span> : #define STREAM_STATE_WRITE 1 /**&lt; The stream is in a normal state of write. */
<span class="lineNum"> 35 </span> : #define STREAM_STATE_ERROR -1 /**&lt; An error was encoutered. */
<span class="lineNum"> 36 </span> : #define STREAM_STATE_EOF 2 /**&lt; The end of file was encoutered. */
<span class="lineNum"> 35 </span> : #define STREAM_STATE_ERROR -1 /**&lt; An error was encountered. */
<span class="lineNum"> 36 </span> : #define STREAM_STATE_EOF 2 /**&lt; The end of file was encountered. */
<span class="lineNum"> 37 </span> :
<span class="lineNum"> 38 </span> : struct stream_handle {
<span class="lineNum"> 39 </span> : int f; /**&lt; Handle of the file. */
@ -221,33 +221,33 @@
<span class="lineNum"> 159 </span> : /**
<a name="160"><span class="lineNum"> 160 </span> : * Check if the buffer has enough data loaded.</a>
<span class="lineNum"> 161 </span> : */
<span class="lineNum"> 162 </span><span class="lineCov"> 140471390 : static inline int sptrlookup(STREAM* s, int size)</span>
<span class="lineNum"> 162 </span><span class="lineCov"> 33182199 : static inline int sptrlookup(STREAM* s, int size)</span>
<span class="lineNum"> 163 </span> : {
<span class="lineNum"> 164 </span><span class="lineCov"> 140471390 : return s-&gt;pos + size &lt;= s-&gt;end;</span>
<span class="lineNum"> 164 </span><span class="lineCov"> 33182199 : return s-&gt;pos + size &lt;= s-&gt;end;</span>
<span class="lineNum"> 165 </span> : }
<span class="lineNum"> 166 </span> :
<span class="lineNum"> 167 </span> : /**
<a name="168"><span class="lineNum"> 168 </span> : * Get the current stream ptr.</a>
<span class="lineNum"> 169 </span> : */
<span class="lineNum"> 170 </span><span class="lineCov"> 140020205 : static inline unsigned char* sptrget(STREAM* s)</span>
<span class="lineNum"> 170 </span><span class="lineCov"> 33144603 : static inline unsigned char* sptrget(STREAM* s)</span>
<span class="lineNum"> 171 </span> : {
<span class="lineNum"> 172 </span><span class="lineCov"> 140020205 : return s-&gt;pos;</span>
<span class="lineNum"> 172 </span><span class="lineCov"> 33144603 : return s-&gt;pos;</span>
<span class="lineNum"> 173 </span> : }
<span class="lineNum"> 174 </span> :
<span class="lineNum"> 175 </span> : /**
<a name="176"><span class="lineNum"> 176 </span> : * Set the current stream ptr.</a>
<span class="lineNum"> 177 </span> : */
<span class="lineNum"> 178 </span><span class="lineCov"> 138951723 : static inline void sptrset(STREAM* s, unsigned char* ptr)</span>
<span class="lineNum"> 178 </span><span class="lineCov"> 33144603 : static inline void sptrset(STREAM* s, unsigned char* ptr)</span>
<span class="lineNum"> 179 </span> : {
<span class="lineNum"> 180 </span><span class="lineCov"> 138951723 : s-&gt;pos = ptr;</span>
<span class="lineNum"> 181 </span><span class="lineCov"> 138951723 : }</span>
<span class="lineNum"> 180 </span><span class="lineCov"> 33144603 : s-&gt;pos = ptr;</span>
<span class="lineNum"> 181 </span><span class="lineCov"> 33144603 : }</span>
<span class="lineNum"> 182 </span> :
<span class="lineNum"> 183 </span> : /**
<a name="184"><span class="lineNum"> 184 </span> : * Check the error status. Like ferror().</a>
<span class="lineNum"> 185 </span> : */
<span class="lineNum"> 186 </span><span class="lineCov"> 24784868 : static inline int serror(STREAM* s)</span>
<span class="lineNum"> 186 </span><span class="lineCov"> 3632818 : static inline int serror(STREAM* s)</span>
<span class="lineNum"> 187 </span> : {
<span class="lineNum"> 188 </span><span class="lineCov"> 24784868 : return s-&gt;state == STREAM_STATE_ERROR;</span>
<span class="lineNum"> 188 </span><span class="lineCov"> 3632818 : return s-&gt;state == STREAM_STATE_ERROR;</span>
<span class="lineNum"> 189 </span> : }
<span class="lineNum"> 190 </span> :
<span class="lineNum"> 191 </span> : /**
@ -291,22 +291,22 @@
<span class="lineNum"> 229 </span> : /**
<a name="230"><span class="lineNum"> 230 </span> : * Read a char. Like fgetc().</a>
<span class="lineNum"> 231 </span> : */
<span class="lineNum"> 232 </span><span class="lineCov"> 82206359 : static inline int sgetc(STREAM* s)</span>
<span class="lineNum"> 232 </span><span class="lineCov"> 82747474 : static inline int sgetc(STREAM* s)</span>
<span class="lineNum"> 233 </span> : {
<span class="lineNum"> 234 </span><span class="lineCov"> 82206359 : if (tommy_unlikely(s-&gt;pos == s-&gt;end))</span>
<span class="lineNum"> 235 </span><span class="lineCov"> 298585 : return sgetc_uncached(s);</span>
<span class="lineNum"> 236 </span><span class="lineCov"> 81907774 : return *s-&gt;pos++;</span>
<span class="lineNum"> 234 </span><span class="lineCov"> 82747474 : if (tommy_unlikely(s-&gt;pos == s-&gt;end))</span>
<span class="lineNum"> 235 </span><span class="lineCov"> 298684 : return sgetc_uncached(s);</span>
<span class="lineNum"> 236 </span><span class="lineCov"> 82448790 : return *s-&gt;pos++;</span>
<span class="lineNum"> 237 </span> : }
<span class="lineNum"> 238 </span> :
<span class="lineNum"> 239 </span> : /**
<span class="lineNum"> 240 </span> : * Unread a char.
<a name="241"><span class="lineNum"> 241 </span> : * Like ungetc() but you have to unget the same char read.</a>
<span class="lineNum"> 242 </span> : */
<span class="lineNum"> 243 </span><span class="lineCov"> 32166 : static inline void sungetc(int c, STREAM* s)</span>
<span class="lineNum"> 243 </span><span class="lineCov"> 33308 : static inline void sungetc(int c, STREAM* s)</span>
<span class="lineNum"> 244 </span> : {
<span class="lineNum"> 245 </span><span class="lineCov"> 32166 : if (c != EOF)</span>
<span class="lineNum"> 246 </span><span class="lineCov"> 31428 : --s-&gt;pos;</span>
<span class="lineNum"> 247 </span><span class="lineCov"> 32166 : }</span>
<span class="lineNum"> 245 </span><span class="lineCov"> 33308 : if (c != EOF)</span>
<span class="lineNum"> 246 </span><span class="lineCov"> 32546 : --s-&gt;pos;</span>
<span class="lineNum"> 247 </span><span class="lineCov"> 33308 : }</span>
<span class="lineNum"> 248 </span> :
<span class="lineNum"> 249 </span> : /**
<span class="lineNum"> 250 </span> : * Read a fixed amount of chars.
@ -317,34 +317,34 @@
<span class="lineNum"> 255 </span> : /**
<a name="256"><span class="lineNum"> 256 </span> : * Get a char from a stream, ignoring one '\r'.</a>
<span class="lineNum"> 257 </span> : */
<span class="lineNum"> 258 </span><span class="lineCov"> 5807 : static inline int sgeteol(STREAM* f)</span>
<span class="lineNum"> 258 </span><span class="lineCov"> 6014 : static inline int sgeteol(STREAM* f)</span>
<span class="lineNum"> 259 </span> : {
<span class="lineNum"> 260 </span> : int c;
<span class="lineNum"> 261 </span> :
<span class="lineNum"> 262 </span><span class="lineCov"> 5807 : c = sgetc(f);</span>
<span class="lineNum"> 263 </span><span class="lineCov"> 5807 : if (c == '\r')</span>
<span class="lineNum"> 262 </span><span class="lineCov"> 6014 : c = sgetc(f);</span>
<span class="lineNum"> 263 </span><span class="lineCov"> 6014 : if (c == '\r')</span>
<span class="lineNum"> 264 </span><span class="lineNoCov"> 0 : c = sgetc(f);</span>
<span class="lineNum"> 265 </span> :
<span class="lineNum"> 266 </span><span class="lineCov"> 5807 : return c;</span>
<span class="lineNum"> 266 </span><span class="lineCov"> 6014 : return c;</span>
<span class="lineNum"> 267 </span> : }
<span class="lineNum"> 268 </span> :
<span class="lineNum"> 269 </span> : /**
<span class="lineNum"> 270 </span> : * Read all the spaces and tabs.
<a name="271"><span class="lineNum"> 271 </span> : * Return the number of spaces and tabs read.</a>
<span class="lineNum"> 272 </span> : */
<span class="lineNum"> 273 </span><span class="lineCov"> 19238 : static inline int sgetspace(STREAM* f)</span>
<span class="lineNum"> 273 </span><span class="lineCov"> 19921 : static inline int sgetspace(STREAM* f)</span>
<span class="lineNum"> 274 </span> : {
<span class="lineNum"> 275 </span><span class="lineCov"> 19238 : int count = 0;</span>
<span class="lineNum"> 275 </span><span class="lineCov"> 19921 : int count = 0;</span>
<span class="lineNum"> 276 </span> : int c;
<span class="lineNum"> 277 </span> :
<span class="lineNum"> 278 </span><span class="lineCov"> 19238 : c = sgetc(f);</span>
<span class="lineNum"> 279 </span><span class="lineCov"> 45607 : while (c == ' ' || c == '\t') {</span>
<span class="lineNum"> 280 </span><span class="lineCov"> 7131 : ++count;</span>
<span class="lineNum"> 281 </span><span class="lineCov"> 7131 : c = sgetc(f);</span>
<span class="lineNum"> 278 </span><span class="lineCov"> 19921 : c = sgetc(f);</span>
<span class="lineNum"> 279 </span><span class="lineCov"> 47225 : while (c == ' ' || c == '\t') {</span>
<span class="lineNum"> 280 </span><span class="lineCov"> 7383 : ++count;</span>
<span class="lineNum"> 281 </span><span class="lineCov"> 7383 : c = sgetc(f);</span>
<span class="lineNum"> 282 </span> : }
<span class="lineNum"> 283 </span> :
<span class="lineNum"> 284 </span><span class="lineCov"> 19238 : sungetc(c, f);</span>
<span class="lineNum"> 285 </span><span class="lineCov"> 19238 : return count;</span>
<span class="lineNum"> 284 </span><span class="lineCov"> 19921 : sungetc(c, f);</span>
<span class="lineNum"> 285 </span><span class="lineCov"> 19921 : return count;</span>
<span class="lineNum"> 286 </span> : }
<span class="lineNum"> 287 </span> :
<span class="lineNum"> 288 </span> : /**
@ -407,10 +407,10 @@
<span class="lineNum"> 345 </span> : * Write a char. Like fputc().
<a name="346"><span class="lineNum"> 346 </span> : * Return 0 on success or -1 on error.</a>
<span class="lineNum"> 347 </span> : */
<span class="lineNum"> 348 </span><span class="lineCov"> 23611223 : static inline int sputc(int c, STREAM* s)</span>
<span class="lineNum"> 348 </span><span class="lineCov"> 3794625 : static inline int sputc(int c, STREAM* s)</span>
<span class="lineNum"> 349 </span> : {
<span class="lineNum"> 350 </span><span class="lineCov"> 23611223 : if (s-&gt;pos == s-&gt;end) {</span>
<span class="lineNum"> 351 </span><span class="lineCov"> 49838 : if (sflush(s) != 0)</span>
<span class="lineNum"> 350 </span><span class="lineCov"> 3794625 : if (s-&gt;pos == s-&gt;end) {</span>
<span class="lineNum"> 351 </span><span class="lineCov"> 38573 : if (sflush(s) != 0)</span>
<span class="lineNum"> 352 </span><span class="lineNoCov"> 0 : return -1;</span>
<span class="lineNum"> 353 </span> : }
<span class="lineNum"> 354 </span> :
@ -421,11 +421,11 @@
<span class="lineNum"> 359 </span> : * to be able to detect memory errors on the buffer,
<span class="lineNum"> 360 </span> : * happening before we write it on the file.
<span class="lineNum"> 361 </span> : */
<span class="lineNum"> 362 </span><span class="lineCov"> 23611224 : s-&gt;crc_stream = crc32c_plain_char(s-&gt;crc_stream, c);</span>
<span class="lineNum"> 362 </span><span class="lineCov"> 3794625 : s-&gt;crc_stream = crc32c_plain_char(s-&gt;crc_stream, c);</span>
<span class="lineNum"> 363 </span> :
<span class="lineNum"> 364 </span><span class="lineCov"> 23809904 : *s-&gt;pos++ = c;</span>
<span class="lineNum"> 364 </span><span class="lineCov"> 3794625 : *s-&gt;pos++ = c;</span>
<span class="lineNum"> 365 </span> :
<span class="lineNum"> 366 </span><span class="lineCov"> 23809904 : return 0;</span>
<span class="lineNum"> 366 </span><span class="lineCov"> 3794625 : return 0;</span>
<span class="lineNum"> 367 </span> : }
<span class="lineNum"> 368 </span> :
<span class="lineNum"> 369 </span> : /**

View file

@ -31,18 +31,18 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">232</td>
<td class="headerCovTableEntry">293</td>
<td class="headerCovTableEntryMed">79.2 %</td>
<td class="headerCovTableEntry">240</td>
<td class="headerCovTableEntry">301</td>
<td class="headerCovTableEntryMed">79.7 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">29</td>
<td class="headerCovTableEntry">31</td>
<td class="headerCovTableEntryHi">93.5 %</td>
<td class="headerCovTableEntry">30</td>
<td class="headerCovTableEntry">32</td>
<td class="headerCovTableEntryHi">93.8 %</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
@ -60,88 +60,92 @@
<td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#465">pathcmp</a></td>
<td class="coverFnHi">50336221</td>
<td class="coverFn"><a href="support.c.gcov.html#470">pathcmp</a></td>
<td class="coverFnHi">51328958</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#422">pathprint</a></td>
<td class="coverFnHi">50030363</td>
<td class="coverFnHi">50908928</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#657">malloc_nofail</a></td>
<td class="coverFnHi">13871886</td>
<td class="coverFn"><a href="support.c.gcov.html#628">malloc_counter_inc</a></td>
<td class="coverFnHi">19792624</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#688">malloc_nofail</a></td>
<td class="coverFnHi">14067108</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#350">pathcpy</a></td>
<td class="coverFnHi">6858601</td>
<td class="coverFnHi">6956056</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#706">strdup_nofail</a></td>
<td class="coverFnHi">5663011</td>
<td class="coverFn"><a href="support.c.gcov.html#737">strdup_nofail</a></td>
<td class="coverFnHi">5715940</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#116">log_tag</a></td>
<td class="coverFnHi">4041705</td>
<td class="coverFnHi">4058806</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#290">esc</a></td>
<td class="coverFnHi">3592843</td>
<td class="coverFnHi">3612178</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#485">mkancestor</a></td>
<td class="coverFnHi">792978</td>
<td class="coverFn"><a href="support.c.gcov.html#490">mkancestor</a></td>
<td class="coverFnHi">793073</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#77">log_error</a></td>
<td class="coverFnHi">614592</td>
<td class="coverFnHi">615188</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#169">msg_info</a></td>
<td class="coverFnHi">295863</td>
<td class="coverFnHi">295974</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#231">msg_verbose</a></td>
<td class="coverFnHi">126936</td>
<td class="coverFnHi">127002</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#549">fmtime</a></td>
<td class="coverFnHi">117937</td>
<td class="coverFn"><a href="support.c.gcov.html#554">fmtime</a></td>
<td class="coverFnHi">119629</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#408">pathexport</a></td>
<td class="coverFnHi">17569</td>
<td class="coverFnHi">17583</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#99">log_expected</a></td>
<td class="coverFnHi">11751</td>
<td class="coverFnHi">11440</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#683">calloc_nofail</a></td>
<td class="coverFnHi">9283</td>
<td class="coverFn"><a href="support.c.gcov.html#714">calloc_nofail</a></td>
<td class="coverFnHi">9576</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#394">pathimport</a></td>
<td class="coverFnHi">8852</td>
<td class="coverFnHi">9180</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#439">pathslash</a></td>
<td class="coverFnHi">7319</td>
<td class="coverFn"><a href="support.c.gcov.html#444">pathslash</a></td>
<td class="coverFnHi">7469</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#188">msg_progress</a></td>
<td class="coverFnHi">3911</td>
<td class="coverFnHi">4145</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#133">log_flush</a></td>
<td class="coverFnHi">1108</td>
<td class="coverFnHi">1148</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#212">msg_bar</a></td>
<td class="coverFnHi">952</td>
<td class="coverFnHi">945</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#55">log_fatal</a></td>
<td class="coverFnHi">804</td>
<td class="coverFnHi">822</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#379">pathcatc</a></td>
@ -149,30 +153,30 @@
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#145">msg_status</a></td>
<td class="coverFnHi">569</td>
<td class="coverFnHi">577</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#603">malloc_counter</a></td>
<td class="coverFnHi">444</td>
<td class="coverFn"><a href="support.c.gcov.html#615">malloc_counter_get</a></td>
<td class="coverFnHi">460</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#255">msg_flush</a></td>
<td class="coverFnHi">440</td>
<td class="coverFnHi">442</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#364">pathcat</a></td>
<td class="coverFnHi">248</td>
<td class="coverFnHi">256</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#456">pathcut</a></td>
<td class="coverFn"><a href="support.c.gcov.html#461">pathcut</a></td>
<td class="coverFnHi">30</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#754">smartctl_attribute</a></td>
<td class="coverFn"><a href="support.c.gcov.html#785">smartctl_attribute</a></td>
<td class="coverFnHi">25</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#828">smartctl_flush</a></td>
<td class="coverFn"><a href="support.c.gcov.html#859">smartctl_flush</a></td>
<td class="coverFnHi">12</td>
</tr>
<tr>
@ -180,7 +184,7 @@
<td class="coverFnLo">0</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#737">smatch</a></td>
<td class="coverFn"><a href="support.c.gcov.html#768">smatch</a></td>
<td class="coverFnLo">0</td>
</tr>
</table>

View file

@ -31,18 +31,18 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">232</td>
<td class="headerCovTableEntry">293</td>
<td class="headerCovTableEntryMed">79.2 %</td>
<td class="headerCovTableEntry">240</td>
<td class="headerCovTableEntry">301</td>
<td class="headerCovTableEntryMed">79.7 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">29</td>
<td class="headerCovTableEntry">31</td>
<td class="headerCovTableEntryHi">93.5 %</td>
<td class="headerCovTableEntry">30</td>
<td class="headerCovTableEntry">32</td>
<td class="headerCovTableEntryHi">93.8 %</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
@ -60,128 +60,132 @@
<td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="support.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#683">calloc_nofail</a></td>
<td class="coverFnHi">9283</td>
<td class="coverFn"><a href="support.c.gcov.html#714">calloc_nofail</a></td>
<td class="coverFnHi">9576</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#290">esc</a></td>
<td class="coverFnHi">3592843</td>
<td class="coverFnHi">3612178</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#549">fmtime</a></td>
<td class="coverFnHi">117937</td>
<td class="coverFn"><a href="support.c.gcov.html#554">fmtime</a></td>
<td class="coverFnHi">119629</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#77">log_error</a></td>
<td class="coverFnHi">614592</td>
<td class="coverFnHi">615188</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#99">log_expected</a></td>
<td class="coverFnHi">11751</td>
<td class="coverFnHi">11440</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#55">log_fatal</a></td>
<td class="coverFnHi">804</td>
<td class="coverFnHi">822</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#133">log_flush</a></td>
<td class="coverFnHi">1108</td>
<td class="coverFnHi">1148</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#116">log_tag</a></td>
<td class="coverFnHi">4041705</td>
<td class="coverFnHi">4058806</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#603">malloc_counter</a></td>
<td class="coverFnHi">444</td>
<td class="coverFn"><a href="support.c.gcov.html#615">malloc_counter_get</a></td>
<td class="coverFnHi">460</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#657">malloc_nofail</a></td>
<td class="coverFnHi">13871886</td>
<td class="coverFn"><a href="support.c.gcov.html#628">malloc_counter_inc</a></td>
<td class="coverFnHi">19792624</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#485">mkancestor</a></td>
<td class="coverFnHi">792978</td>
<td class="coverFn"><a href="support.c.gcov.html#688">malloc_nofail</a></td>
<td class="coverFnHi">14067108</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#490">mkancestor</a></td>
<td class="coverFnHi">793073</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#212">msg_bar</a></td>
<td class="coverFnHi">952</td>
<td class="coverFnHi">945</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#255">msg_flush</a></td>
<td class="coverFnHi">440</td>
<td class="coverFnHi">442</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#169">msg_info</a></td>
<td class="coverFnHi">295863</td>
<td class="coverFnHi">295974</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#188">msg_progress</a></td>
<td class="coverFnHi">3911</td>
<td class="coverFnHi">4145</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#145">msg_status</a></td>
<td class="coverFnHi">569</td>
<td class="coverFnHi">577</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#231">msg_verbose</a></td>
<td class="coverFnHi">126936</td>
<td class="coverFnHi">127002</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#364">pathcat</a></td>
<td class="coverFnHi">248</td>
<td class="coverFnHi">256</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#379">pathcatc</a></td>
<td class="coverFnHi">788</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#465">pathcmp</a></td>
<td class="coverFnHi">50336221</td>
<td class="coverFn"><a href="support.c.gcov.html#470">pathcmp</a></td>
<td class="coverFnHi">51328958</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#350">pathcpy</a></td>
<td class="coverFnHi">6858601</td>
<td class="coverFnHi">6956056</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#456">pathcut</a></td>
<td class="coverFn"><a href="support.c.gcov.html#461">pathcut</a></td>
<td class="coverFnHi">30</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#408">pathexport</a></td>
<td class="coverFnHi">17569</td>
<td class="coverFnHi">17583</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#394">pathimport</a></td>
<td class="coverFnHi">8852</td>
<td class="coverFnHi">9180</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#422">pathprint</a></td>
<td class="coverFnHi">50030363</td>
<td class="coverFnHi">50908928</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#439">pathslash</a></td>
<td class="coverFnHi">7319</td>
<td class="coverFn"><a href="support.c.gcov.html#444">pathslash</a></td>
<td class="coverFnHi">7469</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#334">polish</a></td>
<td class="coverFnLo">0</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#754">smartctl_attribute</a></td>
<td class="coverFn"><a href="support.c.gcov.html#785">smartctl_attribute</a></td>
<td class="coverFnHi">25</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#828">smartctl_flush</a></td>
<td class="coverFn"><a href="support.c.gcov.html#859">smartctl_flush</a></td>
<td class="coverFnHi">12</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#737">smatch</a></td>
<td class="coverFn"><a href="support.c.gcov.html#768">smatch</a></td>
<td class="coverFnLo">0</td>
</tr>
<tr>
<td class="coverFn"><a href="support.c.gcov.html#706">strdup_nofail</a></td>
<td class="coverFnHi">5663011</td>
<td class="coverFn"><a href="support.c.gcov.html#737">strdup_nofail</a></td>
<td class="coverFnHi">5715940</td>
</tr>
</table>
<br>

File diff suppressed because it is too large Load diff

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">4</td>
@ -61,15 +61,15 @@
</tr>
<tr>
<td class="coverFn"><a href="sync.c.gcov.html#405">block_is_enabled</a></td>
<td class="coverFnHi">733118</td>
<td class="coverFnHi">772244</td>
</tr>
<tr>
<td class="coverFn"><a href="sync.c.gcov.html#1215">state_sync</a></td>
<td class="coverFnHi">72</td>
<td class="coverFnHi">80</td>
</tr>
<tr>
<td class="coverFn"><a href="sync.c.gcov.html#437">state_sync_process</a></td>
<td class="coverFnHi">68</td>
<td class="coverFnHi">76</td>
</tr>
<tr>
<td class="coverFn"><a href="sync.c.gcov.html#28">state_hash_process</a></td>

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">4</td>
@ -61,7 +61,7 @@
</tr>
<tr>
<td class="coverFn"><a href="sync.c.gcov.html#405">block_is_enabled</a></td>
<td class="coverFnHi">733118</td>
<td class="coverFnHi">772244</td>
</tr>
<tr>
<td class="coverFn"><a href="sync.c.gcov.html#28">state_hash_process</a></td>
@ -69,11 +69,11 @@
</tr>
<tr>
<td class="coverFn"><a href="sync.c.gcov.html#1215">state_sync</a></td>
<td class="coverFnHi">72</td>
<td class="coverFnHi">80</td>
</tr>
<tr>
<td class="coverFn"><a href="sync.c.gcov.html#437">state_sync_process</a></td>
<td class="coverFnHi">68</td>
<td class="coverFnHi">76</td>
</tr>
</table>
<br>

File diff suppressed because it is too large Load diff

View file

@ -31,18 +31,18 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">229</td>
<td class="headerCovTableEntry">289</td>
<td class="headerCovTableEntryMed">79.2 %</td>
<td class="headerCovTableEntry">255</td>
<td class="headerCovTableEntry">332</td>
<td class="headerCovTableEntryMed">76.8 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">21</td>
<td class="headerCovTableEntry">23</td>
<td class="headerCovTableEntryHi">91.3 %</td>
<td class="headerCovTableEntry">25</td>
<td class="headerCovTableEntryHi">92.0 %</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
@ -60,87 +60,95 @@
<td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#263">tick</a></td>
<td class="coverFnHi">2049010</td>
<td class="coverFn"><a href="unix.c.gcov.html#359">tick</a></td>
<td class="coverFnHi">2214352</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#29">open_noatime</a></td>
<td class="coverFnHi">1640600</td>
<td class="coverFnHi">1661733</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#124">filephy</a></td>
<td class="coverFn"><a href="unix.c.gcov.html#202">filephy</a></td>
<td class="coverFnHi">11432</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#74">devuuid</a></td>
<td class="coverFnHi">2279</td>
<td class="coverFn"><a href="unix.c.gcov.html#296">fsinfo</a></td>
<td class="coverFnHi">2415</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#200">fsinfo</a></td>
<td class="coverFnHi">2175</td>
<td class="coverFn"><a href="unix.c.gcov.html#180">devuuid</a></td>
<td class="coverFnHi">2404</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#305">randomize</a></td>
<td class="coverFnHi">263</td>
<td class="coverFn"><a href="unix.c.gcov.html#83">devuuid_dev</a></td>
<td class="coverFnHi">2404</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#1004">os_init</a></td>
<td class="coverFnHi">252</td>
<td class="coverFn"><a href="unix.c.gcov.html#401">randomize</a></td>
<td class="coverFnHi">271</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#1009">os_done</a></td>
<td class="coverFnHi">230</td>
<td class="coverFn"><a href="unix.c.gcov.html#1100">os_init</a></td>
<td class="coverFnHi">260</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#400">devresolve</a></td>
<td class="coverFn"><a href="unix.c.gcov.html#1115">os_done</a></td>
<td class="coverFnHi">238</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#496">devresolve</a></td>
<td class="coverFnHi">97</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#331">devread</a></td>
<td class="coverFn"><a href="unix.c.gcov.html#427">devread</a></td>
<td class="coverFnHi">86</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#458">devtree</a></td>
<td class="coverFn"><a href="unix.c.gcov.html#554">devtree</a></td>
<td class="coverFnHi">72</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#295">tick_ms</a></td>
<td class="coverFn"><a href="unix.c.gcov.html#391">tick_ms</a></td>
<td class="coverFnHi">36</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#855">thread_smart</a></td>
<td class="coverFn"><a href="unix.c.gcov.html#719">devsmart</a></td>
<td class="coverFnHi">25</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#623">devsmart</a></td>
<td class="coverFnHi">25</td>
<td class="coverFn"><a href="unix.c.gcov.html#951">thread_smart</a></td>
<td class="coverFnHi">22</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#829">thread_spindown</a></td>
<td class="coverFn"><a href="unix.c.gcov.html#925">thread_spindown</a></td>
<td class="coverFnHi">12</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#685">devdown</a></td>
<td class="coverFn"><a href="unix.c.gcov.html#781">devdown</a></td>
<td class="coverFnHi">12</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#753">devup</a></td>
<td class="coverFn"><a href="unix.c.gcov.html#849">devup</a></td>
<td class="coverFnHi">12</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#783">thread_spinup</a></td>
<td class="coverFn"><a href="unix.c.gcov.html#879">thread_spinup</a></td>
<td class="coverFnHi">12</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#918">devquery</a></td>
<td class="coverFn"><a href="unix.c.gcov.html#1014">devquery</a></td>
<td class="coverFnHi">4</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#868">device_thread</a></td>
<td class="coverFn"><a href="unix.c.gcov.html#964">device_thread</a></td>
<td class="coverFnHi">3</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#546">devscan</a></td>
<td class="coverFn"><a href="unix.c.gcov.html#642">devscan</a></td>
<td class="coverFnHi">1</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#150">devuuid_blkid</a></td>
<td class="coverFnHi">1</td>
</tr>
<tr>

View file

@ -31,18 +31,18 @@
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">229</td>
<td class="headerCovTableEntry">289</td>
<td class="headerCovTableEntryMed">79.2 %</td>
<td class="headerCovTableEntry">255</td>
<td class="headerCovTableEntry">332</td>
<td class="headerCovTableEntryMed">76.8 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">21</td>
<td class="headerCovTableEntry">23</td>
<td class="headerCovTableEntryHi">91.3 %</td>
<td class="headerCovTableEntry">25</td>
<td class="headerCovTableEntryHi">92.0 %</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
@ -60,95 +60,103 @@
<td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="unix.c.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#685">devdown</a></td>
<td class="coverFn"><a href="unix.c.gcov.html#781">devdown</a></td>
<td class="coverFnHi">12</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#868">device_thread</a></td>
<td class="coverFn"><a href="unix.c.gcov.html#964">device_thread</a></td>
<td class="coverFnHi">3</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#918">devquery</a></td>
<td class="coverFn"><a href="unix.c.gcov.html#1014">devquery</a></td>
<td class="coverFnHi">4</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#331">devread</a></td>
<td class="coverFn"><a href="unix.c.gcov.html#427">devread</a></td>
<td class="coverFnHi">86</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#400">devresolve</a></td>
<td class="coverFn"><a href="unix.c.gcov.html#496">devresolve</a></td>
<td class="coverFnHi">97</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#546">devscan</a></td>
<td class="coverFn"><a href="unix.c.gcov.html#642">devscan</a></td>
<td class="coverFnHi">1</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#623">devsmart</a></td>
<td class="coverFn"><a href="unix.c.gcov.html#719">devsmart</a></td>
<td class="coverFnHi">25</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#458">devtree</a></td>
<td class="coverFn"><a href="unix.c.gcov.html#554">devtree</a></td>
<td class="coverFnHi">72</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#753">devup</a></td>
<td class="coverFn"><a href="unix.c.gcov.html#849">devup</a></td>
<td class="coverFnHi">12</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#74">devuuid</a></td>
<td class="coverFnHi">2279</td>
<td class="coverFn"><a href="unix.c.gcov.html#180">devuuid</a></td>
<td class="coverFnHi">2404</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#150">devuuid_blkid</a></td>
<td class="coverFnHi">1</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#83">devuuid_dev</a></td>
<td class="coverFnHi">2404</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#43">dirent_hidden</a></td>
<td class="coverFnLo">0</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#124">filephy</a></td>
<td class="coverFn"><a href="unix.c.gcov.html#202">filephy</a></td>
<td class="coverFnHi">11432</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#200">fsinfo</a></td>
<td class="coverFnHi">2175</td>
<td class="coverFn"><a href="unix.c.gcov.html#296">fsinfo</a></td>
<td class="coverFnHi">2415</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#29">open_noatime</a></td>
<td class="coverFnHi">1640600</td>
<td class="coverFnHi">1661733</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#1009">os_done</a></td>
<td class="coverFnHi">230</td>
<td class="coverFn"><a href="unix.c.gcov.html#1115">os_done</a></td>
<td class="coverFnHi">238</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#1004">os_init</a></td>
<td class="coverFnHi">252</td>
<td class="coverFn"><a href="unix.c.gcov.html#1100">os_init</a></td>
<td class="coverFnHi">260</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#305">randomize</a></td>
<td class="coverFnHi">263</td>
<td class="coverFn"><a href="unix.c.gcov.html#401">randomize</a></td>
<td class="coverFnHi">271</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#48">stat_desc</a></td>
<td class="coverFnLo">0</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#855">thread_smart</a></td>
<td class="coverFnHi">25</td>
<td class="coverFn"><a href="unix.c.gcov.html#951">thread_smart</a></td>
<td class="coverFnHi">22</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#829">thread_spindown</a></td>
<td class="coverFn"><a href="unix.c.gcov.html#925">thread_spindown</a></td>
<td class="coverFnHi">12</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#783">thread_spinup</a></td>
<td class="coverFn"><a href="unix.c.gcov.html#879">thread_spinup</a></td>
<td class="coverFnHi">12</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#263">tick</a></td>
<td class="coverFnHi">2049010</td>
<td class="coverFn"><a href="unix.c.gcov.html#359">tick</a></td>
<td class="coverFnHi">2214352</td>
</tr>
<tr>
<td class="coverFn"><a href="unix.c.gcov.html#295">tick_ms</a></td>
<td class="coverFn"><a href="unix.c.gcov.html#391">tick_ms</a></td>
<td class="coverFnHi">36</td>
</tr>
</table>

File diff suppressed because it is too large Load diff

View file

@ -37,7 +37,7 @@
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2015-11-20</td>
<td class="headerValue">2016-01-09</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">14</td>
@ -61,55 +61,55 @@
</tr>
<tr>
<td class="coverFn"><a href="util.c.gcov.html#399">util_rotl32</a></td>
<td class="coverFnHi">924861211</td>
<td class="coverFnHi">796761149</td>
</tr>
<tr>
<td class="coverFn"><a href="util.c.gcov.html#404">util_rotl64</a></td>
<td class="coverFnHi">461015664</td>
<td class="coverFnHi">511410252</td>
</tr>
<tr>
<td class="coverFn"><a href="util.c.gcov.html#447">memhash</a></td>
<td class="coverFnHi">5724756</td>
<td class="coverFnHi">5791413</td>
</tr>
<tr>
<td class="coverFn"><a href="util.c.gcov.html#367">crc32c_x86</a></td>
<td class="coverFnHi">659527</td>
<td class="coverFnHi">646616</td>
</tr>
<tr>
<td class="coverFn"><a href="util.c.gcov.html#478">memdiff</a></td>
<td class="coverFnHi">25190</td>
<td class="coverFnHi">25329</td>
</tr>
<tr>
<td class="coverFn"><a href="util.c.gcov.html#58">malloc_nofail_test</a></td>
<td class="coverFnHi">2580</td>
<td class="coverFnHi">1905</td>
</tr>
<tr>
<td class="coverFn"><a href="util.c.gcov.html#69">mtest_vector</a></td>
<td class="coverFnHi">2580</td>
<td class="coverFnHi">1905</td>
</tr>
<tr>
<td class="coverFn"><a href="util.c.gcov.html#355">crc32c_gen</a></td>
<td class="coverFnHi">353</td>
<td class="coverFnHi">369</td>
</tr>
<tr>
<td class="coverFn"><a href="util.c.gcov.html#381">crc32c_init</a></td>
<td class="coverFnHi">268</td>
<td class="coverFnHi">276</td>
</tr>
<tr>
<td class="coverFn"><a href="util.c.gcov.html#501">lock_lock</a></td>
<td class="coverFnHi">243</td>
<td class="coverFnHi">251</td>
</tr>
<tr>
<td class="coverFn"><a href="util.c.gcov.html#525">lock_unlock</a></td>
<td class="coverFnHi">223</td>
<td class="coverFnHi">231</td>
</tr>
<tr>
<td class="coverFn"><a href="util.c.gcov.html#42">malloc_nofail_vector_align</a></td>
<td class="coverFnHi">201</td>
<td class="coverFnHi">209</td>
</tr>
<tr>
<td class="coverFn"><a href="util.c.gcov.html#26">malloc_nofail_align</a></td>
<td class="coverFnHi">83</td>
<td class="coverFnHi">91</td>
</tr>
<tr>
<td class="coverFn"><a href="util.c.gcov.html#465">hash_config_name</a></td>

Some files were not shown because too many files have changed in this diff Show more